воскресенье, 24 ноября 2013 г.

ppRuby 1.0.0-beta

Итак, очередная версия ppRuby уже выложена на GitHub. На этот раз, как я полагаю, с установившимся, не экспериментальным интерфейсом. Т.е. в дальнейшем планируются только исправления и дополнения, а не перетряска всего и вся.

  • Эксперимент с классами и одновременной загрузкой разных версий признан неудачным — совершенно лишнее усложнение ради ненужной возможности.

  • Поддержки Ruby 1.8 больше нет и уже не будет. В конце концов, разработчики ее поддержку прекратили, и это уже серьезно.

    Зато работает с Ruby 2.0 и есть основания полагать, что версия 2.1 будет подключена с легкостью.

  • Внутри — удалось понять, откуда берутся сегфолты, и, соответственно, избавиться от них. Есть, правда, подозрение, что это избавление чревато утечками памяти — буду постепенно аккуратно прорабатывать тонкие места.

  • Реализован доступ к полному (ну, почти) Ruby API, а не только к нескольким используемым функциям, как раньше.

  • Начата работа над документацией. Пока — только по-русски. Крайне рекомендуется к прочтению.

четверг, 14 ноября 2013 г.

«Обернутые» функции в Free Pascal

Бывает, требуется множество подпрограмм единообразно обернуть — добавить им всем одинаковое начало и завершение или, что более интересно, выполнить их в блоке „try ... except“ с каким-нибудь фильтром на исключения... Вообще, понятно, что FPC поддерживает процедурные типы, но как раз типы тут могут быть самые разные, а нетипизированный вызов с ручной установкой стека — это потенциальный неиссякаемый источник трудноуловимых ошибок.

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

Соответственно, можно вынести все действия подпрограммы во вложенную процедуру без параметров, а в основной блок вставить вызов «оборачивателя» с этой вложенной процедурой. Пример ниже.

понедельник, 11 ноября 2013 г.

На полях: RTTI для статики

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

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

четверг, 7 ноября 2013 г.

Slowpoke-News

Оказывается, в Ruby 2.0 введено непосредственное представление значений с плавающей точкой на 64-битной архитектуре, в связи с этим несколько констант теперь отличаются и от Ruby 1.9, и от Ruby 2.0 x32. Всё это, конечно, отражено в макросах .h-файлов, но вот при переводе на другие языки приходится учитывать... Макросы и инлайны там ужасающего вида, посему приходится радоваться, что старый формат остался доступен, правда зачем-то вместо rb_float_new() теперь rb_float_new_in_heap() с теми же параметрами. А вообще, могли бы и экспортируемую фунцию для формирования новоформатного Float сделать...

PS. Следующая версия ppRuby будет поддерживать Ruby 2.0 и не будет 1.8. Ну, и интерфейс модуля опять полностью перекурочен — возможность одновременной загрузки двух разных движков мне более не представляется сколь-нибудь ценной.

PPS. Разный стиль версионного именования файлов .so в разных дистрибутивах Linux — бесит.