Java代码从编译到执行

来源:互联网 发布:知乎成功的原因 编辑:程序博客网 时间:2024/04/30 15:08

代码编译:从源代码转换为机器能够识别的机器语言或者汇编语言,是一个翻译代码的过程

对于Java代码来说,是对于一个java类的编译,利用java编译器(javac.exe)将源码编译成能够被JVM的类加载器加载的.class文件(字节码),字节码不是机器码,是一个中间代码,与平台无关。java编译一个类的时候,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则,直接引用。如果Java编译器在指定目录下找不到依赖类,就会报错。

通常的javac编译器指的是前端编译器,详细过程参考:http://blog.csdn.net/shaozengwei/article/details/38659569。代码经过前端编译之后,需要在JVM上进一步将字节码转化为机器码。

Java的编译器与虚拟机的关系:java的编译需要安装JDK环境,而运行需要安装JRE。虚拟机是可以运行编译之后的字节码的环境。JVM是Java代码的跨平台的基础。

一般的语言,如C,代码的编译是针对平台的,针对某一平台编译之后的字节码不能在其他平台上使用,跨平台需要多次编译。而Java为了实现跨平台性,用JVM屏蔽了具体的与平台有关操作系统信息。JVM有自己的硬件架构:处理器、堆栈、寄存器等等,使得Java代码只需编译成能够在JVM上运行的字节码即可。

JVM负责运行字节码:把每一条需要运行的字节码交给解释器,翻译成机器码,然后由解释器执行。

JVM解释器执行代码的过程包括:加载、校验、执行三部分。

加载:由类装载器(classLoader)完成,不仅装载当前类,而且需要载入当前类的引用类。本地类加载之后处于同一内存中,每一个类有自己的命名空间。

校验:由字节码校验器完成,校验的内容包括操作数栈溢出、非法数据类型转换等等

执行:如果字节码通过校验,将.class转化为机器码开始执行。

0 0
原创粉丝点击