我的Pascal编译器和波兰当代艺术

起源


几年前,我编写了Pascal编译器。 动机很简单:在我年轻的时候,我从第一本编程书籍中学到了编译器是一件极其复杂的事情。 这种说法已经成为大脑的荆棘,最终需要审判。

图片
ha.art.pl

首先,最简单的PL / 0编译器诞生了,由此,用于MS-DOS的几乎全功能的Pascal编译器逐渐发展起来。 我的灵感来自于Pascal Nicklaus Wirth语言的编写者编写的《 编译器构造 》一书。 即使Wirth的观点已经过时并与IT现实失去了联系,编译器也完全没有Wirth所教。 但是,它的方法仍然简单,优雅,并且最重要的是,它们带来了乐趣 ,因为通过递归下降独立地解析程序文本并生成机器代码比寻求than 野牛及其所有后继者的帮助更具吸引力。

我的编译器的命运并不是最琐碎的。 他过着两种生活:第一次-在我手中,第二次-在波兰计算机古物鉴赏家的手中。

Xd帕斯卡


我刚烘焙的编译器称为XD Pascal 。 它支持gotowith以外的所有Pascal运算符。 第一个似乎难以实现,因为它破坏了程序的理想分层结构。 第二个-与名称范围造成混淆。

支持所有主要数据类型。 只有无符号的整数,集合,枚举和变量条目被排除在范围之外-但是,所有这些显然不是必需的。 但是,我不能否认自己对8087协处理器的浮点数及其算术的乐趣-它影响了工程计算专业人士的偏爱。

在实现过程和函数时,我担心递归和将局部变量存储在堆栈中会是一个大问题。 但是,Pascal特有的真正困难在于在完全不同的地方等待-使用嵌套过程。 从内部引用外部过程的局部变量可能完全是无辜的。 但是,内部过程没有外部过程的堆栈帧的地址-内部过程不知道从中读取变量的地址。 此地址必须始终通过附加的隐藏参数传递给内部过程。 我怀疑正是这种复杂性使C开发人员完全放弃了函数的嵌套。 但是,在Pascal中,这是不容忽视的。

代码生成器为MS-DOS实模式创建了最简单的COM可执行文件。 机器代码是直接生成的,无需外部汇编程序或链接程序的帮助。 对于数据,我使用了80386体系结构的32位寄存器,而寻址仍然是16位,采用段偏移对的形式。

内存模型大致对应于“小”模型(如果其他人还记得16位时代的术语):对于代码,全局数据和堆栈,分配了一个64 KB的段。

图片
内存使用量

快速生成EXE文件和切换段似乎有些不知所措,而“小型”模型的狭小范围让我告别了自我编译的想法。 当然,我遇到过自编译器,它们的代码完全适合一个片段(例如Context )。 但是,除了这种自我编译之外,他们几乎不知道该怎么做。 我想使我的编译器至少适合于数值计算和图形输出。 因此,在程序示例中,出现了分形,线性高斯方程解,快速傅立叶变换,甚至是卡尔曼滤波器的惯性导航系统误差估计。

图片
Mandelbrot集的片段

图片
快速傅立叶变换

图片
惯性导航系统误差估计

结果,我得到的大多数都与世界上最古老的Turbo Pascal 3.0(仍然没有OOP)和业余爱好者BeRo Tiny Pascal相似 。 后者的作者处理了Windows下的自动编译,但是他牺牲了浮点运算和我想观察的语法的许多细微之处。 在我的XD Pascal中更现代的功能中,从Delphi借来的单行注释( // )和Result auto Result

但是,从我出生的那一刻起,我的编译器就带有死亡的印记。 Pascal已经不可逆转地过时了,MS-DOS早已成为一种过时的产品。 那天,当我在没有DOS虚拟机的情况下从32位Windows XP切换到64位Windows 7时,我就下定了决心。

重生


然后发生了一件奇怪的事情。 经过三年的完全遗忘,一群波兰的反向计算爱好者和Atari爱好者找到了我的编译器。 显然,自编译的抽象问题和语法执行的严格性与它们无关。 他们只是需要一种方便的编程工具来安装自己喜欢的汽车。 从我的项目中,他们为架构6502制作了自己的编译器Mad Pascal 。该语言的语法不断发展,支持带有接口和实现部分的模块, goto运算符,无符号整数,集合和枚举以及汇编程序插入。 现在生成汇编代码,而不是机器代码。 它的最终广播由自己设计的组装商完成。

从表面上看,该语言已明显接近Pascal的实际标准。 在内部,编译器看起来有些吓人,保留字与标准过程的名称混合在一起,但这根本不会打扰作者。 无论看上去如何,它都表现出令人惊讶的坚韧:Mad Pascal已定期更新了三年,编写了很多游戏,并且作者每年在Silly Venture回顾会议上演讲 (链接需要VPN)。 有一种感觉,在波兰,雅达利人的传统通常很强。


在2018年春季,发生了一场对于Atari波兰球迷党来说非同寻常的活动: 《 Robbo。 实验文学类型中的“ Solucja” (“ Robbo。Passage” )。 在这里我必须说,30年前发行的游戏《 Robbo for Atari》仍然激发着老一辈波兰人的心,并充满了爱国热情。 总的来说,有一本专门针对游戏的书并不奇怪。 作者们认为,有趣的是,它包含60%的Atari计算机本身生成的用于传递游戏的指令。 生成程序是在相同的Mad Pascal上编写的。

图片
graczpospolita.pl

似乎有些人认为这本书是现代艺术的一个有价值的例子:
将这本书仅视作Robbo迷或Atari迷的收藏品是错误的。 当起点是“游戏”而不是“文学”时,我们必须应对电子游戏文化与文学(在这种情况下是电子学)发生冲突的罕见情况。 对于某些人来说,这对艺术来说是毫无意义的艺术。 对于其他人来说,这种杂交带来了全新的机会和经验。 没有什么可以阻止您创建Robbo的版本,您可以通过完成本书的“演练”来完成。 这本书与我对游戏艺术的看法非常吻合。 一种可以使玩家同时感知和创造力的艺术-如果在“游戏”期间有“观众”看着玩家创建自己的“游戏”故事。 本书的内容可以适合玩家通过使用Robbo的“分步说明”中的元素通过Robbo进行表演。 为了保持毫无根据:基于“ Robbo。 Solucja”于2018年5月11日在克拉科夫的邦克现代艺术画廊举行,在这本书作为无穷尽展的一部分进行介绍期间。
在克拉科夫的演出。 为此,值得编写一个编译器。

Source: https://habr.com/ru/post/zh-CN436694/


All Articles