J operator

May. 21st, 2015 11:51 pm
ermouth: (Default)

J – это от JUMP, “безусловный переход”, GOTO. Совершенно нехарактерная для современных высокоуровневых языков конструкция, а для функциональных – и вовсе практически табуированная.

Тем не менее, оказывается для безусловного перехода в функциональном мире есть хорошая абстракция, она называется J operator. Интересно, что ни про эту конструкцию, ни про её изобретателя – Питера Лэндина – в русской вики статей нет.

Про J operator у Лэндина есть оригинальная работа 1965 года, клик по картинке – академический PDF.

Снимок экрана 2015-05-21 в 22.56.00

Абстракция эта – довольно любопытный зверёк. Это конструкт, который превращает блок кода по метке в лямбду сохраняя её собственный scope в месте объявления, плюс перекрывая этот scope локальным к месту вызова. После этого лямбда исполняется, но вместо return-а она делает jump обратно (или куда-то ещё).

И получается, что блок кода по метке как бы исполняется по месту вызова.

Для реализации такого конструкта Лэндин вводит в свою абстрактную машину специальный стек scope-ов переходов, хотя в нынешних реалиях понятно, что можно обойтись и без него (макросы-темплэйты, например, или подобные конструкции).

Любопытно, что приблизительно таких свойств конструкт я выдумывал, когда делал CoverCouch. Та-же песня – совмещение scope’ов, но не в общем, а в конкретном случае (что гораздо проще), исполнение и возврат результата по месту вызова мутированием аккумулятора в scope вызова.

Но мне совершенно не приходило в голову, что по сути я делаю функциональный эквивалент GOTO. А про оператор J я вообще только вчера узнал.

1965 год. Не перестаю удивляться.

ermouth: (ang)

Год назад я запустил первую версию cloudwall.me. Жэжэшечка у меня тогда была закрыта, так что написал я об этом только в мае и в Medium.

clouds-09

В тот момент cloudwall.me работал на PouchDB 1.4 (это такая локальная NoSQL БД в браузере). Тогда она была дико глючная и медленная. За год PouchDB стараниями комьюнити доросла до 3.3 и стала вполне стабильной. Среда исполнения приложений на jquerymy за год тоже здорово подросла и в плане скорости, и в плане надёжности.

Плюс добавился IDE, плюс ещё всякие редакторы и приложения, плюс я сайт jquerymy переделал.

Короче, сейчас cloudwall.me – простейшая браузерная ОС, которая для работы не требует инет-соединения. Год назад я говорил (и думал), что ОС эта совсем игрушечная – но, похоже, что не такая уж и игрушечная.

В общем, сегодня мы с коллегами хлопнули шампанского по случаю первого маленького бабла по контракту с буржуинией. Первого в моей жизни.

И контракт этот – на разработку софта на платформе cloudwall.me. Offlline-ready, все дела. Интересно, что контракт сам меня нашёл.

Что дальше

CloudWall система уникальная в том плане, что её исходники не существуют в виде файлов.

Текущая версия CloudWall (платформы) создана внутри него самого, исходники – это JSON-документы в локальной браузерной БД. Синхронизированной, конечно, с удалёнными репликами CouchDB.

Сам сайт cloudwall.me – статически слинкованный – это один документ CouchDB с 32 аттачами. То-есть, чтобы запустить CloudWall у себя, как свой сайт, достаточно поставить CouchDB и скопировать в неё один-единственный документ. Больше ничего делать не надо – оно сразу заработает само.

В общем, я планирую довести это всё до стадии open-source для начала. Это не так и просто – потому что файлов нет, а на гитхаб можно положить только файлы, то-есть нужен трюк.

А дальше у меня есть соображения, откуда могут проявиться интересные деньги. Потому что если к этому прикрутить CoverCouch и сделать централизованные профили пользователей, получается распределённая ОС с безопасностью, пригодной для корпоративного сектора.

Что-то типа MS Active directory + DFS получается, только в браузере и для запуска js-приложений. Ну и без дикого сопутствующего гимора как в Винде. И клиенты по определению однопользовательские.

Но сначала я раскрою cloudwall. Скоро на гитхабе, да.

CouchDB PR

Mar. 4th, 2015 06:03 pm
ermouth: (ang)

Меня пропиарили ребята из CouchDB. Причём сразу двумя строчками, ога )

Снимок экрана 2015-03-04 в 17.49.06

Сразу и cloudwall.me, и CoverCouch. А я ведь едва не забросил развивать и то, и другое – а тут внезапно такой наплыв. В этой связи я думаю, что пора их converge в одну систему, ну и cloudwall.me опенсорцить.

В общем, понятны следующие шаги – но цель какая-то нереально амбициозная вырисовывается.

Интересно, что за два предыдущих дня я написал многократно больше текста на инглише, чем на русском, у меня нечасто такое.

ermouth: (ang)
Задачка с эмуляцией JS-энджина CouchDB внутри моей волшебной библиотечки решилась в одно соображение. Там суть задачи – воссоздание для JS-функции довольно необычного scope, такого же, как внутри CouchDB. Сложность в том, что часть этого scope – это «системные» функции CouchDB, а часть – итераторы, зависящие от параметров конкретного запроса и результата работы map-функции.

«В лоб» задача решается просто – в каждом запросе к reduce делаем кусок исходника со всеми этими функциями и превращаем это все в исполняемый код рефлектором. Это очень просто, но совсем плохо по скорости и памяти, да и вообще довольно стрёмно. Первый же подход к снаряду показал, что это тупик – это примерно полгода назад было, и я задачку отложил.

А потом я как-то вспомнил про curried constructor в Scala. Сам по себе аналог в js никак специально не называется, но мне подумалось, что если этот концепт немного дополнить, то выходит как раз нужный мне функционал.

В результате получилось, что на каждую reduce-функцию у меня есть наполовину инстанцированный конструктор, в некотором смысле sсope-полуфабрикат. При каждом запросе reduce клиентом я этот полуфабрикат инжектирую итераторы, зависимые от параметров запроса, и исполняю. Такие конструкции V8 прекрасно оптимизирует – сама reduce-функция получается инстанцированной однократно, вызывается часто и оптимизируется в этой связи компилятором по-полной.

Выложил вчера на гитхаб, а сегодня ночью тесты гонял. Летает )

Profile

ermouth: (Default)
ermouth

November 2021

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 13th, 2025 07:16 am
Powered by Dreamwidth Studios