首页 > 代码库 > 编译原理(龙书)习题答案------第一章

编译原理(龙书)习题答案------第一章

  声明:参考开源项目dragon-book-exercise-answers,如有纰漏,欢迎指正。

1.1练习:

  1.1.1编译器和解释器之间的区别是什么?

  编译器是一个程序,它能将某一语言编写的源程序翻译成与之等价的有目标语言编写的程序,并在翻译过程中报告所发现的错误;解释器直接利用用户提供的输入执行源程序中指定的操作。

  1.1.2编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么?

  一个编译器产生的目标程序通常比一个解释器快很多;解释器逐个语句执行源程序,诊断错误的效果通常比编译器更好。

  1.1.3在一个语言处理系统中,编译器产生汇编语言而不是机器码的好处是什么?

  因为汇编语言比较容易输出和调试。

  1.1.4把一种高级语言翻译成另一种高级语言的编译器称为源到源(source-to-source)的翻译器,编译器用C语言作为目标语言有什么好处?

  因为C语言在各硬件平台都有相应的编译器进行二次编译,产生可执行的机器码。

  1.1.5描述一下汇编器所要完成的一些任务。

  生成可重定位(relocatable)的机器代码。

1.3练习:

  1.3.1指出下面术语:1)强制式的;2)声明式的;3)冯·诺依曼式的; 4)面向对象的;5)函数式的;6)第三代;7)第四代;8)脚本语言。可被用于描述下列哪些语言:  

    1)C;

  2)C++;

  3)Cobol;

  4)Fortran;

  5)Java;

  6)Lisp;

  7)ML;

  8)Perl;

  9)Python;

  10)VB

  强制式的:C、C++

  面向对象的:C++、Java

  函数式的:ML

  脚本语言:Perl、Python

1.6练习

  1.6.1对下面块结构的C代码,指出赋给w、x、y和z的值。

int w, x, y, z;int i = 4;int j = 5;{    int j = 7;    i = 6;    w = i + j;}x = i + j;{    int i = 8;    y = i + j;}z = i + j;

    w = 13;x = 11;y=13;z=11 

  1.6.2对下面块结构的C代码,指出赋给w、x、y和z的值。

int w, x, y, z;int i = 3;int j = 4;{    int i = 5;    w = i + j;}x = i + j;{    int j = 6;    i = 7;    y = i + j;}z = i + j;

  w=9;x=7;y=13;z=11

  1.6.3对下面的块结构代码,假设使用常见的静态作用域规则,给出其中12个声明中的每一个的作用域。

{//块B1    int w, x, y, z;    {//块B2        int x, z;        {//块B3            int w, x;        }    }    {//块B4        int w, x;        {//块B5            int y, z;        }    }}

  从上到下,从左到右:

  w:B1-B3-B4

  x:B1-B2-B4

  y:B1-B5

  z:B1-B2-B5

  x:B2-B3

  z:B2

  w:B3

  x:B3

  w:B4

  x:B4

  y:B5

  z:B5  

  1.6.4下面C代码打印的结果是什么?

#define a (x+1)int x = 2;void b(){x=a; printf("%d\n", x);} void c(){int x=1; printf("%d\n", a);}void main(){b(); c();}

  3

  2

  

编译原理(龙书)习题答案------第一章