2012-05-01 4 views
1

システムコールのRuby CバインディングとRubyラッパーの主な違いは何ですか?システムコールのRuby CバインディングとRubyラッパー

私の質問には、私はGitのバージョン管理機能をRuby on Railsアプリケーションに大きく取り入れようとしています。この作業には、yajl-rubyなどのRuby Cバインディングで実装されたライブラリと、git Ruby Gemなどのシステムコール用のRubyラッパーを組み込んだRubyプログラムの実行パイプラインについて考える方法は理解できません。

答えて

4

バインディングはライブラリのAPIと直接インターフェイスし、ラッパーはシステムコールを使用してコマンドラインからエンドユーザーアプリケーションを呼び出します。

ラッパーは、UNIXパイプと似ています。プログラムは、お互いの内部についての知識がなく、テキストインターフェイスを介して通信します。しかし、疎結合には価格が付いています。システムコールは高価な操作であり、アプリケーションの処理速度を大幅に低下させます。

これはバインディングが優れている理由です。ライブラリのプログラミングインターフェイスを使用するため、オーバーヘッドが大幅に削減されます。 GitHubは独自のgitラッパーとspeed was issue that led them to implement git in Rubyを持っていました。

gitのバインディングを作成するのは難しいため、彼ら自身で行いました。ライブラリとして使用するようには設計されていませんでした。それはかなり多くのエラーでdie()を呼び出すので、直接その関数を呼び出すことは本当に扱いにくいです。

適切なgitライブラリの要求により、libgit2が開発されました。それにはRuby bindingsも付属しています! git機能をアプリケーションに統合したいので、チェックアウトする必要があります。

+1

徹底的に書かれた回答をありがとう! [git'のRubyラッパー(https://rubygems.org/gems/git)と['libgit2'Rubyバインディング](https://github.com/libgit2/rugged)の両方には、 git submodule'](http://git-scm.com/book/en/Git-Tools-Submodules)機能の違いを理解する助けになりました。 [git submodule](http://git-scm.com/book)を採用するために、[git'のRubyラッパー(https://rubygems.org/gems/git)の拡張に向けて作業を開始すると思います/ ja/Git-Tools-Submodules)の機能性を向上させることができます。 – rudolph9