вторник, 14 декабря 2010 г.

Deliver in LispWorks

Предыдущий пост, кстати, про ЛиспВоркс должен был быть, но я как-то до него не дошёл...

В общем, настала пара передавать продукт во внутреннее использование людЯм, ничего про asdf2, quicklisp, systems и т.п. не подозревающих. ЛиспВоркс для такого случая очень мощно приспособлен, у него есть концепция delivery. Это когда всё, что нужно для работы программы, запихивается в один исполняемый файл, но, в отличие от панковских оупенсорсных конпеляторов, у LW есть море ручек, которые можно при delivery крутить.

Например, в LW есть такая стадия создания образа, как утряска дерева (shake tree). LW бегает по дереву программы и смотрит, чего бы такого выбросить, что в программе, собственно, и не используется. Помнится, я жаловался у гражданина Love5an'а в его уютной ЖЖшечке, что SBCL на простой трёхкилобайтный tcp-сервер с использованием флагманских библиотек, типа iolib, генерирует исполняемый файл на 300 мегабайт. Так вот, LW из коробки, только на 20 мегабайт своих исходников, плюс неустановленного кол-ва библиотек, поставленных quicklisp'ом, сгенерил те же 300 мегабайт. 20 мегабайт исходников даже не на лиспе - это чуть больше, чем дофига, а уж на лиспе с его макросами, CLOS'ами и прочими ридтейблами - ещё больше.

Но самое неожиданное заключается в ручках к функции delivery. Есть у неё ключевой параметр с интересным именем :shake-shake-shake. Он отвечает за то, как активно трясти дерево. Я эксперимента ради дал ему вожжи в руки, и он натряс с дерева ажно 250 мегабайт. Т.е. результирующий бинарник стал всего 50 мб.

Самое удивительное, что бинарник всё ещё работал. Не работал только рантаймный load сорца с DSL-программой. Те сущности, которые использовались только в этой программе, и о которой компилятор знать не мог, LW вытряс напрочь, поэтому при загрузке валилось с руганью на неизвестные функции. А так, остальное, что во время компилирования установить можно было, всё работало.

Жаль только, что нормальная версия LW стоит, как подержанная, но всё ещё очень хорошая машина...

5 комментариев:

  1. Интересно, можно ли указывать чёткие критерии ненужного? (Например, указать, что рантаймная подгрузка кода не нужна.)

    ОтветитьУдалить
  2. Можно. Например, http://www.lispworks.com/documentation/lw60/DV/html/delivery-76.htm#pgfId-852200

    ОтветитьУдалить
  3. Можно сделать unintern символу или целому пакету, и если ссылок в коде на него нет, то он удалится.

    ОтветитьУдалить
  4. а ты в lw его собственную ide пользуешь, или emacs+slime?

    ОтветитьУдалить
  5. emacs+slime. Связка чуть похуже, чем ide*, но зато работает одинаково со всем коммон лиспами.

    В ide есть lw-специфичные фенечки, как то работа в отладчике с тредами, нормальный, работающий степпинг из cltl2, всякие адвансед инспекторы и браузеры иерархий. Но я это всё равно не использую. При нужде, всю эту мощь можно заюзать и из кода. ide в lw - это только gui, фактически.

    ОтветитьУдалить

Архив блога