相信很多人在学习java的过程中会遇到过编译时和运行时这两个敏感定义,尤其是涉及到java的多态时。本人在刚开始接触编程时也从来一直没想过这两者的区别,甚至从来就没关心过编译机制。大学是计算机专业的同学多少肯定也知道编译,因为我听身边学计算机专业的朋友说他们学过《编译原理》(擦,没想到编译这货还能弄成一本书学习了,看来这里面的知识很深厚啊)。所以,最近就去认识和理解了一下编译时和运行时。


编译(java中为解释):


编译java类的成功后,会生成后缀名为.class的字节码文件,哈哈!大家领会一点点那个意思了么)来驱动完成的,为什么要是二进制呢(呵呵,有想到电路里的1和0控制与非门了么)。计算机语言分低级语言和高级语言,低级语言(指令操作):机器语言,汇编语言。高级语言:C/C++语言,java语言。

   嘿嘿,为什么要分低级和高级呢,我们知道,低级语言一般是比较底层的语言,可以理解为和硬件比较亲近的,与硬件驱动和操作硬件。而高级语言,必然是比较远离硬件的。既然它远离硬件,就必须有一个流程处理让它最终达到与硬件亲近,然后进行相应的工作。

亲们!这个流程其实就是编译的过程了,编译器把高级语言编译成指令操作的低级语言的过程就是编译(也称为翻译),至于编译器是如何操作的,这个知识就深了,有兴趣的同学可以去看看《编译原理》。

C的编译和java的解释的区别:主要在于java的解释过程是执行一条,翻译一条,不产生中间代码。C的编译是所有内容一次性全部翻译,然后交由计算机执行。这样看来,解释的速度比编译慢,编译是一次性开销,解释每次运行都引起额外开销。


运行:

  

所谓的运行,当然是编译完后,执行系统载入的编译后生成的相关指令代码,完成相应硬件工作的过程。

 

注:java是一边解释一边运行的,就是一条条解释和运行。

       c是全部编译完,然后运行编译生成的可执行文件。


附:

Android运行时:

Android核心库包含了Java编程语言核心库所提供的大部分功能。

 

每个Android应用程序都运行在它自己的进程中,每个进程都拥有自己的Dalvik虚拟机实例。Dalvik被设计成在一个设备上能有效运行多个虚拟机实例的Java虚拟机。在Dalvik可执行(.dex)格式中Dalvik虚拟机可执行文件对内存的需求被优化到最小。这个虚拟机是基于寄存器的,并且运行被Java语言编译器编译的类,这些类通过”dx”工具转换成.dex格式。

 

Dalvik虚拟机依赖Linux内核底层功能,如线程和底层内存管理。