私は新しい Ruby プログラマーで、Ruby 言語への C コード拡張を作成するためのチュートリアルをいくつか調べていて、疑問に思っていました: これを行う利点は何ですか? 私が所属しているクラスで将来チームプロジェクトを行う必要があり、Ruby開発を行っているのは私だけだと確信していますが、ほとんどの人はCを知っているので、書いてもらうことができるので、個人的にこれを見ていました。理論的には、プロジェクトの自分の Ruby 開発で使用できる C コード。しかし、通常、これがそれを行う主な理由ですか、それとも私が気付いていないことがありますか? また、私のアイデアはあなたの意見でうまくいきますか (プロジェクト全体で Ruby に統合している間、誰かに C 開発をしてもらいます)? 他の言語で同様のことができますか (つまり、Ruby プロジェクト、Python コードなどで Java コードを使用できますか)?
1 に答える
そうする主な理由は、速度と既存の機能の再利用です。
まず、スピード。C は、Ruby VM を回避し、手動でメモリ管理を行うことができるため、一般的に Ruby よりもはるかに高速です。アプリケーションのパフォーマンスが重要な部分 (たとえば、データベース ドライバーなど) では、主に、プリミティブをラップする大量の Ruby オブジェクトを生成する必要がなく、その必要がないため、アプリケーション全体のランタイムが大幅に改善される可能性があります。ガベージ コレクタを呼び出して自分でクリーンアップします。
次に、C 拡張機能を作成することで、C ライブラリに既に存在するコードと連携できます。Linux エコシステムは、多くの一般的な機能に対応する、強力で十分にテストされた C ライブラリで満たされています。たとえば、Nokogiriは解析にlibxmlを使用します。これにより、実戦でテスト済みの高速パーサーを使用できるようになり、その上に優れた Ruby シュガーが追加されます。この場合の C 拡張機能の主な目的は、C コードを呼び出し、データを C-Ruby データ型との間で変換する Ruby API を提供することです (そのためrb_string
、 をパラメーターとして渡し、これを に変換する必要があります)。char*
一部の C ライブラリで使用するために使用し、結果を に変換しrb_string
て Ruby に戻します)。
MRI (株式の Ruby) を使用する場合、Ruby などで Python を実行する方法はありますが、通常は C コードのみに限定されますが、同じタイプのインターフェイスではありません。JRuby を使用する場合、Java パッケージを直接使用できます。特別な拡張機能は必要ありません。
とはいえ、Ruby を既存の C ライブラリに接続したい場合は、ruby-ffi をご覧ください。これは、C ライブラリへのインターフェイスを非常に簡単に記述できるようにする多くの機能を提供し、すばやく簡単に起動して実行できるようにします。