Подтвердить что ты не робот

Может ли Ruby, PHP или Perl создать предварительно скомпилированный файл для кода, такого как Python?

Для Python он может создать предварительно скомпилированную версию file.pyc, чтобы программа могла запускаться без повторной интерпретации. Может ли Ruby, PHP и Perl делать то же самое в командной строке?

4b9b3361

Ответ 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 фактически не использует байт-код вообще (даже внутренне), поэтому нет этапа предварительной компиляции.