将编程语言作为自然界中的对象

2020-12-25 13:11:58

在1990年代初,编程语言研究界处于乐观状态。在最近的过去,它的两种范式语言(Scheme和ML)已将其语义正式化。对于ML,它采用了Milner等人的全书形式。 Scheme在其标准中提供了指称语义。当然,所有语言朝着这个方向迈进只是时间问题。

如果您是一个没有理论背景的工作程序员,那么您可能会奇怪,为什么正式的语义至关重要。实际上是出于您容易理解的原因。当您针对别人编写的代码编写程序时,您喜欢使用一个接口或进行编程。它将您的对话与远程代码进行中介,并在某些问题无法按预期进行时锚定有关应归咎于谁的对话。

语言的形式语义做的完全相同。语言本身就是您要编程的“远程代码”。您应该尽可能精确地确定它所做的工作,但也应尽可能理解它!

语义不仅仅是语言用户的界面。它也是工具作者的重要界面,他们必须(也)必须猜测语言的行为。如果想要一个示例,说明即使变量重命名重构的相对简单的操作也可能出错,请参阅Python语义的附录2。语义并不能保证不会发生这类错误,但是缺少它会使它们更可能发生。

对于许多研究人员来说,编程语言是数学对象。这是自然而迷人的观点。毕竟,语言是形式对象。因此,它们适用于从逻辑到拓扑等所有方面的编纂。 (正式)规范是这种世界观的自然结果。

但是,世界上充满了不适合该模型的编程语言。有些甚至是由编程语言学家创建的,这值得深思。由表面上未洗的东西创建,他们毫不客气地宣布它们的到来只是实现。人们拾起它们,发现它们有用,与他们一起做有价值的事情,一百万行之后,下一个主要的“脚本语言”诞生了。我们称之为非正式语言。

非正式语言当然也符合正式规范。但是,这两种类型的语言存在重大差异。假设我们观察到规范说明与实现之间存在差异。例如,在使用标准ML的情况下,可以接近实现者,逐步了解规范中的推理,并解释实现错误的原因。如果实施者同意您的推理,即弄不清这使他们感到不满意,他们必须承认并最终确定其实现。

非正式语言的实现者没有这种限制。面对表面上的规范与其实现之间的不匹配,他们可以随意大笑,质疑规范的血统,并退出舞台。该规范最多只能跟踪“语言在做什么”,而不能真正决定其行为。

服务于规范的所有其他用途,例如作为构建工具的基础。

为了有效地完成所有这些工作,该规范必须采取重要步骤以表明其符合非正式语言的实际情况,例如通过运行与实现相同的测试套件。

我们可以推,戳,刺它,并希望它会产生秘密。但是,在没有执行者的帮助下,我们永远不能确定我们已经对所有特征进行了适当的描述。

这并不意味着我们无法系统地解决问题。面对岩石的地质学家不会无助地扑朔迷离。在高中化学领域,我被教导要通过测试来接近未知物质:检查其状态,颜色,气味,密度和溶解度。他们从来没有写过“品味”这封信,反映出他们的愿望比在高中化学实验室中的真实感更重要。也就是说,我们确定了一些分类维度,并沿着主轴进行。

我们也有用于编程语言的这些轴。我们可以讨论他们的范围规则,他们的评估语义,他们的类型系统等等。的确,由于程序员的职业生涯中有很多时间都花在对抗非正式语言上,并且不得不从它们中迅速理解,所以我长期以来一直认为,我们如何教授编程语言也应按照这些维度来划分。

只要敬业的业余爱好者可以吓a一种新语言的实施,非正式语言的问题就不会消失。的确,我们的非正式语言空间的规模比数学语言要大得多。在2015年,我制作了这张幻灯片:

它显示了一个堆栈,上面是典型的当今客户端Web程序所在的堆栈。它实际显示的是更加微妙和重要的东西:

而是,它们以语言,库,框架(可以强加自己的操作行为,例如,似乎将按值调用语言转换为响应式语言)等某种复杂的组合进行编程。程序员需要的不仅是语义的语义,而且还在于他们程序所在的山峰的语义。

有关此类语义可能是什么样的说明性示例,请参见我们关于(它是一个巨大的控件运算符)的操作语义以及jQuery的类型结构的文章。但是这些只是细小条子中的细小条子。我们如何在山上取得真正的进步,并在山上不断前进时保持自己的位置?

我们不能指望日期选择器库的作者也是语义学家。但是,我们不应该因此而得出这样的结论:我们永远无法到达那里。相反,我们应该承认存在有用的分工。语义学家不必寻找非正式语言设计师的实践方法,而需要找到一种弥合这种差距的方法,请牢记:

不能通过正式手段从非正式到正式。AlanPerlis

一个特别好的中间代理是某种测试套件。测试并不一定总是得到应有的尊重,但它们也是一种形式。我喜欢称它们为“自下而上的规范”,精确地定义了个别情况下应该发生的情况,而典型的形式化规范是“自上而下的规范”,定义了整个案例家族中发生的事情。最终,当然,我们需要“从上方”的规范,但值得注意的是,“从下方”的规范既对开发人员有用,又对他们熟练地生产。在这方面,最近产生“确认套件”或“石蕊测试”的趋势语言尤其有希望。 (例如,我们在规范ECMAScript 5.1严格模式方面的工作使用了ECMAScript一致性套件。)

我们如何使用它们仍然是一个悬而未决的问题。最明显的用途是测试我们的语义:Arjun Guha和我(也许有些恐惧)称为测试语义。但是我们也许还可以概括这些测试,从“下面”到“上面”,即这是一个综合问题。这就需要某种结构来产生有意义的语义。我们关于“下一个700语义学”的论文描述了要考虑的这一工作线的一些轮廓。