2011-04-09 10 views
8

Según el official ruby About page es más fácil extender Ruby con C que con Perl. No soy un (perl) tipo XS, pero me resulta muy sencillo escribir algo rápido y simple con Inline::C, entonces, ¿por qué es más fácil en Ruby?¿Cómo es más fácil escribir una interfaz C en Ruby que en Perl?

escritura extensiones C en Ruby es más fácil que en Perl o Python, con un API muy elegante para llamar Rubí de C. Esto incluye las llamadas para incrustar Rubí en software, para su uso como un lenguaje de script. Una interfaz SWIG también está disponible.

Cualquier otra explicación de aquellos que hacen más extensiones C sería útil.

+5

Creo que esto tiene un gran potencial para degenerar en una pelea geek, Y no hay nada tan mezquino e inútil como una pelea geek. Y, por cierto, [ed] (http://www.gnu.org/fun/jokes/ed.msg.html) >> vi> emacs, Linux> FreeBSD, etc. –

+3

Todavía no hay una respuesta - - No hay necesidad de su especulación negativa de distracción. –

+4

Si desea que esto sea cualquier cosa menos totalmente subjetivo, tendrá que proporcionar más estructura que una declaración en una página de marketing. Tal vez reformule la pregunta? "Proporcione ejemplos de extensiones C que sean fáciles de escribir con Ruby". O tal vez incluso más simple ... "¿Cuál es un buen tutorial para extender Ruby con C?" – Schwern

Respuesta

12

(La revelación completa, soy un programador de Perl)

El Ruby C API sin duda se ve mucho mejor que Perl 's. Parece una biblioteca C normal con funciones que corresponden al código Ruby. La API de Perl es un desorden de macros dentro de las macros dentro de las macros y las banderas de enhebrado mágico. Usar la API de Perl fuera del núcleo Perl es ciertamente una preocupación secundaria. Ruby definitivamente gana al no ser intestino estremecedoramente aterrador.

Mientras Ruby tiene una mejor API C, Perl tiene los mejores tutoriales sobre cómo hacer algo con ella. La documentación de Ruby generada carece de cualquier tipo de tutorial cohesivo o, a menudo, de texto descriptivo. Es posible que esté buscando en el lugar equivocado but that's all that was offered. Por el contrario, la documentación de la API de Perl está escrita a mano en prosa con información útil sobre lo que hace cada función. Además, there's over a dozen documents in the core docs about using Perl and C. Yo diría que Perl gana en los documentos.

FFI parece bastante impresionante. Lo más parecido que Perl tiene a FFI es Inline::C, que es un envoltorio alrededor del lío de XS. Su uso principal es inline C code into your Perl program, pero también puede usarlo al access C library functions.

Aquí hay un ejemplo trivial similar al ejemplo de getpid de nash.

use Inline 
    C    => Config  => 
    ENABLE  => "AUTOWRAP"; 

use Inline C => q{ int getpid(); }; 

print getpid(); 

Ahora, yo estoy engañando porque los rendimientos técnicamente GETPID pid_t en mi sistema, pero eso es sólo un entero. Parece que FFI tiene muchísimo código especial para getpid, por lo que sospecho que su facilidad de uso corresponderá directamente a si FFI ya se ha ocupado de él. Los ejemplos triviales son triviales. Sería interesante ver qué sucede cuando surgen las complicaciones típicas, como las funciones que devuelven la memoria preasignada y tienen tipos impares y tiran estructuras.

Si bien FFI e Inline :: C se pueden utilizar para hacer lo mismo, la forma en que lo hacen se ve muy, muy diferente. Inline :: C en realidad está compilando y almacenando en caché el código C. FFI de alguna manera no está haciendo ninguna compilación. No estoy seguro de si eso es real, o si la compilación está hecha para usted en el momento de la instalación de las bibliotecas comunes.

Además, FFI alisa los problemas de portabilidad en las diversas implementaciones de Ruby y sus diferentes formas de llamar a API nativas. Esto es algo que Inline :: C no tiene que ver, y francamente es increíble si realmente funciona. Un beneficio es que la interfaz FFI es mucho más suave que Inline :: C. Con Inline :: C, está muy claro que estás escribiendo un compilador alrededor de un compilador de C.

+0

Niño, para alguien que dudaba en aceptar la pregunta tal como estaba redactada, este es exactamente el tipo de respuesta que estaba buscando. ¡Gracias! Lo aceptaré en unos días si no se ha dado algo tremendamente asombroso. –

+0

La respuesta de @nash proporcionó la estructura faltante. También FFI captó mi curiosidad. – Schwern

+0

Hay algunos proyectos de FFI para Perl ahora –

6

Con FFI es muy fácil de extender rubí con C. Este es un ejemplo de github

require 'rubygems' 
require 'ffi' 
module Foo 
    extend FFI::Library 
    ffi_lib FFI::Library::LIBC 
    attach_function :getpid, [ ], :int 
end 
puts "My pid=#{Foo.getpid}" 

No es necesario un compilador instalado en su sistema a ser capaz de ejecutar FFI extensiones . En Linux, tampoco necesita necesidad de instalar las versiones de desarrollo de las bibliotecas, solo las versiones en tiempo de ejecución . Por supuesto, las bibliotecas necesitarán que se haya compilado en algún momento, , pero es probable que no lo haya tenido que hacer .

https://github.com/ffi/ffi/wiki/why-use-ffi

+0

AFAIK, módulos similares están disponibles para Perl. –

+2

Sigo viendo personas que dicen que las FFI son MUY útiles, pero ¿cómo les va con los tipos de datos complejos del mundo real? Las funciones de envoltura de enteros y valores de coma flotante solo tienen un uso limitado. – tsee

+2

¿qué tipos complejos? [https://github.com/ffi/ffi/wiki/Structs](https://github.com/ffi/ffi/wiki/Structs), [https://github.com/ffi/ffi/wiki/ Enums] (https://github.com/ffi/ffi/wiki/Enums), [https://github.com/ffi/ffi/wiki/Types](https://github.com/ffi/ffi/ wiki/Tipos) –

Cuestiones relacionadas