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)".但这仅仅是个开头而已.编 ...
随机推荐
- PAT 1048. Find Coins
two sum题目,算是贪婪吧 #include <cstdio> #include <cstdlib> #include <vector> #include &l ...
- mysql 查询近几天的结果 按每天的粒度查询
),DATE_FORMAT(FROM_UNIXTIME(createtime), '%Y-%m-%d') as time from bskuser group by time
- js-JavaScript的简介
JavaScript的简介 * 是基于对象和事件驱动的语言,应用于客户端 - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** HTML做网站静态效果,JavaScript ...
- javascript获取元素样式值
使用css控制页面有4种方式,分别为行内样式(内联样式).内嵌式.链接式.导入式. 行内样式(内联样式)即写在html标签中的style属性中,如<div style="width:1 ...
- iview中事件获取自定义参数
前提:页面渲染多个cascaer组件,根据不同cascader组件选中的值,加载不同内容 解决:此时需要解决的问题是,在on-change事件中返回index索引使用如下格式: <Cascade ...
- JavaWeb请求-响应学习笔记
先来看一个流程图: 服务器处理请求的流程: (1)服务器每次收到请求时,都会为这个请求开辟一个新的线程. (2)服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载 ...
- 基础架构之GitLab
Git几乎是软件开发人员的必备工具了,关于代码管理,公司都一般都会搭建自己的仓库,关于GitLab的详细介绍参见官方网站详见 https://about.gitlab.com,这篇文章主要介绍安装及使 ...
- ES6入门——数值的扩展
1.二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b或0B和0o或0O表示. 2.Number.isFinite(),Number.isNaN() ES6在Number对 ...
- Python unittest模块心得(二)
基础概念介绍请参看: http://www.cnblogs.com/frost-hit/p/8295818.html 组织测试用例 unittest.TestSuite(tests=()): 除了使用 ...
- WCF安全 z
WCF custom authentication using ServiceCredentials The generally accepted way of authenticating a us ...