← All posts tagged cgml

yelbota
vasilisa cgml Василиса сложновата получается, сил нет делать. Сложная архитектрура (полный парраллелизм), сложная система типов, и слишком высокие требования к коду (я поставил задачу 100% покрытия тестами, и полную детерминированость). Возможно пока стоит вернуться к cgml. Сам язык очень простой, система типов достаточно развитая, но не переусложенная. Забабахаю онднопоточный компилятор на Scala, повторив архитектуру haxe-версии, благо все косяки уже известны. В дальнейшем добавлю уровень совместимости в Василису.
yelbota
AS3 Scala vasilisa cgml Раз уж пошла такая пьяна, и сегодня вечером изрыгаю текст, что в обычные дни для меня не характерно, напишу ка я про свой новый чудо-проект: Рассово Русскуй Православный Дата Фреймворк Василиса. code.google.com Василиса это развитие идеи CGML, который из простого компактного сереализатора превратился в тул для связи данных из разных источников. К примеру у нас есть некий сравочник, который меняется редко и сложен по структуре, пользовательские данные, которые ссылаются на объекты из этого справочника и клиент-серверный протокол, который может ссылаться и на то и на другое. Сравочник в базе хранить смысла не имеет, передавать его на клиент по средством какого-то особого механизма тоже. Имеет смысл загружать этот справочник в память клиента и сервера, как блоб. Имеет смысл смысл хнанить пользовательские данные в БД. Вопрос: как все это дело связать в одное единое, хм.. пространство имен? Вот тут по и приходит на помощь Василиса. По сути это прострой язык для описания структур данных с поддержкой полиморфизма и множественного наследования. Из этого языка генерируются исходники для разных платформ. Исходники предствляют из себя модели (классы с геттерами и стеерами), структруры (классы с геетерами и конструкторами содеражщими параметры), и трейты (суть интерфейсы). Модели и структуры имеют методы выдачи и приемки данных. В случае с со структорой это функции приемки и выдачи полной информации, а с моделями еще приемка и отдача changeset. Эти методы принимают интерфейсы, реализация которых определят способ передачи или сохранения этих моделей/cтруктур (Worker). Worker'ы связываются в цепочки, что позволяет организовать связанность данных. Можно грабить корованы.
yelbota
жизнь as-lambda работа cgml Короче у меня тут всего понаслучалось. Я теперь типа большой босс, что выражается в том, что я приезжаю раньше всех и открываю офис (шутка. конечно я теперь самый крутой). Естественно все мои планы по отъезда в самый чистый город на свете полетели к чертям собачьим. А еще я схватил ларингит и говорю, как Гоша Куценко, только еще хуже. CGML я пилить не буду. На данный момент то, что находится в dev ветке работает с java и as3. Наверно выпилю haxe и солью в транк. В место этого я начну пилить новую тулзу на Scala, которая будет в 100500 раз круче, но прежде я сделаю as3-lambda, который обещал чуть ли не месяц назад.
yelbota
cgml Что-то не получается остановить поток новых фич, несмотря на неоттестированность старых. Добавил readonly аннотацию. Поля модели, с такой аннотацией, будут доступны только через геттеры. Пока работает только в джаве. Добавил условные аннотации. К примеру два модуля используют одну и ту же модель. Один модуль клиент, другой модуль — сервер. С помощью условных аннотаций можно сделать, что бы структуры, которые сервер получает с клиента были readonly для сервера, но read-write для клиента, и на против те структуры, которые клиент получает от сервера, были readonly для клиента, но read-write для сервера. Довабил флаг, по которому все float значение в моделе, в джаве будут представлены, как double. Все это доступно в dev ветке.
yelbota
ToDo Scala cgml Все ObS/RT будет последней новой фичей в CGML. Далее я сделаю автоматическую сборку с помощью ant-runner (для haxe есть ant task) и выложу билды для Linux/Win/OsX. Далее будут только багфиксы. Никаких новых целей, кортежей и прочего. В место этого я начну новый проект на Scala, название пока не придумал, но можно что нибудь красивое, типа Nimble Data Framework. Эта вещь будет иметь человекочитаемый синтаксис (в ущерб супер-компактности, которая есть в CGML), принцип "один тип, один файл", кортежи и множественное наследование. Будет протокол для отправки частичных изменений в объектах и коллекциях. Планирую битстриминг, что существенно повысит компактность (на которую я дрочу) и усложнит обратную инженерию (что так актуально для игр). Представьте: один бит для булева значения. Круто. Будет IDE Tools с рефакторингом, который будет распространяться не только на исходную спецификацию данных но и на код проекта. В перспективе плагины для IDEA и Eclipse. Выходить это дело будет в виде ант-таска, мавен плагина, CLI утилиты и GUI-обертки для нее. Многопоточность, двухчасовой доклад на Adobe MAX, преферанс и поэтессы. Как же круто. Все, я кончил.
yelbota
Haxe realaxy cgml А что я действительно разнылся по поводу "CGML никому не нужен"? Вон народ косо смотрит на Realaxy, который делается такими глыбами, как Потапенко и Дембицкий. Куда мне там со своими игрушками. Надо смотреть на мир объективно. Кстати не смотря на то, что я фрик, мне RASE то же не нравится. Но не потому, что там "нет кода" или еще какие-нибудь непривычности, а потому, что нет интеграции с внешним миром. Трудно использовать контроль версий, нельзя интегрировать с мавеном (на сколько я понял), пока нет поддержки флекс. У нас уже есть один такой проект. haXe называется.
yelbota
жизнь cgml Код генераторов становится невыносимым. Огромная куча хардкода, в которой даже я уже начинаю путаться. Парсер отдает генераторам список типов, которые надо выгнать в java, as3 и haxe. Где то с месяц назад я упростил генераторам жизнь убрав параметризированные типы на уровне модели. То есть параметризиарованный тип стал виртуальным, существующим только на этапе компиляции (в токенах парсера, в списке типов они уже отсутствуют). Если в cgml-декларации мы имеем свойство типизированное, как point.int, то в результате будет сгенерирован новый класс PointOfInt, а не просто подствлен Point<Integer>. Это со всех сторон верное решение. Списки, ради которых кстати и затевались параметризированные типы, были вынесены отдельно. Сразу решилась куча проблем, но код генераторов все равно остается весьма громоздким. Сейчас код генерируется в тупую. Берется тип, его свойства и в StringBuffer пишутся всякие там "class " + getNodeActualName(node) + " extends ". Планов громадье, и чувствую, что через пару месяцев JavaWriter превратиться в кусок говна на пять тысяч строк, как минимум. Понятное дело, что эти генератор надо каким-то образом заменить на систему шаблонов, но удивительное ощущение, которое я уже не испытывал давно: я не знаю с какой стороны браться за задачу. Такого я не испытывал уже года полтора (с тех пор, как первый раз попробовал поюзать мавен). Неповторимое ощущение, того, что потолок в который я уперся из за своей неграмотности трескается и еще немного, и я его пробью выйдя на новый уровень, где меня будут опять окружать просторы неизведанного. Может быть я найму учителя по математике, вновь займусь английским и найду себе подружку. Хм, что-то я увлекся, дорогой дневничок :)
yelbota
Haxe cgml Касательно теста из прошлого поста

С++ — 0.25s
Flash10-browser — 0.32s
JS(Chome7-MacOS) — 0.34s
Flash10-standalone-debug — 0.6s
neko — 1.2s
php 5.3.2 — 6.1s
yelbota
PHP cgml Ради эксперимента собрал тест для haxe/php.

! void player
@ string login
@ string email
@ slist.item inventory
@ slist.friend friends
@ point position
@ bool admin

! void item
@ string label
@ int power

! void friend
@ string name
@ bool online

! void point
@ int x
@ int y

Сереализуется 1000 обектов Player. У каждого по 150 friends и inventory. На моей машине получается 6.1 секунд. Для сравнения на neko — одна секунда. Надо отметить, что haxe генерирует весьма тяжелый php-код, однако мне трудно оценить, 6 секунд это быстро для такого масштаба или медленно?
yelbota
cgml А круто получается. Reference Table открывает весьма прикольные возможности. На пример у нас есть справочники, которые могут измениться только в новой версии приложения. Эти справочники сереализуются на клиент через файл, который отдает сервер статического контента. Сервер логики может передать клиенту сообщение с ссылкой на инстанс из справочника. На пример сервер сереализует игроку инвентарь, в виде списка item которые являются ссылками на объекты из справочника.
yelbota
Scala cgml Кстати, я всем говорю, что в CGML есть поддержка Scala, но на самом деле ее там нет. Реализация генерилки для Scala уже устарела и способы вызвать ее отсутствуют. Надо востановить, но вот все руки никак не доходят.
yelbota
cgml Осознал, что в CGML не хватает не только reference table, но и интерфейсов. С интерфейсами тема будет весьма интересная. Очевидно, что для них необходимо будет генерировать дополнительные сереализаторы. В Scala на пример есть трейты, что позволяет запихнуть методы сереализации непосредственно в интерфейс, однако в Java, AS3 и haXe, такой возможности нет. Прийдется выносить их в отдельные класс в виде статических методов.
yelbota
cgml На BAFPUGe @yzh44yzh рассказал про AMF и про такую штуку, как Reference Table. Удивительно, как я не додумался до такой простой вещи! Это как раз тот элемент, которого не хватало. Без него приходится делать кучу копипасты.
yelbota
cgml Переезды не мешают программированию. За два вечера сделал инкрементальную компиляцию в cgml-compiler. Теперь актуальные классы не генерируются повторно.
yelbota
Maven ToDo Haxe cgml Надо будет что-то делать с зависимостью от самого cgml. Сейчас это консольное приложение сделанное через nekotools boot, которое устанавливается в /usr/bin. Первое, что пришло в голову, это переписать cgml на scala. Но в связи с тем, что разработка maven-плагина оказалась совсем не страшной, можно подумать о haxeMojos. Это принесло бы, на мой взгляд, бОльшую общественную пользу. Ну и интереснее: ведь писать новое веселее, чем переписывать старое (еще больше быдлокода :). Ладно на сим перестаю тратить на haxe свое рабочее время. Потом, потом.
yelbota
Maven cgml Отлично! maven-cgml-plugin работает. Сорцы генерируются, подключаются как source-path, IDEA их тоже видит. Можно сказать, что задача по настройке сборки сервера, на первом этапе выполнена.
yelbota
ToDo Scala Haxe cgml В связи с моим решением расстаться с миром haXe (во всяком случае пока, может быть потом примусь с новыми силами), думаю переписать cgmlс на Scala. В принципе это будет не сложно. Кодовая база < 10000 строк кода всего. За одно почищу рудименты всякие, добавлю кортежи и если осилю maven, то сделаю интеграцию с ним. Кстати может быть стоит сменить название? А то Code Generator Meta Language, которое я придумал просто от балды, по синьке или недосыпу, как-то не звучит.