Bitácora de Código

Cómo crear un lenguaje de programación

15 MAY 2023

Lenguajes y compiladores
codexivolenguaje de programación

Cómo crear un lenguaje de programación desde cero: por qué empecé Codexivo, un lenguaje en español para aprender lógica, qué objetivos me puse y cómo planteé el intérprete.

Durante las últimas semanas, me he embarcado en un proyecto fascinante: la creación de un nuevo lenguaje de programación destinado a facilitar el aprendizaje de la programación. Inicialmente, mi objetivo era desarrollar un intérprete de pseudocódigo con una visualización de diagrama de flujo integrada, una característica que posiblemente incorpore más adelante. Sin embargo, a medida que avanzaba en mi investigación, surgió la idea de crear un "lenguaje de programación" similar al que usaba en mi infancia con un emulador de robot llamado Karel, un software libre orientado a la educación de lenguajes de programación como Pascal.

Con ese pensamiento en mente, empecé el proyecto con el objetivo de crear una plataforma que permitiera aprender sobre lógica, algoritmos básicos, bucles y más. Para cumplir con este objetivo, determiné que el lenguaje debía poseer las siguientes características:

  • Simplicidad: Dado que está diseñado para aprendices, solo incluirá tipos de datos simples como números, cadenas y arreglos, y posiblemente diccionarios.
  • Verbalidad: Para facilitar la comprensión y lectura del código, he decidido que tenga más palabras que símbolos.
  • En español: El aprendizaje es más sencillo cuando se realiza en tu lengua materna, por lo que el español era la opción ideal para este lenguaje. Incluso, estoy planeando permitir el uso de la ñ y acentos dentro del código.
  • Fácil acceso: Es esencial que el lenguaje sea fácil de usar, por lo que opté por un diseño que pueda ejecutarse en un navegador sin necesidad de instalaciones adicionales o acceso a internet.

Una vez que tenía claras estas metas, era momento de empezar. Pero, ¿cómo? ¿En qué lenguaje? Para responder a estas preguntas, me puse a investigar cómo funciona un lenguaje de programación, qué partes lo componen, cómo se ejecuta el código y descubrí que un lenguaje de programación consta de los siguientes componentes:

  • Tokens: Los tokens son los símbolos o palabras que tienen un significado específico dentro del código, como los operadores +, -, /, >, <, o las palabras if, else, for, while. Cada token tiene un tipo de token y un literal; el tipo de token es el significado que tendrá el símbolo y el literal es el símbolo asociado. Por ejemplo, el token (ASSIGN,=) significa que cada símbolo = (igual) que se encuentre en el código se entenderá como una asignación de valor.
  • Lexer: El Lexer o analizador léxico es la parte que lee el código fuente carácter por carácter y va creando los tokens. Por ejemplo, el código fuente 5; genera el token (INT,'5').
  • AST: El AST (Abstract Syntax Tree) o Árbol de Sintaxis Abstracta es una estructura de datos que representa la estructura gramatical de un programa de manera jerárquica y abstracta. Se utiliza como una representación intermedia durante el análisis sintáctico de un lenguaje de programación.
  • Parser: El Parser es la parte que analiza la sintaxis del código utilizando los tokens, y se encarga de construir el AST para su posterior procesamiento.
  • Evaluator: El evaluator es la parte de un intérprete o entorno de ejecución que realiza la evaluación y ejecución de un programa representado internamente, como un AST. Es responsable de interpretar y ejecutar las expresiones y las instrucciones del programa de acuerdo con las reglas y semántica del lenguaje de programación.

Con este conocimiento en mente, era hora de dar inicio al proyecto. Decidí utilizar TypeScript, principalmente porque, como mencioné antes, quería que se pudiera ejecutar en el navegador. Aunque existen otras alternativas, como ejecutarlo desde el servidor, esto requeriría acceso a internet. Además, si bien WebAssembly sería otra opción, no cuento con la misma experiencia y conocimientos en lenguajes como C o Rust, como los que poseo con JavaScript y TypeScript.

Así que aquí estamos, al inicio de este emocionante viaje. En los siguientes posts, compartiré más detalles sobre los avances y desafíos que se presenten en la creación de este lenguaje de programación.

La serie

Parte 2: los tokens

Creación de un lenguaje: tokens

Qué son los tokens en programación, cómo se clasifican y cómo definí el conjunto completo para Codexivo. Segunda parte de la serie sobre crear un lenguaje.

Parte 3: el lexer

Creación de un lenguaje: el lexer

Qué es un lexer o analizador léxico, cómo construí el de Codexivo, el error que partía la palabra "orden" en dos y lo que aprendí al corregirlo.

Parte 4: el parser

Creación de un lenguaje: el parser

Qué hace un parser, cómo decide un parser Pratt quién se queda con cada valor y cómo construí el de Codexivo: precedencias, llamadas y el pero_si.

Parte 5: el evaluador

Creación de un lenguaje: el evaluador

Cómo funciona el evaluador de un intérprete que recorre el árbol: entornos, procedimientos que recuerdan dónde nacieron, cómo sale un regresa y errores en español.

En este artículo