编译器描述语言
编辑编译器描述语言(CDL)是一种基于词缀语法的编程语言。它与Backus-Naur形式(BNF)符号非常相似。它是为开发编译器而设计的。它的能力和控制流非常有限,而且是故意的。这些限制的好处是双重的。一方面,它们使得CDL2优化器所使用的复杂的数据和控制流分析成为可能,从而产生了极其有效的代码。另一个好处是,它们促进了一个高度冗长的命名惯例。这反过来又导致了程序在很大程度上是自我记录的。这种语言看起来有点像Prolog(这并不奇怪,因为这两种语言都是在差不多同一时间从词缀语法的工作中产生的)。然而,与Prolog不同的是,CDL中的控制流是以成功/失败为基础的,也就是说,当当前的控制流成功时,不会尝试其他的选择。这种想法也被用于解析表达式语法。CDL3是CDL语言的第三个版本,与前两个版本明显不同。
编译器描述语言的设计
编辑971年出现的原始版本由奈梅亨大学的CornelisH.A.Koster设计,它有一个相当不寻常的概念:它没有核心。一个典型的编程语言源被翻译成机器指令或这些指令的罐装序列。这些代表了核心,即给定语言所支持的最基本的抽象概念。这种基元可以是数字的加法,将变量相互复制,等等。CDL1缺乏这样一个核心。程序员有责任以一种可以通过汇编器或传统语言的编译器变成机器指令的形式来提供原始操作。CDL1语言本身没有基元的概念,除了机器字(一个抽象的存储单位--不一定是真正的机器字)之外,没有数据类型的概念。评估规则与Backus-Naur形式的语法描述相当相似;事实上,为BNF描述的语言编写解析器在CDL1中相当简单。基本上,该语言由规则组成。一个规则既可以成功也可以失败。一条规则由其他规则调用的序列的替代物组成。如果一个规则的任何一个替代物都成功了,那么这个规则就成功了;这些替代物被依次尝试。如果一个替代品的所有规则调用都成功,那么它就成功了。该语言提供了操作符来创建没有递归的评价循环(尽管这在CDL2中不是严格必要的,因为优化器达到了同样的效果),并提供了一些捷径来提高其他递归评价的效率,但基本概念如上。除了在上下文自由语法解析中的明显应用外,CDL也很适合控制应用,因为很多控制应用本质上是深度嵌套的if-then规则。每条CDL1规则在被评估时,都可以作用于数据,这些数据的类型没有被指定。理想情况下,除非规则成功,否则数据不应该被改变(失败时没有副作用)。这导致了一些问题,因为尽管这个规则可能会成功,但调用它的规则可能仍然会失败,在这种情况下,数据的改变不应该生效。如果所有的数据都是在堆栈中动态分配的,那么保证上述行为是相当容易的(尽管是内存密集型)。然而,当有静态数据时,这就相当困难了,而这种情况经常发生。CDL2编译器能够标记可能的违规行为,这要归功于参数的方向(输入、输出、输入-输出)和规则的类型(可以失败:测试、谓词;不能失败:函数、动作;可以有副作用:谓词、动作;不能有副作用:测试、函数)必须由程序员指定。
由于规则的评估是基于调用越来越简单的规则,在底部,应该有一些原始的规则来做实际的工作。这就是CDL1非常令人惊讶的地方:它没有这些基元。你必须自己提供这些规则。如果你的程序中需要加法,你必须创建一个有两个输入参数和一个输出参数的规则,输出被你的代码设置为两个输入之和。CDL编译器将你的代码作为字符串使用(对输入和输出变量的称谓有约定俗成的方式),并根据需要简单地将其排放出来。如果你用汇编来描述你的添加规则,你将需要一个汇编程序来把CDL编译器的输出翻译成机器码。如果你用Pascal或C语言描述所有的原始规则(CDL术语中的宏),那么你需要一个Pascal或C编译器在CDL编译器之后运行。当你要写一段代码时,即使是最简单的机器指令操作,这种核心基元的缺乏也会让你非常痛苦。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/163820/