Eternal Embrace

INTERCAL 论文翻译

INTERCAL 的抽象和模块化

D. Alexander Garrett
CS-538: Theory and Design of Programming Languages
(课程:编程语言理论与设计)

原文地址

“切记,你在向坑里看的时候,坑也在看着你。“
– 某 INTERCAL 黑客

在 1972 年 5 月 26 日,两名普林斯顿大学的学生在发布 INTERCAL 时
带给编程界,如果算不上是狂风骤雨,至少也算得上是一阵和风细雨。[1]
他们因为在语言细节中针对政治犯而立马被学校开除,并被强制遣送到
一个疯狂的小共和国去了。这当然,是很明显地违法了《日内瓦公约》的,
不过如同你将要看到的一样,INTERCAL 之后成为了一门独具一帜的语言。

十八年后,丧病的 Malvernite J. Lapin 在经受让人麻痹的退意的同时,
在 UN*X 平台上发布了被其命名为 C-INTERCAL 的 INTERCAL 实现,在全世界
造成了不可计量的后果。可惜的是, Malvernite J. Lapin 很显然是个
假名,所以没有人能确定谁该为如此恶行负责。然而,一些群众怀疑 INTERCAL 的
重现预示着古老的存在将要从沉睡中醒来,并在接下来的 2 的 32 次方 年里统治
人类的思想,迫使人们使用愚蠢而溢价的软件。[2]

当然我不是在将末日学,我在这篇论文里面是要讲模块化和抽象性。相信我,你是无法
设计出一门像 INTERCAL 一样抽象的语言的。首先,抽象性的最重要特征就是隐藏信息。
隐藏信息是自古以来码农的一项光荣传统,虽然有时候它也被称为“职位保障”。它的
思想就是让你的代码尽可能地难懂,想尽一切办法隐藏信息,这样你的老板就不能把你炒了
以后雇某些菜鸟邮递员来维护你的代码。INRTERCAL 并不止于隐藏信息,它还能扭曲信息。
比如,将 65536 这个数字储存为 32 位 INTERCAL 变量的最简单实现就是这样:

1
DO:1<-#0$#256

如果这就是最简单的实现,你就可以想象一段故意隐藏信息的代码会长成啥样了。
为了更进一步的说明,假如你想用 INTERCAL 写一个程序,读入 32 位整数,除以 2
之后把绝对值打印出来,这会需要大约 22 行代码以及 15 到 30 分钟到时间,
而同样的程序用 SNOBOL 或者 APL 写各需要一行代码,而且一分钟足够把两个程序都写完。
所以 INTERCAL 不只能让程序员产出大约二十倍的代码,让程序员比他们用简练的语言写
程序的同事们看起来更有效率,还需要更长的时间写,产生更多的休息机会。除此之外,
当一个程序被写完以后,所有的信息都被完美地隐藏了,以至于 Sparky the Wonder Dog
都无法察觉出来,要知道她可是能在污水池里找到肉汁的!这使得程序员能在上班的时候
花更多的时间来摸鱼,因为公司的管理阶层绝对不敢将公司的宝贵财产随意炒掉。

除信息隐藏之外,多语言支持同样是一项极为重要的抽象特性。鉴于信息交换让地球变小
了,一门编程语言应当能支持多国文化。为达到这一要求,INTERCAL 在多方面进行了尝
试。由于各国使用的数字系统是不同的,INTERCAL 实现了又一种数字系统。它使用
数字的名称而不是阿拉伯数字来输入。比如,523 应当输入为 FIVE TWO THREE
另外,INTERCAL 支持将 OH 识别为 0 以及将 NINER 识别为 9
既然 INTERCAL 是一门国际性的语言,实现者们提供了用 梵语、巴斯克语、菲律宾语、
传统墨西哥语、格鲁吉亚语、印第安语以及世界语 输入数字的可能。

鉴于目前为止 INTERCAL 编译器没有 RYM 支持,它是没法知道你可以接受哪一种
数字输出形式。因此 INTERCAL 十分聪明地将数字输出为罗马数字,鉴于罗马曾经
统治了半个世界,罗马数字成为了我们种族记忆的一部分。

INTERCAL 除了能处理多国语言和多种问题外,它还是一门非常简单的语言。
比如,在大部分语言中逻辑操作符号 AND OR XOR 接受 2 个参数。而
在INTERCAL 中它们只接受一个参数,这样存在逻辑错误的可能性也就减半了。
AND 表示为 &OR 是一个无底的倒三角 V,以及 XOR 是问号 ?