Paranoias sobre PL's

Desde chiquitito me llamó la atención eso de hacer un intérprete, un compilador o un traductor. Mis primeros pinitos, hechos allá por 1992 en el ZX Spectrum sirvieron para que me hiciese a la idea de que no era nada fácil lo que yo pretendía hacer.

Escribir un intérprete es complicado ya que tienes que reconocer el texto escrito, organizar la información en una estructura manejable, y luego hacer lo que dice. La parte complicada es la de reconocer el texto, sobre todo si este se complica como hace cualquier lenguaje que se precie como C, BASIC o Pascal. Esta es la razón por la cual mis primeros intérpretes, a los que titulé LBasic's, solo interpretasen programas de ejecución lineal compuestos por órdenes sencillas, como por ejemplo:
 
tinta BLANCO
fondo NEGRO
borrar
imprimir HOLA, ESTO ES UN PROGRAMA TONTO
imprimir ¡JA JA JA, ESTO NO SIRVE PARA NADA!

Este tipo de programas son fáciles de interpretar. Solo hay que ir leyendo las líneas de texto del archivo, y luego mirar el principio de la línea para buscar el comando. Dependiendo de qué comando sea podrá o no tener parámetros, si los tiene simplemente tomamos el resto de la línea y la parseamos.

Con mi paso al PC en 1993 continué con la línea, ahora introduciendo nuevos comandos. Estos nuevos comandos te daban a elegir entre tres opciones, de las cuales sólo una era la acertada (como en los tests). De esta forma se podían hacer juegos pseudo-conversacionales muy sencillos. Se daba una descripción, se planteaban las tres opciones, y luego se esperaba a que el jugador eligiese. Si fallaba se acababa el juego. Un programa sería algo así:
 
print "ESTAS EN UN PARAJE DESIERTO"
print "NO SABES QUÉ HACER"
print "1. CORTARTE LAS VENAS"
print "2. PEGARTE UN TIRO"
print "3. FROTAR LA LÁMPARA MARAVILLOSA QUE TIENES JUSTO AL LADO DEL PIE"
choice 3,3,"TE MUERES DESANGRADO","TE MUERES DE LA HERIDA","SALE UN GENIO Y TE SALVA"

¡La cosa se complica! Ahora hay un comando que tiene cinco parámetros separados por comas. Para reconocer eso hay que recorrer la línea carácter por carácter, detenerse en las comas, e ir escribiendo los datos a las variables adecuadas... ¡un lío! Por aquella época eso era demasiado para mí (ni me lo planteaba), así que no hacía parseado ni nada, sino que a la hora de introducir el programa, al escribirse 'choice' entonces el IDE preguntaba por el número de opciones, la verdadera, y los textos correspondientes, y se encargaba de meterlos en las estructuras listas para ser ejecutadas.

Eso no eran programas ni juegos ni eran nada (aunque satisfacían las necesidades creativas de muchos de mis amigos que no tenían ni idea de programar). La ejecución era totalmente lineal (siempre hacia delante, y sin saltos) y siguió así hasta que en 1996 descubrí un método para poner etiquetas y lograr hacer saltos dentro del programa (GOTO's), por ejemplo:
 
:inicio
   cls
   print "MENÚ PRINCIPAL"
   print "1. Jugar"
   print "2. Salir"
   choigo 2,go :jugar,go :salir
:jugar
   print "Se supone que aquí va el juego."
   pause 0
   go :inicio
:salir
   print "Fin del programa"
   <fin>

El método para ejecutar los saltos era el siguiente: Yo abro el archivo de texto que contiene al programa y voy leyendo las líneas una por una e interpretándolas al tiempo. Cuando me topo con una orden de salto hacia otra línea cierro el archivo, vuelvo a abrirlo (para posicionar el puntero al principio de éste), y voy leyendo líneas hasta que encuentro la etiqueta referida en la orden de salto, volviendo al bucle principal de interpretación y siguiendo con lo mío.
 
LS Basic 8.5ß PC, Junio de 1996
La versión de LBasic que hace esto es la 8.5 que te puedes bajar aquí para echarle un vistazo. Viene con el módulo de ejecución aparte para que lo puedas mirar.

Para obtener instrucciones completas mira el archivo manual.exe. También tienes completa referencia de todos los comandos y estructuras desd el menú de ayuda del propio entorno integrado de desarrollo. 

Nota: Necesitarás QBasic 1.1. Lee las instrucciones para saber cómo instalarlo y hacerlo funcionar.

bájatelo

Esta idea tan simple me abrió muchas puertas. Los programas dejaban de ser lineales,  además tenía muchas ideas para hacer programas de verdad con sus instrucciones selectivas e iterativas. Además, ahora sí que había aprendido a parsear en condiciones, así que pude meter todo tipo de comandos con varios parámetros, variables, etcétera:
 
#1 = 0
mientras #1<10
   print "Contando, número: ";
   print #1
   #1=#1+1
fin

Lo único que necesitaba es poner el intérprete de comandos dentro de una función recursiva. Cada vez que encontraba un si, un mientras, etcétera, volvía a llamar a los comandos para el fragmento de código correspondiente. De este modo, si tenía instrucciones iterativas o selectivas anidadas seguía funcionando. Todo eso lo dejé más o menos averiguado allá por 1998. Como esto se iba ya un poco de madre dejé el número y lo llamé LS Basic E1.

Para montarlo utilicé un editor de textos programado por Douglas H. Lusher que encontré en los ABC Packets de William Yu, y que me venía como anillo al dedo.

Sin embargo todavía cojeaba, ya que no tenía un buen evaluador de expresiones aritméticas, así que no podía asignar expresiones complejas a las variables. Abandono el proyecto de nuevo hasta verano del 2000. Cuando ya tenía algunas ideas sobre como hacer el evaluador me encontré un código muy gracioso de nuevo en los ABC Packets que incorporé de inmediato al intérprete. Tuve que hacer algunos cambios para que el parser de expresiones reconociese ahora variables y operaciones con éstas. El resultado LS Basic E2.
 
LS Basic E2 PC, Agosto de 2000
Tienes aquí el primer alpha de LS Basic E2, con el código incluído para que le eches un vistazo. Asimismo incluye el IDE que comencé a programarle este verano utilizando Visual Basic para MSDOS.

Aún quedan muchas cosas por hacer, como meter soporte para gráficos y esas cosas. Además tengo que hacer un manual.

Incluye un único ejemplo en LBASIC.LBS.

Espero que te resulte interesante y provechoso.

bájatelo

El traductor LBasic 9.

Cuando abandoné LBasic E1 al no poder implementar un editor de expresiones, estuve en sequía un tiempo. Pronto, con mi conexión de internet, conseguí un pequeño compilador llamado MoonRock que transformaba un sencillo lenguaje de medio nivel parecido a Basic en lenguaje ensamblador, que más tarde podía compilarse en un compacto y sencillo archivo .COM. Eso me llamó la antención, y en seguida me puse a enredar con él. Me di cuenta de que era bastante tedioso de programar. Un día estaba aburrido haciendo un programa en LBasic 8.5 (¡imagínate lo aburrido que podía estar!). Se me ocurrió que sería buena idea poder compilar ese programa, así que me hice un pequeño traductor que, tomando un programa en LBasic 8.5, lo transformaba a MoonRock.

De ahí surgió una nueva idea. Podría programar un entorno integrado para trabajar con MoonRock que, además, trajese una especie de traductor de macros de forma que, tomando un programa escrito en MoonRock pero con macros y llamadas a funciones de librerías escritas, digamos, en LBasic, generase un programa nativo MoonRock que pudiese compilar facilmente... ¡Sonaba bien! Era como un compilador de LBasic, un verdadero compilador que generaba ejecutables. En seguida me puse manos a la obra.

Próximamente os podréis bajar desde aquí el programita. No lo incluyo aún porque lo estoy documentando, paso de dar una versión sin documentar que no tenga ninguna utilidad.

Futuro.

En un futuro próximo (?) tendré aprobadas PL1 y PL2 de la carrera que tratan precisamente de Procesadores de Lenguajes. Supongo que una vez echas estas asignaturas estaré en condiciones de programar un compilador de verdad, con sus funciones, librerías, módulos, etcétera. ¿quién sabe?

De interés.

Para los que os interesa recolectar basura de internet aquí tenéis LBasic 4.03, la primera versión que hice para PC.


Volver arriba | Volver al menú

Hosted by www.Geocities.ws

1