Squeak, el Smalltalk del Siglo XXI

Artículo publicado originalmente en la revista de Universal Thread en el número de Octubre 2003.

Smalltalk es objetos puros, una tecnología nacida hace casi 30 años en los laboratorios Xerox de Palo Alto (PARC) y que hoy se mantiene vigente, aunque no ha ganado las masas de programadores ni las corporaciones. Sin embargo su paradigma de trabajo es quizás lo mejor que existe para modelar la realidad de cualquier dominio que se quiera resolver mediante software.

Este artículo intentará mostrar las características principales (y únicas) de Squeak, un Smalltalk portable y de código abierto, cuya máquina virtual (VM) está escrita enteramente en Smalltalk. Además, se comentarán brevemente características generales de cualquier Smalltalk.

Introducción

Cualquier Smalltalk no es simplemente un lenguaje de programación, sino que es un lugar donde viven cosas y tiene un lenguaje. Cada cosa en Smalltalk es un objeto y todo en este mundo trabaja con la metáfora objeto - mensaje.

Cualquier Smalltalk, también Squeak, está compuesto de una VM (máquina virtual) específica del sistema operative donde corre y una imagen.

La imagen es el lugar dónde los objetos viven, objetos del ambiente como el compilador, el debugger, etc. y los objetos del dominio de la solución. (En algunos casos, los objetos del dominio pueden residir en bases de objetos o, (no recomendable pero posible) en bases de datos relacionales.

Las imágenes son intercambiables entre VM's, esto significa, entre sistemas operativos.

Todo el código de este artículo fue desarrollado y testeado en un Mandrake 9.1 (Kernel 2.4.21) corriendo Squeak 3.5 image 5180 (Y VM nivel 3.4-1 para Linux). Sin embargo, también fue testeado en Windows XP en el mismo equipo (equipado con dual boot) y en este último se tomaron las imágenes que acompañan al presente.

El ambiente de desarrollo completo, para cualquiera de los sistemas operativos soportados, puede ser descargado de http://www.squeak.org.

Cómo arrancar Squeak

La instalación de Squeak está fuera del alcance de este artículo, pero es muy simple en Windows, ya que sólo se debe descomprimir el contenido completo del zip que se descarga en un directorio y doble click al ejecutable.

En el caso de Linux se deben instalar los paquetes de acuerdo a la distribución que se tenga o compilar la VM (este es el camino más difícil).

Luego de instalar Squeak podemos desarrollar un simple script para arrancar Squeak, por ejemplo:

#!/bin/sh /usr/local/bin/squeak /home/garduino/squeak35/squeak35.image

Luego, se puede crear un link a este script para colocar en el escritorio. Por supuesto, con los permisos correspondientes.

Si todo funciona correctamente, verá algo como lo siguiente:

Squeak

Luego de un poco de trabajo (también fuera del alcance de este artículo) se puede obtener un Squeak mas confortable y amigable, como este:

Squeak más cómodo

Cómo evaluar código

En la jerga del Smalltalk evaluar código significa algo así como ejecutar. Un objeto llamado workspace permite ejecutar código Smalltalk y otro, llamado transcript, muestra la salida.

Abrimos un workspace presionando Alt+k o en el menú World (click izquierdo en el World, el lugar principal de la imagen), seleccionando open y luego workspace. También abrimos un transcript desde el menú World: open - transcript o presionando Alt+t.

Una pequeña pieza de código para probar.

Escriba en el workspace:

Transcript show: 'Hello World'; cr.

Seleccione lo escrito y presione ambos botones del mouse juntos (sólo el derecho si está en Windows) y elija do-it, como en:

Evaluación de código

En pocas palabras, le estamos diciendo al objeto transcript que muestre el string 'Hello World', usando el mensaje show: y que luego envíe un retorno de carro.

Algunos ejemplos sorprendentes

Factorial de un número grande: Luego de la muy breve introducción anterior, es tiempo de ver números en Squeak. Para ello tipeamos en el workspace lo siguiente: (Recordar que en Smalltalk cada sentencia finaliza con un punto).

1000 factorial.

y la evaluamos, pero usando "print-it" en lugar de "do-it".

¿Resuelto muy rápido, verdad? pero ¿cuán rápido? Pruebe lo siguiente (evaluándolo con "print-it"):

Time millisecondsToRun: [1000 factorial].

Como se puede deducir, estamos enviando al objeto Time el mensaje "millisecondsToRun:", es decir el tiempo empleado en ejecutar el bloque de código que le sigue (1000 factorial, en este caso). El resultado es 30 y es sólo 4000 para calcular el factorial de 10000 en una vieja Pentium III de 500 Mhz y 128 MB de RAM. No muchos entornos de desarrollo son capaces de producir estos resultados!

¿Squeak habla?

Un original 'Hello World': Cerciórese de tener convenientemente ajustado el volumen de sonido de su computadora y escriba en un workspace:

Speaker man say: 'Hello World'.
Speaker woman say: 'Hello World'.

y evalúe cada una.

Utilizando este paquete, text2speech, hecho en Squeak, desarrollaremos un simple WebReader (o LectorWeb).

¿Qué significa 'WebReader'? Resumidamente, lo siguiente:

  • El usuario apunta una URL
  • Entonces WebReader navega esa URL, examina la home page y busca un tag html title.
  • Si no encuentra el tag, entonces WebReader dice: 'Esta página no tiene un título'.
  • Si encuentra el tag title, entonces lo examina buscando la palabra Squeak, y si no la encuentra, entonces WebReader dice: 'Esta página no habla sobre Squeak'.
  • Si la palabra Squeak existe en el tag title, entonces WebReader lee en voz alta el title completo.

Puede ser más complejo parsear toda la página, a causa de las tablas, y otras cosas como flash, css, frames, etc, pero con más trabajo es perfectamente posible.

Primeros pasos en el desarrollo de WebReader

En Smalltalk, la primer cosa a realizar es lo que se llama el 'modelo', el corazón del software, sin interfaz de usuario.

Un programador puede trabajar como prefiera en Smalltalk, pero una muy buena metáfora es la llamada 'MVC', model-view-controller, que establece la separación e independencia entre el código kernel y la presentación e interfases de usuario. Esto permite cambiar la interfase sin afectar la lógica del sistema.

Detalles de 'MVC' están fuera del alcance de este artículo, pero se menciona por la importancia que tiene en el desarrollo de software, principalmente en el mundo Smalltalk y es altamente recomendable que cualquier programador lo domine a la perfección. Un paso en este sentido es estudiar patrones de diseño, también un tema fundamental para crear arquitecturas de sistemas robustas y durables.

Un patrón muy usado en el 'MVC' es el denominado Observer, y esto es todo lo que diré en este artículo sobre este tema.

Lo primero para comenzar es crear un nuevo proyecto Morphic, Menú World - open - morphic project. Morphic es un framework gráfico para trabajar en Squeak.

El nuevo proyecto es creado como 'unnamed', click con el mouse sobre 'unnamed' y tipee el nombre deseado, WebReader en este caso. Click en el proyecto y un nuevo world se abre.

Menú world - open - browser o Alt+b abre el Examinador (más conocido como Browser) de Clases, la herramienta más usada por cualquier smalltalker.

En la mitad inferior del browser se tipea el código de la nueva clase WebReader, haciéndola una subclase de Model u Object (Model es necesario para usar el antes mencionado paradigma MVC), asignando la nueva categoría WebReader y colocándole las variables de instancia url, urlPage, parsedPage y pageTitle. Luego de tipeado todo lo indicado, se presionan ambos botones del mouse juntos (o derecho si es Windows) y seleccionamos accept, como se muestra a continuación:

Escribiendo código

Ahora ya tenemos la nueva clase WebReader en nuestra imagen de Squeak.

Cada variable de instancia (algo así como las propiedades de los objetos) debe tener sus métodos de acceso (uno para para asignarle valor y otro para leer el valor de esa variable de instancia).

Squeak tiene una preferencia que permite la generación automática, cuando es necesario, de los métodos de acceso. Desde el menú World - appearance - preferences - tipee (en la caja de textos con fuentes de color rojo) autoacc y presione Enter. Entonces seleccione la característica Autoaccessors.

Luego de hecho lo anterior, Squeak preguntará para crear cada accesor necesario la primera vez que un objeto necesite leer o grabar en una variable de instancia.

Obviamente, Squeak crea los accessors en un modo genérico, si el programador necesita código más especializado, debe sobreescribir lo que generó Squeak.

Los accessors creados, por ejemplo, para url, son:

url
   ^ url

Es el accesor de lectura, ^ es el símbolo que indica que retorna o devuelve el objeto cuyo nombre le sigue, en este caso url.

url: anObject
   url := anObject

En la primer línea los dos puntos significan que recibe otro objeto (en este caso anObject) como parámetro, en la segunda := es el símbolo de asignación, significa que a url es asignado anObject, entonces url = anObject. En ocasiones, en lugar de := se usa <-

Algunos accessors modificados:

parsedPage: anObject
parsedPage := HtmlParser parse: anObject

La última sentencia significa que parsedPage obtiene su valor como el resultado de la expresión a la derecha de :=, es decir HtmlParser parse: anObject.

El método parse: de HtmlParser recibe anObject (el objeto que deseamos parsear), entonces el contenido de parsedPage es el resultado de aplicar el método parse: del objeto HtmlParser al objeto que le pasamos (la página web, en este caso).

HtmlParser es un objeto que también vive en la imagen Squeak. Abrir la imagen es como abrir el viejo baúl de la abuela, que está repleto de cosas insólitas e interesantes. Así, dentro de una imagen Squeak, encontraremos el compilador, el debugger, un navegador de internet, un cliente de mail, scripting, herramientas para trabajar con objetos 3D, objetos para conectividad y redes, en fin........miles de cosas listas para usar.

urlPage: anObject
urlPage := HTTPSocket httpGetDocument: anObject

Aquí el HTTPSocket httpGetDocument: anObject obtiene el objeto anObject desde la web y lo asigna a urlpage.

También HTTPSocket es un objeto que vive en la imagen de Squeak. Todos los objetos que viven en la imagen pueden, obviamente ser modificados o usados para generar subclases de los mismos (Herencia).

Intente escribir los métodos en la mitad inferior del browser y acéptelos, como se muestra a continuación:

Aceptando

¡Probando el código!

Abra un workspace (desde el menú World o presionando Alt+k) y escriba: x := WebReader new.

Evalúelo con ald+d, alt+p o desde el menú. Esto crea una nueva instancia de WebReader llamada x.

Ahora evalúe lo siguiente: x url: 'http://localhost'.

Como un objeto que hereda de WebReader, x tiene las mismas variables de instancia y métodos que WebReader, entonces estamos asignando 'http://localhost' a la variable de instancia url. Para el ejercicio, debe tener un localhost con algún servidor web corriendo en su máquina.

Luego evalúe: x urlPage: x url.

Recupera la página apuntada por url. Luego evalúe: x parsedPage: x urlPage.

Aquí estamos pasando a parsedPage: el retorno de urlPage (recuerde que urlPage se devuelve a si misma, aquí la página recuperada en el paso anterior).

A continuación evalúe en el workspace, con Print It o Alt+p: x parsedPage contents.

Lo anterior nos muestra la página recuperada, como una OrderedCollection (Un tipo de colección de las que maneja cualquier Smalltalk, Squeak en este caso). También podemos probar otras herramientas muy útiles de Squeak: x parsedPage explore. x parsedPage inspect.

Ambas son muy usadas para ver objetos y su contenido.

A continuación examinaremos la OrderedCollection buscando el tag title, código que no se incluye aquí, y pueden ocurrir varias cosas diferentes:

  1. La página no tiene un tag title, entonces nuestro programa debe hacer algo así (evalúe lo siguiente en el Workspace):
    Speaker manWithHead say: 'La página no tiene un título'.

    ó

    Speaker manWithHead say: 'Esta página no habla sobre Squeak'.

    Speaker necesita el sonido funcionando apropiadamente en su computadora.

  2. La página tiene un tag title:

    Entonces, debemos examinar este tag buscando la palabra Squeak, código que tampoco se incluye aquí. Si la encuentra, entonces podemos recuperar el tag title completo y guardarlo en alguna variable, por ejemplo xTitle.

    Con fines de prueba, suponga que el tag title es algo así como: 'Squeak es el Smalltalk del Siglo Ventiuno', entonces debemos evaluar:

    xTitle := 'Squeak es el Smalltalk del Siglo Ventiuno'.

    y a continuación

    Speaker manWithHead say: xTitle.
    Squeak respondiendo

    Si el tag title no contiene la palabra Squeak, entonces nuestro programa hará lo siguiente:

    Speaker manWithHead say: 'Esta página no está relacionada con Squeak'.

No muchos lenguajes y ambientes de desarrollo permiten hacer este tipo de cosas tan fácilmente como Squeak y usando real tecnología de objetos (no sólo orientación a objetos).

Esta aplicación puede ser completada desarrollando una GUI, o guardando objetos en la imagen (armando una pequeña base de conocimientos sobre urls visitadas y sus títulos), etc.

Todo puede ser desarrollado usando el mismo estilo de trabajo con objetos.

¿Qué otras aplicaciones existen en Squeak?

Hoy en día Squeak es un producto que tiene una muy activa comunidad que se ocupa tanto del mantenimiento y evolución del ambiente como de desarrollar diversos productos adicionales en Squeak. Una forma fácil de ver la cantidad de software disponible para usar en Squeak es desde el World menú, open - Package Loader, lo que nos presenta esta utilidad que permite instalar, actualizar y desinstalar paquetes. Aquí podemos observar que existen Servidores web, un framework para aplicaciones web, un cliente VNC, múltiples aplicaciones de manipulación de gráficos y multimedia, Criptografía, Cliente DNS, Cliente IRC, Framework de mapeo de objetos a relacional, cliente MAPI, Bases de Objetos, ODBC, cliente MySQL, Cliente PostgreSQL, Lector de PDFs y un largo etcétera.

Por otra parte Squeak corre en múltiples plataformas, incluyendo PDAs y es posible utilizarlo para desarrollar un amplio abanico de aplicaciones, por ejemplo: aplicaciones de negocios, web, multimedia, embedded, de control de hardware y dispositivos, todo usando objetos, lo cual nos brinda una ventaja diferencial al momento de mantener y hacer evolucionar el software.

Consecuentemente con uno de los principios de diseño de Smalltalk enunciados por Dan Ingalls hace muchos años, que dice que el sistema operativo es algo que no debiera existir, también existe un proyecto llamado SqueakNOS (en SourceForge) para desarrollar lo que se dió en llamar Squeak No Operating System, es decir un Squeak que controle directamente el hardware donde corre, sin necesidad de un sistema operativo.

También y como un ejemplo más, Squeak se puede usar como el gestor de ventanas de cualquier Linux, reemplazando a Gnome, KDE o el que sea, utilizando algunos de los módulos que se pueden cargar del Package Loader.

Soprendente, ¿verdad?

Algunas urls interesantes:

Otros Smalltalks:

Conclusión

Este artículo pretendió ser una introducción breve y concreta al mundo de los objetos y Smalltalk, particularmente Squeak. Si luego de su lectura, al lector le queda la curiosidad para seguir investigando Smalltalk, el objetivo de quien lo escribió estará cumplido.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP