1.1 语言处理器
练习1.1.1:编译器和解释器之间的区别是什么?
答:
编译器:将源程序阅读并翻译成等价的用另一种语言(目标语言)编写的程序。编译器的重要任务之一是报告它在翻译过程中发现的源程序中的bug。
解释器:直接利用用户提供的输入执行原程序中指定的操作。
所以区别在于:编译器起到是翻译源程序的作用。解释器是起到执行源程序作用。
练习1.1.2:编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么?
答:
编译器相对于解释器的优点是产生的机器语言目标程序的速度快。
解释器相对于编译器的优点是错误判断诊断效果要好,因为它是逐行执行源程序。
练习1.1.3:在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么?
答:
因为汇编语言比较容易输出和调试。汇编语言可由汇编器的程序进行处理,并生成可重定位的机器代码。
练习1.1.4:在一种高级语言翻译成为另一个高级语言的编译器成为源到源(source-to-source)的翻译器。编译器使用C语言作为目标语言有什么好处?
答:
1、C语言较为普及,各种平台上都有对其实现的支持;
2、相对于汇编语言,C的抽象更为高级,分离了更多具体的实现细节,可以避免在代码在移植时由于具体机器架构,指令集的不同等其他问题而受到影响。
练习1.1.5:描述一下汇编器所要完成的一些任务。
答:
对汇编语言程序进行处理,并生成可重定位的机器代码。
1.3 程序设计语言的发展历程
练习 1.3.1:指出下面的术语:
1)强制式的 2)声明式的 3)冯·诺依曼式的 4)面向对象的
5)函数式的 6)第三代 7)第四代 8)脚本语言
可以被用于描述下面的哪些语言:
1)C 2)C++ 3)Cobol 4)Fortan 5)Java
6)Lisp 7)ML 8)Perl 9)Python 10)VB
答:
C:强制式、冯·诺依曼式、面向对象、第三代。
C++:强制式、面向对象、冯·诺依曼式、第三代。
Cobol:冯·诺依曼式、第三代。
Fortan:冯·诺依曼式、第三代。
Java:冯·诺依曼式、面向对象、第三代。
Lisp:声明式、函数式、冯·诺依曼式。
ML:冯·诺依曼式、函数式。
Perl:脚本语言、冯·诺依曼式。
Python:脚本语言、冯·诺依曼式、函数式的、面向对象。
VB:强制式、冯·诺依曼式。
1.6 程序设计语言基础
练习1.6.1:对图1-13a中的块结构的C代码,指出赋给w,x,y和z值。
赋给 w 的值是13,赋给 x 的值是9,赋给 y 的值是13,赋给 z 的值是9。
练习1.6.2:对图1-13b中的代码重复练习1.6.1。
赋给 w 的值是9,赋给 x 的值是7,赋给 y 的值是13,赋给 z 的值是9。
练习1.6.3:对于图1-14中的块结构代码,假设使用常见的声明的静态作用域规则,给出其中12个声明中的每一个的作用域。
答:
第一行:w的作用域:B1,B2,B5。x的作用域:B1,B5。y的作用域:B2,B3,B4。z的作用域:B1,B3,B4。
第二行:x的作用域:B2。z的作用域:B2,B3。
第三行:w的作用域:B3。x的作用域:B3。
第五行:w的作用域:B4,B5。x的作用域:B4,B5。
第六行:y的作用域:B5。z的作用域:B5。
练习1.6.4:下面的C代码的打印结果是什么?
打印结果是3, 2。