lumen
Un lenguaje de scripting de tipado dinámico en Kotlin. El código fuente se escanea, se analiza a AST, se compila a bytecode y se ejecuta en una máquina virtual de pila.
Un lenguaje de scripting de tipado dinámico en Kotlin que ejecuta de verdad el código: escaneo y análisis hacia un AST, compilación a bytecode y ejecución en su propia máquina virtual de pila.
Descripción general
lumen es un lenguaje de scripting de tipado dinámico escrito en Kotlin que ejecuta de verdad el código. La fuente se escanea, se analiza en un AST, se compila a bytecode, y al final se ejecuta en su propia máquina virtual de pila. Parece un lenguaje de scripting ordinario, pero por debajo cada línea recorre todo el camino del texto hasta las instrucciones de máquina.
La diferencia entre lumen y un ejercicio típico de escribir un lenguaje está en esa sola palabra: bytecode. Es fácil construir un intérprete que recorre un árbol y lo evalúa sobre la marcha. lumen va un paso más allá y compila, lo que es a la vez más difícil y mucho más interesante.
Un intérprete que recorre el árbol sintáctico es simple de escribir, pero pronto choca con un techo de rendimiento. Cada ejecución del mismo bucle significa volver a recorrer los mismos nodos del árbol, con todo el sobrecoste que eso conlleva. Para un script pequeño es invisible, para cualquier cosa más grande es perceptible.
lumen elige el camino más difícil pero mejor: en lugar de ejecutar el árbol, lo compila a bytecode, es decir una lista plana de instrucciones simples. Esas instrucciones corren luego en una máquina virtual que ya no tiene que entender nada de la sintaxis - recibe órdenes ya listas y simplemente las ejecuta.
Del texto al bytecode
Todo el camino se descompone en cuatro etapas. El escáner corta el texto en tokens, el analizador los ordena en un árbol, el compilador transforma el árbol en bytecode, y la máquina virtual ejecuta ese bytecode instrucción por instrucción. Parece código ordinario, pero cada línea recorre el mismo camino completo.
el texto fuente se vuelve tokens.
los tokens se ordenan en un árbol sintáctico (AST).
el árbol se transforma en bytecode.
el bytecode se ejecuta en una pila, instrucción por instrucción.
La máquina de pila por dentro
Una máquina de pila no tiene registros como una CPU real - apila y desapila los operandos en la pila. Una suma se reduce a tres movimientos: apila dos números, desapílalos y suma, apila el resultado. El mismo modelo mueve entre otros a Python y Java bajo el capó, así que escribirlo uno mismo es asomarse a cómo funcionan los lenguajes que se usan a diario.
Suma en una máquina de pila
| Paso | Instrucción | Pila después |
|---|---|---|
| 1 | apila 2 | 2 |
| 2 | apila 3 | 2, 3 |
| 3 | suma | 5 |
Una máquina de pila funciona sin registros, y aun así sabe ejecutar cualquier programa. Toda la aritmética y el paso de valores ocurren a través de una sola pila - es sorprendentemente simple, y a la vez exactamente la idea que mueve a los grandes lenguajes de producción.
El resultado: la palabra "compilado" deja de ser una abstracción
Lo que sale es un lenguaje que ejecuta de verdad el código - no interpreta un árbol sobre la marcha, sino que lo compila y lo ejecuta en su propia máquina. Es un proyecto tras el cual la palabra "compilado" deja de ser una abstracción, porque uno mismo recorrió todo el camino, de un carácter en un archivo hasta una instrucción que hace algo. Un lenguaje pequeño, pero completo hasta la ejecución.
Más proyectos
Más trabajos de la misma categoría - mira cómo abordamos retos parecidos.
¿Tiene un proyecto similar?
Escríbenos - el presupuesto es gratuito y llega en una hora.



