【编译原理 读书笔记】第一章 引论

1.1语言处理器

编译器:一个程序,可以阅读某一种语言编写的程序,并把该程序翻译成一个等价的、用另一种语言(目标语言)编写的程序;

    他的重要任务之一:报告它在翻译过程中发现的源程序的错误;

解释器:常见的语言处理器。不通过编译的方式生成目标程序。直接利用用户提供的输入执行源程序中指定的操作。

目标程序比解释器快。

解释器的错误诊断效果更好。

1.6程序设计语言基础

1.6.1静态与动态的区别

静态策略:语言使用的策略支持编译器静态决定某个问题;(这个问题再编译时刻compile time决定)

动态策略:只允许在运行程序的时候做出决定的策略;(需要在运行时刻做出决定)

作用域scope:指程序的一个区域,在其中对x的使用都指向这个声明;

  静态作用域:仅通过阅读程序就可以确定一个声明的作用域;

  动态作用域:当程序运行的时候,同一个x的使用会指向x的几个声明其中之一;

例:java中public static int x;使得x成为一个类变量:不管创建了多少个这个类的对象,只存在一个x的拷贝,编译器可以确定内存中被用于存放x的位置。如果没有static的话,这个类的每个对象都会有它自己存放x的位置,编译器无法在运行程序之前确定所有这些位置。

1.6.2环境与状态

环境:变量就是指内存位置(左值),从名字到变量的映射;

状态:从内存位置到它们的值的映射。状态吧左值映射到右值;

【编译原理 读书笔记】第一章 引论_第1张图片

【编译原理 读书笔记】第一章 引论_第2张图片

【编译原理 读书笔记】第一章 引论_第3张图片

【编译原理 读书笔记】第一章 引论_第4张图片

1.6.3静态作用域和块结构

块:声明和语句的一个组合。{和}可以限定一个块。块是一种语句;

标识符:字母和数字组成,用来指向一个实体,入:数据对象、过程、类、或者类型;

标识符都是名字,名字不一定是标识符。例如:x.y中x和y都是标识符,x.y是名字(受限名字);

【编译原理 读书笔记】第一章 引论_第5张图片

1.6.3显式访问控制

声明:告诉我们事物的类型;

定义:告诉我们事物的值;

1.6.4动态作用域

作用域策略依赖于一个或者多个只有在程序执行时刻才能知道的因素,那么他就是动态的。

【编译原理 读书笔记】第一章 引论_第6张图片

打印结果是:2 3

 

第一章课后作业:

1.6.1

【编译原理 读书笔记】第一章 引论_第7张图片

解:

第五行中w=i+j,其中i=6,j=7,j是在第一个大括号中申请的临时变量,所以在这个大括号中值是7,之后的j还是第二行申请的j=5,但是i的值被改变了。所以w=6+7=13;x=6+5=11;

第二个大括号中有定义了一个临时变量i,只在这个大括号的范围内有效y=8+5=13;

z=6+5=11;

其实我想可以这样,将括号中的临时变量名都改一下,避免和主函数中的变量名重复:

int w,x,y,z;

int i=4;int j=5;

{

  int k0=7;

  i=6;

w=i+k0;

}

x=i+j;

{

  int k1=8;

  y=k1+j;

}

z=i+j;

这样就比较直观了。

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

1.6.2

【编译原理 读书笔记】第一章 引论_第8张图片

解:

直接更改重复的临时变量名,改写代码:

int w,x,y,z;

int i=3;int j=4;

{

  int k0=5;

w=k0+j;       //w=5+4=9;

}

x=i+j;           //x=3+4=7;

{

  int k1=6;

  i=7;

  y=i+k1;        //y=7+6=13;

}

z=i+j;           //z=7+4=11;

答:

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

1.6.3

【编译原理 读书笔记】第一章 引论_第9张图片

解:

第一个变量w,块B1中的声明int w;它的作用域包括整个B1,嵌套在B1中的块中,块B3和块B4中也声明了int w;所以,B3和B4是位于名字w在B1中声明的作用域之外的地方,w的作用域就是B1-B3-B4;

第二个变量x,块B1中的声明int x;块B2和块B4中也声明了int x;所以,B2和B4是位于名字x在B1中声明的作用域之外的地方,x的作用域就是B1-B2-B4;

第三个变量y,块B1中的声明int y;块B5中也声明了int y;所以,B5是位于名字y在B5中声明的作用域之外的地方,y的作用域就是B1-B5;

第四个变量z,块B1中的声明int z;块B2和块B5中也声明了int z;所以,B2和B5是位于名字z在B1中声明的作用域之外的地方,z的作用域就是B1-B2-B5;

第五个变量x,块B2中的声明int x;块B3中也声明了int x;所以,B3是位于名字x在B2中声明的作用域之外的地方,x的作用域就是B2-B3;

第六个变量z,块B2中的声明int x;块B3中没有声明了int z;所以, z的作用域是B2;

第七个变量w和第八个变量x,在块B3中声明,作用域是B3;

第九个变量w和第十个变量x,块B4中的声明int w,x;块B5中没有声明,所以,作用域是B4;

第十一个变量y和第十二个变量z,在块B5中声明,作用域是B5;

答:

块B1中的变量:

w:B1-B3-B4

x:B1-B2-B4

y:B1-B5

z:B1-B2-B5

块B2中的变量:

x:B2-B3

z:B2

块B3中的变量:

w:B3

x:B3

块B4中的变量:

w:B4

x:B4

块B5中的变量:

y:B5

z:B5

1.6.4

【编译原理 读书笔记】第一章 引论_第10张图片

解:

主函数中,先调用函数b();,后调用函数c();,

b()函数中,x=a;a的值为x+1,x的值为2,因此:x=x+1=2+1=3;打印出的是“3”;

c()函数中定义了x=1,则a=1+1=2,打印出的是“2”;

答:

打印结果:

3

2

你可能感兴趣的:(【编译原理 读书笔记】第一章 引论)