AjTalk y Javascript (Parte 1) El Modelo Abstracto

Published on Author lopezLeave a comment

Post Siguiente

Hace tres semanas escribí los posts:

Smalltalk and Javascript
Smalltalk y Javascript

Este año (2011) escribo un montón de código Javascript, así que ya estoy más entrenado en su uso. Como comentaba en los posts mencionados, estoy trabajando mi VM de código abierto AjTalk (implementada en C#) para que pueda generar código Javascript (sí, yo también! ;-). Este primer post está dedicado a describir el nuevo modelo abstracto que reside en el projecto de librería de clases AjTalk.

El AjTalk tradicional procesa y “parsea” código Smalltalk desde consola o archivos, lo arma en memoria (armando los métodos como secuencias de bytecods de la máquina virtual), y los puede ejecutar. Pero ahora, tengo un nuevo modelo abstracto en memoria. Vean, en la actual versión, el Model:

La idea es tener representaciones en memoria de clases, métodos, expresiones. Algunas interfaces:

Hay varias clases que implementan IExpressio: SetExpression, ConstantExpression, MessageExpression, ArrayExpression, etc. La más interesante, quizás, es MessageExpression: representa código que tiene un receptor, un selector de mensaje y tiene a otras expresiones como parámetros:

a + b. “binary messages”
anObject doSomething. “unary messages”
anObject do: aParameter with: anotherParameter. “keyword messages”

La clase ModelParser se encarga de leer un stream de chars y los convierte en el modelo abstracto en memoria:

En el estado actual del proyecto, pude procesar un file out de la clase Object de Squeak. Mi idea es procesar todas las clases del kernel de Squeak (jeje … estoy un poco perezoso para escribir mi propia librería 馃槈

Las principales clases del modelo abstracto:

CodeModel tiene una lista de elementos: cada “chunk” de código se parsea a memoria y es agregado a esta lista. Si un “chunk” representa la definición de una nueva clase, se crea un nuevo objecto ClassModel para representarla. Por cada métedo definido, se crea un objeto MethodModel.

Ahora, puedo manipular esta representación abstracta en memoria. Quiero experimentar este modelo para usar un patrón Interpreter: evaluar las expresiones, DIRECTAMENTE usando este modelo abstracto, en vez de compilar a Bytecodes. Pero por ahora, el camino a explorar es usar el patrón Visitor para recorrer el modelo abstracto, mientras se lo va traduciendo a código Javascript:

Estas son las clases que estoy escribiendo para este paso:

Vean que podría implementar otros Visitor: puedo generar otro código (¿Ruby? ¿otra forma de pasar a Javascrip? ¿Dart? 馃槈 o, como escribí más arriba, podría ejecutar el código en memoria usando un patrón Interpreter, por ejemplo, haciendo que cada IExpression tenga un método Evaluate (usar un Visitor me parece algo extremo).

El proyecto AjTalk.Compiler es una aplicación de consola que toma un archivo como parámetro (por ejemplo, Object.st) y genera un archivo Program.js en Javascript. Parte del código generado luego de procesar el file out de Squeak de Object (Work in progress):

Ya saben: soy adicto a Twitter: así que quedó capturado parte de mi TweetDeck en el rincón de abajo a la derecha ;-). Tome el código de arriba y lo procesé con Node.js sin errores (sólo define funciones, todavía no probé si la semántica es la correcta). Debería implementar algunas primitivas (vean que en el código de arriba, las primitivas las genero como comentarios Javascript). Las estrategias que estoy usando para traducir elementos de Smalltalk a Javascript puede cambiar en el futuro cercano. Estoy experimentando distintas soluciones.

Próximos temas: cómo implementar elementos de Smalltalk (clases, herencia, expresiones) en Javascript.

Nos leemos!

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

Leave a Reply

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