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

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

 


推荐阅读
  • 摘要:对于类的成员(包括成员变量和成员方法)而言,其能否被其他类所访问,取决于该成员的修饰词;而 ... [详细]
  • 关于Pycharm的使用小技巧
    这篇文章主要介绍关于Pycharm的使用小技巧,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python最好IDE:Pycha ... [详细]
  • R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开 ... [详细]
  • 计算机学科领域复杂而广阔,学习过程漫长而多样,对学习对象的内容进行归类划分,形成不同阶段的学习内容,有利于高效学习ÿ ... [详细]
  • 【原创】响应式网页设计基础【从零开始】
    2019独角兽企业重金招聘Python工程师标准响应式网页设计基础【从零开始】如今的互联网事业突飞猛进,可谓一日千里。响应式网页设计凭借其能为开发者提高开发效率 ... [详细]
  • 在Windows上安装python2pluslxmlplusmechanize的最简单方法是什么?我正在寻找一个易于遵循的解决方案,并且还可以在将来轻松安装其他库(鸡蛋?). ... [详细]
  • Flutter基础Widgets之AppBar详解
    概述AppBarMaterial风格应用栏,有工具栏和其他的Widget构成应用栏通常用于Scaffold.appBar属性,该属性将应用栏放置在屏幕顶部的固定高度小部件中。对于可 ... [详细]
  • cookie中path路径探讨
    上篇文章中说:cookie必须在同一网站下且cookie的path路径为当前url或者是当前url的父级时才是共享的。具体怎 ... [详细]
  • openssh其他版本有漏洞,需要升级,本文以我升级的机器centos6为例一、准备工作1.1检查openssh版本查看系统版本catetcre ... [详细]
  • 在分布式系统领域有个著名的CAP定理:C——数据一致性;A——服务可用性;P——服务对网络分区故障的容错性。这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。Zookee ... [详细]
  • 欢迎关注我们微信公众号,可以加入我们QQ人工智能行业交流群626784247.01在当前飞速发展的创新步伐中,科技似乎正在积极地解决人类最紧迫的难 ... [详细]
  • 关于主从复制:异步复制、半同步复制:https://blog.csdn.net/keil_wang/article/details/88669587https://c ... [详细]
  • Win11如何关闭UAC?Win11关闭UAC的方法
    友情提示:教程内容为了更好的解决大家的问题,所以电脑教程网的每一篇内容都是图文并茂的在多端设备下呈现给大家。告诉大家的是,文章内里的图片也尤为重要, ... [详细]
  • 乐观锁_乐观锁 VS 悲观锁
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了乐观锁VS悲观锁相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Currentlyimfacingissuethattroublesmealot.Ihopethatsomebodycouldhelpmeout.Iworkfor ... [详细]
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社区 版权所有