22 de Febrero, 2005

Objective-C también es sexy

Desde que vi en la universidad algo de Smalltalk, no había vuelto a experimentar la sensación de encontrarme con algo rematadamente bueno, que además no lo es porque a mi me lo parezca, sino porque alguien lo ha pensado así.

Supongamos que sabemos programar en C más o menos fluido. Imaginemos también que tenemos unos fundamentos razonables respecto al paradigma de programación orientada a objetos. Una vez que llegamos a ese punto, solo hay que imaginar que C++ no existe, y tendremos a muchos programadores felices desarrollando en Objective-C :D (la página tiene versión en español, pero es mucho más pobre).

No se puede hablar de Objective-C con propiedad sin hablar antes de Smalltalk. Pero bueno, me apetece hace las cosas mal, con lo que me limitaré a hacer algunas afirmaciones arbitrarias :P.

Objective-C es C, pero que le han añadido los mecanismos justos e indispensables para que permita la programación orientada a objetos (POO). No es como C++, que vuelve cabeza abajo todo el mundo del programador imperativo en C para poder llevar a cabo la POO. Simplemente se ha portado la simplicidad y flexibilidad del paso de mensajes existente en Smalltalk, y además se ha hecho muy bien.

[perro muerde: hueso];

Tan sencillo como eso: le pasamos el mensaje muerde con el parámetro hueso al objeto perro. Un ejemplo muy claro :).

Tengo que admitir que en su momento no le presté demasiada atención al lenguaje. Smalltalk me interesó más, y C++ por cuestiones prácticas (concretamente varias prácticas de la carrera).

Pero ahora todo es diferente, no solo mi situación personal ;).

Las máquinas son lo suficientemente potentes para ejecutar programas en lenguajes que están entre nosotros desde los años 80, pero que habían sido olvidados por ser demasiado para su época (no solo computacionalmente hablando, sino también desde el punto de vista de la metodología). Y además, en el caso de Objetive-C, una empresa importante lo ha elegido como principal herramienta de desarrollo para su sistema.

Mientras que C++ se diseñó para generar código eficiente para las máquinas, Objective-C se creó para facilitarle las cosas a los programadores. Tiene la fama de permitir realizar aplicaciones muy grandes en poco tiempo, aunque eso no lo puedo confirmar.

El punto clave es que el lenguaje emplea un runtime muy ligero, encargado de hacer que toda esa magia que corre sobre C simplemente funcione.

Por una parte es trivial emplear cualquier librería o código existente hecho en C (Objective-C es C, como he dicho), y por otra nos proporciona cosas que, por ejemplo, en C++ no son posibles. Como el tipado dinámico.

No podía ser de otro modo, tomado el modelo de paso de mensajes de Smalltalk. Es decir, la resolución de tipos se retrasa lo más posible, siendo viable incluso enviar un mensaje a un objeto que no lo soporta (entiende).

Es una de las características con las que más alucino, desde luego. Se puede enviar un mensaje a un objeto (todos bajo el tipo id), y si no sabe como interpretarlo, se puede reenviar a otro objeto que si sabe manejarlo. Esta relajación de tipos incluso permite hacer enlazado dinámico y añadir clases en tiempo de ejecución.

Se permite herencia múltiple en la especificación, es decir, una clase toma las características de varias clases base, mediante protocolos, de forma similar a lo que proporciona Java con sus intarfaces. Esto nunca lo he usado, mi experiencia con OO es mayoritariamente con C++ :(.

Se puede guardar un objeto en disco para recuperarlo posteriormente, lo que implica la posibilidad de serializar el paso de un mensaje y hacer invocaciones remotas (RPC) de forma trivial :o.

Pero no todo va a ser bueno, lamentablemente.

Objective-C no se usa tanto como otros lenguajes, y tampoco hay tantos compiladores como de C++. La industria elige, y muchas veces manda. No hay demasiados recursos dedicados especificamente.

El viaje del lenguaje ha ido siempre muy ligado a los sistemas de NeXT. Primero NeXTSTEP, luego OpenStep, y ahora GNUstep y, en cierto grado, MAC OS X. El principal recurso de Smalltalk es su espléndido conjunto de clases, y gracias a estos sistemas podemos encontrar con fundaciones de clases de gran calidad y, en muchos casos, bastante compatibles entre ellas. De hecho, si nos ceñimos a la especificación de OpenStep, conseguiremos que nuestro programa sea portable entre las diferentes fundaciones.

Finalmente comentar que Objective-C está incluido en la suite de compiladore de GNU (gcc) desde hace años (el mismo RMS implementó el segundo runtime que se empleó), lo cual es un gran aliciente :).

Como he sido algo desordenado, y seguro que me he dejado muchas cosas, aquí quedan un par de enlaces por si alguien tiene la suficiente curiosidad (y osadía :D) por echarle un vistazo:

Rápido, antes de que sea demasiado tarde.

Anotación por Juan J. Martínez.

Hay 2 comentarios

Gravatar

Llevo leyendo tu blog un huevo de tiempo, es uno de mis blogs favoritos y esta es la primera vez que escribo.

¿Implementa Objetive-C mecanismos de genericidad como las poderosas templates de C++ (adquiridas recientemente por Java y C#)?

Una cosa que no he entendido es lo del tipado dinámico ¿Puedes explicarlo o darme algún enlace?
¿Te refieres a lo que en C++ es dynamic_cast?

Gracias

por un visitante, en 2005-02-24 22:40:59

Gravatar

En realidad no son necesarios las templates, y es gracias al tipado dinámico.
Gracias al tipo id, que se usa para referirse a cualquier clase de objeto (!) -una instancia y punto, porque en objc una clase es solo un tipo de objeto-. De esta forma puedes tener una lista de objetos (id), y dependiendo del objeto... pues será una lista de una cosa u otra. Aún así puedes hacer uso del tipado estático, y sería muy como C++, ojo.
Resumiendo... gracias al tipado dinámico podemos manejar objetos, indistintamente del tipo que sean, como objetos, y además a una velocidad considerable, porque se retrasa el decidir qué es qué hasta el último momento :)
Espero haberme explicado un poco, estos conceptos también son nuevos para mi. Te recomiendo echar una ojeada rápida a cualquiera de los dos enlaces que comento en la anotación.
¡Gracias por el comentario!

por Juanjo, en 2005-02-24 23:11:37

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.