martes, 17 de marzo de 2026

ZX2SB. Cambios en el planteamiento

Transpilador ZX BASIC a SuperBasic

Índice de entradas del conversor



Transpilador ZX BASIC → SuperBasic
Dos versiones en paralelo: Moderno y QL

En las últimas entradas hemos avanzado en el diseño interno del transpilador ZX BASIC → SuperBasic, definiendo estructuras de datos, el sistema de tokens y un Lexer optimizado para ejecutarse en un Sinclair QL real. Durante ese proceso me ha surgido una idea interesante para quienes quieran usar este proyecto no solo como herramienta, sino también para aprender sobre compiladores.

Vamos a generar dos versiones del transpilador en paralelo

El objetivo es disponer de dos rutas de ejecución simultáneas, una preparada para migrar a SuperBASIC, y la otra usando elementos actuales. Ambas conviven dentro del mismo proyecto. La mayoría de procesos son comunes, por lo que es sencillo ver cómo pasar de una a otra. Además incluyo una pantalla donde puedes seleccionar cuál quieres lanzar.

1) Versión Moderna

Diseñada para:

  • Usar estructuras avanzadas de .NET (List, Dictionary, etc.).
  • Desarrollo más rápido, depuración más cómoda y diagnósticos completos.
  • Actuar como referencia clara del algoritmo general.

2) Versión compatible con SuperBasic

Implementa las estructuras reales que usará la versión final del QL:

  • TokenBuffer como arreglo dinámico de registros empaquetados.
  • Formato big‑endian de 16 bits, igual que el Motorola 68008.
  • Procesos simples y lineales, estilo SuperBasic.

Esta versión sirve como puente entre .NET moderno y la implementación final en un QL real.

¿Por qué dos versiones?

✔ Didáctica

Muestra cómo implementar un compilador moderno y cómo trasladarlo a una plataforma retro con limitaciones reales.

✔ Validación de algoritmos

Al ejecutar ambos motores en paralelo es fácil encontrar divergencias antes de portar código al QL real.

✔ Documentación y mantenimiento

Permite explicar y probar Lexer, Parser, Semántico y Emitter tanto desde un enfoque moderno como desde un enfoque retro.

Pantalla lanzadora

Incluyo una interfaz WinForms que permite seleccionar:

  • Modo: Moderno o QL‑Prep
  • Ruta y nombre del fichero BASIC
  • Modo Verbose

El lanzador invoca automáticamente el director correspondiente con las opciones necesarias.

Arquitectura del proyecto

El proyecto utiliza .NET Framework 4.8 para asegurar compatibilidad con Windows 7/8/10/11 y aprovechar WinForms clásico. Para quienes pidan Windows XP, 95 o 3.11… lo siento, ¡aún no he retrocedido tanto! (Aunque con lo voluble que soy, cualquiera sabe si un día aparece una versión en Turbo‑C o Turbo Pascal 😄).

Estructura general del proyecto:

ZX2SB/
  Lanzador/              -> Pantalla lanzadora + consola
    LauncherForm.vb
    ConsoleLauncher.vb

  Director/              -> Directores del proyecto
    Moderno/
      ModernDirector.vb
    QL/
      QLDirector.vb
    ITranspilerDirector.vb   -> Contrato común

  Motor/
    Moderno/             -> Lexer / Parser / Semantic / Emitter modernos
      ModernLexer.vb
      ModernParser.vb
      ModernSemantic.vb
      ModernEmitter.vb

    QL/                  -> Lexer / Parser / Semantic / Emitter QL‑Prep
      QLLexer.vb
      QLParser.vb
      QLSemantic.vb
      QLEmitter.vb

  Comunes/               -> Elementos compartidos
    TokenKind.vb
    Keywords.vb
    AppOptions.vb
    Diagnostics.vb
    Endian.vb
    TextUtils.vb
    Paths.vb

  Ejemplos/              -> Archivos .bas de prueba
    demo1.bas

  Documentación/         -> README y documentación
    README.md

  ZX2SB.vbproj           -> Proyecto .NET Framework 4.8 (WinForms)
  Program.vb             -> Sub Main (arranque del lanzador)

Conclusión

A partir de ahora el desarrollo continúa en dos líneas paralelas:

  • Moderno: claridad, pruebas y comodidad.
  • QL‑Prep: compatibilidad y preparación para SuperBasic.

Ambas serán documentadas paso a paso en el blog. Por ahora ya está la estructura base en el repositorio GIT del proyecto, y los directores están preparados para llamar a los procesos (que de momento solo muestran un mensaje en pantalla).

No hay comentarios:

Publicar un comentario