Knowledge Point 20180303 对比编译器、解释器与Javac编译原理
编译器与Javac编译原理
在前文我们知道了Java是一种编译语言和解释语言,它的源代码经过编译器Javac编译为能够被JVM识别的二进制语言,然后JVM将其解释为能够被平台识别的机器语言。那么什么是编译器呢?编译器的作用是什么呢?Javac又是如何进行工作的?下面我们一一来认识了解。
1 编译器(Compiler )
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,转换为最终可以被CPU直接计算的机器码(NativeCode)。
简单来说,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序,编译器的作用就是就是将便于人理解的语言规范转化为机器容易理解的语言规范;
2 解释器
解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
3 解释器和编译器的对比
解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言。
编译器是把源代码整个编译成目标代码,执行时不再需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。
解释器比编译器的效率高(详见http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html)
4 Javac编译原理
我们知道程序语言都有自己的规范,这个规范详细描述了语言有哪些语法和词汇,Java作为一个高级开发语言也不例外,它也有自己的语言规范,Java虚拟机也有自己的虚拟机规范,Java虚拟机规范和Java语言规范不是一回事,他们都有自己的词法和语法解析规则,而且它们的解析规则也是不同的。那么如何才能让Java的语法规则适应Java虚拟机的语法规则呢?这个任务就由Javac编译器来完成。它的作用就是将Java语言规范转化为Java虚拟机语言规范,完成“翻译”工作。
4.1 Javac是什么
Javac是一种编译器,能将一种语言规范转化为另一种语言规范。通常编译器都是将便于人理解的语言规范转化为机器容易理解的语言规范,如C、C++或者汇编语言都是将源码直接编译成目标机器码,这个目标机器码是CPU直接执行的指令集合。这些指令集合也就是底层的一种语言规范,机器能够直接识别这种语言规范,但是人不可能直接去写目标机器码。虽然这种机器码执行起来非常高效,但是对人太不友好了,开发这个代码的成本往往高于省下的机器的执行成本,所以才有了编译器的出现,有了编译器才有可能出现了这么多的高级编程语言。
从某种意义上来说,有了编译器才有了程序语言的繁荣,因为编译器是人类和机器沟通的一个纽带。
5 Java你就是比C慢
我们知道Java是由C++发展而来的,Java即是一种编译型语言,又是一种解释型语言,而C++是一种编译型语言,C的源代码经过一次编译后可以直接在计算机上(编译后的C代码为针对该计算机平台特有的机器指令,到了另一个平台需要重新编译)执行,而Java的源代码需要经过一次编译生成符合JVM规范的中间码,然后由JVM解释执行生成能够被计算机识别的机器码,最后由CPU执行.如下图:
这样很明显就能看出来Java在运行上的确没有C那么直接,那么迅速,针对这个缺点,JVM有了一个选项,可以将执行频率高的字节码序列翻译成机器码,这一过程叫做即时编译,大大提供了执行效率.
Knowledge Point 20180303 对比编译器、解释器与Javac编译原理的更多相关文章
- 第二章 Javac编译原理
注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...
- javac编译原理(一)
我们都知道,计算机只能识别二进制语言,是不能直接识别java c c++等高级语言的.将高级语言转化成计算机可以是别的二进制语言,这个过程就叫编译. 有次面试,面试官问了一道“java的编译原理是什么 ...
- 第四章 Javac编译原理
4.1 Javac是什么 是一种编译器,将JAVA源代码(.java文件)语言先转化成JVM能够识别的一种语言(.class文件),然后由JVM将JVM语言再转化成当前机器可以识别的机器语言. 4.2 ...
- 第四章 Javac编译原理(待续)
Javac是什么 Javac编译器的基本结构 Javac工作原理分析 设计模式解析之访问者模式
- Javac编译原理 《深入分析java web 技术内幕》第四章
javac编译的四个主要的流程: 词法分析器:将源码转换为Token流 将源代码划分成一个个Token(找出java语言中的关键字) 语法分析器:将Token流转化为语法树 将上述的一个个Token组 ...
- Javac 编译原理
写在前面 JDK & JRE JRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只 ...
- javac编译原理
javac编译器的作用就是将符合java语言规范的源代码转化成符合java虚拟机规范的java字节码 经历:词法分析器->语法分析器->语义分析器->编译字节码 四个过程生成字节码文 ...
- 学了编译原理能否用 Java 写一个编译器或解释器?
16 个回答 默认排序 RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...
- 前端与编译原理——用JS写一个JS解释器
说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念.作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于"抽象语法树(AST)".但这仅仅是个开头而已.编 ...
随机推荐
- div中嵌套div中使用margin-top失效问题
div中嵌套div中使用margin-top失效问题
- CSS3自定义loading效果
效果: 使用CSS3完成loading的制作 css样式: <style type="text/css"> .mask { position: fixed; left: ...
- MySQL数据库(5)----删除或更新已有行
有时候,会需要删除某些行,或者修改其内容.这是候便需要用到DELETE语句和UPDATE语句. 1. DELETE 语句的基本格式如下所示: DELETE FROM tbl_name WHERE wh ...
- 项目经验:GIS<MapWinGIS>建模第一天
随便记录下项目的进展情况: GIS平台系统,实现整个供水系统的协调与统一.系统以管网为基础依据,建立可实现供水管网规划设计.输配管理.图档管理.抢修辅助决策及综合查询.统计等功能. 本文档的预期读者是 ...
- flexviewer infowindow背景问题
flexiewer里遇到的一些问题 infoWindowRenderer问题 在arcgis api for flex中要设置infowindow的外观很容易,只需要在编写一下css文件即可,就如 e ...
- 【Markdown】Markdown 使用MathJax引擎 书写Latex 数学公式
大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中添加MathJax引擎也很简单, <script type=" ...
- CCF201409-1相邻数对
试题编号: 201409-1 试题名称: 相邻数对 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 ...
- Azkaban调度器
Azkaban介绍 Azkaban 是由 Linkedin 公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程.Azkaban 使用 job 配置文件建立任务之间 ...
- Going Deeper with Convolutions(Inception v1)笔记
目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...
- WebExtensions小例
一:简述 扩展是修改Web浏览器功能的代码位.它们使用标准的Web技术(JavaScript,HTML和CSS)以及一些专用的JavaScript API编写.其中,扩展程序可以向浏览器添加新功能或更 ...