Trabajando en AjTalk: una Virtual Machine tipo Smalltalk, escrita en C#

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
http://twitter.com/ajlopez

This entry was posted in 11722, 12677, 1389, 3462, 8870. 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>