Mi compilador Pascal y arte contemporáneo polaco

Los orígenes


Hace unos años escribí el compilador Pascal. La motivación era simple: en mi juventud aprendí de mis primeros libros de programación que el compilador es algo extremadamente complicado. Esta declaración quedó atrapada en el cerebro por una astilla y al final requirió verificación experimental.

imagen
ha.art.pl

Primero, nació el compilador PL / 0 más simple, y de él creció gradualmente un compilador Pascal casi completamente funcional para MS-DOS. Me inspiró el libro Compiler Construction , escrito por el creador del lenguaje Pascal Nicklaus Wirth. E incluso si las opiniones de Wirth ya están desactualizadas y han perdido toda conexión con las realidades de TI, y los compiladores no lo hacen, como Wirth enseñó. Sin embargo, sus métodos siguen siendo simples, elegantes y, lo que es más importante, brindan alegría , porque es mucho más atractivo analizar de forma independiente el texto del programa por descenso recursivo y generar código de máquina que pedir la ayuda de yaks , bisontes y todos sus sucesores.

El destino de mi compilador no fue el más trivial. Vivió dos vidas: la primera, en mis manos, la segunda, en manos de conocedores polacos de antigüedades informáticas.

Xd pascal


Mi compilador recién horneado se llama XD Pascal . Admitía todos los operadores de Pascal excepto goto y with . El primero parecía difícil de implementar, ya que destruía la estructura idealmente jerárquica del programa. El segundo - creó confusión con el alcance de los nombres.

Todos los principales tipos de datos fueron compatibles. Solo los enteros, conjuntos, enumeraciones y entradas de variantes sin signo quedaron fuera del alcance; sin embargo, todo esto claramente no es una necesidad esencial. Sin embargo, no podía negarme el placer de los números de coma flotante y su aritmética en el coprocesador 8087: afectó la inclinación profesional por los cálculos de ingeniería.

Al implementar procedimientos y funciones, temía que la recursión y el almacenamiento de variables locales en la pila fuera un gran problema. Sin embargo, la verdadera dificultad, específica de Pascal, estaba al acecho en un lugar completamente diferente: trabajar con procedimientos anidados. Puede surgir una necesidad completamente inocente de referirse a la variable local del procedimiento externo desde el interno. Sin embargo, el procedimiento interno no tiene la dirección del marco de la pila del procedimiento externo; el procedimiento interno no sabe de qué leer la dirección de la variable. Esta dirección siempre debe pasarse al procedimiento interno a través de un parámetro oculto adicional. Sospecho que fue esta complicación la que hizo que los desarrolladores de C abandonaran por completo la anidación de funciones. Sin embargo, en Pascal lo son, y esto debe tenerse en cuenta.

El generador de código creó los ejecutables COM más simples para el modo real de MS-DOS. El código de máquina se generó directamente, sin la ayuda de un ensamblador o enlazador externo. Para los datos, utilicé los registros de 32 bits de la arquitectura 80386, y el direccionamiento permaneció en 16 bits, en forma de un par de segmentos desplazados.

El modelo de memoria correspondía aproximadamente al "pequeño" (si alguien más recuerda esta terminología de la era de los 16 bits): para un código, datos globales y una pila, se asignó un segmento de 64 kb.

imagen
Uso de la memoria

Generar archivos EXE y cambiar segmentos sobre la marcha me pareció un poco abrumador, y el estrecho alcance del modelo "pequeño" me hizo decir adiós a la idea de autocompilación. Por supuesto, me he encontrado con compiladores de compilación automática cuyo código encaja completamente en un segmento (por ejemplo, Contexto ). Sin embargo, rara vez sabían cómo hacer algo útil aparte de esta autocompilación. Quería hacer mi compilador al menos un poco adecuado para los cálculos numéricos y la salida de gráficos. Por lo tanto, entre los ejemplos de programas, aparecieron fractales, solución de ecuaciones lineales de Gauss, transformación rápida de Fourier e incluso estimación por el filtro de Kalman de errores del sistema de navegación inercial.

imagen
Fragmento del conjunto de Mandelbrot

imagen
Transformada rápida de Fourier

imagen
Estimación de error del sistema de navegación inercial

Lo que obtuve como resultado, sobre todo, se parecía a lo antiguo como el mundo Turbo Pascal 3.0 (aún sin POO) y al aficionado BeRo Tiny Pascal . El autor de este último hizo frente a la autocompilación en Windows, pero sacrificó la aritmética de coma flotante y muchas sutilezas gramaticales que quería observar. De las características más modernas en mi XD Pascal, Result comentarios de una sola línea ( // ) prestados de Delphi y Result automática Result .

Sin embargo, desde mi nacimiento, mi compilador fue marcado con el sello de la muerte. Pascal ya ha pasado de manera irreversible y MS-DOS se ha convertido en un arcaico. Ese día, cuando cambié de Windows XP de 32 bits a Windows 7 de 64 bits sin una máquina virtual DOS, enterré mentalmente mi proyecto.

Renacimiento


Entonces sucedió algo extraño. Después de tres años de olvido total, un grupo de entusiastas de la retrocomputación polaca y amantes de Atari encontraron mi compilador. Aparentemente, los problemas abstractos de la autocompilación y el rigor de la implementación de la gramática no les preocupaban demasiado. Solo necesitaban una herramienta de programación conveniente para su automóvil favorito. A partir de mi proyecto, crearon su propio compilador Mad Pascal para la arquitectura 6502. La gramática del lenguaje creció, el soporte para módulos con secciones de la interfaz y la implementación, operador goto , enteros sin firmar, conjuntos y enumeraciones, aparecieron insertos de ensamblador. En lugar del código de máquina, ahora se genera el código del ensamblador. Su transmisión final fue realizada por un ensamblador de diseño propio.

Exteriormente, el lenguaje se ha vuelto notablemente más cercano al estándar real de Pascal. En el interior, el compilador parece algo intimidante, las palabras reservadas se mezclan con los nombres de los procedimientos estándar, pero esto no molesta en absoluto a los autores. No importa cómo se vea, resultó ser sorprendentemente tenaz: Mad Pascal se ha actualizado regularmente durante tres años, ha escrito muchos juegos y los autores hablan anualmente en la retroconferencia de Silly Venture (el enlace requiere una VPN). Existe la sensación de que en Polonia, las tradiciones Atari son generalmente muy fuertes.


En la primavera de 2018, tuvo lugar un evento que fue bastante notable para la fiesta polaca de fanáticos de Atari: el libro “Robbo. Solucja " (" Robbo. Passage ") en el género de la literatura experimental. Aquí debo decir que el juego Robbo para Atari, publicado hace 30 años, todavía excita los corazones de los polacos de la generación anterior y los llena de entusiasmo patriótico. En general, no es sorprendente que haya un libro dedicado al juego. Lo curioso es que, según los autores, consiste en el 60% de las instrucciones para pasar el juego generadas por la computadora Atari. El programa de generación está escrito en el mismo Mad Pascal.

imagen
graczpospolita.pl

Y parece que algunos percibieron el libro como un digno ejemplo de arte moderno:
Sería un error tratar el libro solo como un objeto de colección para los fanáticos de Robbo o, en general, para los fanáticos de Atari. Tenemos que lidiar con un caso raro de colisión de la cultura de los videojuegos con la literatura (en este caso, electrónica), cuando el punto de partida es "juego" y no "literatura". Para algunos, este es un arte sin sentido por el arte. Para otros, este cruce ofrece oportunidades y experiencias completamente nuevas. Nada le impide crear una versión de Robbo, que puede terminar con el "recorrido" del libro. El libro está de acuerdo con mi visión de los juegos como arte. Un arte en el que el jugador puede ser perceptivo y creativo, si durante el "juego" hay una "audiencia" que mira al jugador creando su propia historia del "juego". El contenido del libro se puede adaptar para el rendimiento con un jugador que pasa a Robbo usando los elementos de las "instrucciones paso a paso" del libro. Para no quedar infundado: rendimiento basado en "Robbo". Solucja ”se llevó a cabo el 11 de mayo de 2018 en la Bunker Gallery of Modern Art en Cracovia, durante la presentación del libro como parte de la Exposición Inagotable.
Actuación en Cracovia. Por el bien de esto, valió la pena escribir un compilador.

Source: https://habr.com/ru/post/es436694/


All Articles