2016-04-04 11 views
0

たとえば、私はRubyプロジェクトにdevise gemをインストールしました。すべてのソースコードを見ることができます。プリコンパイルされたバイナリ形式でソースコードのないライブラリを使用することは可能ですか? .NETのようなアセンブリ?そして、それを手動でgemパッケージマネージャーなしでプロジェクトに追加する方法は?Rubyのプリコンパイルされたライブラリ

+0

プリコンパイル・ライブラリを使用するためのユースケースは何ですか? –

+0

コンパイルされたRubyのあらゆる形式は、根本的にRubyのあらゆるインフラストラクチャと互換性がありません。 – tadman

+0

@tadmanなぜあなたは拡大しますか? – pjs

答えて

0

いいえ、これはRubyでは不可能です。 Rubyで最も近いのは、プリコンパイルされたライブラリをラップする拡張です。例えば、Nokogiriまたはbcrypt-rubyです。

0

短い答えはノーです。

Rubyはコンパイルされた言語ではありません。 YARVはソースコードをオンザフライでコンパイルしますが、バイトコードは生成しません。 rubyの唯一のコンパイルされた実装Rubiniusは、(マイナーバージョン間であっても)異なるバージョン間でのバイトコードの互換性を約束していません。

+0

技術的には、MRI/YARVのバイトコードにコンパイルされますが、バイトコードは通常どこにも出力されません。これを生成したプロセスの範囲外では役に立たないと予想されます。 – tadman

+0

"コンパイルされた言語"のようなものはありません。コンパイルは言語ではなくコンパイラの特性です。すべての言語をコンパイルできます。また、Rubiniusは「唯一のコンパイルされた実装」ではありません。実際、コンパイラ(MRI)を持たないRubyの実装は1つしかなく、その実装は時代遅れであり、非難され、維持されていません。すべての既存の実装(YARV、Rubinius、JRuby、IronRuby、Topaz、Opal、Cardinal、MacRuby、MRuby、RubyMotionなど)にはコンパイラがあります。 –

0

Rubyには、Ruby言語以外のコードの移植可能なフォーマットはありません。それ以外の唯一の移植可能なフォーマットはMarshalフォーマットですが、これはデータ用であり、コードをシリアライズすることはできません。つまり、すべてのメソッドProc、ラムダ、ブロックが除外され、エラーが発生します。

これは実際に他の言語と違いはありません。例えば。 Java言語とJVMバイトコード言語は、2つの異なる仕様で定義された2つの異なる言語です。 Javaの実装にもJVMLの実装が含まれているという保証はなく、逆もあります。たとえば、AvianはJVMLのみを実装し、Javaは実装しません。そして、GWTはJavaだけを実装しますが、JVMLは実装しません。

たとえば、JITコンパイラまたはKilim並行性フレームワークでJRubyなどのJVMバイトコードを実行できることに依存するJavaアプリケーションは、Androidでは動作しません。 JRubyはAndroid上でJITを無効にし、純粋に解釈された形で実行することでこれを解決します。

JRubyとIronRubyはどちらもRuby to JVMLバイトコードとCLI CILバイトコードをコンパイルするAhead-Of-Timeコンパイラを持っています。 Opalには、RubyをECMAScriptにコンパイルするAhead-Of-Timeコンパイラがあります。

YARVには、RubyからYARVバイトコードをコンパイルするAhead-Of-Timeコンパイラがありますが、通常、バイトコードはYARVバイトコードVMに直接送られ、永続化されることも、公開されることもありません。 YARVバイトコードは安全ではありません.YARV VMは、コンパイラがVMを破壊しないコードだけを生成することを暗黙的に信頼します。これは、コンパイラがVMの一部である場合には合理的な前提ですが、外部ソースからバイトコードを読み込むことができれば、コンパイラがどのコンパイラを生成したか分からず、VMを一貫性のない状態にすることができます。

これを防ぐために、バイトコードを安全に変更するか、VMがバイトコードベリファイアを必要とするかのいずれかを行う必要があります。

can実際にバイトコードにアクセスし、ファイルから読み込んで実行することは可能ですが、私が概説した理由では安全ではありません。

Rubiniusはバイトコードのファイルへの書き込みと読み取りをサポートしていますが、実際にはバイトコードのアーカイブを配布するためのものではありません。 Rubiniusは、コンパイルされたバイトコードをレイテンシの最適化としてキャッシュに使用します(CPythonと同じように)。以前は、Rubiniusには、と.jarというファイル(.rbc.rba)に似た機能がありましたが、.rbaのアーカイブからコードをロードできましたが、まだ存在しているかどうかはわかりません。

いくつかのRuby実装では、いくつかの形式のバイトコードコンパイルがサポートされていますが、堅牢に動作するものはありません。また、Ruby実装で移植可能なものもありません。

関連する問題