たとえば、私はRubyプロジェクトにdevise gemをインストールしました。すべてのソースコードを見ることができます。プリコンパイルされたバイナリ形式でソースコードのないライブラリを使用することは可能ですか? .NETのようなアセンブリ?そして、それを手動でgemパッケージマネージャーなしでプロジェクトに追加する方法は?Rubyのプリコンパイルされたライブラリ
答えて
いいえ、これはRubyでは不可能です。 Rubyで最も近いのは、プリコンパイルされたライブラリをラップする拡張です。例えば、Nokogiriまたはbcrypt-rubyです。
短い答えはノーです。
Rubyはコンパイルされた言語ではありません。 YARVはソースコードをオンザフライでコンパイルしますが、バイトコードは生成しません。 rubyの唯一のコンパイルされた実装Rubiniusは、(マイナーバージョン間であっても)異なるバージョン間でのバイトコードの互換性を約束していません。
技術的には、MRI/YARVのバイトコードにコンパイルされますが、バイトコードは通常どこにも出力されません。これを生成したプロセスの範囲外では役に立たないと予想されます。 – tadman
"コンパイルされた言語"のようなものはありません。コンパイルは言語ではなくコンパイラの特性です。すべての言語をコンパイルできます。また、Rubiniusは「唯一のコンパイルされた実装」ではありません。実際、コンパイラ(MRI)を持たないRubyの実装は1つしかなく、その実装は時代遅れであり、非難され、維持されていません。すべての既存の実装(YARV、Rubinius、JRuby、IronRuby、Topaz、Opal、Cardinal、MacRuby、MRuby、RubyMotionなど)にはコンパイラがあります。 –
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実装で移植可能なものもありません。
- 1. プリコンパイルされたヘッダとプリコンパイルされたバイナリの違い
- 2. CMakeにはプリコンパイルされたライブラリが含まれています
- 3. プリコンパイルされたスタティックライブラリ
- 4. CMake:プリコンパイルされたライブラリからシンボルを隠す方法
- 5. Rubyで結合されたSimpleDBライブラリ
- 6. プリコンパイルされたXSLT、ReBase、NGEN
- 7. ヘッダーとSTLライブラリをプリコンパイル
- 8. プリコンパイルされたソースコードの逆コンパイルASP.NET
- 9. プリコンパイルされたDLLからの参照
- 10. Windowsでサードパーティのプリコンパイルされた動的ライブラリと静的ライブラリの両方をリンクする
- 11. プリコンパイルされたブーストライブラリ用パッケージ(Ubuntu)
- 12. プリコンパイルされたAzure関数とSOAPエンドポイント
- 13. iOS:XcodeにプリコンパイルされたPro/Liteバージョン
- 14. Javaはプリコンパイルされた.classファイルに
- 15. アップロードされたアセットをプリコンパイルする
- 16. herokuでプリコンパイルされたアセット(manifest.yml)が検出されない
- 17. プリコンパイルで生成されたファイルはコンパイルされません
- 18. プリコンパイルされたアセットが使用されていません
- 19. ウェブサイトの公開後にプリコンパイルされたファイルが取得されなかった
- 20. 埋め込みC内の別のプログラムにプリコンパイルされたアプリケーション
- 21. Ruby用XMPライブラリ
- 22. Ruby用XMPPライブラリ
- 23. Ruby:メーリングリストのライブラリまたはgem
- 24. mvc 2プリコンパイルされたDLLの代わりにCodebehindを使用
- 25. Azureの機能、プリコンパイルされた関数、HttpRequestMessage
- 26. プリコンパイルされたAzure Webアプリケーションの動的ページコンテンツ
- 27. Rails/Herokuのプリコンパイルされたアセットが見つかりません
- 28. プリコンパイルされたアセンブリと紺碧の機能から設定ファイル
- 29. プリコンパイルされたAzure関数の依存関係エラー
- 30. Requirejsを持つバックボーンのプリコンパイルされたハンドルバーテンプレート?
プリコンパイル・ライブラリを使用するためのユースケースは何ですか? –
コンパイルされたRubyのあらゆる形式は、根本的にRubyのあらゆるインフラストラクチャと互換性がありません。 – tadman
@tadmanなぜあなたは拡大しますか? – pjs