复习一些编译原理

语言处理器的黑盒理解

编译器

就是这样一个程序: 输入:源程序 -> [编译器] -> 输出:目标程序,如下图1,并可以报告翻译过程中的错误。

如果目标程序是machine code,就可以被用户调用,处理输入产生输出:

解释器

与编译器区别是:并不翻译成目标程序,从用户角度看,可以直接运行由输入产出输出,关键是这里的解释和执行是同时的,而不是分为两个阶段

解释器需要逐个语句执行源程序,比如一个for内的循环需要被解释多次;相对于编译后的机器指令,执行效率低10倍左右。

java语言处理器综合了编译和解释过程(还有JIT编译优化),是一个混合编译器:

这里的中间程序就是Bytecode,虚拟机会再根据具体的平台翻译成相应的machine code执行,所以这个编译的bytecode时可以拿到任何一个平台去run的。

生成目标可执行程序的其它语言处理器

过程如下,这里的编译会生成汇编代码,而汇编器会生成机器代码,需要进一步和其它可重定位的库等链接起来,不再解释:

编译器的结构

编译器分为分析部分和综合部分。分析部分要生成中间表示和符号表。

分析过程首先会将源程序分解为多个组成要素,并为组成要素添加语法结构,这就是中间表示。符号表则存储了源程序的变量名、作用域等信息。

整个编译过程如以下步骤构成:

AOT 与 JIT

开始提到的编译和解释两种常见的运行方式下,分别对应AOT于JIT。

尽管通过 JIT 编译保持了平台无关性,但是付出了一定代价。因为在程序执行时进行编译,所以编译代码的时间将计入程序的执行时间。任何编写过大型 C 或 C++ 程序的人都知道,编译过程往往较慢。

为了克服这个缺点,现代的 JIT 编译器使用了下面两种方法的任意一种(某些情况下同时使用了这两种方法)。第一种方法是:编译所有的代码,但是不执行任何耗时多的分析和转换,因此可以快速生成代码。由于生成代码的速度很快,因此尽管可以明显观察到编译带来的开销,但是这很容易就被反复执行本地代码所带来的性能改善所掩盖。第二种方法是:将编译资源只分配给少量的频繁执行的方法(通常称作热方法)。低编译开销更容易被反复执行热代码带来的性能优势掩盖。很多应用程序只执行少量的热方法,因此这种方法有效地实现了编译性能成本的最小化。

动态编译器的一个主要的复杂性在于权衡了解编译代码的预期获益使方法的执行对整个程序的性能起多大作用。一个极端的例子是,程序执行后,您非常清楚哪些方法对于这个特定的执行的性能贡献最大,但是编译这些方法毫无用处,因为程序已经完成。而在另一个极端,程序执行前无法得知哪些方法重要,但是每种方法的潜在受益都最大化了。大多数动态编译器的操作介于这两个极端之间,方法是权衡了解方法预期获益的重要程度。

时间: 2024-11-06 13:39:07

复习一些编译原理的相关文章

Compiler_编译原理复习小注

本文出自:点击打开链接 词法分析: 1.之前一直没有理解关于正则表达式扩展的单目运算符.关于正则定义式的扩展: 在一个问题就是关于回退: 之前一直没有考虑回退符号的问题.回退一个符号,到达终态.实验那么做虽然没有问题,但是这个地方一直理解错了.  Compiler_编译原理复习小注

实况:《编译原理》期末考试一天复习

大学的编译原理课程是讲解如何设计编译器的.我要做的,是在一学期没怎么听课的条件下,用我对算法的理解能力,和互联网以及身边同学的帮助,来在不足一天的时间中复习完考试所需的所有知识. 我手上有两份可用资料: 复习课上记录的,老师对考试知识点的回顾. 同学总结的,会考的算法的列表. 而现在的时间是晚上6:33,我刚刚看完大约四分之一,明天下午1:10就考试了.由于时间紧迫,我必须对自己的任务有个计划,不能浪费一点时间.这个计划会花去我大概半个小时的时间,但它是一定要做的,否则我一定复习不完. 考试涉及

编译原理--01 复习大纲(清华大学出版社第3版)

前言 目前以手中这本清华大学出版社出版的编译原理(第3版,张素琴等编著)作为复习总结,因为考试都是大题,一部分概念会被忽略.所有内容都需要通过举例和推导来帮助加深理解,优先为过几天的考试服务.该文实现了教材中那些特别复杂的推导符号,并且这几天会加紧持续更新. 第2章 文法和语言 符号和符号串 空符号串用\(\varepsilon\)表示,长度为0 若 \(\Sigma=\{0,1\}\) ,则 \(\Sigma^*=\{\varepsilon,0,1,00,11,000,001,...\}\),

编译原理

1.编译原理是什么? (1)就是对程序语言进行翻译: (2)介绍编译程序构造的原理和基本方法: (3)从本质上讲是一个算法问题: 2.学习编译原理有什么好处? (1)接触一些新的算法,如,贪心算法,图论算法等: (2)学习一些新的思想,如,有限状态机,递归下降等: (3)多了一项技能: 3.不学有什么损失? (1)将来出社会可能比较难混: (2)不学好这门课程期末可能不及格: (3)有学不一定有用,不学肯定没用: 4.如何学习编译原理? (1)上课跟上老师的步伐,课前预习,课后复习: (2)多从

程序员的三大浪漫之一——编译原理

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为,既然编译过程是将一种语言翻译为另一种语言的计算机程序的过程,顾名思义,编译原理就是为我们解释计算机是如何将一种语言翻译成另一种语言这

关于计算机编译原理

从我个人理解,计算机编译原理,顾名思义,就是关于计算机编程翻译的相关原理,即对计算机编程的,更为深入.更为详细的去解读计算机语言.上网看了许多个人解读编译原理,发现最令我信服的,就是把编译原理类比成人体解剖:只有认真解剖.研究人体各部位,才能在手术中.医治中做到更好的处理.因此,唯有理解编译原理,才能更好地进行计算机的编程等一系列的操作. 博客上有人说到,学习编译原理能够更加容易理解算法之间的关系.能培育自己的观点.提高学习语言的效率.但在我个人看来,学好编译原理,能让我们有一个更强的临时变换的

0909编译原理作业

1.学习编译原理既掌握编译理论和方法方面的基本知识,而且也获得设计.实现.分析和移植编译程序方面的初步能力.知道程序编译器是怎么编译的,学好了以后可以开发编译器.学会使自己写的程序更优,提高程序的效率.告诉我们编译器是怎么在内存中为程序的函数(包括变量)分配空间的等等. 2.编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力.编译原理是计算机科学与技术中一个非常成熟的分支,非

0909 编译原理

1.编译原理学什么? 编译原理是计算机专业的一门重要专业课.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 2.为什么学编译原理? 编译原理是计算机专业设置的一门重要的专业课程.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了. 3.怎么学编译原理? 1)提高学习

如何更好的学习编译原理?

编译原理就是什么?编译原理对于我们学计算机来说,是一门很重要的学科,它在计算机科学与技术的历史发展中发挥了巨大作用,是计算机系统的核 心支持软件.这门课程关注的是编译器方面的产生原理和技术问题,从本质上来讲就是一个算法问题. 学习编译原理有什么好处?1. 词法分析方面,掌握正则表达式,了解dfa/nfa.2. Parsing 方面,能读懂BNF,知道AST,会写简单的递归下降parser,会用 antlr之类的parser generator.3. 优化方面,知道现代编译器的优化能力有多强,知道