高级语言如CC++C#JAVA等并不能直接被机器所认识。也就是说机器是不懂你写的那些高级语言的代码的,当然也不知道怎么去执行你所写的那一串字符。高级语言所写出来的程序要被机器所认识并执行的话就必需将其翻译为只有01两个数字所组成的机器码,因为机器就只认识01这两个数字而已。

 

要实现高级代码被机器执行的话,在传统上有两种做法。一是通过编译器将代码翻译为机器所认识的机器码,二是将代码翻译成一种中间码,这种中间码与平台即机器无关,只有在运行时才通过某一种类似翻译器的东西将转化成机器所认识的语言。

 

C、C++等语言采用的是第一种做法。一个传统的C++程序会首先编译成目标文件(后缀为obj),这种目标文件包含了针对目标平台能够识别的指令集,然后通过链接与系统的库文件(里面包含了程序中各种语句所对应的机器码)结合产生最终可执行的EXE文件。这种编译方法决定了其最终生成的EXE文件不能够拥有跨平台的特性。比如说,将一个在Windows系统上编译的EXE程序放在拥有不同底层架构的Mac系统上是绝对不可能运行成功的,必须重新进行编译链接才可以。

 

Java采用的则是第二种方法。编译时,Java编译器会将Java代码翻译为一种二进制中间文件,该文件具有平台无关性,后缀为class。这个class文件之后会与它运行时所需要的各种库文件(也是class格式)打包在一起形成以jar为后缀的文件。该文件的运行需要Java虚拟机的支持才能实现。运行时Java虚拟机会把需要用到的部分翻译成相应适用于该平台的机器代码,而不是利用软件对其进行模拟,以提高程序运行的效率。当然,这个特性也决定了Java语言的执行效率不可能会比得上用CC++写出来的相同程序。不过,也正由于这点,Java能够实现跨平台的强大功能。只要目标平台装有Java虚拟机就能够执行Java程序。这也即是Java号称的“Compile once, run everywhere.

posted on 2013-03-23 18:35  RedHood  阅读(641)  评论(0编辑  收藏  举报