english version

Engendrando un Smalltalk.

Alejandro F. Reimondo
Documento en zipeado (download)

Introducción:

El valor más importante de un Smalltalk radica en que es un Ambiente de Objetos (AO). Entendiendo por Ambiente de Objetos a un lugar donde hay cosas.
Esto permite el estudio de la informática usando técnicas de manipulación; las cuales son usadas por un individuo desde edades muy tempranas.
El entendimiento de esta diferencia modifica a la persona que usa un Smalltalk y la dificultad que se encuentra normalmente en el aprendizaje algunas personas, es debido a que, por lo general, no se espera tanto del software.

Una vez que se entendió que un Smalltalk es un lugar, que las cosas están contenidas en él y además relacionadas haciendo al ambiente en su totalidad "estable"; es más fácil entender que además estas cosas evolucionan de manera interactiva procurando una evolución general del ambiente.
Por lo general la evolución trae consigo una mejora general...

Entonces tenemos en un Ambiente de Objetos un tarro donde colocamos cosas y vemos como se desarrollan gracias a la interacción con nosotros o entre ellas mismas.
Estos Ambientes de Objetos se nutren de la inteligencia aportada por los seres humanos que lo utilizan y refinan. Las técnicas de reuso y programación permiten el agregado de inteligencia de manera incremental a medida que es necesaria, ya sea, para el agregado de nuevos conceptos y objetos como para mantener la estabilidad general.
Debido a que el hardware actual no permite (de forma practica) la vida constante de una pieza de software (actualmente el soporte de base es inestable y cada vez más complejo) en Smalltalk se usa desde hace mucho tiempo el concepto de "snapshot" o "image" (imagen). Lo que se logra es "congelar" a todo el ambiente en el estado en que se encuentra y guardarlo en un almacenamiento pasivo, para mas tarde volverlo a la vida. En este documento usaremos la palabra "imagen" para denominar al conjunto de objetos que determina un Smalltalk en un determinado instante.
Dentro de una imagen se encuentran un gran numero de objetos, y es común que estos representen a varios subsistemas que coexisten dentro del mismo mundo.
Definimos como subsistema (máquina u organismo) a un conjunto de objetos que se relacionan de manera autónoma; teniendo como propiedad más relevante la característica de existir por un periodo de tiempo interesante. El subsistema podrá cambiar para subsistir.

Por lo general, los subsistemas no son independientes, sino que cambios en un sistema pueden generar cambios en otros.
También ocurre que cambios en un sistema afectan al medio en que se encuentra; y cambios en el medio afectan a los sistemas que lo forman. La ola de cambios tiende a disminuir de intensidad en el tiempo de manera proporcional a la antigüedad/estabilidad del medio.

Clonación

La forma de trabajo tradicional en Smalltalk es comenzar a trabajar a partir de una imagen inicial y hacerla evolucionar hasta reflejar el ambiente deseado.
Aquí es donde uno se pregunta:
Cómo se obtiene esa imagen inicial?

La respuesta es simple: ya esta hecha, solo hay que copiarla.
El medio informático actual posee una característica notable, nos permite duplicar sin perdidas, fácilmente.
La persona inquieta nunca deja de preguntarse; pero... como se obtuvo esta imagen de la que partimos? Y la anterior?
La primera imagen como se obtuvo?

La primera imagen se construyó objeto por objeto, se los relacionó. Esta imagen tenia muy pocos objetos.
Allá por la década del 70 se generó la primera imagen Smalltalk a partir de un conjunto pequeño de objetos y luego esta se fue haciendo crecer y crecer hasta llegar a las imágenes que usamos hoy en día.
En las imágenes actuales hay objetos que estaban en aquellas primeras imágenes; sí, claro mucho más viejos y robustos!
El tema es que a partir de aquellos días hemos usado la facilidad de la copia para obtener clones de esa imagen inicial.
Cada etapa de la evolución de Smalltalk pasó por un refinamiento de una imagen inicial, hasta llegar a un grado estable como para ser distribuida como nueva imagen inicial.
El principio generalmente aceptado como punto de partida es la clonación.
El modelo de propagación por clonación es un modelo horizontal; de manera que es de un alto índice de contagio, pero propenso a propagación descontrolada. (Por lo general la propagación horizontal presenta estas características y nunca llegan al equilibrio, salvo fuerzas externas que controlen su reproducción)

La Red


La red nos propone un nuevo medio de propagación de información; la red nos permite tener un espacio virtualmente infinito.
Si la imagen representaba un Mundo de objetos, la red nos permite tener un Universo de objetos.
La técnica de clonación era satisfactoria para el trabajo unipersonal con un ambiente de objetos, aunque algo inadecuada para trabajo grupal.
Son conocidos los inconvenientes del trabajo grupal en Smalltalk en varios mundos con la técnica de "snapshots". Por eso es común ver que por lo general se proponen técnicas de armado individual y ensamblado de subsistemas (por medio de interfaces) o la centralización de servicios (como en el caso de bases de objetos con un servidor centralizado).

Cómo propagar Smalltalk?


Intentamos encontrar una forma más "natural" de generación de imágenes (mundos de objetos). Con "más natural" queremos decir, menos ideal, más dinámica y en lo posible con la posibilidad de errores e imperfecciones.
Asumimos que, aunque el universo de objetos es infinito, seguiremos trabajando con imágenes Smalltalk, aunque con la salvedad de que estas puedan "reproducirse" por propagación vertical (padre-hijo).
La idea es generar una semilla dentro de un mundo Smalltalk.
Esta semilla[embrión] contiene casi nada, solo la posibilidad de colocar algún objeto dentro de ella.
En el momento que colocamos un objeto en ella este objeto deberá tratar de vivir dentro de ella.
Para poder vivir (funcionar o como lo quieran llamar), el objeto deberá conocer cosas que aun no se encuentran dentro de la semilla. Deberá aprender cosas que aún no tiene.
La semilla, que será un mini-Smalltalk/mini-Mundo dentro del padre/madre. Con la diferencia que no tiene nada y todo lo que necesite lo obtendrá nutriéndose del padre.
Esta semilla/embrión es un subsistema y para funcionar ira nutriéndose (y aprendiendo) del padre gracias a la migración transparente de clases (métodos, etc.) del Smalltalk padre.
Una vez que tenemos los objetos deseados en el embrión y este ya "aprendió" lo suficiente del padre (y sea autónomo), podremos sacarlo del padre! Así luego del nacimiento se transformará en un Smalltalk con SOLO lo que necesita para vivir, pero habiendo heredado el patrón genético del padre.

Hay varias cosas interesantes en este esquema:

  1. Probablemente se generen images mucho más chicos y menos riezgosos que los obtenidos por shrinking (recortando lo que no se necesita).
  2. Tendríamos un esquema de generación de Smalltalks por gestación, herencia y con el concepto de patrones genéticos heredados del padre! (esto posiblemente nos cambie la óptica respecto del software, una vez mas :-)
  3. Es un esquema tentador para Internet. No solo tendríamos images movibles y autónomos sino que además podríamos encapsular objetos en mini-imágenes que migren de maquina para ir aprendiendo etc.
  4. Esto recién empieza.

Imaginen esto en paginas de Internet y con la posibilidad de encapsular fácilmente miniaturas en mini-images que se muestran vivas! Un lector puede interactuar con ellas, embeberlas en su image o grabársela al disco para usarla mas tarde.

Implementación

(preliminar: OJO! Es posible que esto cambie notablemente)
El padre tiene la composición acostumbrada, con la posibilidad de generar embriones y cordones umbilicales para que se nutran durante su gestación.
El padre tiene un SystemDictionary[Smalltalk] que define el Mundo (nombres globales).

Qué necesitamos para generar la semilla/embrión?

  1. Un SystemDictionary[microSmalltalk] que defina Globalidad en el mundo embrión
  2. MicroClases de base.
  3. Cuáles son las mínimas necesarias?
  4. Se necesitan todos los métodos de las clases de base? [no]
  5. Cuales serán necesarios?
  6. Micro VM kernel
  7. Primitivas?
  8. Cuales?
  9. Mecanismo de proxy para asegurar nutrición transparente del hijo.

MicroObject

Por ahora (quizás esto cambie) llamare MicroObject a la clase Object en el embrión.
Definiciones posibles: nil subclass: #microObject ...
[Parent]Object subclass: #MicroObject ...
(donde Object no esta en el MicroSystemDictionary!)
Así frente al #doesNotUnderstand: se translada usando el condón umbilical métodos del padre de manera transparente.
Será este el único patch necesario con el padre?

MicroMundo

MicroMundo = MicroSmalltalk + MicroVMKernel + MicroBaseClasses
MicroSmalltalk isA: MicroSystemDictionary con las globales del mundo en gestación.

MicroVMKernel = MicroVMConstants
Necesarias para el funcionamiento de la maquina virtual (por ej.: Semaphore, Process, Point, Smalltalk etcétera). Concuerda con SpecialObjects en la maquina virtual. Es constante en el mundo que se esta ejecutando.

MicroBaseClasses = Conjunto de clases necesarias para el funcionamiento del mundo
(por ejemplo: Class, CompiledMethod, Symbol, Process, Context, SystemDictionary, etcétera)

Creación

Un MicroMundo nace en el contexto de un mundo (imagen) padre (o madre?). Está conectado al padre por medio de un mecanismo de nutrición ante desconocimiento (por ejemplo mecanismo #doesNotUnderstand: desencadena búsqueda de lógica en el padre por medio de un canal de comunicación).
En el momento que es estable y conoce como "vivir solo" podrá ser desconectado del padre, naciendo por medio de un clonado (vía SystemTracer) en otro medio o en uno creado por/para él.

Alimentación

La alimentación ocurre frente a la falta de conocimiento (vía #doesNotUnderstand:). Ante falta de conocimiento se hace conexión con el padre (vía cordón umbilical, para nutrirse de nuevos métodos aprehendidos del padre).
La migración de métodos desde el padre genera la aparición de nuevos objetos y clases (en los literales del método); los cuales hacen crecer al hijo solo con lo necesario.
La transferencia de clases en el hijo se hace por medio de la creación de una clase en el hijo. La clase debería crearse con todos los métodos patchados para que migren en caso de necesitarse (esto es importante pues el mecanismo de #doesNotUnderstand: no alcanza; polimorfismo en clases del mismo nivel).

Nacimiento vs. Clonación

En el momento del nacimiento se podrá eliminar los métodos patchados y no usados en el hijo.
Luego se desvincula al hijo del padre.

Pasos propuestos:

  1. Se recorre el hijo eliminando lazos con el padre (se deben borrar los métodos patchados o solo se debe desconectar del padre?)
  2. Se construye una nueva tabla de símbolos para el hijo.
  3. Se construye un image trazando el hijo (SystemTracer).
  4. Se compactan los sources

Herramientas de trabajo sobre el hijo


Se deberá poder crear/modificar métodos en el hijo durante la gestación? O solo en el padre. De ser solo en el padre la infección al hijo deberá ser inmediata, diferida o no hacerse?
Se debe poder cambiar por inspección objetos del hijo? Si es así; quizás deba compilarse en el padre, migrar el método al hijo y evaluarlo allí.
No es suficiente con infectarlo... Es muy vil matar al hijo bobo y crear otro nuevo?
Es suficiente con la infección? No es problemática? No será necesario un mapa de transformaciones entre padre-hijo.
La transferencia de objetos solo ocurre de padre a hijo. No?
Es fundamental poder debuggear al hijo mientras se está gestando.
Posiblemente el simulador de la VM del padre pueda usarse para el hijo.
Un loggin en el cordón umbilical sería muy útil al comienzo.

Propagación de patrones genéticos

Creación asexuada

  1. Un padre es un Smalltalk tradicional con las clases que saben generar la semilla, construir el mecanismo de alimentación y tienen lo suficiente como para crear un hijo completo. El padre contendrá un SistemDictionary (Smalltalk) que le define el máximo de globalidad, un conjunto de clases y objetos que garantizan su estabilidad.
  2. Genera la semilla, con un SystemDictionary para esta y al menos un objeto que será la razón de vida del ambiente hijo. Esto traerá aparejado la generación de clases en el hijo durante la gestación.
  3. El hijo nace como un image autónomo pero aún puede tener un link (ocasional) de conexión con su padre.

Creación sexuada

  1. El padre contiene un(o o más) objeto(s) que servirá(n) de partida en la gestación de la semilla. La madre contiene el soporte para la generación de la semilla y lo básico para la gestación.
  2. Se crea la semilla en la madre con objetos aportados por el padre.
  3. El hijo contendrá partes del padre y la madre. Puede ocurrir que la madre no tenga todos los nutrientes necesarios durante la gestación, y puede comunicarse con el padre para obtenerlos.
  4. Si el hijo contiene un link al padre podrá nutrirse directamente sin usar a la madre.
  5. Si el hijo tiene varios links de alimentación, puede decidir cual usar; intentar en varios padres o incluso decidir de que información nutrirse (dadas varias alternativas otorgadas por los padres).

Fíjense que en este caso el padre no necesita tener soporte para generar hijos!
Podría ser un Smalltalk virgen?.

Documento en zipeado (download)