购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 代码执行过程概述

Java代码是如何被执行的?要回答这个问题并不容易。一般来说,代码的执行有两种模式:解释执行和编译执行。解释执行指的是解释器读取源代码,逐行解释代码,生成目标机器代码并执行;编译执行指的是编译器首先把源代码编译成目标机器代码,然后链接成可执行文件,最后由OS负责执行可执行文件。

Java代码的执行过程更为复杂。Java代码在执行之前首先编译成字节码 (ByteCode,简称BC,是一种中间语言表示),然后由JVM执行字节码。字节码的执行是一个非常复杂的过程,涉及字节码的解释、编译,以及解释/编译代码的执行,这些工作均由JVM来完成。为了能够更好地了解JVM的工作原理,首先需要了解一下C、C++语言的编译执行过程。

本节主要介绍程序的执行方式,后文再详细介绍不同语言的执行过程。

1.1.1 编译执行

编译执行最典型的代表是C/C++语言。C/C++源代码首先由编译器进行编译,不同系统/平台的编译器不同,编译器根据代码执行的目标平台产生目标机器文件。

链接器对目标机器文件进行链接,链接包括动态链接和静态链接。链接后形成可执行文件,不同系统有不同的可执行文件格式,如在Windows中使用PE(Portable Executable)格式、在Linux中使用ELF(Executable and Linkable Format)等格式。

执行可执行文件,如在Windows中双击EXE文件(文件格式为PE格式),操作系统会创建新的进程/线程执行代码。程序的执行过程涉及程序的加载、链接、执行等工作。

C/C++程序执行流程如图1-1所示。

图1-1 编译执行流程

1.1.2 解释执行

采用解释执行的语言也非常多,一些常用的脚本语言(如Python)就是解释执行。Python代码被编译成字节码,然后由解释器针对字节码进行解释执行。解释执行和编译执行最大的区别在于是否存在目标机器文件,显然,解释执行中并没有产生目标机器文件。

1.1.3 混合执行

解释执行实现简单,通常启动也比较快,但是性能低下;编译执行需要强大的编译器支持,编译实现复杂,但性能较高。混合执行融合解释执行和编译执行的优点(实际上混合执行还可以引入新的编译优化方式,即大家所熟知的Just-In-Time优化),程序在执行过程中既存在解释执行也存在编译执行,最典型的代表就是Java语言的执行。Java的执行过程可以概括为:

1)Java源代码首先由编译工具javac编译成字节码,字节码有固定的文件格式,称为Class文件,该类型的文件可以跨操作系统执行。

2)启动JVM(不同的系统JVM不同),JVM加载字节码,解释执行字节码。在解释执行的过程中如果发现字节码(更准确地说是字节码片段,如一个函数或者一个循环代码)执行频次高,会尝试将字节码直接编译成目标机器代码,待编译完成后使用编译优化后的机器代码替代解释执行。

Java程序的执行过程如图1-2所示。

图1-2 混合执行流程

比较图1-1和图1-2,可以看到JVM做了链接器的工作,还因为JVM也做了编译工作,所以实质上它也包含了编译器。另外,JVM还做了操作系统的部分工作,例如对资源的管理等。 8Wr54WEvfK0qsiWIpjtCsRApK9LkH1C3IUiFCq4uZTuJm1ajmtx9fY/xEqRBGkwY

点击中间区域
呼出菜单
上一章
目录
下一章
×