编译原理学习笔记-基本术语

2018-06-10  本文已影响0人  blentle欢子

学习前,先来了解两个概念:

显然:由编译器产生的及其语言目标程序要比解释器要快的多,因为解释器顺序读取用户的输入或者叫客户端字符流,再同时进行转换成及机器语言交给CPU计算执行,最后把结果返回给客户端.这其中还有程序优化的原因,稍后说明.

因为我个人是java出身,所以这里简单聊一下Java编译器的编译过程.

一个java源代码首先经过javac 被编译成子解码的中间表示形式,这里子解码并不是最终的机器语言,为什么呢,因为java 需要解决跨平台的问题,编译后的目标程序自然不能是机器码,因为每个平台和硬件上的结构都是不一样的.导致底层执行的差异.完成这个适配的软件就是java虚拟机,所以java虚拟机不是跨平台的.这样一看站在java虚拟机的角度上看,虚拟机就是一个解释器,解释的是javac编译成的字节码. 是不是突然明白了为什么java的速度不如C/C++了? 哈哈, C/C++ 经过gcc 编译器最终生成的是机器码,或者非常接近机器码(链接以后),这里给出unix上源程序从编译到最终能运行的示例图, 应该会好理解一点:

执行过程

所以可以确认java是同时拥有编译和解释两种执行器. javac 命令的动作是编译, 对生成的.class文件执行java命令的动作是解释执行.

对上面的图解释以下:源程序经过 编译器 会产生一个汇编程序源码作为输出, 然后这个汇编程序源码经过汇编器进行处理, 并生成可重定位的机器码,最后可重定位的机器码与其他可重定位的文件或者库进行链接, 如系统打印函数. 最终生成真正可执行文件. 最后我们在执行./xx 的时候由加载器把所有可执行的目标文件放到内存中执行.

说的通俗一点,其实可以把编译器看成一个黑盒,它能把源程序映射成在语义上等价的目标程序.其内部可以总结成按如下步骤顺序执行的:

编译器的各个步骤.png

下面具体来聊这几个步骤

与上面的语法分析器不同的是,这里多了一个关于运算符inttofloat的额外节点. inttofloat明确的指出了把它的整数类型参数转换成一个浮点数, 后面的文章再次介绍.

中间代码生成器-new2.png 代码优化 (1).png

不同的编译器生成所作的代码优化工作量相差很大. 优化工作做的最多的编译器, 会在优化阶段花费相当多的时间. 简单的优化方法可以极大的提高目标程序的运行效率而不会降低编译的速度.

 了解了代码优化器后, 现在想一想为什么java中的反射构造对象、动态代理加载自定义自己码 没有new 构造对象快了. 对的, 因为编译器无法优化代码.

参考文献

  1. 编译原理 龙书 第二版
  2. 深入理解计算机系统 第三版
上一篇下一篇

猜你喜欢

热点阅读