【编译原理】第一章,什么是编译原理?

简介: 【编译原理】第一章,什么是编译原理?

第一章 绪论

以下上课后个人总结,希望有问题能够共同探讨!


什么是编译原理?

我们写代码是通过通过高级程序语言,因为它易于理解,但计算机能够执行处理的只能是机器代码。编译就是将高级程序语言转为机器代码的流程。我们要学的就是知道怎么转化它,并且能够完成编译过程的每一个步骤。这样才能做出像 浏览器,百度地图等等的应用软件。


这里的“译”就是代表翻译,是高级语言到机器语言的翻译过程,这个过程中也包含了优化。


这里的“编”,代表我们要让“译”执行的这个动作,因为语言的转换不可能靠人工来完成,所以我们必须要用程序来完成这个翻译的。

编译过程?

下面是核心图,慢慢的依照这个图来理解



我们首先拿到手的是一个写好代码的java文件,它肯定必须要经过编译后变成机器代码后才能执行。****


第一步,词法分析器


java文件里面是一个个的字符,“h”,“e”,“l”,“l”,"o"之类的。首先要经过词法解析器,把它变成,一个个单词,hello,print,class等等。组成后的单词称为词素(lexeme),相当于word。它有两类,预定义符(系统的变量以及关键字比如,class,public等)和自定义符(自己定义的变量)


词法解析也就是将字符解释成一个个的单词。


第二步,语法分析器


有了一个个的单词,当然要构成句子。


根据语言的语法规则,单词有它自己的含义,根据单词的含义来构成句子的含义。词法解析是线性的解析,语法解析是树型的解析。


例如: id1 = id2 + id3 * 60


解析的话,必须先挑出 = 号,然后两边再进行进一步的解析,右边话,再挑出 + 号,等等,形成下面的解析结果。


第三步,语义解析器


一个句子里面,或者句子之间,有时会有冲突。它就是检查句子是否满足语言定义的语义约束。例如,数组下标必须为整数,0不能作为被除数等等


第四步,中间代码生成器


我们有了句子,int b=(a*3)-3+19


它肯定不能在机器里面一次性执行,机器都是执行一条一条的指令,所以我们必须把这个句子拆开。变成


a=a*3

a=a-3

a=a+19

b=a


这样才能生成一条条的对应的机器代码供计算机执行


中间代码生成器就是拆开代码


第五步,机器无关代码优化器


为了减少数据在存储器里面的容量,减少cpu的计算量,减少两者之间数据传输量。代码优化也是我们要做事情。


比如说,中间代码含有,a=a+1,a=a+0


那a=a+0完全不用转为机器指令进行执行。把a=a+0去除,这就是无关代码优化器要做的事情。


第六步,机器代码生成器


就是将高级语言的这些代码,转为机器语言指令。中间肯定是经过汇编语言。


第七步,机器代码优化器


和第五步类似,是进行机器代码的优化


其实还有第零步


文件本身其实是010101011,bit构成的,bit要转为字节,字节再转为字符才能进行第一步的词法解析


因此,学完编译原理,就是能让我们自己能用程序完成上述的编译过程,用程序来生成程序。


如何构造编译器?

这块涉及编译器构造方法学,这就是我们要做的事情,怎么来实现编译器


用非常抽象、高级的表达式来表达语法规则;其特点是简洁,人能把控,一目了然。交给编译器构造工具,也叫生成器,由它来生成编译器的源代码。


这种设计方式是高水平,高境界的,用程序来生成程序,就事论事的来构造编译器是不可取的。


举例:


词法构造器,就用正则表达式作为工具,把合适的语法做为输入,生成词法构造器的源代码,也就是编译器最开始的部分。


语法构造器,就用上下文无关文法作为工具,同样的把合适的语法作为输入,生成词法构造器的源代码



相关文章
|
自然语言处理 安全 数据安全/隐私保护
不影响输出质量还能追踪溯源,大模型无偏水印入选ICLR 2024 Spotlight
【6月更文挑战第7天】研究人员提出了一种无偏水印技术,能在不降低大型语言模型(LLMs)输出质量的情况下实现追踪和归属。此方法被ICLR 2024选为Spotlight论文,保证水印不影响模型性能,保护知识产权,防止滥用。无偏水印的挑战包括设计无损模型质量的实现、有效检测及安全防范措施。[论文链接: https://openreview.net/pdf?id=uWVC5FVidc]
302 2
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
1082 0
|
人工智能 算法
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
蓝桥杯真题宝藏排序详解 | 冒泡排序 选择排序 插入排序
|
存储 Linux C++
|
存储 NoSQL 关系型数据库
四种类型的nosql数据库
随着互联网的发展,传统关系型数据库已经不能满足大数据时代的需求。NoSQL数据库应运而生,它们具有高可扩展性、高性能和高可用性等优点。本文将介绍四种主要类型的NoSQL数据库,分别是键值存储数据库、文档存储数据库、列存储数据库和图形数据库。这些数据库在不同的场景下有着不同的应用,可以满足不同的需求。
1854 0
|
存储 安全 Linux
C++文件格式深度解析:从底层结构到关键特性
C++文件格式深度解析:从底层结构到关键特性
1101 3
C++文件格式深度解析:从底层结构到关键特性
|
JSON 安全 Java
Java一分钟之-Spring Security:身份验证与授权
【6月更文挑战第7天】本文介绍了Spring Security的常见问题及解决方案,包括配置启动、身份验证、授权、无状态JWT和异常处理。通过`@EnableWebSecurity`启动安全框架,自定义登录页面和登录逻辑,使用`http.authorizeRequests()`设置访问规则。对于JWT,需添加解析器并注册过滤器。此外,处理Spring Security异常,创建自定义的`AccessDeniedHandler`和`AuthenticationEntryPoint`。理解核心概念并按业务需求定制,是确保应用安全的关键。
330 1
|
存储 移动开发 C#
一篇文章讲明白MIME详解
一篇文章讲明白MIME详解
723 0
|
网络协议
地址家族(Address Family)
地址家族(Address Family)
810 2
|
存储 设计模式 人工智能
程序设计:原理、实践与魅力
程序设计:原理、实践与魅力
305 0

热门文章

最新文章