Исправил два важных бага в ppRuby. Из-за первого ничего не работало в 32-битных системах, из-за второго — под Windows. В первом случае была моя ошибка по невнимательности — забыл в трех местах cdecl
(да, под 64 битами это не имеет значения); во втором не скорректировал инициализацию для Ruby 1.9, поскольку на моей рабочей машине старый способ от 1.8 продолжал работать...
среда, 30 октября 2013 г.
ppRuby — исправления
четверг, 24 октября 2013 г.
RDot 1.1.1.1 — промежуточный недорелиз
Новая версия поддерживает аргументы-ключи и **kwargs
у методов. Собственно новые возможности пока не введены, это скорее допиливание старых до совместимости с Ruby 2.0.
среда, 9 октября 2013 г.
Возвращаясь к размышлизму...
Или снова об оптимизации скриптовых языков. В предыдущей заметке я это всё как-то сумбурно описал. Вкратце: для условного веб-сервиса минута инициализации много «дешевле», чем секунда обработки запроса. Поэтому, проведя собственно инициализацию, имеет смысл оптимизировать с ее учетом дальнейшую работу. И для скриптовых языков это вполне возможно, в отличие от компилируемых. А вот как это мне представляется в плане практики:
- Составляем граф переходов для загруженной программы. Естественно, учитываем на данном этапе все возможные переходы.
- Выделяем самый внешние (т.е. не вложенные ни в какие другие) циклы. Получаем точки-входы и точки перед ними, в которые гарантированно не происходит возврата.
По идее, нам надо выделить самый главный цикл, а циклы в инициализации и финализации нас уже не интересуют. Скорее всего, его таки можно выделить, но в общем случае — проблематично.
- Когда исполнение доходит до такой точки невозврата, включаем оптимизацию дальнейшего кода:
- Находим переменные, значения которых в данном цикле не меняются, фиксируем их как константы, вычисляем все константные выражения.
- Просматриваем условные ветвления в графе переходов, сокращаем те, условия которых стали константами в силу предыдущего пункта.
- Поскольку в отброшенных путях могли быть изменения переменных, повторяем итерацию. Пока изменения не закончатся.
- Только теперь с чистой совестью запускаем цикл.
Естественно, это всё не отменяет классической алгоритмической оптимизации, JIT-компиляции и т.д. после сокращения всего ненужного. И естественно, всё это не будет работать при «eval(string)
» внутри циклов, но так делать в любом случае не стоит...