分析编程语言


10

SICP中,作者声明(第1.1节)有三种编程语言的基本“机制”:

  • 基本表达式,表示语言所关注的最简单的实体

  • 组合的手段,由较简单的要素构成复合要素

  • 抽象手段,通过这种手段,复合元素可以被命名和操纵为单元。

如何从这些元素或机制方面分析主流编程语言(例如Java)?


您之前看过扩展Backus-Naur形式EBNFBackus-Naur形式BNF吗?它可以分解类似于这三个概念的语法,尽管我不确定您的意图是什么,所以我不知道它是否会有所帮助。
杰蒂

@Jetti-是的,我有,不是,这不是我感兴趣的内容。我真的是在分析编程语言的语义(问题:这实际上是我要找的单词吗?),而不是他们的书面形式(即语法)。

Answers:


1

在对编程语言进行建模时,原始表达,组合方式和抽象方式之间的区别非常有用。请注意,这不是语言的固有属性:您不能指向任何语言定义,而是说“此功能无疑是原始表达,该功能无疑是组合的一种方式”。区别是模型的属性,复杂的模型可以抵抗分类。

这三个概念的教科书示例是lambda演算,该演算恰好具有每个概念之一:

  • 变量xy,…是唯一的原始表达式。
  • 功能应用MN是组合的一种手段。
  • Lambda抽象λx.M是一种抽象方法。

当您使用具有更多功能的语言时,建模可能会变得更加模棱两可。一般而言,原始表达式是您无法或不会分解为原始组件的表达式。但这就像原子:它是原始的,直到科学继续前进。例如,存在lambda演算的一种变体,其中变量使用数字而不是名称(de Bruijn索引),这在为计算机证明建模lambda项时特别方便。在计算机证明中,整数被分解为组成部分。因此,在这些模型中,变量毕竟不是原始表达式。

在Java的典型模型中,基本表达式主要是常量和变量。组合的方式包括众多的运算符;更准确地说,“加法表达式”是指两个插槽(左侧和右侧)或三个插槽(两侧加上运算符)的组合方式(如果同时包含A + BA - B)以该名称命名(在这种情况下,运算符+-本身就是原始构造)。其他组合方式包括指令序列I ; J,循环构造while (…) {…}, 等等。然后,您将拥有诸如变量声明,函数定义,类定义之类的构造,它们既是组合的手段(它们将参数名称和类型,主体,初始化器等)组合起来,又是抽象的手段(因为它们定义了可重用的名称)。实际上,抽象手段也是组合手段是很常见的:它们将名称与其定义结合在一起。


好的答案;你的问题了,我是挣扎-图元,组合等之间的暧昧区别

您所说的“变量”到底是什么意思?因为它们有名称,所以不能将它们描述为抽象方法吗?
morbidCode '17

@morbidCode变量的概念很复杂,在lambda演算和Java中,单词具有不同但相关的含义。变量可以被视为“抽象”,因为它指的是未指定的值。然而,它不是一个手段抽象的:它不创建引用,它只是利用现有的抽象的方式。lambda抽象创建了一种使用代码块作为可操纵对象的方式。
吉尔斯(Gillles)“所以-别再邪恶了”

4

粗刺:

表情就是这样;Java中构成表达式的内容。我不知道这是否会扩展为包括语句。

组合将包括复合表达式,(变量?)语句,方法,类机制和包。一旦使用了语言,模块也是如此。

在Java中,最简单的抽象方法是类:类之外可能不存在任何东西。也许有抽象的“层”:可以说静态方法比实例方法简单,因为它不需要实例。

泛型提供了额外的抽象层(和挫败感)。


@MattFenwick表达式可以包含单个图元,图元和其他实体的组合构成一个复合表达式(仍然是表达式,但不是语句)。
戴夫·牛顿

@MattFenwick我不是,我不是说一个表达式一个原语,我是说一个表达式可能只包含一个原语。除非您想在立即字符串和它创建的引用之间进行区分,否则String不能仅仅因为该语言为其提供了语法糖而成为原始语言。我会说+是,因为它不能以任何方式作用。
戴夫牛顿

顺便说一句:Java的泛型实现是否存在问题?
史蒂文·埃弗斯

2

这是我的基本分类。我正在尝试与LISP并列。

原始表达

  • 所有原始值,您可以使用文字表示的东西(数字,布尔值,...)

在LISP中并行:原子,数字和列表。

组合方式(可以构建复合数据结构的方式)

  • 数组
  • 对象/结构。

LISP中的并行:cons单元,列表

抽象手段

  • 所有控制流语法(如果,则为)
  • 所有内建运算符(+-*/,...)
  • 所有功能(在此类别中,我们包括类和方法)

并行LISP:函数,语法糖一样letdefine


好答案!我当时在想,也许某些控制流构造会适合于组合方式。与LISP的相似之处非常有用。

不完全的。数组和对象的作用不同,它们是数据表示的一部分,而不是语言本身。数组初始化器是该语言的一部分,并且是组合的一种方式。运算符和控制流构造不是抽象的手段,因为它们不会“存储”任何东西以供重用。抽象方法通常给实体起一个名称,以该名称在将来重用。
吉尔(Gilles)“所以,别再邪恶了”,

0

编程语言通常由其语法语义来定义。两者都将在语言标准中定义。

语法概述了如何编写有效程序,而语义定义了有效程序的含义。

在您的情况下,语法将告诉您基本元素是什么,如何组合它们以及如何抽象它们。语义将告诉您组合和抽象的含义。

例如,语法将告诉您如何编写有效的for循环。语义将告诉您for循环的作用。

如果您真的想开始分析一种编程语言,请获取该标准的副本并查看其中的内容。在研究Java之前,我真的会从简单的语言(如C)开始。我还将阅读本书的其余部分。即使我不实现编译器,了解编程语言为何以它们的工作方式工作也使我成为了一个更好的程序员。


1
等一下 “像C一样简单,然后再深入研究Java。” 您在“像C一样简单”上迷失了我。
corsiKa 2011年

马特,我想我当时不太了解您在做什么。您引用的书谈论了这两个方面,无论作者是否明确将其称为语法和语义。
mpdonadio 2011年

实际上,“语法”精确地描述了语言中构成其原子的“最简单”事物。
伊拉·巴克斯特

语法不能完全捕获有效程序是什么,远非如此。例如,语法正确的程序可能无法通过类型检查。x = ++x;即使典型的编译器接受该语句,执行该语句的AC程序也是无效的。
吉尔(Gilles)'所以

0

我不知道它是否正确,但是我对这种划分的理解如下:

基本表达式,例如>>,+,*,/,int,boolean,variables,methods等。

结合的方式, 这可能是有争议的,要么是类似+和简洁的东西,要么是谈论更高级的想法,例如继承vs组合以及实现此目的的方法。注入,新运算符,扩展等

抽象方法, 这将是用于命名变量和方法的语法,以及用于创建接口,类,静态类,重载方法等的方法。

但是,您可能需要从书中给我们提供更多信息,以便我们确切地知道其中的含义。


这本书是免费在线的;在OP中给出了一个链接。我有点类似的感觉means of combination-很难弄清楚到底是什么。好的答案,虽然。

您是否知道他在谈论哪几章有关组合和抽象的内容?
鲍勃
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.