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

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

Ответы [ 11 ]

30 голосов
/ 20 мая 2009

Не существует спецификации переносимого байт-кода для Ruby, и, следовательно, нет стандартного способа загрузки предварительно скомпилированных архивов байт-кода. Однако почти все реализации Ruby используют какой-либо формат байт-кода или intcode, и некоторые из них могут создавать дампы и перезагружать архивы байт-кода.

YARV всегда компилируется в байт-код перед выполнением кода, однако обычно это делается только в памяти. Есть способы выгрузить байт-код на диск. В настоящее время нет способа прочитать его обратно в , однако. Это изменится в будущем: ведется работа по проверке байт-кода для YARV, и, как только это будет сделано, байт-код можно безопасно загрузить в ВМ, не опасаясь повреждения. Кроме того, разработчики JRuby указали, что они готовы внедрить эмулятор виртуальной машины YARV внутри 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 Intermediate Language), который по сути является сериализованным парсетом. (Подробнее см. Blue Ruby - виртуальная машина Ruby в SAP ABAP (PDF).)

Я думаю (но я точно не уверен), что есть способ получить Кардинал для выгрузки Parrot архивов байт-кода. (На самом деле, Cardinal компилирует только в PAST, а затем Parrot вступает во владение, поэтому Parrot будет выполнять задачу выгрузки и загрузки архивов байт-кода.)

13 голосов
/ 19 мая 2009

Perl 5 может записать байт-коды на диск, но он глючит и неприятен. Perl 6 имеет очень чистый метод создания исполняемых файлов байт-кода, который может запускать Parrot .

Компиляция Perl точно в срок достаточно быстра, чтобы это не имело значения в большинстве случаев. Единственное место, где это имеет значение, это CGI-среда, для которой mod_perl .

11 голосов
/ 19 мая 2009

При истерических изюминках Perl 5 ищет файлы .pmc перед файлами .pm при поиске модуля. Эти файлы могут содержать байт-код, хотя Perl не записывает байт-код по умолчанию (в отличие от Python).

Module :: Compile (или: что это за штука с PMC?) углубляется в эту неясную функцию. Они не часто используются, но ...

Умные люди, написавшие Module :: Compile , воспользовались этим, чтобы предварительно скомпилировать код Perl в ... ну, это все еще Perl, но он предварительно обработан.

Помимо прочих преимуществ, это ускоряет время загрузки и упрощает отладку при использовании исходных фильтров (код Perl изменяет исходный код Perl перед загрузкой интерпретатором).

6 голосов
/ 19 мая 2009

Не для PHP, хотя большинство настроек PHP включают в себя Кэш байт-кода , который будет кэшировать скомпилированный байт-код, так что при следующем запуске сценария будет запущена скомпилированная версия. Это значительно ускоряет выполнение.

Я не знаю, как на самом деле получить байт-код через командную строку.

5 голосов
/ 19 мая 2009

Для Perl вы можете попробовать использовать B :: Bytecode и perlcc . Тем не менее, оба они очень экспериментальные. И Perl 6 скоро выйдет (теоретически), будет на Parrot и будет использовать другой байт-код, поэтому все это будет несколько спорным.

3 голосов
/ 20 мая 2009

Вот несколько примеров магических слов для командной строки

perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
2 голосов
/ 19 мая 2009

Согласно третьему изданию Programming Perl , это можно аппроксимировать некоторыми экспериментальными способами.

1 голос
/ 04 июня 2009

Кто-нибудь рассматривал возможность использования байт-кода LLVM вместо еще одного другого пользовательского байт-кода?

1 голос
/ 19 мая 2009

Для PHP Phalanger Project компилируется в сборки .Net. Я не уверен, что это то, что вы искали, хотя.

1 голос
/ 19 мая 2009

Если вы используете Zend Guard в своих сценариях PHP, он по существу прекомпилирует сценарии в байт-код, который затем может быть запущен механизмом PHP, если загружено расширение Zend Optimizer.

Итак, да, Zend Guard / Optimizer разрешает использовать предварительно скомпилированные сценарии PHP.

...