Mass Lenguaje de Programación (1) Orígenes

Siguiente Post


Durante estos días, estuve trabajando en la implementación de un lenguaje interpretado, sobre C#, llamado Mass (dedicado al bueno de @MArtinSaliaS):


https://github.com/ajlopez/Mass



La solución actual se compone de tres proyectos: una librería de clases, sus tests, y un programa de consola, mass.exe, para lanzar programas Mass



Pueden lanzar un programa escrito en un archivo hello.ms con


mass hello.ms

El clásico Hello world es entonces


println("Hello, world")

Un ejemplo con clases y objetos


class Person
	define initialize(firstname, lastname)
		self.firstname = firstname
		self.lastname = lastname
	end
	
	define getName()
		return self.lastname + ", " + self.firstname
	end
end

adam = new Person("Adam", "TheFirst")

println(adam.getName())

Un ejemplo con acceso a tipos y objectos .NET:


dirinfo = new System.IO.DirectoryInfo(".")

for fileinfo in dirinfo.GetFiles()
	println(fileinfo.Name)
end

La idea es (como en AjSharp y otras implementaciones) tener un lenguaje dinámico montado sobre un lenguaje/librería de clases. Y poder acceder a esa librería de clases desde el nuevo lenguaje. Me llevó a escribir Mass de la forma en que lo hice, el haber trabajado antes en:


- Implementar Python en C# (ver PythonSharp)


- Implementar Ruby en C# (ver RubySharp)


- El ya mencionado AjSharp (ver repo y posts)


Pero esta vez quería implementar algo que tuviera sintaxis y semántica simple. Ya estuve pensando en eso de “simple” para implementar un compilador de lenguaje simple a JavaScript ver SimpleScript


Entonces con Mass me propuse evitar:


- Múltiples comandos en la misma línea (descarté el ‘;’ de Ruby)


- Sintaxis basada en espacios en blanco, indentación (descartado Python)


- Llamadas a funciones con simplemente el nombre: se necesita explícitamente los paréntesis (descartado el Ruby clásico)


- Que las clases/valores de base (por ejemplo, enteros, strings, arreglos, etc…) tuvieran multitud de métodos (tienen los dados por la librería de clases de implementación, en este caso .NET) (descartado Ruby, que tiene casi tantos métodos nativos como PHP)


Y quise tener:


- Valores funcionales, como ciudadanos de primera clase, como en JavaScript. Vean que al tener que invocar una función con paréntesis, si o si, entonces la variable func tiene el valor funcional, y func() es la invocación explícita


- Objectos dinámicos: cada objeto puede extenderse en cualquier momento, con nuevas variables de instancia, funciones propias del objeto, como JavaScript


- Sintaxis basada en líneas: cada comando va en una línea distinta


- Sintaxis basada en palabras claves: para los comandos compuestos se usa ‘end’ para terminar un bloque


- En lo posible, una sola forma de hacer algo, en vez de múltiples maneras


- Palabras claves completas, ‘define’ en vez de ‘def’


- Clases con herencia simple (aunque la esencia de Mass bien puede expresarse sin clases, y usar librerías de clases ya escritas en .NET)


- Modificación explícita de variables fuera del alcance local (para explicar en próximos posts)


- Alcance de variables por archivo, como en JavaScript/NodeJs/CommonJS


- Módulos por archivo, con un require que permite buscar en directorios automáticamente, como en NodeJs/CommonJS


- Empaquetamiento, manejo de dependencias e instalación de esos módulos usando algo ya dado, como NPM, el manejador de paquetes de Node.js


En próximos posts, más detalles de implementación, ideas que guiaron el diseño, ejemplos. Pero ya pueden ver el código, y los ejemplos que están en los tests (sí, está todo construido paso a paso usando TDD).


Nos leemos!


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

This entry was posted in 11699, 1389, 15035, 17834, 5374, 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>