编译原理 --- 引论 --- 编译与计算思维

第一部分 --- 什么是编译程序 --- 转换器

1.编译程序就是翻译程序的一种

1.机器语言程序可以直接在计算机上运行,并得到计算结果

2.编译程序具有以下几种分类:

1.诊断编译程序侧重于对源语言程序的调试核检查

2.优化编译程序则侧重于对源语言程序的执行效率的优化

3.交叉编译程序:

前置知识:运行编译程序的机器称为宿主机,运行机器语言程序的是目标机,一般来说宿主机和目标机是同一台机器

但是当宿主机和目标机不是同一台机器,也就是说编译程序编译出不同于他所在的机器(宿主机)的机器代码时,我们称这种为交叉编译程序

4.可变目标编译程序:可以将一个源程序编译为多种不同的机器语言程序的编译程序

1.解释程序和编译程序的区别就是编译程序会将源程序编译为目标程序(机器语言程序,翻译得到的结果会被保留)后,然后在机器上执行目标语言程序,并将得到的结果返回

而对于解释程序而言,它不会生成目标语言程序,而是在执行将一条源程序中的代码翻译为对应的机器语言代码,然后直接执行得到的机器语言代码(不保留),执行完后再继续翻译下一句的循环(循环结束条件是源程序被翻译且执行完毕)


第二部分 --- 什么是计算思维

1.抽象

 

2.自动化

 

3.分治(分解)


第三部分 --- 编译过程(五个阶段),编译程序的结构(前端,后端)以及编译程序的生成(高级语言书写,自编译,自动生成)

1.基本字是高级语言预定义的一些符号,一般我们称其为关键字

2.进行词法分析的时,依循的原则是构词规则,而描述构词规则的工具就是有限自动机

1.描述语法规则的工具是:上下文无关文法

 

1.代码的可读性是对人而言的,有时候我们为了保证代码的可读性不得不选择效率更低的表达方式,但是通过编译时的优化,我们最终依然能够得到高效率的代码(优化前的代码是给人看的,保证可读性,优化后的代码是给机器看的,保证效率)

1.绝对指令代码中有着计算机中已经定好的内存地址(绝对地址),我们可以通过代码中的绝对地址找到对应的内存空间并进行存储和运算

2.可重新定位指令代码中中有的则是相对于起始地址的内存地址(相对地址),这个起始地址是我们给定的计算机中一个已经定好的地址,给定起始地址后,我们就能够确定其它相对地址所对应的计算机中已经定好的地址(绝对地址),然后我们就可以通过绝对地址找到对应的内存空间并进行存储和运算了。

1.在编写程序的时候我们采用的都是模块化编程,即编写多个独立的子程序(函数),然后将这些子程序拼接为我们最终想要的程序

这个拼接的过程就称为 链接

其中每个模块都有一个起始地址,当模块拼接好后模块的起始地址就变为了相对地址(相对于第一个模块的起始地址),而模块中的变量等等的地址也是相对地址(相对于其所处模块的起始地址)

2.汇编代码也不能够直接执行,它需要经过汇编器转换为机器语言代码后才能够直接在机器上执行

1.只要在编译过程中涉及到了符号处理就需要与符号表管理打交道(编译过程中的所有阶段都需要与符号打交道)

2.在编译过程中的任何一个阶段出现错误时,我们就需要与出错处理部分打交道。出错处理部分要求全面,能够给出出错代码位置,甚至给出纠错建议。

1.阶段和遍是不同的概念,但它们之间有着紧密的联系

2.有时候对源程序进行一次遍历,可以执行多个阶段 --- 比如首先对遍历到的一条源程序代码进行词法分析,分析完后进行语法分析,最后进行语义分析以及中间代码生成

有时候也可以在一个阶段进行多次遍历 --- 比如在优化阶段,我们需要多次遍历中间代码,第一次遍历获得中间代码的基本结构,第二次遍历将中间代码进行初步优化,第三次遍历对中间代码中的第一层循环进行优化...等等

1.编译过程中与源语言有关的一切操作,以及与目标语言无关的优化称为编译程序的前端,而与目标语言有关的一切操作(中间语言编译为目标语言,以及为了使目标语言执行效率更高对中间语言进行的优化操作)则称为编译后端

1.与目标语言(机器语言)有关的优化属于编译后端,与目标语言(机器语言)无关的优化属于编译前端

首先一段程序必须在转化为机器语言代码后才能够在机器上真正的被执行,而将源代码转化为机器语言代码的程序称为编译程序,我们在转化的过程中需要调用编译程序

编译程序可以有两种实现方式:1.机器语言 / 汇编语言实现 ; 2.高级语言实现

用机器语言编写的编译程序可以直接在对应的机器上执行,不需要经过再次编译程序翻译

用汇编语言编写的翻译程序需要经过汇编器由汇编语言转换为机器语言代码后才能够执行

用高级语言编写的翻译程序需要在经过这个高级语言自身的翻译程序翻译为机器语言代码后才能够在机器上被执行

 由于使用机器语言或者是汇编语言编写翻译程序非常的麻烦,所以我们采用高级语言也就是上面的实现语言来编写翻译程序

(要注意的是这个实现语言本身必须具有翻译程序,也就是说无论如何都需要一个由机器语言或者是汇编语言编写而成的翻译程序,可以说是前人栽树后人乘凉了)

1.上面这个图中L1和L2分别是两种不同的高级编程语言,A代码是机器语言代码

当L2语言的翻译程序是由L1语言编写而成,而L1语言的翻译程序是由A代码编写而成时,给定一段L2语言代码,会出现下面这些步骤:

一:L2语言传给翻译程序后,我们需要在机器上运行这个编译程序来实现翻译

二:由于L2的翻译程序是由高级语言编写而成,而高级语言编写的程序必须在转换为机器语言代码后才能够在机器上被执行,所以我们需要先调用编写L2的翻译程序的高级语言,将L2的翻译程序转换为机器语言代码后,他才能够在机器上执行以及行使翻译功能                               

1.首先我们用L语言自身编写一个编译程序一号,这个编译程序的作用是将L语言转化为机器语言B 

(PS:L语言具有一个由机器语言A编写的编译程序二号,作用是将K语言转化为机器语言A)

(PS:由机器语言A编写而成的代码只能够在机器A上被执行) 

2.我们在机器A上调用编译程序一号将L语言转换为机器语言B,而编译程序一号如果想要在机器A上运行的话就需要调用编译程序二号将其由高级语言L转化为机器语言A

3.此时我们就得到了高级语言L通过由机器语言A编写而成的编译程序翻译为机器语言B

4.此时我们再设计一个编译程序三号,这个编译程序由L语言编写而成,且这个编译程序要在机器B上运行:

首先将编译程序三号通过L语言在机器A上的的编译程序(在机器A上执行)转化为由机器语言B编写而成的程序,然后再将这个转化后的编译程序在机器B上执行翻译工作

给定一个高级语言L,我们要为这个高级语言构造一个编译程序,如果用自编译的方式来构造的话过程就是:

1.先构造一个能够编译高级语言L核心部分的小的编译程序L1

2.在这个小的编译程序L1的基础上构造一个能够编译高级语言L更复杂部分的编译程序L2

3.就这样不停的在原来的基础上进行构造,直到我们的编译程序能够编译整个高级语言为止

编译程序自动生成器接收源语言的语法描述和语义描述,然后接收目标语言或者是机器描述,通过接收到的这两个信息自动生成源语言到目标语言的编译程序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值