2016-12-26 55 views
0

我正在使用Ruby,並意識到如果能夠使用某些內置的gcc函數(以及x86架構內置插件),這將是非常有益的。看起來不得不寫一個擴展名來使用它們是不切實際的,所以我想知道是否有一種方法可以調用內置函數。例如,如果我想叫int __builtin_popcount(unsigned int),在Ruby中的數字,是有辦法,我可以以某種方式做如何在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,你可以用C擴展封裝libgcc,併爲它設計一個Ruby API。

如果要使用GCC動態生成本機代碼,那目前不可能AFAIK。有一個基於GCC的JIT編譯器庫的項目,但我不知道它的狀態是什麼。你可以將庫換成C擴展,併爲它設計一個Ruby API。無論如何,您還必須修改您正在使用的Ruby實現,以便將動態生成的本機代碼與Ruby代碼鏈接起來。 (並且在某些實現上根本不可能,例如在Opal上,這是一個純靜態編譯器)。

當然,並非所有的Ruby實現實際上都支持C擴展;它們是YARV的一個非標準特性,不能保證在其他實現中工作或存在。

相關問題