Есть некоторые инструменты, которые помогают в такой ситуации (например, rake-compiler
gem), но я предпочитаю использовать RubyInline
gem.Он был разработан для замены медленных, критичных к производительности разделов кода Ruby реализациями на других языках (например, C поддерживается прямо из коробки), но он также используется для встроенного кода, который вызывает внешние библиотеки C.
AПример RubyInline выглядит следующим образом:
class MyClass
inline(:C) do |builder|
builder.include '<stdio.h>'
builder.c <<-END
void my_printf(char * string){
printf("%s\\n",string);
}
END
end
end
MyClass.new.my_printf("Abc")
# prints 'Abc'
Приятной особенностью RubyInline является то, что вам не нужно хранить отдельные файлы для C и Ruby, некоторые базовые преобразования аргументов поддерживаются "из коробки", и вы ненужно написать код склеивания.Плохо то, что у вас нет полного контроля над компиляцией и т. Д. Лично я считаю RubyInline очень мощным решением.