RubyCocoa es un framework para macOS que proporciona un puente entre los lenguajes de programación Ruby y Objective-C , permitiendo al usuario manipular objetos Objective-C desde Ruby, y viceversa. Permite escribir una aplicación Cocoa completamente en Ruby, así como escribir una aplicación que combine código Ruby y Objective-C. [ 1 ] Un proyecto de Apple llamado MacRuby estaba en desarrollo para reemplazar a RubyCocoa en 2008. [ 2 ] Posteriormente, en 2012, se lanzó un spin-off propietario llamado RubyMotion , disponible para iOS, macOS y Android. [ 3 ]
RubyCocoa se utiliza para explorar las características de un objeto Cocoa con irb de forma interactiva, crear prototipos de una aplicación Cocoa, escribir una aplicación Cocoa que combine las características de Ruby y Objective-C, y encapsular la interfaz gráfica de usuario nativa de macOS para un script Ruby. [ 4 ]
RubyCocoa es software libre , publicado bajo la licencia Ruby y la LGPL . [ 1 ]
Historia
RubyCocoa fue creado en 2001 por Hisakuni Fujimoto, quien implementó un módulo de extensión de Ruby para encapsular las funciones NSObject y NSClassFromString. Posteriormente, se integró con Project Builder (que más tarde se convertiría en Xcode ). En 2002, el proyecto se registró en SourceForge y el equipo de desarrollo comenzó a crecer.
En 2006, se unió a la lista de colaboradores un desarrollador de Apple , Laurent Sansonetti, y posteriormente se realizó una presentación de RubyCocoa durante la WWDC . Apple declaró que RubyCocoa se incluiría y sería compatible con Mac OS X v10.5 “Leopard”.
En agosto de 2008, Sansonetti confirmó que MacRuby "está destinado a reemplazar a RubyCocoa" en el futuro. [ 5 ]
Funcionalidad
RubyCocoa a veces se interpreta como un conjunto de enlaces a los frameworks de Cocoa, lo cual es falso. RubyCocoa es un verdadero puente entre los lenguajes de programación Objective-C y Ruby.
Importación de clase perezosa
RubyCocoa importará las clases de Objective-C al entorno Ruby cuando sea necesario. Por ejemplo, al acceder a una clase OSX::NSTableViewpor primera vez en tu código, RubyCocoa recuperará toda la información necesaria del entorno de ejecución de Objective-C y creará una clase Ruby con el mismo nombre que actuará como proxy. De la misma forma, importará todas las clases heredadas.
Reenvío de mensajes
Cada vez que el usuario envía un mensaje Ruby a un objeto proxy, RubyCocoa intentará reenviarlo a la instancia de Objective-C integrada, traduciendo el nombre del mensaje a un selector de Objective-C y solicitando al entorno de ejecución de Objective-C que lo reenvíe.
Si se produce una excepción en el entorno Objective-C, RubyCocoa la convertirá en una excepción de Ruby y te la reenviará.
RubyCocoa utiliza la biblioteca libffi para llamar a las implementaciones de los métodos de Objective-C.
Anulación automática de métodos
RubyCocoa facilita la sobrescritura de un método de Objective-C desde Ruby, ya sea en una subclase o directamente en la clase (como se haría en Objective-C utilizando una categoría).
Una vez insertado su método, RubyCocoa recuperará la firma del método Objective-C existente e inyectará uno nuevo en el entorno de ejecución de Objective-C, con la misma firma, pero que ahora apunta a su código.
Para lograr esto, RubyCocoa utiliza la biblioteca libffi para crear dinámicamente un cierre que llamará al método Ruby, y simplemente pasa un puntero a ese nuevo cierre al entorno de ejecución de Objective-C.
Acceso a los bits C
Debido a la naturaleza del lenguaje Objective-C, se puede utilizar C libremente desde código Objective-C. Para conectar las partes relevantes de C de un framework Objective-C, como estructuras, funciones, enumeraciones, constantes y más, RubyCocoa se basa en el proyecto BridgeSupport .
RubyCocoa interpretará en tiempo de ejecución los archivos BridgeSupport (utilizando xmlTextReader de libXML 2) y gestionará su contenido en consecuencia. Por ejemplo, construirá las clases proxy de Ruby para las estructuras de C y también creará las funciones.
Cabe señalar que las operaciones costosas, como la localización de los símbolos, se realizan bajo demanda y, obviamente, solo una vez.
Cadenas de formato
RubyCocoa es capaz de detectar las API que utilizan cadenas de formato, como NSLog o NSString.stringWithFormat, y convertir adecuadamente los argumentos variables a los tipos especificados en la cadena de formato.
Punteros a funciones
RubyCocoa permite pasar Procobjetos Ruby como argumentos de puntero a función. A continuación, utiliza la biblioteca libffi para crear dinámicamente un cierre y pasarlo a la función o método subyacente.
Creación de aplicaciones Cocoa escritas en Ruby
Al instalar RubyCocoa, también se instalan automáticamente las plantillas de Xcode correspondientes . Esto permite a los desarrolladores seleccionar "Aplicación Cocoa-Ruby" como tipo de proyecto de Xcode, y Xcode generará todos los archivos necesarios.
Cómo llamar a métodos de Objective-C desde Ruby
Para invocar un método de Objective-C, se reemplazan todos los dos puntos del nombre del método, excepto el último, por un guion bajo. Así, por ejemplo, el método de instancia de NSWindow initWithContentRect:styleMask:backing:defer:se convierte en initWithContentRect_styleMask_backing_defer.
Todas las clases y funciones de Cocoa pertenecen a OSXun módulo, por ejemplo, el código Objective-C:
[[ NSWindow alloc ] initWithContentRect : frame styleMask : NSTitledWindowMask backing : NSBackingStoreBuffered defer : NO ]se convertirá en:
OSX :: NSWindow . alloc . initWithContentRect_styleMask_backing_defer ( frame , OSX :: NSTitledWindowMask , OSX :: NSBackingStoreBuffered , false )Como puede verse, esto disminuye la legibilidad del código al hacer que la nomenclatura de parámetros de Objective-C sea inútil. Por lo tanto, existe otra forma conveniente de escribir las llamadas a métodos: el objc_sendmétodo que acepta símbolos de Ruby como nombres de parámetros. Por ejemplo, el código anterior también se puede escribir como:
OSX :: NSWindow . alloc . objc_send ( :initWithContentRect , frame , :styleMask , OSX :: NSTitledWindowMask , :backing , OSX :: NSBackingStoreBuffered , :defer , false )Ventajas de RubyCocoa
- Como Ruby es un lenguaje interpretado, no es necesario recompilar la aplicación con frecuencia durante el desarrollo.
- Algunas de las funciones avanzadas de Ruby, como la compatibilidad integrada con expresiones regulares , hacen que escribir el código sea más rápido y también convierten a RubyCocoa en una herramienta ideal para la creación de prototipos.
Desventajas
- Sin tener en cuenta la velocidad del intérprete de Ruby, las aplicaciones RubyCocoa siempre serán más lentas que las aplicaciones Objective-C/Cocoa debido a la sobrecarga adicional que supone la conversión de objetos.
- Dado que Ruby no es seguro para subprocesos, no es posible enviar múltiples subprocesos nativos para ejecutar código RubyCocoa. Sin embargo, se pueden utilizar los subprocesos emulados de Ruby.
Referencias
- 1 2 "Archivo: RubyCocoa - Un puente Ruby/Objective-C — Documentación de RubyCocoa" . rubycocoa.github.io . Recuperado el 18 de diciembre de 2024 .
- ↑ "Foros pragmáticos | ¿MacRuby cambia las reglas del juego?" . 2 de abril de 2010. Archivado del original el 2 de abril de 2010. Consultado el 18 de diciembre de 2024 .
- ↑ "Acerca de RubyMotion | RubyMotion" . rubymotion.com . Consultado el 18 de diciembre de 2024 .
- ↑ "Ruby y Python en OS X" . developer.apple.com . Consultado el 18 de diciembre de 2024 .
- ↑ "Pragmatic Bookshelf: By Developers, For Developers" . pragprog.com . Consultado el 18 de diciembre de 2024 .
Enlaces externos
- Página de RubyCocoa en SourceForge
- Herramientas de programación de macOS
- Ruby (lenguaje de programación)