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)".但这仅仅是个开头而已.编 ...
随机推荐
- TransitionEnd事件
定义和用法: transitionend 事件在 CSS 完成过渡后触发. 注意: 如果过渡在完成前移除,例如 CSS transition-property 属性被移除,过渡事件将不被触发. 浏览器 ...
- 05_zookeeper的ACL
[ACL概述] ACL:access control Lists,权限控制. * 针对节点可以设置相关的读写等权限,目的是为了保障数据安全性. * 权限permissions可以指定不同的权限范围以及 ...
- easyui的解析器Parser
平时使用easyui做框架开发时,都知道easyui的模块组件能通过属性方法或js方法来渲染,本质上是通过parser解析器来处理实现的,因为多数情况下都是自动触发完成整个页面的解析,所以没有感觉到它 ...
- div浮层,滚动条移动,保持位置不变的4种方法
div浮层,滚动条移动,保持位置不变的4种方法 div在顶部不变.滚动条滚动,div还是在顶部! 直接上传源码 了: 方法一: <!DOCTYPE html PUBLIC "-//W3 ...
- slider.js 滑动和点击事件在firefox下报错 event is not defined
在使用layui的slider滑块控件的时候,firefox遇到了event is not defined 的情况.追究原因是因为layui的layui.js 的滑块功能依赖于silder.js,而官 ...
- Linux内核收包过程
net/core/dev.c int __init net_dev_init(void) { queue->backlog.poll = process_backlog; open_softir ...
- 设计模式:组合(Composite)模式
设计模式:组合(Composite)模式 一.前言 关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序 ...
- AutoHotkey使用Excel的Com对象可能导致进程残留问题的原因及解决方案
在AutoHotkey脚本中,对Excel的应用体验很不错,xl := ComObjActive("Excel.Application")就和当前Excel表连接了, 通过xl变量 ...
- 学习Road map Part 02 机器学习和图像识别
方法:结合项目.竞赛.mentor计划
- ZT 七大寡头
网易评论人才辈出啊!!!看下面 http://comment.news.163.com/news_guoji2_bbs/9GRIIJA90001121M.html 关注 关注他的微博yftyfm ...