システムコール用のRubyCバインディングとRubyラッパーの実行の主な違いは何ですか?
私の質問を文脈に当てはめると、Gitバージョン管理機能をRubyonRailsアプリケーションに大幅に組み込むことを検討しています。このタスクに取り組む際に、 yajl-rubyなどのRubyCバインディングで実装されたライブラリとgitRubyGemなどのシステムコール用のRubyラッパーを組み込んだRubyプログラムの実行パイプラインについて考える方法がわかりません。
システムコール用のRubyCバインディングとRubyラッパーの実行の主な違いは何ですか?
私の質問を文脈に当てはめると、Gitバージョン管理機能をRubyonRailsアプリケーションに大幅に組み込むことを検討しています。このタスクに取り組む際に、 yajl-rubyなどのRubyCバインディングで実装されたライブラリとgitRubyGemなどのシステムコール用のRubyラッパーを組み込んだRubyプログラムの実行パイプラインについて考える方法がわかりません。
バインディングはライブラリのAPIと直接インターフェースしますが、ラッパーはシステムコールを使用して、コマンドラインからエンドユーザーアプリケーションを呼び出します。
ラッパーはUNIXパイプに似ています。プログラムは互いの内部を認識せず、テキストインターフェイスを介して通信します。ただし、緩い結合には代償が伴います。システムコールはコストのかかる操作であり、アプリケーションの速度を大幅に低下させます。
これがバインディングが優れている理由です。ライブラリのプログラミングインターフェイスを使用するため、オーバーヘッドが大幅に削減されます。GitHubには独自のgit
ラッパーがあり、速度が問題であったためgit
、Rubyに実装することになりました。
のバインディングを作成するのは難しいので、彼らは自分でそれを行いましたgit
。ライブラリとして使用するようには設計されていません。die()
ほとんどすべてのエラーを呼び出すため、関数を直接呼び出すのは本当に厄介です。
適切なライブラリの需要は、git
の開発につながりましたlibgit2
。Rubyバインディングも付属しています!機能をアプリケーションと統合したいのでgit
、それをチェックする必要があります。