启示录#1 中引入的“语义模型”是什么?

rai*_*iph 7 rakudo metamodel raku nqp

在《启示录》#1 中,拉里写道,我还强调

Raku 将支持映射到单个语义模型的多种语法。其次,该单一语义模型将依次映射到多个平台。

我对 Larry 在写“单一语义模型”时可能意味着什么有一些模糊的概念:

  • 图灵完备的语言/自动机;和/或

  • 什么变成了6model;和/或

  • 什么变成了 NQP/nqp。

(我在谷歌上搜索并找到了一些讨论,例如slashdot 上的这个,但它们同样含糊不清。)

也许比回答他当时的想法更重要的是已经发生的事情。

他的表述听起来很像它可能映射到NQP 和/或 nqp(在 Raku/NQP/nqp/NQP 后端架构的中间)。

(如果是这样,大概那个模型是由 nqp 相当于 Raku 的烤肉“指定”的?)

或者,根据 Liz++、QAST 或 RAST?


我知道我认为谁能够最好地回答我的主要问题(在标题中),但也许其他人知道?

Jon*_*ton 14

Apocalypse #1 代表了 Larry 在将我们引导到我们今天所知道的 Raku 语言的过程中的一些最早的想法。在语言设计过程的早期,我并没有参与其中,因此我给出的任何答案自然都会涉及尝试想象当时已知的情况。有了这个相当重要的警告,让我们来看看。

语法是关于我们写的单词和符号。语义是关于事物的含义。例如,假设我们使用的语言有中缀运算符之类的东西,并且有一个拼写为 的运算符+。我们可能会写出表达式a + b。语义告诉我们这意味着什么。尽管许多编程语言都具有这种语法,但它们在与之相关的语义(即含义)上却大不相同。例如:

  • 在C,它取决于类型ab。它可能意味着某种数字加法(有一大堆基于整数、整数等级、浮点数等的规则)。但是,如果a是一个指针并且b是一个整数,那么根据指针大小,实际上也有一个偷偷摸摸的乘法。
  • 在 C++ 中,请参阅 C 中的定义,但也可以是对运算符重载的函数调用,和/或在对操作数应用转换规则后获得的任何这些语义。请不要问我这些规则是什么。
  • 在 Java 中,它也按类型进行;它可能意味着数字加法,也可能意味着字符串连接。
  • 在 JavaScript 中,它可能是数字加法或字符串连接,但它是在运行时根据规则决定的。不,也不要问我这些。
  • 在 Raku 中,它是对 的函数调用infix:<+>,这意味着无论标准库决定它意味着什么。

对我来说,语义模型是描述语义的系统方式。这可能以以下一种或多种形式存在:

  • 试图描述事情应该做什么的书面(自然语言)规范
  • 一个试图描述事物做什么的可执行规范(如 Raku 规范)
  • 使用数学形式的语义表达,例如操作语义或指称语义
  • 用其他语言实现的解释器(在这种情况下,我们依赖于它的语义模型)
  • 翻译成其他语言的编译器(同样,我们依赖目标语言的语义模型)

正如我们观察到的语法a + b可能会映射到不同语言的许多不同语义,我们也可以将许多语法映射到同一组语义。即使在标准乐中也是如此。写作$a + $binfix:<+>($a, $b).

虽然这可能提供了一些答案,但阅读您引用的部分之后的段落很有趣。以下是注解。

多种语法听起来像是一件坏事,但它们对于语言的发展来说确实是必要的。

我认为“进化”的使用在这里很重要,因为允许语言的语法以受控方式改变,实际上确实允许语言语法的不同突变共存。此外,适者生存可以适用(并且什么是合适的很可能是使用语言的上下文的函数)。鉴于语法是语言的接口,例如,什么值得霍夫曼化,可以随时间或在上下文中改变,期望它可能会发展,同时仍然提供对相同底层行为集的访问并不是不合理的。

无论如何,我认为我们可以将其视为预见功能,例如用户定义的运算符和俚语。

在某种程度上,我们在 Perl 5 中已经有了一个多语法模型;每次使用 pragma 或模块时,都在扭曲正在使用的语言。

我觉得这部分有点奇怪,因为“语言”不仅是句法,也是语义,实际上很多 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 提供新语法语义模型。