2016-12-26 2 views
0

私はRubyで作業しています。組み込みのgcc関数(とその点でもx86アーキテクチャの組み込み関数)を使用できることは非常に有益であることに気付きました。これらを使用する拡張機能を書く必要がないように思えるので、組み込み関数と呼べる方法があるのだろうかと思っていました。私はRubyで番号に、int __builtin_popcount(unsigned int)をコールしたい場合たとえば、私は何とか何ができる方法はありRubyで組み込みコンパイラ関数を呼び出す方法はありますか?

a = rand(1..10000) 
__builtin_popcount(a) 

私は明らかに基本的な何かを行うことができないことを知っているが、方法があることをRubyにgccとx86アーキテクチャの組み込み関数を含めることができますか?

+0

CまたはC++コードを[FFI](https://github.com/ffi/ffi)とリンクすることができます。拡張子なしでこれを内部的に行う方法はありません。 Rubyは必ずしも 'gcc'とは関係ないことを忘れないでください。たとえば、JRubyにはまったく関係がありません。さらに、多くの現代システムでは 'clang'がバックエンドになることは珍しいことではありません。 – tadman

答えて

1

あなたがしたいことははっきりしていません。

GCCに電話したい場合は、libgccをCの拡張子で囲み、Ruby APIを設計することができます。

GCCを使用してネイティブコードを動的に生成したい場合、現在はAFAIKが使用できません。 GCCベースのJITコンパイラライブラリのプロジェクトがありますが、その状態がわかりません。 そのライブラリをC拡張モジュールにラップし、Ruby APIをデザインすることができます。とにかく、動的に生成されたネイティブコードとRubyコードをリンクできるように、使用しているRuby実装を変更する必要があります。 (純粋な静的コンパイラであるOpalなどの実装では不可能な実装もあります)。もちろん、すべてのRuby実装で実際にC拡張がサポートされているわけではありません。それらはYARVの非標準機能であり、動作することは保証されておらず、他の実装上に存在することさえありません。

関連する問題