2016-12-26 3 views
0

Я работаю в Ruby и понимаю, что было бы невероятно полезно использовать некоторые встроенные функции gcc (а также встроенные встроенные архитектуры архитектуры x86). Кажется, что нужно написать расширение для использования, это непрактично, поэтому мне было интересно, есть ли способ, который я мог бы назвать встроенными. Например, если бы я хотел назвать int __builtin_popcount(unsigned int), на число в Ruby, есть способ, которым я мог бы как-то сделатьКак я могу вызвать встроенную функцию компилятора в Ruby?

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

Я знаю, что я, очевидно, не может сделать что-то, что основное, но есть способ, который Я мог бы включить встроенные встроенные модули gcc и x86 в Ruby?

+0

Вы можете связать код C или C++ с [FFI] (https://github.com/ffi/ffi). Нет никакого способа сделать это внутренне без расширения. Помните, что Ruby не обязательно имеет какое-либо отношение к 'gcc'. Например, JRuby не имеет никакой связи, и это не редкость для того, чтобы «clang» был back-end во многих современных системах. – tadman

ответ

1

Не совсем понятно, что вы хотите сделать.

Если вы хотите позвонить в GCC, вы можете обернуть libgcc в расширении C и разработать для него Ruby API.

Если вы хотите генерировать собственный код с помощью GCC динамически, в настоящее время это невозможно AFAIK. Существует проект для библиотеки компилятора JIT на основе GCC, но я не знаю, каков его статус. Вы можете обернуть библиотекой в расширение C и разработать для нее Ruby API. Во всяком случае, вам также придется изменить используемую вами реализацию Ruby, чтобы иметь возможность связать динамически сгенерированный собственный код с вашим кодом Ruby. (И на некоторых реализациях, которые просто невозможны, например, на Opal, который является чистым статическим компилятором.)

И, конечно, не все реализации Ruby фактически поддерживают расширения C; они являются нестандартной функцией YARV и не гарантируются для работы или даже существуют в других реализациях.

Смежные вопросы