Джулия каждый раз компилирует script?

Язык Юлии компилирует script каждый раз, не можем ли мы скомпилировать двоичные файлы с julia? Я попробовал небольшой helloworld script с функцией println, которая потребовала 2,3 секунды, чтобы показать julia. Было бы лучше, если бы мы могли создавать двоичные файлы вместо компиляции каждый раз

Обновление: В Джулии произошли некоторые изменения, так как я задал этот вопрос. Хотя я больше не слежу за обновлениями для julia, так как я задал этот вопрос, и если вы ищете что-то подобное, загляните в нижеследующие ответы и комментарии людей, которые следуют за julia.

Кроме того, полезно знать, что теперь требуется около 150 мс для загрузки script.

Ответ 1

В настоящий момент Julia JIT компилирует всю свою стандартную библиотеку при запуске. Мы знаем об этой ситуации и в настоящее время работаем над кэшированием вывода LLVM JIT для исправления ситуации, но до сих пор там нет пути (за исключением использования REPL).

Ответ 2

Ответ Кено на место, но, возможно, я могу немного подробнее рассказать о том, что происходит и что мы планируем сделать.

В настоящее время существует только режим LLVM JIT:

  • Там очень тривиальный интерпретатор для некоторых простых операторов верхнего уровня.
  • Перед выполнением все остальные коды передаются в машинный код. Код агрессивно специализируется с использованием типов времени выполнения значений, к которым применяется код, который распространяется через программу с использованием вывода динамического типа.

Так Джулия получает хорошую производительность, даже если код написан без аннотаций типа: если вы вызываете f(1), вы получаете код, специализированный для Int64 - тип 1 в 64-битных системах; если вы вызываете f(1.0), вы получаете новую jitted-версию, которая специализируется на Float64 - тип 1.0 для всех систем. Поскольку каждая скомпилированная версия функции знает, какие типы она будет получать, она может работать со скоростью C-like. Вы можете саботировать это, написав и используя "нестабильные" функции, тип возврата которых зависит от данных во время выполнения, а не только от типов, но мы очень старались не делать этого при разработке основного языка и стандартной библиотеки.

Большая часть Julia написана сама по себе, затем анализируется, вводится как тип, так и jitted, поэтому загрузка всей системы с нуля занимает около 15-20 секунд. Чтобы ускорить работу, у нас есть поэтапная система, в которой мы анализируем, вводим тип и затем кешируем сериализованную версию типа-выведенного АСТ в файле sys.ji. Затем этот файл загружается и используется для запуска системы при запуске julia. Однако код LLVM или машинный код не кэшируются в sys.ji, поэтому все изменения LLVM все равно должны выполняться каждый раз, когда запускается julia, поэтому требуется около 2 секунд.

Эта 2-секундная задержка запуска довольно раздражает, и у нас есть план ее фиксации. Основной план состоит в том, чтобы иметь возможность компилировать целые программы Julia в двоичные файлы: либо исполняемые файлы, которые могут быть запущены, либо .so/.dylib разделяемые библиотеки, которые могут быть вызваны из других программ, как если бы они были просто разделяемыми библиотеками C. Время запуска для двоичного файла будет похоже на любую другую программу на C, поэтому 2-секундная задержка запуска исчезнет.

Добавление 1: С ноября 2013 года версия разработки Julia больше не имеет 2-секундной задержки запуска, поскольку она прекомпилирует стандартную библиотеку как двоичный код. Время запуска все же на 10 раз медленнее, чем Python и Ruby, поэтому есть место для улучшения, но это довольно быстро. Следующим шагом будет разрешить предварительную компиляцию пакетов и скриптов, чтобы они могли запускаться так же быстро, как и сама Юлия.

Добавление 2: С июня 2015 года версия для разработки Julia автоматически распаковывает множество пакетов, что позволяет им быстро загружать. Следующий шаг - статическая компиляция всех программ Julia.

Ответ 3

Какие-либо улучшения с этой проблемой? В настоящее время испытываю его в julia-1.0.0-arm, бегаю в малиновом пи b+..