编译器与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有了一个选项,可以将执行频率高的字节码序列翻译成机器码,这一过程叫做即时编译,大大提供了执行效率.