Для Python он может создать предварительно скомпилированную версию file.pyc, чтобы программа могла запускаться без повторной интерпретации. Может ли Ruby, PHP и Perl делать то же самое в командной строке?
Может ли Ruby, PHP или Perl создать предварительно скомпилированный файл для кода, такого как Python?
Ответ 1
В Ruby отсутствует спецификация портативного байт-кода и, следовательно, также нет стандартного способа загрузки предварительно скомпилированных архивов байт-кода. Тем не менее, почти все реализации Ruby используют какой-то формат байт-кода или intcode, а некоторые из них могут сбрасывать и перезагружать архивы байт-кода.
YARV всегда компилируется в байт-код перед выполнением кода, однако это обычно делается только в памяти. Есть способы сбросить байт-код на диск. На данный момент нет способа прочитать его в. Это изменится в будущем: ведется работа над верификатором байт-кода для YARV, и как только это будет сделано, байт-код можно безопасно загрузить в виртуальную машину, не опасаясь коррупции. Кроме того, разработчики JRuby указали, что готовы реализовать эмулятор YARV VM в JRuby как только формат и верификатор байт-кода YARV стабилизируются, поэтому что вы можете загрузить байт-код YARV в JRuby. (Обратите внимание, что эта версия устарела.)
Rubinius также всегда компилируется в байт-код и имеет формат для скомпилированные файлы (.rbc
файлы, аналогичные файлам JVM .class
), и есть разговор о формате архива байт-кода (.rba
файлов, аналогичных файлам JVM .jar
). Существует вероятность того, что Rubinius может реализовать эмулятор YARV, если развертывание приложений в качестве байт-кода YARV становится популярным. Кроме того, разработчики JRuby указали, что готовы реализовать эмулятор байт-кода Rubinius внутри JRuby, если байт-код Rubinius станет популярным способом развертывания приложений Ruby, (Обратите внимание, что эта версия устарела.)
XRuby является чистым компилятором, он компилирует исходный код Ruby прямо в байт-код JVM (.class
). Вы можете развернуть эти файлы .class
так же, как и любое другое приложение Java.
JRuby начался как интерпретатор, но у него есть как JIT-компилятор, так и компилятор AOT (jrubyc
), который может скомпилировать исходный код Ruby для байт-кода JVM (.class
файлов). Кроме того, ведется работа по созданию нового компилятора который может скомпилировать (тип-аннотированный) код Ruby для байт-кода JVM, который на самом деле выглядит как класс Java и может использоваться из кода Java без барьеров.
Ruby.NET - это чистый компилятор, который компилирует исходный код Ruby в байт-код CIL (файлы PE .dll
или .exe
). Вы можете развернуть их так же, как и любое другое приложение CLI.
IronRuby также компилируется в байт-код CIL, но обычно делает это в памяти. Тем не менее, вы можете передать командной строки, поэтому он выгружает файлы .dll
и .exe
на диск. Как только вы их получите, они могут быть развернуты в обычном режиме.
BlueRuby автоматически предварительно анализирует исходный код Ruby в BRIL (промежуточный язык BlueRuby), который в основном представляет собой сериализованный parsetree. (Подробнее см. Blue Ruby - Ruby VM в SAP ABAP (PDF).
Я думаю (но я определенно не уверен), что есть способ получить Cardinal для выгрузки Parrot байт-коды. (На самом деле, кардинал только компилируется в PAST, а затем Parrot берет верх, поэтому задача Parrot - сбросить и загрузить файлы байт-кода.)
Ответ 2
Perl 5 может сбрасывать байт-коды на диск, но он глючит и неприятен. Perl 6 имеет очень чистый метод создания исполняемых файлов байт-кода, который Parrot может работать.
Perl компиляция точно в срок достаточно быстро, что в большинстве случаев это не имеет значения. Одно место, где это имеет значение, - это среда CGI, которая является mod_perl для.
Ответ 3
Для истерических изюминков Perl 5 ищет файлы .pmc
перед файлами .pm
при поиске модуля. Эти файлы могут содержать байт-код, хотя Perl не записывает байт-код по умолчанию (в отличие от Python).
Модуль:: Компиляция (или: что это такое PMC?) углубляется в эту непонятную особенность. Они не часто используются, но...
Умные люди, которые писали Module:: Compile, воспользовались этим, чтобы предварительно скомпилировать Perl-код в... ну, он все еще Perl, но он предварительно обработан.
Среди других преимуществ это ускоряет время загрузки и упрощает отладку при использовании исходных фильтров (Perl-код, модифицирующий исходный код Perl перед загрузкой интерпретатором).
Ответ 4
Не для PHP, хотя большинство настроек PHP содержат Bytecode Cache, который будет кэшировать скомпилированный байт-код, чтобы в следующий раз script запускался, выполняется скомпилированная версия. Это значительно ускоряет выполнение.
Я не знаю, как реально попасть в байт-код через командную строку.
Ответ 5
Для Perl вы можете попробовать использовать B:: Bytecode и perlcc. Однако, оба они очень экспериментально. И Perl 6 скоро выйдет (теоретически) и будет на Parrot и будет использовать другой байт-код, и поэтому все это будет несколько спорным.
Ответ 6
вот несколько примеров магических слов для командной строки
perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
Ответ 7
Согласно третьему изданию Программирование Perl, это можно приблизить с помощью некоторых экспериментальных способов.
Ответ 8
Если вы используете Zend Guard в своих PHP-скриптах, он по существу прекомпилирует скрипты в байтовый код, который затем может управляться PHP, если расширение Zend Optimizer загружено.
Итак, да, Zend Guard/Optimizer разрешает использовать предварительно скомпилированные PHP-скрипты.
Ответ 9
Для PHP Phalanger Project сводится к сборкам .Net. Я не уверен, что это то, что вы искали.
Ответ 10
Кто-нибудь думал об использовании байт-кода LLVM, а не о еще-пользовательском байтовом коде?
Ответ 11
Ruby 1.8 фактически не использует байт-код вообще (даже внутренне), поэтому нет этапа предварительной компиляции.