静止的

115 阅读3分钟

今年夏天为了好玩,我实现了PostScript语言的一部分,使用PyCairo进行渲染。我把它叫做Stilted。 实现一种语言是一项有趣的工作。在这个过程中你总能学到一些东西。

可执行位。PostScript中的所有对象都有一个字面/可执行位,可以用cvx(转换为可执行)和cvlit(转换为字面)操作符来改变。 字面数组以方括号为界,可执行数组(程序)以大括号为界。 像Python和JavaScript一样,多个引用共享存储。 但奇怪的是,在PostScript中,你可以在堆栈中复制一个对象,并改变其可执行位,现在你有两个对相同存储的引用,但属性不同。

下面是一个使用GhostScript(第三方的符合性实现)的例子。

GS

可执行属性是引用的一部分,而不是对象的一部分!? 这似乎不是一个计划中的和期望的结果:它似乎是一个常见的C技术的副作用:使用指针的低位来存储标志。

在写Stilted的时候,我没有意识到这种行为,直到我已经把可执行性作为对象本身的一部分,所以Stilted产生了一个不同的(错误的)结果。

|-0

由于我认为没有人真正依赖于有两个共享存储的对象,但有不同的可执行性,所以我没有费心去改变它。 纯粹好玩的辅助项目的一个好处是:你可以做任何你想做的事情

BTW:提示中的数字是当前操作数栈的深度。

**可爱的字符串语法。**PostScript的字符串是用小括号组成的,而且它们是嵌套的,所以这是一个字符串。

GS

Stilted不会在字符串中嵌套小括号,因为它使用词组来词组标记,而用词组嵌套是很难的。 这是Stilted的一个语法错误。

|-0

另外,谁会依赖字符串中的嵌套后缀?只要在你的字符串中转义收尾的圆括号即可。

灵活的范围。PostScript是一种面向堆栈的语言。有一个操作数栈,用于操作者的弹出和推入,还有一个字典栈,用于定义和查询名称。 字典堆栈是用beginend操作符明确操作的。 程序不隐含地开始新的作用域,而是由程序员决定何时开始和结束作用域。 这意味着它们根本不需要对应于程序的调用。

在我们的编程语言中,我们已经习惯于将作用域与函数调用联系在一起,所以当我们意识到这两个概念可以完全不相关时,我们感到很奇怪。

**令人惊讶的差距。**重新认识PostScript后,我对它所没有的东西感到惊讶:没有办法对数组进行排序,没有字符串格式化,诸如此类。 PostScript比Python、JavaScript、甚至Perl等语言都要早。它的模型更像C语言,而不是我们现在所习惯的高级语言。 虽然C语言有字符串格式化,你会认为这在打印编程语言中是一个有用的东西。

**更多。**如果你不熟悉PostScript,我有更多关于其不寻常的控制结构方法的描述,还有其他标记为#postscript的博客文章。

Stilted已经有了很多乐趣。 额外的乐趣。我使用了混淆的PostScript赢家作为测试案例!