我正在尝试理解有关编程语言设计的academic paper(pdf)。特别是,它描述了一个名为Featherweight Java的轻量级Java。它的输入规则带有如下符号:
x_ : C_, this : C |- e0 : E0 E0 <: C0
class C extends D {...}
if mtype(m,D) = D_->D0, then C_ = D_ and C0 = D0
---------------------------------------------------------------------------
C0 m(C_ x_){ return e0; } OK IN C
无论如何,这是我在文本中再现它的最佳尝试。然而,该论文似乎假设这种符号是熟悉的,并且几乎没有解释它。有人能指出我更好的解释方向吗?谢谢!
答案 0 :(得分:5)
这是一个特别复杂的例子,里面发生了一些不同的事情。
水平条记法通常用于推理规则。在线上方是前提(通常在一条线上用空格分隔),在线下面是一个结论。如,
P0 P1 ... Pn
------------------
C
表示“如果P0
到Pn
全部成立,那么我们可能会认为C
也有效。”
旋转门符号(⊦)通常用于蕴涵关系。在类型系统中,这通常意味着“如果我们假设左侧的类型,我们可以在右侧推导出类型。”冒号通常用于将变量或表达式与类型相关联,因此
x_ : C_, this : C ⊦ e0 : E0
表示“假设x_
的类型为C_
而this
的类型为C
,我们可以推导e0
的类型为E0
。” ¹
符号<:
通常用于子类型关系,但应在文章中明确定义。
“class C extends D
”位似乎指的是源程序的语法。即,预期的前提是“C
被明确声明为扩展D
”。
如果没有涉及到纸张,其余部分很难理解。我衷心地将诺曼·拉姆齐的推荐Pierce作为对类型理论的一个很好的介绍。
¹请注意,“推理”和“蕴涵”之间的区别要么是微妙的要么是不存在的 - 哪个用于惯例,品味和/或细微差别。
答案 1 :(得分:2)
Benjamin Pierce的本科教科书Types and Programming Languages将教你理解羽量级Java论文中使用的符号所需要知道的一切。 (我认为皮尔斯也可能是该论文的合着者。)
答案 2 :(得分:-1)
看起来像formal semantics,在这种情况下语法可能是denotational semantics,但有些符号看起来非常神秘。