热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

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

第一部分---什么是编译程序---转换器1.编译程序就是翻译程序的一种1.机器语言程序可以直接在计算机上运行,并得到计算结果2.编译程序具有以下几种分类ÿ

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

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

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

 


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 如何查找和管理计算机中的C盘临时文件
    本文详细介绍了如何在计算机中找到和管理C盘的临时文件,包括其具体路径、环境变量设置方法以及清理这些文件对系统性能的影响。对于希望优化系统性能和释放磁盘空间的用户来说,这是一篇非常有价值的参考。 ... [详细]
author-avatar
清雅竹gf_644
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有