Ruby、PHP、または Perl は、Python のようなコードのプリコンパイル済みファイルを作成できますか?

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

質問

Python の場合、プリコンパイル済みバージョンの file.pyc を作成できるため、プログラムを再解釈せずに実行できます。Ruby、PHP、Perl もコマンドラインで同じことができますか?

役に立ちましたか?

解決

Ruby には移植可能なバイトコード仕様がないため、プリコンパイルされたバイトコード アーカイブをロードする標準的な方法もありません。ただし、ほぼすべての Ruby 実装は何らかのバイトコードまたは intcode 形式を使用しており、そのいくつかはバイトコード アーカイブをダンプおよびリロードできます。

ヤーフ コードを実行する前に常にバイトコードにコンパイルされますが、通常はメモリ内でのみ行われます。バイトコードをディスクにダンプする方法があります。 現時点では読み返す方法はありません , 、 しかし。これは将来的には次のように変更されます。YARV のバイトコード検証の作業が進行中であり、それが完了すると、破損の心配なくバイトコードを VM に安全にロードできるようになります。また、JRuby 開発者は、 JRuby 内の YARV VM エミュレータ, YARV バイトコード形式とベリファイアが安定すると、YARV バイトコードを JRuby にロードできるようになります。(このバージョンは 廃止.)

ルビニウス また、常にバイトコードにコンパイルされ、 コンパイルされたファイルの形式 (.rbc ファイル、JVM に類似 .class ファイル)、バイトコードのアーカイブ形式についての話があります(.rba ファイル、JVM に類似 .jar ファイル)。アプリを YARV バイトコードとしてデプロイすることが普及すれば、Rubinius が YARV エミュレータを実装する可能性があります。また、JRuby 開発者は、 JRuby 内の Rubinius バイトコード エミュレータ, 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 アプリケーションと同様にデプロイできます。

鉄ルビー CIL バイトコードにもコンパイルされますが、通常はメモリ内で行われます。ただし、通過できます コマンドラインでそれに切り替わります, 、したがって、それはダンプします .dll そして .exe ファイルをディスクに出力します。これらを入手したら、通常どおりにデプロイできます。

ブルールビー Ruby のソースコードを BRIL (BlueRuby Intermediate Language) に自動的に事前解析します。BRIL (BlueRuby Intermediate Language) は、基本的にシリアル化された解析ツリーです。(見る Blue Ruby - SAP ABAP の Ruby VM詳細は(PDF))

考える (しかし、私には絶対にわかりません) 枢機卿 吐き出す オウム バイトコードのアーカイブ。(実際には、Cardinal は PAST にコンパイルするだけで、その後は Parrot が引き継ぐため、バイトコード アーカイブをダンプしてロードするのは Parrot の仕事になります。)

他のヒント

Perl 5 はバイトコードをディスクにダンプできますが、バグが多く厄介です。 パール6 バイトコード実行可能ファイルを作成する非常にクリーンな方法を備えています。 オウム 走れる。

Perl のジャストインタイム コンパイルは十分に高速であるため、ほとんどの状況ではこれは問題になりません。それが重要な場所の 1 つは CGI 環境です。 mod_perl のためのものです。

モジュールを検索する際に

ヒステリックレーズンのために、Perl 5のは、先に.pmcファイルの.pmファイルを検索します。 Perlは(Pythonのとは違って)、デフォルトではバイトコードを書き込みませんが、これらのファイルは、バイトコードが含まれている可能性があります。

モジュール::コンパイル(または:?何このPMCがブツ)のこの曖昧な機能に関するいくつかのより多くの深さになります。彼らは頻繁に使用されるが、いない...

モジュール::コンパイルをする、これを利用を書いた

賢い人々 Perlコードを事前にコンパイルするだけでなく、それはまだPerlのだが、それは、前処理されます...にます。

他の利点の中でも、これは、ローディング時間をスピードアップし、ソースフィルタ(インタプリタによってロードされる前に、Perlのソースコードを変更するPerlコード)を使用する場合より簡単にデバッグなります。

ほとんどのPHPのセットアップは、バイトコードキャッシュに組み込むが、

PHPのために、それはコンパイルをキャッシュするわけではありません次回は、スクリプトが実行されるようにバイトコードは、コンパイル済みのバージョンが実行されます。これはかなりの実行を高速化します。

私が実際にコマンドラインからバイトコードで取得するの承知している方法はありません。

Perlの場合は、使用してみることができます B::バイトコード そして パールCC. 。ただし、これらはどちらも非常に実験的なものです。そして、Perl 6 は間もなく (理論的には) リリースされ、Parrot 上で使用され、別のバイトコードが使用されるため、その時にはこれらすべてが多少意味不明になるでしょう。

ここでは、コマンドラインのための魔法の言葉

いくつかの例であり、
perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
あなたは、PHPスクリプトの Zendのガードを使用する場合は、

、それは基本的にプリコンパイルZendのオプティマイザの拡張機能がロードされているならば、PHPエンジンによって実行することができます。

バイトコードへのスクリプト

だから、はい、Zendのガード/オプティマイザは、使用するプリコンパイルされたPHPスクリプトを許可します。

誰が代わりにまだ別のカスタム・バイトコードの、LLVMのバイトコードを使用すると考えていますか?

ルビー1.8は、実際に(でも内部で)すべてのバイトコードを使用していないので、何の事前コンパイル手順はありません。

scroll top