为什么编译原理被称为龙书? (4)

如何完成计算任务的语言称为 强制式(imperative)语言,而把程序中指明要进行哪些计算的语言称为 声明式(declarative)语言。 C、C++、Java 这些都是强制式语言,它们能够改变程序的状态;声明式比如 HTML Prolog 等。

冯·诺伊曼 语言指的是以冯·诺伊曼计算机体系为基础的编程语言,今天很多编程语言都是冯·诺伊曼语言

面向对象语言(object-oriented language) 是一种描述对象的语言,比如 C、C++、Java

脚本语言(scripting language) 是具有高层次的解释型语言,它通常把多个过程粘在一起,比如 JavaScript、Perl、PHP、Python 等。

程序设计语言基础

下面我们主要探讨程序设计语言的研究中最重要的术语和它们的区别,假设读者已经了解过 C、C++、C#、Java 中任意一种语言。

静态和动态的区别

编译器需要能够对程序作出判定,如果语言能够让编译器静态(非运行)时候决定某个问题,那么我们说这个语言使用了一种 静态(static) 策略,或者说能够在 编译时刻(compile time) 决定。如果让编译器在运行时决定某个策略,那么就是动态策略(dynamic policy),或者被认为是 运行时决定(run time) 。

还有一个问题是声明的作用域(scope),如果能够通过阅读程序就能确定一个声明的作用域,那么这个语言就是静态作用域(static scope),或者说是 词法作用域(lexical scope)。否则这个语言使用的是 动态作用域(dynamic scope)。动态作用域的指向对象是几个声明中的一个,并不惟一。

C 和 Java 都使用了静态作用域,比如 Java 中的 static 关键字,下面是一段代码示例

public static int x;

这段代码在创建完成后就能够确定它的作用域,因为 static 声明的变量是类变量,类变量的实例能确保只有一个个(不太清楚的小伙伴可以参考我的这篇文章 )

如果你去掉了 static ,那么这个变量的作用域和在内存中的分配就无法确定,编译器无法在运行之前确定所有这些位置。

静态绑定和动态绑定

同样的,名字到位置也区分静态绑定和动态绑定,如果能在非运行条件下唯一确定名字到位置,那么就是静态绑定,如果要在程序运行时才能确定名字和位置的绑定,那么就是动态绑定。

静态作用域和块结构

大多数编程语言都提供了作用域这么一个结构,比如 Java 中的 private,protected,public 等关键字的使用,提供了有效的作用域控制。

块结构也是一种作用域,使用块结构表示的含义是在块内部(block) 作用范围有效,块使用 {} 来界定一个块。

这种语法允许在任意函数或者方法的内部嵌入一个块,这种嵌套结构也被称为 块结构(block structure)。

参数传递机制

参数传递机制主要描述的是形式参数和实际参数的关联。大多数编程语言都支持两种调用:值传递和 引用传递

值传递

在值传递(call-by-value) 中,会对实参求值或拷贝,这些值被放在属于被调用的形式参数的内存位置上,这种调用方式在 C 和 Java 中都会使用,值调用的结果是,实参本身不会改变。但是在 C 中,我们可以传递一个指针,使得变量的值能够被修改。

引用传递

在 引用传递(call-by-reference) 中,实际参数的地址作为相应的形式参数的值被传递给调用者。在被调用者的代码中使用形式参数,实现方法是沿着这个指针找到调用者指明的内存位置。因此,改变实际参数相当于改变了形式参数。

为什么编译原理被称为龙书?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjzf.html