Trabajando de nuevo en on AjTalk: Smalltalk Virtual Machine, en C#

Luego de trabajar en ejemplos distribuidos con Node.js (ver Genetic Algorithms), y en mi intérprete Python en .NET (Post, GitHub repo), volví a trabajar en AjTalk, mi implementación de una VM Smalltalk. Tengo tres proyectos (versión C#, versión Java, versión JavaScript), pero en estos días estroy trabajando en la versión C#.

El fin de semana pasado, agregué un simple/ingenuo pero funcional grabado/lecturan de imágenes, y tengo un nuevo compilador de bytecodes: en vez de “parsear” el código y directamente generar “bytecodes”, ahora hay una implementación alternativa que construye un árbol AST, en memoria, y usando el patrón Visitorr, genera los “bytecodes” correspondientes. El año pasado había implementado el AST para con un Visitor ir recorriendo los nodos e ir generando código JavaScript, que se levanta con la versión AjTalk en JavaScript. El patrón Visitor podría usarse para generar distintas salidas, usando el mismo AST. Por ejemplo, tengo pensado como “prueba ácida”, armar un Visitor que genere Python (alternativas: que genere Ruby o C#, en este último caso exploraría el usar objetos dynamic).

Desde hace tiempo, puedo crear más de una Machine: una imagen viva en memoria, cada una con su propio Object, Class, ClassDescriptor, etc. En vez de ser un Singleton, puedo crear y levantar desde imágenes más de una Machine. El código principal en:

https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk/Machine.cs

Pude entonces generar una imagen mínima de un “Hello world” con menos de 300 bytes (! ;-), ver el código en:

https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk.Console/Programs/HelloWorld.st

También estube entrenando a los dos parsers para lean y ejecuten código de Pharo:

https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk.Tests/CodeFiles/PharoCoreKernelObjects.st
https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk.Tests/CodeFiles/PharoKernelNumbers.st
https://github.com/ajlopez/AjTalk/blob/master/Src/AjTalk.Tests/CodeFiles/PharoKernelClasses.st

Y todo escrito usando TDD.

Ahora que tengo varias máquinas en memoria, quiero implementar esta idea:

- Cargar/Crear una Machine A (con sus clases, métodos, objetos) teniendo una librería completa de clases
- Cargar/Crear una Machine B, teniendo solamente algunas clases y objetos
- Hacer que la Machine A sea el “host” de la Machine B. Es decir, que se ocupe de darle lo que no tiene, ver el próximo punto.
- Reimplementar el proceso del mensaje #doesNotUnderstand en la Machine B para que, si el método correspondiente no es encontrado en esa máquina, la búsqueda del mismo continúe en la máquina “host”, la Machine A. De esta manera, podría usar todo el poder la Machine A, para operar sobre una Machine B más liviana, manteniendo la “liviandad” de ésta. La Machine A podría tener todas las herramientas de desarrollo, clases, objetos, métodos, mientras que la Machine B sigue teniendo un tamaño mínimo. Ideas similares están siendo exploradas por @morplenauta (“committer” de Squeak, ver la lista en español.

(Actualización: hoy a la mañana, conseguí implentar lo de arriba, pero será tema de otro post).

Otro proyecto: tener implementado un servidor web mínimo, que sirva archivo estáticos, aprovechando clases nativas de .NET, por ejemplo, lo de System.NET.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 11722, 15035, 3462, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>