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

StackOverflow https://stackoverflow.com/questions/884186

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top