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

起源


几年前,我编写了Pascal编译器。 动机很简单:十几岁的时候,我从我的第一本编程教科书中学到了编译器是一件非常复杂的事情。 这种说法最终成为一个挑战,需要通过经验进行检验。

图片
ha.art.pl

首先,一个简单的PL / 0编译器应运而生,后来一个用于MS-DOS的几乎全功能的Pascal编译器由此产生。 我的灵感来源是Pascal语言的发明者Niklaus Wirth编写的《 Compiler Construction》一书。 我不在乎Wirth的观点现在是否已过时并且与IT主流没有直接联系,或者编译器的设计方式是否已更改。 足以知道他的技术仍然简单,优雅,并且最后但并非最不重要的是, 带来了很多乐趣 ,因为用手写递归下降解析器解析程序源并生成机器代码比使用称为yaccs野牛及其所有后代。

我的编译器的命运并不那么琐碎。 它有两种生命:第一种在我自己的手中,第二种在来自波兰的计算机古董商的手中。

Xd帕斯卡


我刚出生的编译器名为XD Pascal 。 它支持gotowith之外的所有Pascal语句。 前者似乎很难实现,因为它将破坏完美的分层程序结构。 后者可能会使简单的作用域规则变得模棱两可。

还支持所有主要数据类型。 除了范围之外,只有无符号的整数,集合,枚举和变量记录-但是所有这些显然不是日常必需品。 但是,我不能否认自己引入了浮点数和8087 FPU算术的乐趣-那是我对工程计算的沉迷。

在实现过程和函数时,我担心本地变量的递归和在堆栈上的存储将是一个大问题。 然而,嵌套子例程是Pascal真正的难题。 可以无私地希望从内部子例程中访问外部子例程的局部变量。 但是,内部子例程不具有外部子例程的堆栈帧地址,换句话说,它不知道使用可变偏移量的源是什么。 该地址将作为附加的隐藏参数传递给内部子例程。 我认为正是这种困难迫使C的设计人员完全放弃了子例程的嵌套。 但是Pascal仍然有它们,并且此功能不能忽略。

代码生成器为实模式MS-DOS创建了最简单的COM可执行文件。 机器指令是直接生成的,无需任何外部汇编程序或链接程序。 我使用32位寄存器存储数据,但是寻址仍然是16位(段/偏移对)。

内存模型类似于“小型”模型(如果有人仍然记得这种16位时代的术语):代码,数据和堆栈每个占用一个64 KB的段。

图片
内存使用量

生成EXE并动态切换段似乎太难了,“小”模型的严格限制迫使我告别了自我编译。 当然,我看到一些自编译器,它们的代码仅适合一个段(例如Context )。 但是,除了这种编译自身的功能之外,他们几乎无法做任何有用的事情。 相反,我希望使我的编译器适合于数值计算和图形。 因此,除其他示例外,我还包括分形,用于求解线性方程式的高斯方法,快速傅立叶变换,甚至包括用于估计惯性导航系统误差的卡尔曼滤波器。

图片
曼德布罗集片段

图片
快速傅立叶变换

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

我最终得到的东西与古老的Turbo Pascal 3.0(无OOP)和业余爱好者BeRo Tiny Pascal非常相似。 后者的作者设法在Windows下自编译,但是牺牲了浮点运算和语法的许多微妙之处,我希望保留这些细节。 在更现代的功能中,我的XD Pascal获得了Delphi样式的单行注释( // )和Result变量。

然而,自从诞生以来,我的编译器被标记为死亡。 Pascal不可逆转地过时了,而MS-DOS早已成为过时的了。 当我从没有DOS虚拟机的32位Windows XP切换到64位Windows 7的那天,我认为我的项目已死。

复兴


然后发生了一些奇怪的事情。 经过三年的遗忘,一组波兰的反向计算爱好者和Atari爱好者找到了我的编译器。 看来他们不太在意抽象问题,例如自我编译或语法严格性。 他们只是需要一种方便的编程工具来安装自己喜欢的机器。 他们使用我的项目,为6502体系结构构建了自己的Mad Pascal编译器。 语言语法得到了扩展,添加了对具有接口和实现部分, goto语句,无符号整数,集合和枚举,内联汇编代码的独立单元的支持。 生成了汇编代码,而不是机器代码。 然后由自制编译器翻译。

该语言的外观已与事实上的标准Pascal变得非常接近。 编译器内部看起来有些恐怖,保留字与标准子例程的名称混合在一起,但这不会打扰开发人员。 无论看上去如何,这项工作都令人惊讶地可行:Mad Pascal进行了三年定期更新,编写了许多游戏,作者每年参加Silly Venture逆向计算会议(链接可能需要VPN)。 看起来Atari的传统在波兰非常流行。


Atari的波兰粉丝在2018年春季发生了一件值得注意的事件:《 Robbo 》一书 出版了实验文献的示例SolucjaRobbo。Walkthrough )。 我在这里需要强调的是,30年前发行的Atari 机器人游戏仍然激发了波兰老球迷的热情,使他们充满了爱国主义的喜悦。 一般而言,出现一本受游戏启发的书并不奇怪。 但是有趣的事实是,正如作者所说,这本书的60%是Atari计算机本身生成的演练教程。 文本生成程序是用Mad Pascal编写的。

图片
graczpospolita.pl

似乎有人认为这本书是当代艺术的一个很好的例子:
将这本书视作Robbo粉丝(或更笼统的Atari粉丝)的收藏品会产生误导。 我们以视频游戏文化与文学(在本例中为电子文学)之间互动的罕见例子为出发点,即“游戏”而非“文学”。 对于某些人来说,这是毫无意义的“为艺术而艺术”。 对于其他人来说,这样的交叉提供了绝对新的机会和经验。 没有什么可以阻止您创建可以使用本书中的“演练”完成的Robbo版本的。 这本书很符合我对电子游戏艺术的看法。 玩家既可以是接受者又可以是创造者的艺术-如果在“游戏”期间有“观众”看着玩家创建自己的“游戏”历史。 本书的内容可以与演员表演Robbo的演员一起使用表演中的演练元素来进行表演。 为了不落伍:基于Robbo的表现 Solucja于2018年5月11日在克拉科夫的Bunker当代艺术画廊举行,展览的同时介绍了《 无尽之力》展览。
在克拉科夫的表演节目。 值得编写一个编译器。

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


All Articles