Особенности Компиляции В Macruby



Предисловие Только что я слушал Рубиновый подкаст NoName (кстати, очень всем рекомендую), в котором я услышал новость о том, что МакРуби 0.5 вышла из стадии бета-тестирования.

Докладчики также сообщили, что в пакет MacRuby входит отличный компилятор Ruby — MacRubyC, который теперь может компилироваться в динамические библиотеки.

Естественно, мне стало интересно, и я решил поэкспериментировать.



Процесс

Так что же нам делать? Зайдите на официальный сайт MacRuby и скачать последняя версия пакета.

Распакуйте архив и установите его.

Далее запустите Терминал и попробуйте:

Особенности компиляции в MacRuby

Все работает? Большой.

Теперь попробуем компилятор MacRubyC. Для этого нам понадобится любой файл .

rb, например hello.rb, содержащий всего одну строку:

puts "Hello world!"

Пишем в терминале:

macrubyc hello.rb -o hello

Результатом является аккуратный исполняемый файл, который можно легко запустить как обычное приложение Unix:

Особенности компиляции в MacRuby

Однако если мы попробуем запустить нашу программу на другой машине, на которой не установлен MacRuby, результат будет неутешительным — в программе отсутствует динамическая библиотека MacRuby:

Особенности компиляции в MacRuby

Выход есть — статическая компиляция.

Но и здесь не все так просто: если у вас нет ЛЛВМ , то программа не скомпилируется:

Особенности компиляции в MacRuby

Самое логичное решение — установить вот этот самый LLVM:

svn co -r 82747 llvm.org/svn/llvm-project/llvm/trunk llvm-trunk cd llvm-trunk .

/configure UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 make -j2 sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 make install

Заранее предупреждаю, LLVM собирается довольно долго; это заняло у меня около часа.



Наиболее вкусный

Наши программы легко можно скомпилировать статически и, соответственно, запустить на чужой машине.

Это потрясающе.

Что ж, давайте проведем небольшое исследование.

Во-первых, размер: исходный код hello.rb составляет всего 19 байт. Если мы посмотрим на размер первого бинарника, то увидим, что он весит всего 13,6 килобайт. Не так много, как может показаться.

Но мы скомпилировали его динамически! Давайте посмотрим на размер статически скомпилированного бинарного файла — 14,3 мегабайта! Но это всего лишь «Привет, мир».

Однако особо волноваться не стоит: ведь с увеличением объёма кода размер исполняемого файла увеличится не так сильно.

Совершенно очевидно, что в этих 14 мегабайтах находятся библиотеки, которые программа нечаянно тащит за собой.

Теперь перейдем к самому интересному — производительности.

Для измерения производительности напишем программу, состоящую всего из одной строки:

10000000.times { |i| puts i }

Затем мы скомпилируем нашу программу статически и динамически соответственно с опцией --статический и без этого:

macrubyc cycle.rb -o cycle macrubyc cycle.rb --static -o cycle-static

Чтобы увидеть, насколько быстро (или медленно) выполняются наши программы, мы воспользуемся встроенной утилитой измерения времени Unix.

Особенности компиляции в MacRuby

Замеры проводились несколько раз, но результат в целом был один и тот же.

Что мы видим? Мы видим, что программа, выполняемая интерпретатором, выполняется почти на порядок быстрее, чем автономная программа.

В то же время статическая компиляция выигрывает на несколько секунд по сравнению с динамической компиляцией.

А если взять более серьезные тесты, например, Функция Мандельброта , то все становится на свои места: скомпилированная программа работает на порядок быстрее — всего 0,32 секунды, а интерпретируемая — примерно 8 секунд. Аналогичные результаты наблюдаются, если принять в качестве тестовой функции Функция Такеючи (около 21 секунды при интерпретации и 0,5 секунды при компиляции):

Особенности компиляции в MacRuby



Вместо послесловия

Вот и все, собственно.

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

Однако решение об использовании компиляции в ваших проектах остается за вами.

Теги: #ruby #macruby #macrubyc #компиляция #ruby #компиляция #ruby

Вместе с данным постом часто просматривают: