- 自己动手构建编程语言:如何设计编译器、解释器和DSL
- (美)克林顿·L.杰弗瑞
- 952字
- 2024-05-11 19:45:01
2.2 指定控制流
控制流(control flow)用于显示程序的执行在源代码中是如何从一个地方到另一个地方进行的。大多数控制流结构对于接受过主流编程语言培训的程序员来说应该是熟悉的。语言设计中的创新可以集中在那些新颖或领域特定的功能上,这些功能促使我们首先创造一种新的语言,要让这些新的东西尽可能地简单,尽可能地可读。设想一下这些新特性应该如何融入编程语言的其余部分中。
每种语言都必须有条件和循环语句,几乎所有的语言都使用if和while来启动。我们可以为if表达式发明自己的特殊语法,但除非有充分的理由,否则就是自找麻烦。以下是一些Java的控制流结构,这些控制流结构当然也用在Jzero中:
下面是一些其他不太常见的Java控制流结构,这些控制流结构不在Jzero中使用,如果它们在程序中出现,那么Jzero编译器应该如何处理它们?
在默认情况下,编译器将输出一条神秘消息,但该消息并不能对问题做出很好的解释。在接下来的两章中,我们将让Jzero编译器输出一条关于它不支持的Java特性的错误消息。
除了条件和循环结构外,语言往往有一种用于调用子程序然后返回的语法。所有这些无所不在的控制流形式都是底层机器改变指令执行位置能力的抽象——GOTO指令。如果你能发明一个更好的符号来改变指令执行的位置,那就非常了不起。
在设计许多甚至大多控制流结构时,最大的争议似乎是判断它们是否是语句,或者我们是否应该让其成为可以在周围表达式中产生结果的表达式。我使用过一些语言,其if表达式的结果很有用,C、C++、Java等甚至配备有专门的运算符:i?t:e条件运算符。我还没有发现有哪种语言在使while循环成为表达式方面做了一些有意义的事情。它们所做的最好的事情就是用while表达式生成一个结果,告诉我们循环是否由于达到测试条件或由于内部中断而退出。
如果读者正在从头开始发明一种新的语言,一个大问题是能否想出一些新的控制结构来支持预期应用领域。例如,假设你想让你的编程语言能够为股票市场的投资提供特殊支持,如果你能想出一个更好的控制结构来明确该领域中的条件、约束或迭代操作,那么你可能会给那些在这个领域用你的语言编码的人提供竞争优势。程序必须在底层的冯诺伊曼指令集上运行,所以必须弄清楚:如何将这样的新控制结构映射到布尔逻辑测试和GOTO指令等指令上。
无论决定支持什么样的控制流结构,你都需要设计一套数据类型和声明,以反映该语言中程序将要处理的信息。