Siguiente Post
Si leen este blog (y tienen la paciencia de seguirme en Twitter ;-), ya saben que, luego de PyCon 2012 Argentina, he estado ocupado trabajando en mi máquina virtual Smalltalk AjTalk, escrita en C#:
https://github.com/ajlopez/AjTalk
He aquí un pequeño Hello, World:
nil subclass:#Object
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
category:'Kernel-Objects'
!
Object subclass:#Program
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
category:'Kernel-Objects'
!
!Program class methods!
main @System.Console writeLine: 'Hello, world'! !
En el repo:
https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk.Console/Programs/HelloWorld.st
Podría ser menor, pero necesito el Program main como punto de entrada de una imagen grabada en disco. El programa que genera la imagen es
ajtalk Programas/HelloWorld.st –s hello.im
y se lanza la imagen con
ajtalk hello.im
De esta forma, AjTalk busca una variable global Program con un método main, y si existe, es invocado luego de la carga.
La notación del nombre con @ para @System.Console es la forma que tiene AjTalk de referirse a tipos nativos de .NET.
Noten que no cargo toda la librería de clases, solamente las que necesito para ejecutar este Hello, world. AjTalk puede manejar varias máquinas en memoria, cada una de las cuales tiene sus propias clases y métodos. Aún más: le he agregado que una máquina virtual pueda operar sobre otra, y hasta “prestarle” sus métodos. De esta manera, puedo tener una máquina A con todas las clases de desarrollo, y manejar desde ahí el contenido de la máquina B. Puedo entonces producir imágenes mínimas. En vez de tener una sola y gran imagen en memoria, y hacer toda clase de contorsiones para reducirla, mis máquinas YA NACEN livianas por diseño. Esto es un ejemplo de “pensar fuera de la caja”: por décadas, los desarrolladores Smalltalk pensaron siempre en tener una sola imagen, y se metieron en el problema de COMO hacerla decrecer. Mi aproximación al problema es distinta: cada máquina va creciendo desde lo mínimo, y si es necesario usar algo (algún método compile: por ejemplo), lo provee otra máquina, sin que tenga que crecer la primera.
Tengo que escribir más sobre lo que le agregué a esta versión. Por ejemplo: objetos remotos (revisitado), métodos por objeto, procesos, semáforos, múltiples threads, acceso a tipos nativos, grabar/leer imágenes, un AST interno, visitors para recorrer ese árbol, generación de código para JavaScript, módulos (a la import de Python o el require de Node.js), ambientes (como espacios de nombre, para evitar la colisión de nombres), y bastante más (como tener un Process que pueda ser suspendido y reanudado en cualquier momento, quizás llegue a call con continuations).
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez