2016-12-26 5 views
0

저는 루비에서 일하고 있는데, 내장 된 gcc 함수 (및 x86 아키텍처 빌트인도 마찬가지입니다)를 사용할 수 있다는 것이 엄청난 도움이된다는 것을 깨달았습니다. 이것들을 사용하기위한 확장 기능을 작성하는 것은 비실용적 인 것처럼 보입니다. 그래서 내장 함수를 호출 할 수있는 방법이 있는지 궁금합니다. 내가 루비의 숫자에 int __builtin_popcount(unsigned int)를 호출하려는 경우 예를 들어, 어떻게 든 할 수있는 방법이Ruby에서 빌트인 컴파일러 함수를 호출하려면 어떻게해야합니까?

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

나는 분명히 기본적인 일을 할 수 있다는 것을 알고 있지만 방법이 그 루비에 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를 디자인 할 수 있습니다. 어쨌든 동적으로 생성 된 네이티브 코드를 루비 코드와 연결할 수 있으려면 사용중인 루비 구현을 수정해야합니다. (순수 정적 컴파일러 인 Opal과 같이 구현할 수없는 일부 구현에서는)

물론 모든 Ruby 구현이 실제로 C 확장을 지원하지는 않습니다. YARV의 비표준 기능이며 다른 구현에서 작동하거나 심지어 존재할 수도 없습니다.

관련 문제