程序原本(五十):程序设计的核心思想——执行体与它在执行过程中的环境(概念笼子:十个或是更多)

阅读数:33 2019 年 10 月 1 日 16:06

程序原本(五十):程序设计的核心思想——执行体与它在执行过程中的环境(概念笼子:十个或是更多)

我们已经在讨论一种具体的语言实现形式,即所谓“静态的、编译型”语言。这事实上涉及到两种语言的分类法,其一是静态与动态的,其二是编译与解释的。

在计算机语言实现中的所谓“编译”,是不同于翻译(translation)的。从本质来说,我们所使用的任何计算机语言编写的代码都需要通过翻译才能交由计算机执行,因为计算机最终是只能理解开关状态的电子电路。但是在最终抵达目标语言——即机器语言,或称之为电子电路的序列行为——之前,我们事实上会经过不止一次的翻译过程。在这些翻译过程中,编译(compile)解释(interpret),都不过是其中的“某一个过程,或包括多个过程的阶段”的代名词而已。

问题是这个翻译过程可能有相当多的步骤,而且今后步骤还将有增减(或因系统复杂而变多,或因优化而变少),所以几年前作为名称的“编译或解释(这些过程)”与今天就可能根本不同。为了避免这类问题,我们采用两种极端的方法来定义它们,即对于一门语言翻译结果的执行体

  • 如果是可以直接指示 CPU 行为的指令,则我们称之为编译型语言;否则(必然地),
  • 它需要被某个软件再经过(至少一次)翻译才能得出上述指令的,我们称之为解释型语言

而“静态与动态”这样的分类法,则是源起于语法与语义之间的绑定关系。其中所谓的语义包括数、数据与逻辑等。一般来说,语言中会通过“有值但没有标识”的数据来表达“数”这一概念,即1

1 对于“数”的支持,在动态或静态语言中并没有根本的不同,但其中的匿名函数在静态语言中实现起来要困难很多——不过这并非无法实现,例如 Delphi 2009 以后的版本。

  • 对于没有标识的代码(这种数据),我们称为匿名函数(或匿名方法等);一般性的没有标识的数据,我们称为直接量(或字面量立即值)。

接下来,我们前面所谈到的数据结构最终被表示为(语言中的)数据类型,数据类型也因此可以理解为数据在语言中的性质——除非一个数据是无结构的。那么将语义绑定于标识时2,事实上语法元素就有了对这些值、数据类型以及对逻辑(代码、执行体)这一特殊数据的考量。作为一个约定,如果在代码执行之前

2 与上述“匿名 XX”相对应的,我们称之为“具名”。

  • 代码与该段代码的标识是绑定的,并且
  • 任何上述代码所使用的数据的标识具有确定的数据类型含义3

3 注意这里没有强调值与标识的绑定,这是因为存在变量的缘故。对于 Erlang 这类语言来说,所有“作为系统计算的前设”的值都必须是常量性质的,即:不可写且类型确定。

则我们称该语言是一个静态语言

评论

发布