Могут ли Ruby, PHP или Perl создать предварительно скомпилированный файл для кода, подобного Python?
-
22-08-2019 - |
Вопрос
Для Python он может создать предварительно скомпилированную версию file.pyc, чтобы программу можно было запускать без повторной интерпретации.Могут ли Ruby, PHP и Perl сделать то же самое в командной строке?
Решение
Для Ruby не существует переносимой спецификации байт-кода, а значит, и стандартного способа загрузки предварительно скомпилированных архивов байт-кода.Однако почти все реализации Ruby используют тот или иной формат байт-кода или инткода, и некоторые из них могут выгружать и перезагружать архивы байт-кода.
ЯРВ всегда компилируется в байт-код перед выполнением кода, однако обычно это делается только в памяти.Есть способы записать байт-код на диск. На данный момент нет возможности прочитать его обратно в, однако.В будущем это изменится:Ведется работа над верификатором байт-кода для YARV, и как только это будет сделано, байт-код можно будет безопасно загружать в виртуальную машину, не опасаясь повреждения.Кроме того, разработчики JRuby заявили, что готовы реализовать Эмулятор YARV VM внутри JRuby, как только формат байт-кода YARV и верификатор будут стабилизированы, чтобы вы могли загрузить байт-код YARV в JRuby.(Обратите внимание, что эта версия устаревший.)
Рубиниус также всегда компилируется в байт-код и имеет формат скомпилированных файлов (.rbc
файлы, аналог JVM .class
файлы) и ведутся разговоры о формате архива байт-кода (.rba
файлы, аналог JVM .jar
файлы).Существует вероятность, что Rubinius может реализовать эмулятор YARV, если развертывание приложений с использованием байт-кода YARV когда-либо станет популярным.Кроме того, разработчики JRuby заявили, что готовы реализовать Эмулятор байт-кода Rubinius внутри JRuby, если байт-код Rubinius станет популярным способом развертывания приложений Ruby.(Обратите внимание, что эта версия устаревший.)
XRuby является чистым компилятором, он компилирует исходный код Ruby прямо в байт-код JVM (.class
файлы).Вы можете развернуть эти .class
файлы, как и любое другое приложение Java.
ДжРубин начинал как интерпретатор, но у него есть и JIT-компилятор, и AOT-компилятор (jrubyc
), который может скомпилировать исходный код Ruby в байт-код JVM (.class
файлы).Также ведется работа по созданию новый компилятор, который может скомпилировать (с аннотациями типа) код Ruby в байт-код JVM на самом деле это выглядит как класс Java и может быть использовано из кода Java без каких-либо препятствий.
Руби.НЕТ — это чистый компилятор, который компилирует исходный код Ruby в байт-код CIL (PE .dll
или .exe
файлы).Вы можете развернуть их так же, как и любое другое приложение CLI.
ЖелезоРубин также компилируется в байт-код CIL, но обычно делает это в памяти.Однако вы можете пройти командная строка переключается на него, поэтому он сбрасывает .dll
и .exe
файлы на диск.Если они у вас есть, их можно будет развернуть в обычном режиме.
СинийРубин автоматически предварительно анализирует исходный код Ruby в BRIL (BlueRuby Intermediate Language), который по сути представляет собой сериализованное дерево синтаксического анализа.(Видеть Blue Ruby — виртуальная машина Ruby в SAP ABAP(PDF) для получения подробной информации.)
я думать (но я точно не уверен), что есть способ получить Кардинал выбросить Попугай архивы байт-кода.(На самом деле Cardinal компилируется только в PAST, а затем Parrot берет на себя управление, поэтому задачей Parrot будет выгружать и загружать архивы байт-кода.)
Другие советы
Perl 5 может сбрасывать байт-коды на диск, но он содержит ошибки и неприятен. Перл 6 имеет очень чистый метод создания исполняемых файлов байт-кода, который Попугай могу бегать.
Компиляция Perl по принципу «точно в срок» выполняется достаточно быстро, поэтому в большинстве случаев это не имеет значения.Единственное место, где это имеет значение, — это среда CGI. mod_perl для.
Для истерических изюминок Perl 5 ищет .pmc
файлы впереди .pm
файлы при поиске модуля.Эти файлы могут содержать байт-код, хотя Perl по умолчанию не записывает байт-код (в отличие от Python).
Модуль::Компилировать (или:что это за ЧВК?) более подробно рассказывает об этой неясной особенности.Они используются не часто, но...
Умные люди, написавшие Модуль::Компилировать воспользуйтесь этим, чтобы предварительно скомпилировать код Perl в...ну, это все еще Perl, но с предварительной обработкой.
Среди других преимуществ это ускоряет время загрузки и упрощает отладку при использовании фильтров исходного кода (код Perl изменяет исходный код Perl перед загрузкой интерпретатором).
Не для PHP, хотя большинство настроек PHP включают Кэш байт-кода это будет кэшировать скомпилированный байт-код, так что при следующем запуске скрипта будет запущена скомпилированная версия.Это значительно ускоряет выполнение.
Я не знаю способа получить байт-код через командную строку.
Для Perl вы можете попробовать использовать Б::Байткод и perlcc.Однако оба они являются весьма экспериментальными.И Perl 6 скоро выйдет (теоретически), будет на Parrot и будет использовать другой байт-код, так что тогда все это будет несколько спорным.
вот несколько примеров волшебных слов для командной строки
perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
По данным третьего издания Программирование на Perl, это можно аппроксимировать экспериментальными способами.
Если вы используете Зенд-Гвардия в ваших PHP-скриптах он, по сути, предварительно компилирует сценарии в байт-код, который затем может быть запущен движком PHP, если загружено расширение Zend Optimizer.
Итак, да, Zend Guard/Optimizer позволяет использовать предварительно скомпилированные PHP-скрипты.
Для PHP Проект Фалангер компилируется в сборки .Net.Хотя я не уверен, что это то, что вы искали.
Кто-нибудь рассматривал возможность использования байт-кода LLVM вместо еще одного пользовательского байт-кода?
Ruby 1.8 фактически вообще не использует байт-код (даже внутри), поэтому этап предварительной компиляции отсутствует.