En estos días, estoy trabajando en mi proyecto AjTalk, una virtual machine interpretada, tipo Smalltalk, escrita en C#. El año pasado, escribí algunos posts sobre el proyecto. Es tiempo de refrescar su estado: puede manejar más de una VM en un proceso .NET, tiene agentes, procesamiento en paralelo, objetos distribuidos, acceso a la librería de clases .NET, y está por tener transacciones de objetos. Espero que sirva este posts para retomar el tema de cómo funciona.
Pueden bajar el código fuente desde (Work in progress):
http://code.google.com/p/ajtalk/
El aspecto actual de la solución (escrita usando Visual Studio 2008):
La librería núcleo es AjTalk, y todo su código fue escrito usando TDD. Los tests están en el proyecto AjTalk.Tests.
AjTalk está preparado para manejar sus propios tipos de objectos, que implementan la interfaz IObject:
y también puede manejar tipos y objetos nativos .NET. Strings, enteros y números en general son creados y manejados como objetos nativos .NET. Escribiré un post dedicado al tema del acceso a estos objetos nativos desde el lenguaje AjTalk (similar a Smalltalk).
La principal implementación de IObject es BaseObject. Internamente, mantiene una referencia a un objeto IBehavior y a un arreglo interno de variables de instancia:
[Serializable] public class BaseObject : IObject, ISerializable { private IBehavior behavior; private object[] variables; public BaseObject() { this.behavior = null; this.variables = null; } public BaseObject(IBehavior behavior, int nvars) { this.behavior = behavior; this.variables = new object[nvars]; } //... }Noten que las variables de instancias no son IObjects: son objetos generales, pueden tanto referenciar a objetos nativos .NET o a objetos IObject. Yo tenía planes de acceder a los objetos nativas via un decorador que implement IObject, en vez de referenciarlos directamente, pero decidí no hacerlo. La referencia es directa.
IBehavior está definida como:
![]()
Sus responsabilitidades son definir y recuperar métodos por nombre, crear instancias, y mantener la jerarquía de superclases. Los métodos son objetos que implementan IMethod, que deriva de IBlock:
![]()
Actualmente, todas estas interfaces están implementadas usando clases nativas. De esta manera, puedo usarlas sin tener una librería de clases escrita en el propio AjTalk. Es una suerte de “scaffolding”: una forma de tener una base inicial sobre la cual apoyar el resto de lo que estoy construyendo.
Hay 201 tests, todos en verde:
![]()
Buen code coverage, pero podría mejorar el número:
![]()
Próximos tópicos a tratar por aquí: la implementación de Machine, Blocks, acceso a objetos y tipos .NET, agentes, objetos distribuidos, y objetos transaccionales (Work in progress).
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com