程序语言运行机制
两种编程语言原理
程序员编写的源代码是人类语言,人类可以轻松理解,但是对于计算机硬件(CPU),无法直接执行源程序,因为计算机只能识别某些特定的二进制指令,所以任何程序在运行前都必须将源代码转换成二进制指令。
所谓二进制指令,就是机器码,是CPU能够识别的硬件层面的”代码“,比如单片机有几十条指令,而我们的电脑和智能手机有成百上千条指令。
那么,究竟在什么时候将源代码转换成二进制指令了?不同的编程语言有不同的规定:
- 必须提前将所有源代码一次性转换成二进制指令,即生成一个可执行程序(Windows下的.exe文件),比如C语言、C++、Golang、Pascal、汇编等,这种编程语言称为编译型语言,使用的转换工具为编译器。
- 有的编程语言可以一边转换一边执行,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如python、JavaScript、PHP、shell、matlab等,这种编程语言称为解释型语言,使用的工具为解释器。
两种编程语言特点比较
类型 | 原理 | 优点 | 缺点 |
---|---|---|---|
编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在) | 编译一次后,脱离了编译器也可以运行,并且运行效率高 | 可移植性差,不够灵活 |
解释型语言 | 有专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码 | 一边执行一边转换,效率很低 |
Java程序运行机制
Java语言是一种比较奇葩的存在,它是半编译半解释型的语言,源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行,Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率。
简单来说Java程序的运行机制
即编写 、编译 、运行 三个步骤。
运行机制主要指编译、运行的过程
-
编译
Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,好让JVM(Java虚拟机)中的解释器可以正常读取。
-
运行
分三步:代码的装入、代码的校验和代码的执行
-
代码的装入
JVM控制解释器中的”类装载器“去读取和装载程序所需的类(class的字节码)。然后解释器开始建立类与类之间的关系。
- 代码的校验
字节码校验器进行检查:校验器可发现操作数栈溢出,非法数据类型转换等多种错误。
- 代码的执行
代码执行也分为两种情况
即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。
解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。
通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作。