提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
- 浅浅的介绍主流语言的一些区别。
提示:以下是本篇文章正文内容,下面案例可供参考
一、源代码、字节码、机器码的区别
1.源代码
源代码是开发者用编程语言(如 JavaScript、Python、Java、C++ 等)编写的人类可读懂的代码,不能被计算机直接执行,必须经过转换(编译或解释)。即平常我们书写的未经过任何处理的原始代码文件。以下是其一个简单的java编写的源代码,HelloWorld.java。
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld");
}
}
2.字节码
字节码是源代码经过编译后生成的中间代码(java文件到class文件),是一种介于源代码和机器码之间的二进制指令(查看的时候一般以十六进制的形式展示如下图,但底层仍然以二进制存储)。由字节组成(二进制数据),人类难以直接阅读,但比机器码更通用,不依赖特定硬件,可在支持对应虚拟机(VM)的平台上运行(跨平台特性),需要虚拟机(如 JVM)解释为机器码后才能执行。下面是HelloWorld.java源代码文件经过编译后形成的字节码文件,HelloWorld.class。
3.机器码
机器码是计算机硬件(CPU)能直接识别和执行的二进制指令(由 0 和 1 组成),它是编程语言的最终执行形式。执行效率最高,但可读性极低。与硬件架构紧密相关,不同平台的硬件不同,意味着有时相同的机器码在不同的架构下会被翻译成不同的机器指令,例如机器码 0x89 0xD8 在 x86 中是 mov eax, ebx,但在 ARM 或 MIPS 中可能对应完全无关的操作(或触发非法指令异常)。
由于Java 不会直接生成机器码,而是生成字节码(.class),由 JVM 解释或即时编译(JIT)为机器码执行。想要获得其机器码的过程比较复杂,因此不再展示其机器码。我们只要知道机器码是硬件能直接识别的由0和1组成的二进制指令即可。
以下是对三种文件的对比
可读性:源代码 > 字节码 > 机器码
执行方式:源代码需解释或编译;字节码依赖虚拟机;机器码直接由CPU执行
跨平台性:字节码通常跨平台;机器码与硬件绑定;源代码需重新编译以适应不同平台
那我们不禁有疑问,既然字节码与机器码都是二进指令,那么为什么他们之间还会存在不同呢?我们可以简单的理解为,字节码是为虚拟机设计的,追求的是跨平台与安全,机器码是为cpu设计的追求性能。有一个形象的比喻是,机器码是汇编语言可以直接操纵硬件,但字节码是说明书,指导虚拟机组装机器码。
二、解释与编译的区别
解释指的是逐行或逐段翻译并执行源代码的过程,运行时动态解释。
编译指的是先整体转换成机器码(字节码)再运行,提前静态编译。
三、解释型语言、编译型语言与混合型语言的区别
解释型语言、编译型语言和混合型语言的核心区别在于代码从编写到执行的转换方式,以及由此带来的性能、跨平台性等差异。
1.解释型语言
由该语言编写的代码不经过预先编译,而是由解释器逐行读取并实时转换为机器码执
行(“边解释边运行”),如python等。
执行流程:源代码 → 解释器(逐行转换为机器码)→ 直接执行
这种语言具有以下特点:
- 跨平台性好,只需对应平台有解释器(虚拟机)
- 开发效率较高,代码出错后修改后可直接运行,不需要编译
- 执行速度较慢,每次运行都需重新解释,有额外开销。
2.编译型语言
代码需通过编译器一次性全部转换为目标平台的机器码,生成独立的可执行文件,之后直接运行该文件。如 C++、Go等。
执行流程:源代码 → 编译器 → 机器码文件(如 .exe、.out)→ 执行
这种语言具有以下特点:
- 执行速度快,机器码直接被 CPU 执行,无解释开销
- 可生成独立文件,运行时不依赖编译器
- 跨平台性差,机器码与硬件 / 操作系统强相关,不同平台需重新编译
- 开发流程多一步编译,修改代码后需重新编译才能运行
3.混合型语言
结合解释型和编译型特点,先将源代码编译为跨平台的中间代码(字节码),再在运行时通过虚拟机将中间代码转换为机器码执行。如 Java。
执行流程:源代码 → 编译器 → 中间代码(如字节码)→ 虚拟机(解释 / 即时编译为机器码)→ 执行
这种语言具有以下特点:
- 兼顾跨平台性,中间代码不依赖硬件,只需要根据不同的平台实现不同的虚拟机
- 执行效率高,虚拟机可通过 JIT 即时编译为机器码,
- 具有一定的开发灵活性,因为字节码的存在无需针对不同平台重新编译
- 依赖虚拟机(如 JVM)才能运行,理论上性能略低于纯编译型语言(但 JIT 优化可大幅缩小差距)
四、补充
1.JIT(Just-In-Time)编译
JIT,即即时编译吗,是一种在程序运行时将代码编译成机器码的技术。与传统的解释执行或预先编译(AOT)相比,JIT 在效率和性能上有显著优势,以下是其特点:
运行时优化,JIT 编译器能够在程序运行时动态分析代码的执行情况,识别热点代码(频繁执行的代码段)并进行针对性优化。例如,内联函数、消除冗余代码、调整循环结构等。这些优化是基于实际运行数据,比静态编译更精确。
减少解释开销,纯解释执行的语言(如传统 Python)需要逐行解析和执行代码,效率较低。JIT 将热点代码直接编译为机器码,并将这些机器码存放在Code Cache中,避免了重复解释的开销,显著提升执行速度。
延迟加载,JIT 只编译实际执行到的代码,避免一次性编译整个程序。这减少了启动时间和内存占用,尤其适合大型应用或脚本语言。
代码缓存(Code Cache),多次执行的代码会被缓存编译结果,避免重复编译。长期运行的应用(如服务器程序)能持续受益于累积的优化效果。
2.现在python语言的执行过程
现在python的执行过程与java的执行过程有点类似,由源代码经过隐式编译( 也包括JIT编译,将热点代码之间编译成机器码),自动生成字节码文件,然后经过PVM逐条解释执行字节码。