编程语言语义中的一种是什么?


9

在《实用程序语言基础》的第1章中,作者提到抽象语法树与排序相关联。

直观上来说,排序就像类型,但是我想知道它们是否有精确的定义。如果也提供一些参考,我将感到高兴。

Answers:


4

这取决于我们对类型和排序采用何种语义。-但是可能有一个简短的非正式定义- 排序是AST的类,类型是值的类


4

实际上,表象语法的类型和类型之间实际上有很多相似之处。但是排序是一个形式化的句法概念,AS树也是语法,而类型是语义概念

该术语来自术语代数(也称为自由代数)和通用代数。这些本质上是代数结构的句法理论,可以独立于任何解释进行分析。它们是在20世纪上半叶开发的。

术语可以看成是一棵树,其中从一组有限的运算符中标记节点,每个运算符都具有固定的Arity,该Arity指定树中的子代数。Arity 0是叶子。在多分类代数中,这用分类进行了细化,因此每个运算符都属于一个分类,并且Araries替换为分类的有序列表,该列表为每个女儿固定了其头运算符的分类。运算符的种类以及其子目录的列表称为运算符的签名

在通用代数中,这可以通过引入方程式定义的项之间的等价关系来进一步完善。

尽管这些概念似乎已经消失了,但是在20世纪后期,这些概念作为计算机的抽象代数在抽象科学中非常流行,并且在计算机科学中进行了大量研究,后来被视为抽象数据类型的基础,而抽象数据类型在某种程度上是面向对象编程中的nos类。

通用代数与范畴论的发展有关,范畴论也是当前类型和编程语言的基础。

代数是句法对象,旨在与对应于类型的某些语义域中的解释一起使用。解释是一种同态,它把排序映射到值(类型)的域中,将运算符映射到这些域之间的函数中,这样就可以尊重签名,并且在方程式代数的情况下,方程也是如此。这样,您便可以通过遵循组定义的操作将组理论的结果应用于任何领域。

早期的编程语言研究人员认为该组织非常方便,尤其是那些与规范化编程语言有关的人员。它具有隔离语法和语义以及在数学上易于理解的优点。

采用它的另一个原因是与在开发环境或正式系统中操纵程序的工具的开发有关,以证明程序的属性(事实证明,这是越来越多的双重问题)。

这导致了用于编程语言的抽象语法树(AST)概念的出现,该语法本质上是多排序代数的术语(有时在某些系统中使用排序并集进行改进)。AST是一种语言的参考语法,可以从同义中定义语义,就像在指称语义中一样。

这不仅方便研究语言的语义,而且树的结构比字符串更好,因此是开发编程工具和编程环境的更好基础。

它允许隔离解析,这在传统上是一个混乱的部分,因为解析技术的局限性迫使使用失真的语法。它还排除了演示问题。

它允许使用程序的多个具体(字符串或图形)表示形式,这有时可能很方便(没有理由在程序语法上使用标点符号而不是制表符,反之亦然)。

它很容易定义许多程序和各种解释,以便用抽象解释分析程序属性。

这对于编写(半)自动化程序操作工具非常方便,例如用于自动程序转换或语言之间的翻译。

实际上,事情有时可能会有些复杂,因为某些抽象语法的形式允许某些运算符将属于几种类型的树(表达式)(一种非正式的查看方式)进行投标。例如,可能存在一种表示变量(可分配实体)的句法构造,而另一种表示形式。但是任何变量都可以用作表达式,反之则为false。

有关编程语言的早期论文可追溯到七十年代中期。当时的概念化旨在用于产生语法意识的编程环境(然后使用“ directed”一词)。在欧洲寻找Mentor和Centaur,在美国寻找Cornell程序合成器。它们是前两种系统以实际方式实际使用这些概念。之后开发了许多其他产品。

但是抽象语法早于这些系统。Lisp语言(1958年)具有抽象语法,这并不奇怪,因为它是由逻辑学家开发的,并且其目的是制作可操纵程序的程序(另请参见稍后的ML和LCF ...)。但是Lisp没有排序:语法上的所有内容都是列表,而更精细的结构本质上是依赖于语义的。这导致一些人在某种程度上错误地认为Lisp没有语法。


您是否会说有两种不同的层次结构,一种在语法领域,另一种在语义领域。在语法上,我们为您提供AST,排序和排序类。在语义上,我们具有值,类型,种类等。不存在将两种语言统一到一个开发环境(如Twelf或Coq)中的语言吗?
CMCDragonkai '16

@CMCDragonkai我要说的是(排除可能的错误)。我不会称这些层次结构,而是(元)话语的领域。语法-语义分离区分了我们所讨论的内容和我们的处理方式,这需要表示形式。您不应该混合使用同一语言的语法和语义,但是一种语言的语法可以作为论述的对象,因此属于另一种语言的语义。从这个意义上讲,您可能会看到一些统一,请谨慎处理。语法始终是有限生成的,而语义则没有这种约束。
babou

2

在第四章看来,排序是针对语法的,类型是针对语义的。

第40页上的示例语法图使用语言L {num str}处理排序。显然,排序是语言语法中的类别。

特别地,“加”具有排序,这是其结果的语法类别。运算符“ plus”的种类称为“ Exp”。在语法上,这表示一个事实,对运算符“ plus”的调用是一个表达式。运算符“ plus”的调用可以填充抽象语法树中允许表达式的位置。这就是“加号”的构造形式。这就是它适合表示程序的文本结构的方式。

第41页的类型系统处理语言为L {num str}的类型。假设运算符“ plus”的操作数的类型为“ num”,则其类型为“ num”。该判断是对运算符“加”的语义的部分描述。即,运算符“加”的部分含义是两个数字的组合以产生一个数字。此含义将“加号”与其他表达形式区分开。

此外,还有一个名为“ Typ”的排序,其中包含两种类型:“ num”和“ str”。


1
好吧,他在这个概念中使用了它,但是他没有明确定义。我发现“很多排序的逻辑”这个术语在我看来,排序和类型实际上是封闭的相关概念。我只是想知道两者的明确定义。
rslima

这与“纯类型系统”有关。我怀疑我们可以认为“ Lambda Calculi with Types ”中的演示是传统的。但这并不简洁。我还没有找到提供术语,类型,种类和类别的清晰简洁定义的参考。
minopret

解析器中的生产主管呢?很多时候,您最终都将语法分类为类似的名称,例如Expression或Type。
CMCDragonkai '16

1

在第1章的开头,Harper用单词sort暗示了他的意思:

语言的语法指定了各种短语 (表达式,命令,声明等)可以组合成程序的方式。

他将单词短语定义为抽象语法树,然后对其进行讨论。


在我看来,“ sorts”在这里使用其通常的英语含义,与“ kinds”同义。
拉斐尔

@Raphael是的,但是这似乎与后者的正式用法是一致的,您不同意吗?
jcora 2014年

不完全的。这类“ X”可能经常出现在书中。这句话绝不表示已在定义某些内容。(此外,此段落与我对“排序”一词的理解不匹配)。
拉斐尔

@Raphael好的,请解释一下这种特殊用法是如何不一致的,它肯定会通知我,因为这就是我目前的理解方式。
jcora 2014年

我知道的“排序”概念与AST的各个节点相关联,而不是与整个树相关联(这就是您所说的“短语”在您的原文中的意思)。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.