启示录 #1 中引入的 "semantic model" 是什么?

What is the "semantic model" introduced in Apocalypse #1?

Larry 在 Apocalypse #1 中写道,我添加了 强调

Raku will support multiple syntaxes that map onto a single semantic model. Second, that single semantic model will in turn map to multiple platforms.

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

(我用谷歌搜索了一下,发现了一些讨论,例如 this one on slashdot,但它们同样含糊不清。)

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

他的公式听起来很像它可能映射到 NQP and/or nqp(在 Raku / NQP/nqp / NQP 后端架构的中间).

(如果是这样,估计那个型号是nqp的相当于乐库烤的“指定”?)

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


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

Apocalypse #1 代表了 Larry 在将我们引向今天所知的 Raku 语言的过程中的一些最早想法。我不在语言设计过程的早期,所以我给出的任何答案自然会涉及尝试想象那个时间点已知的东西。有了这个相当重要的警告,让我们来看看。

语法是关于我们写的单词和符号的。语义是关于事物的含义。例如,假设我们使用的语言具有中缀运算符之类的东西,并且有一个拼写为 + 的运算符。我们可以写表达式 a + b。语义告诉我们它的意思。尽管许多编程语言都具有这种语法,但它们在与之关联的语义(即含义)方面存在巨大差异。例如:

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

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

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

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

在语义上没有区别

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

Multiple syntaxes sound like an evil thing, but they're really necessary for the evolution of the language.

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

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

To some extent we already have a multi-syntax model in Perl 5; every time you use a pragma or module, you are warping the language you're using.

我觉得这部分有点奇怪,因为“语言”不仅仅是语法,还有语义,事实上很多编译指示改变了语义而不是(只是) 语法。另一方面,它确实说了“在某种程度上”,这是一个很好的躲在后面的对冲。 :-)

As long as it's clear from the declarations at the top of the module which version of the language you're using, this causes little problem.

这意味着语言变化是有范围的。他们最终是词法范围的,而不仅仅是文件范围的。这并不奇怪;词法作用域的效用似乎在设计过程中越来越多地被意识到。

A particularly strong example of how support of multiple syntaxes will allow continued evolution is the migration from Perl 5 to Perl 6 itself.

这表明当时的想法是 Perl 5 和 Perl 6(现在的 Raku)有足够的共同点,它们可以共享一个语义模型,并且 运行 在相同的 运行时间。正如我们所知,事情并没有以这种方式发展,但是在撰写启示录#1 时,我可以想象这是一个假设。事实上,它可能已经保持了很长一段时间。例如,PONIE(尝试 运行 Perl 5 在 Parrot VM 之上的项目)在多年后仍在进行中。

实际上,随着语言设计的出现,允许这样做的单一语义模型变得不现实了。出于这个原因,将 Perl 6 的特性引入 Perl 5 的各种努力都遇到了困难。智能匹配是它的典型代表,问题根本不是因为语法,而是因为语义:在 Raku 中,事物总是知道它们的类型,而在 Perl 5 中,标量可能同时包含字符串和数字表示,取决于该值在该点之前的使用方式。该功能基于 Raku 语义模型中的某些内容,而在 Perl 5 语义模型中没有直接等效项。

另一个有趣的地方是,当前正在进行的 RakuAST 工作将提供 Raku 语言的文档对象模型形式。我们可以将其视为表示为对象图的 Raku 的替代语法。鉴于它也将是编译器前端用于 Raku 代码的表示,我们也可以将其视为一种通往 Raku 语义模型的语法独立网关。而且,当我们真正拥有俚语时,可以预期它们将通过将与附加俚语语法相​​关的语义表达为 RakuAST 节点的组合来实现——因此最终将根据单个 Raku 提供新语法语义模型。