Apocalypse #1 代表了 Larry 在将我们引向我们今天所知道的 Raku 语言的过程中的一些最早的想法。我在语言设计过程中并没有那么早,所以我给出的任何答案自然都会涉及尝试想象当时已知的内容。有了这个相当重要的警告,让我们来看看。
语法是关于我们编写的单词和符号的。语义是关于事物的含义。例如,假设我们使用的语言具有中缀运算符之类的东西,并且有一个运算符拼写为+
. 我们可以写出表达式a + b
。语义告诉我们它的含义。尽管许多编程语言都具有这种语法,但它们在与之相关的语义(即含义)方面存在巨大差异。例如:
- 在 C 中,它取决于 和 的
a
类型b
。它可能意味着某种数字加法(有一大堆基于整数、整数等级、浮点数等的规则)。然而,如果a
是一个指针并且b
是一个整数,实际上也有一个基于指针大小的偷偷摸摸的乘法。
- 在 C++ 中,请参阅 C 中的定义,但它也可能是对运算符重载的函数调用,和/或任何这些语义,但在对操作数应用转换规则后获得。请不要问我这些规则是什么。
- 在 Java 中,它也是按类型进行的;它可能意味着数字加法,也可能意味着字符串连接。
- 在 JavaScript 中,它可能是数字加法或字符串连接,但它是在运行时根据规则决定的。不,也不要问我这些。
- 在 Raku 中,它是对 的函数调用
infix:<+>
,这意味着标准库决定它意味着什么。
对我来说,语义模型是描述语义的系统方式。这可能作为以下一项或多项存在:
- 试图描述应该做什么的书面(自然语言)规范
- 一个可执行的规范,试图描述事物的行为(如 Raku 规范测试)
- 使用数学形式的语义表达,例如操作语义或指称语义
- 用其他语言实现的解释器(在这种情况下,我们依靠它的语义模型)
- 翻译成其他语言的编译器(同样,我们依靠目标语言的语义模型)
正如我们已经观察到语法a + b
可能映射到不同语言的许多不同语义一样,我们也可以将许多语法映射到同一组语义。即使在标准 Raku 中也是如此。$a + $b
write和.之间没有语义上的区别infix:<+>($a, $b)
。
虽然这可能提供了一些答案,但阅读您引用的段落之后的段落很有趣。以下是附注的内容。
多种语法听起来像是一件坏事,但它们对于语言的发展确实是必要的。
我认为“进化”的使用在这里很重要,因为允许语言的语法以受控方式改变确实允许语言语法的不同突变共存。此外,适者生存可以适用(并且适合的内容很可能是使用该语言的上下文的函数)。给定语法是语言的接口,例如,值得霍夫曼化的东西可以随时间或上下文变化,期望它可能会发展并不是不合理的,同时仍然提供对相同底层行为集的访问。
无论如何,我认为我们可以将其视为预见用户定义的运算符和俚语等功能。
在某种程度上,我们在 Perl 5 中已经有了一个多语法模型;每次您使用编译指示或模块时,您都在扭曲您正在使用的语言。
我觉得这部分有点奇怪,因为“语言”不仅仅是语法,也是语义,实际上很多 pragma 改变语义而不是(只是)语法。另一方面,它确实说“在某种程度上”,这是一个很好的躲在后面的对冲。:-)
只要从模块顶部的声明中清楚您正在使用哪个版本的语言,这不会造成什么问题。
这意味着语言突变是范围内的事情。它们最终是词法范围的,而不仅仅是文件范围的。这并不完全令人惊讶。在设计过程中似乎越来越意识到词汇范围的实用性。
从 Perl 5 迁移到 Perl 6 本身就是一个特别有力的例子,说明了对多种语法的支持将如何实现持续发展。
这表明当时的想法是 Perl 5 和 Perl 6(现在的 Raku)将有足够的共同点,它们可以共享一个语义模型,并在相同的运行时之上运行。正如我们所知,事情并没有这样发展,但是在写《启示录》#1 时,我可以想象这是一个假设。事实上,它可能会在很长一段时间内保持不变。例如,PONIE(尝试在 Parrot VM 上运行 Perl 5 的项目)在几年后仍在进行中。
实际上,随着语言设计的出现,原本允许这样做的单一语义模型变得不切实际。出于这个原因,将 Perl 6 中的特性引入 Perl 5 的各种努力都遇到了困难。智能匹配是这方面的典型代表,问题根本不是因为语法,而是因为语义:在 Raku 中,事物总是知道它们的类型,而在 Perl 5 中,标量可能同时包含字符串和数字表示,取决于该值在此之前的使用方式。该功能基于 Raku 语义模型中的某些内容,而 Perl 5 语义模型中没有直接等效的内容。
另一个有趣的地方是,目前正在进行的 RakuAST 工作将提供 Raku 语言的文档对象模型形式。我们可以将其视为表示为对象图的 Raku 的另一种语法。鉴于它也是编译器前端用于 Raku 代码的表示形式,我们也可以将其视为 Raku 语义模型的一种与语法无关的网关。而且,当我们真正达到使用俚语时,可以预期它们将通过将与附加俚语语法相关的语义表达为 RakuAST 节点的组合来实现——因此最终将根据单个 Raku 提供新语法语义模型。