Ruby、PHP、または Perl は、Python のようなコードのプリコンパイル済みファイルを作成できますか?
-
22-08-2019 - |
質問
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のは、先に.pmc
ファイルの.pm
ファイルを検索します。 Perlは(Pythonのとは違って)、デフォルトではバイトコードを書き込みませんが、これらのファイルは、バイトコードが含まれている可能性があります。
のモジュール::コンパイル(または:?何このPMCがブツ)の>この曖昧な機能に関するいくつかのより多くの深さになります。彼らは頻繁に使用されるが、いない...
モジュール::コンパイルをする、これを利用を書いた賢い人々 Perlコードを事前にコンパイルするだけでなく、それはまだPerlのだが、それは、前処理されます...にます。
他の利点の中でも、これは、ローディング時間をスピードアップし、ソースフィルタ(インタプリタによってロードされる前に、Perlのソースコードを変更するPerlコード)を使用する場合より簡単にデバッグなります。
PHPのために、それはコンパイルをキャッシュするわけではありません次回は、スクリプトが実行されるようにバイトコードは、コンパイル済みのバージョンが実行されます。これはかなりの実行を高速化します。
私が実際にコマンドラインからバイトコードで取得するの承知している方法はありません。
ここでは、コマンドラインのための魔法の言葉
いくつかの例であり、perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
のPerl をプログラミングの第3版によれば、いくつかの実験的な方法でこれを近似することが可能である。
、それは基本的にプリコンパイルZendのオプティマイザの拡張機能がロードされているならば、PHPエンジンによって実行することができます。
バイトコードへのスクリプトだから、はい、Zendのガード/オプティマイザは、使用するプリコンパイルされたPHPスクリプトを許可します。
PHP、までコンパイルする 指結びプロジェクトのために.NETアセンブリ。私はあなたがが探していたものをthatsのかはわかりません。
誰が代わりにまだ別のカスタム・バイトコードの、LLVMのバイトコードを使用すると考えていますか?
ルビー1.8は、実際に(でも内部で)すべてのバイトコードを使用していないので、何の事前コンパイル手順はありません。