Answers:
实际上,表象语法的类型和类型之间实际上有很多相似之处。但是排序是一个形式化的句法概念,AS树也是语法,而类型是语义概念。
该术语来自术语代数(也称为自由代数)和通用代数。这些本质上是代数结构的句法理论,可以独立于任何解释进行分析。它们是在20世纪上半叶开发的。
术语可以看成是一棵树,其中从一组有限的运算符中标记节点,每个运算符都具有固定的Arity,该Arity指定树中的子代数。Arity 0是叶子。在多分类代数中,这用分类进行了细化,因此每个运算符都属于一个分类,并且Araries替换为分类的有序列表,该列表为每个女儿固定了其头运算符的分类。运算符的种类以及其子目录的列表称为运算符的签名。
在通用代数中,这可以通过引入方程式定义的项之间的等价关系来进一步完善。
尽管这些概念似乎已经消失了,但是在20世纪后期,这些概念作为计算机的抽象代数在抽象科学中非常流行,并且在计算机科学中进行了大量研究,后来被视为抽象数据类型的基础,而抽象数据类型在某种程度上是面向对象编程中的nos类。
通用代数与范畴论的发展有关,范畴论也是当前类型和编程语言的基础。
代数是句法对象,旨在与对应于类型的某些语义域中的解释一起使用。解释是一种同态,它把排序映射到值(类型)的域中,将运算符映射到这些域之间的函数中,这样就可以尊重签名,并且在方程式代数的情况下,方程也是如此。这样,您便可以通过遵循组定义的操作将组理论的结果应用于任何领域。
早期的编程语言研究人员认为该组织非常方便,尤其是那些与规范化编程语言有关的人员。它具有隔离语法和语义以及在数学上易于理解的优点。
采用它的另一个原因是与在开发环境或正式系统中操纵程序的工具的开发有关,以证明程序的属性(事实证明,这是越来越多的双重问题)。
这导致了用于编程语言的抽象语法树(AST)概念的出现,该语法本质上是多排序代数的术语(有时在某些系统中使用排序并集进行改进)。AST是一种语言的参考语法,可以从同义中定义语义,就像在指称语义中一样。
这不仅方便研究语言的语义,而且树的结构比字符串更好,因此是开发编程工具和编程环境的更好基础。
它允许隔离解析,这在传统上是一个混乱的部分,因为解析技术的局限性迫使使用失真的语法。它还排除了演示问题。
它允许使用程序的多个具体(字符串或图形)表示形式,这有时可能很方便(没有理由在程序语法上使用标点符号而不是制表符,反之亦然)。
它很容易定义许多程序和各种解释,以便用抽象解释分析程序属性。
这对于编写(半)自动化程序操作工具非常方便,例如用于自动程序转换或语言之间的翻译。
实际上,事情有时可能会有些复杂,因为某些抽象语法的形式允许某些运算符将属于几种类型的树(表达式)(一种非正式的查看方式)进行投标。例如,可能存在一种表示变量(可分配实体)的句法构造,而另一种表示形式。但是任何变量都可以用作表达式,反之则为false。
有关编程语言的早期论文可追溯到七十年代中期。当时的概念化旨在用于产生语法意识的编程环境(然后使用“ directed”一词)。在欧洲寻找Mentor和Centaur,在美国寻找Cornell程序合成器。它们是前两种系统以实际方式实际使用这些概念。之后开发了许多其他产品。
但是抽象语法早于这些系统。Lisp语言(1958年)具有抽象语法,这并不奇怪,因为它是由逻辑学家开发的,并且其目的是制作可操纵程序的程序(另请参见稍后的ML和LCF ...)。但是Lisp没有排序:语法上的所有内容都是列表,而更精细的结构本质上是依赖于语义的。这导致一些人在某种程度上错误地认为Lisp没有语法。
在第四章看来,排序是针对语法的,类型是针对语义的。
第40页上的示例语法图使用语言L {num str}处理排序。显然,排序是语言语法中的类别。
特别地,“加”具有排序,这是其结果的语法类别。运算符“ plus”的种类称为“ Exp”。在语法上,这表示一个事实,对运算符“ plus”的调用是一个表达式。运算符“ plus”的调用可以填充抽象语法树中允许表达式的位置。这就是“加号”的构造形式。这就是它适合表示程序的文本结构的方式。
第41页的类型系统处理语言为L {num str}的类型。假设运算符“ plus”的操作数的类型为“ num”,则其类型为“ num”。该判断是对运算符“加”的语义的部分描述。即,运算符“加”的部分含义是两个数字的组合以产生一个数字。此含义将“加号”与其他表达形式区分开。
此外,还有一个名为“ Typ”的排序,其中包含两种类型:“ num”和“ str”。
在第1章的开头,Harper用单词sort暗示了他的意思:
语言的语法指定了各种短语 (表达式,命令,声明等)可以组合成程序的方式。
他将单词短语定义为抽象语法树,然后对其进行讨论。