Pues sí, tal dia como hoy, hace 18 años, publiqué la primera versión de Boriel Basic (que bauticé como ZX Basic por aquel entonces).
Esta primera versión era muy diferente de lo que es hoy, y es muy difícil resumir todos los cambios hechos (ni enumerar la enorme lista de colaboradores de las bibliotecas de BASIC y ensamblador) pero haré lo que pueda... sin IA (no como esta imagen 😉).

La primera versión
Algunas curiosidades de lo que ha cambiado en estos 18 años.
No tenía ensamblador propio
Usaba Pasmo para la fase final de ensamblado. En aquella época Pasmo no era capaz de resolver las etiquetas en algunos casos (solo daba 2 pasadas al código como mucho; contacté con el autor y me dijo que iba a añadir una tercera pasada, pero que además estaba trabajando en una nueva versión que restructuraba todo el código). Yo me impacienté y en un fin de semana tuve un emsamblador funcional, zxbasm. Este ensamblador no tiene macros, pero permite usar macros del preprocesador (aunque tiene algunas predefinidas como LO() y HI()), y da infinitas pasadas (es decir, todas las que sean necesarias para resolver las etiquetas). Esto permite expresiones muy complejas basadas en etiquedas cuyo valor final es desconocido hasta prácticamente el final del ensamblado.
Los IF no eran compatibles con Sinclair BASIC
Boriel BASIC admitía IF multilínea como:
IF a < b THEN
PRINT "a es menor que b"
END IF
Pero no admitía:
IF a < b THEN PRINT "a es menor que b"
Esto hacía que portar programas de listados de revistas como MicroHobby fuera más laborioso (algunos ejemplos en la carpeta examples/ tienen esta diferencia).
No había READ, DATA ni RESTORE
Fueron complejos de implementar, e imitan muy bien la funcionalidad del Sinclair BASIC: se pueden poner expresiones en los DATA, que son calculadas en el momento de leerse. Muy pocos BASICs admiten esto:
DATA x * x, x + 2
Realmente son como funciones anónimas (lambda).
Los Arrays eran bastante más lentos
Al contrario que en C, Boriel BASIC admite arrays (matrices o arreglos) multidimensionales, pero calcular la posición del elemento requiere hacer multiplicaciones encadenadas. Esto en el pobre Z80 que no tiene instrucciones de multiplicación, es muy costoso. Pero @BritLion vino con una optimización que descubrió por internet: para multiplicaciones pequeñas de 16 bits, es más rápido iterar una suma (que hacer la multiplicación). Como los índices de los arrays normalmente son menores de 32, este suele ser el caso más general y se optimiza mucho en velocidad sin aumentar demasiado el tamaño de la rutina de cálculo de posición.
Además, es posible declarar un array para que su zona de datos esté en una posición determinada de memoria (por ejemplo en la pantalla), con DIM a(...) AT <dirección>.
No había primitivas de dibujado
... y las primeras que aparecieron (PLOT, DRAW, CIRCLE...) llamaban a la ROM.
Actualmente las rutinas son propias y mucho mucho más rápidas que las de la ROM.
Además, es posible dibujar e imprimir (PRINT) en cualquier zona de la memoria, lo que permite usar una "shadow screen".
No existían las librerías que tienes ahora
Desde luego no había PRINT42, ni PRINT64, ni librerías de Sprites, música, bancos que tienes ahora a tu disposición. Mucha, muchísima gente ha creado o ha colaborado en ellas.
No había ensamblador en-línea
Pues no, no existía ASM ... END ASM. Pero fue lo primero que llegó junto con Funciones y SUB. Esto permitiría expandir el lenguaje.
Había muchísimos bugs
Programas grandes no se podían compilar. Pero gracias a los informes de fallos de la comunidad, el compilador fue ampliando su batería de tests contando hoy con cerca de 2000 casos de tests.
Y faltaba lo más importante...
Faltabas tú 🫵. Porque sin ti, no habría comunidad. No habría buenos momentos. No habría nostalgia. No habría librerías ni alicientes para hacerlas.
No habría IDEs hechos por otros, ni Game Engines, ni saldríamos en MicroHobby, ni nos quejaríamos de que no publicaran nuestros listados en la revista.
Sin ti, esto no tendría sentido.
¡Salud! 🍺 Y por muchos años...
Gracias, de verdad. @Boriel.