Answers:
在对编程语言进行建模时,原始表达,组合方式和抽象方式之间的区别非常有用。请注意,这不是语言的固有属性:您不能指向任何语言定义,而是说“此功能无疑是原始表达,该功能无疑是组合的一种方式”。区别是模型的属性,复杂的模型可以抵抗分类。
这三个概念的教科书示例是lambda演算,该演算恰好具有每个概念之一:
当您使用具有更多功能的语言时,建模可能会变得更加模棱两可。一般而言,原始表达式是您无法或不会分解为原始组件的表达式。但这就像原子:它是原始的,直到科学继续前进。例如,存在lambda演算的一种变体,其中变量使用数字而不是名称(de Bruijn索引),这在为计算机证明建模lambda项时特别方便。在计算机证明中,整数被分解为组成部分。因此,在这些模型中,变量毕竟不是原始表达式。
在Java的典型模型中,基本表达式主要是常量和变量。组合的方式包括众多的运算符;更准确地说,“加法表达式”是指两个插槽(左侧和右侧)或三个插槽(两侧加上运算符)的组合方式(如果同时包含A +
B和A -
B)以该名称命名(在这种情况下,运算符+
和-
本身就是原始构造)。其他组合方式包括指令序列I ;
J,循环构造while (…) {…}
, 等等。然后,您将拥有诸如变量声明,函数定义,类定义之类的构造,它们既是组合的手段(它们将参数名称和类型,主体,初始化器等)组合起来,又是抽象的手段(因为它们定义了可重用的名称)。实际上,抽象手段也是组合手段是很常见的:它们将名称与其定义结合在一起。
粗刺:
表情就是这样;Java中构成表达式的内容。我不知道这是否会扩展为包括语句。
组合将包括复合表达式,(变量?)语句,方法,类机制和包。一旦使用了语言,模块也是如此。
在Java中,最简单的抽象方法是类:类之外可能不存在任何东西。也许有抽象的“层”:可以说静态方法比实例方法简单,因为它不需要实例。
泛型提供了额外的抽象层(和挫败感)。
这是我的基本分类。我正在尝试与LISP并列。
原始表达
在LISP中并行:原子,数字和列表。
组合方式(可以构建复合数据结构的方式)
LISP中的并行:cons单元,列表
抽象手段
+
,-
, *
, /
,...)并行LISP:函数,语法糖一样let
,define
编程语言通常由其语法和语义来定义。两者都将在语言标准中定义。
语法概述了如何编写有效程序,而语义定义了有效程序的含义。
在您的情况下,语法将告诉您基本元素是什么,如何组合它们以及如何抽象它们。语义将告诉您组合和抽象的含义。
例如,语法将告诉您如何编写有效的for
循环。语义将告诉您for循环的作用。
如果您真的想开始分析一种编程语言,请获取该标准的副本并查看其中的内容。在研究Java之前,我真的会从简单的语言(如C)开始。我还将阅读本书的其余部分。即使我不实现编译器,了解编程语言为何以它们的工作方式工作也使我成为了一个更好的程序员。
x = ++x;
即使典型的编译器接受该语句,执行该语句的AC程序也是无效的。
我不知道它是否正确,但是我对这种划分的理解如下:
基本表达式,例如>>,+,*,/,int,boolean,variables,methods等。
结合的方式, 这可能是有争议的,要么是类似+和简洁的东西,要么是谈论更高级的想法,例如继承vs组合以及实现此目的的方法。注入,新运算符,扩展等
抽象方法, 这将是用于命名变量和方法的语法,以及用于创建接口,类,静态类,重载方法等的方法。
但是,您可能需要从书中给我们提供更多信息,以便我们确切地知道其中的含义。