语言语法的演变及其语义保存

时间:2010-09-23 18:59:07

标签: programming-languages syntax semantics

我正在研究语言的句法演变如何影响其语义。例如,java的for循环语法在其版本5中演变为紧凑版。设计师是否必须证明即使使用这种语法,语义仍然保留!可能这是一个微不足道的例子。

因此,一般来说,即使语法的语法从非常详细到紧凑,如何证明语言的语义仍然保留?

非常感谢任何见解/链接。

科坦

2 个答案:

答案 0 :(得分:2)

好的,你的上一条评论更容易回答。

  

一些更具体的细节:我们有一个解释器,它以非常详细的语法理解语言A.现在,我们发明了一种语言非常紧凑的新语言B,完全不同于A.因此,用户现在可以用紧凑语言B编写代码,使用我有的翻译程序翻译成冗长的语言A.书面。问题是如何证明/保证所有可能的此类翻译将保留解释器理解的原始语言A的语义。

简短的回答是:你没有。首先,当你添加语法糖时,你通常只是捕获一个众所周知的,广泛使用的模式,并给它特殊的,更好的语法 - 你不会替换语言的大部分语法。对于这种小型替换,可以使用信息性描述和示例来制定翻译 - 例如,PEP 343 defines the "with" statement相对丰富的信息。

现在,当语法的变化如此激进时,新语言与后端语言几乎没有任何共同点,我们不是在谈论语法的变化 - 我们谈论的是编译器。但编译器也未被证明是正确的。嗯,实际上有些人try it。但对于现实世界的编译器来说,这很少发生;相反,测试检查无数用户及其程序的正确性。 当然,所有严肃的语言实现都有各种各样的测试用例(读取:示例程序,从基本到荒谬),至少在正式版本中应该运行并传递(或者在某些情况下会产生错误)。当他们这样做(并且测试套件值得它的盐)时,你仍然不知道没有错误,但至少它有一些信心。正如Dijkstra所说:“测试显示存在,而不是没有错误。”

答案 1 :(得分:0)

证明在旧版本的语言中,每个语法扩展都是非法的。

由于显而易见的原因,新的语法元素应该以旧语言版本在语法上非法的方式引入。因此,大多数语言都有一个超出已使用关键字的保留字列表。

例如,当C#在版本3.0中引入var关键字时,它可能会出现问题,因为var不是C#1.0版中的保留字(也可能不是2.0版)。因此,一个程序可以在C#1.0中使用legaly创建一个名为var的类型,但它不再在C#3.0及更高版本中编译。

旧语言元素的语义不变更多地取决于编译器的构建方式,因为规范很少会发生变化。如果它发生了变化,那么语义就不会被保留。例外情况是在规范的先前版本中修复可能构成未定义行为(但仍然合法)的新规范。我想到了C.