高级语言——编译型、解释型、混合型
1. 编译型语言
对于类似 C++ 这样的编译型语言,代码会事先被编译成机器指令(可执行文件),然后再一股脑儿交给 CPU 来执行
在执行时,CPU 面对是已经编译好的机器指令,直接逐条执行即可,执行效率比较高
但因为每种类型的 CPU(比如 Intel、ARM 等)支持的 CPU 指令集不同,并且程序还有可能调用操作系统提供的 API
所以,编译之后的可执行文件只能在特定的操作系统和机器上执行,换一种操作系统或机器,编译之后的可执行文件就无法执行了
2. 解释型语言
对于类似 Python 这样的解释型语言,代码并不会被事先编译成机器指令
而是在执行的过程中,由 Python 虚拟机(也叫做解释器)逐条取出程序中的代码,编译成机器指令,交由 CPU 执行
完成之后,再取出下一条代码,重复上述的编译、执行过程
这种一边编译一边执行的过程,叫做解释执行
解释型语言相对于编译型语言,执行速度会慢一些
因为程序是在执行的过程中一边编译一边执行的,所以,程序整体的执行时间包含了程序编译的时间
不过,使用解释性语言编写的代码,可移植性更好
程序在执行的过程中,虚拟机可以根据当前所在机器的 CPU 类型和操作系统类型,翻译成不同的 CPU 指令
这样,同一份代码就可以运行在不同类型的机器和不同类型的操作系统上,这就是常听到的 "一次编写,到处运行"
3. 混合型语言
Java 语言比较特殊,它属于混合型语言,既包含编译执行也包含解释执行
Java 编译器会先将代码(.java文件)编译成字节码(.class文件)而非机器码
字节码算是 Java 代码的一种中间状态,其跟平台无关,但又可以快速地被翻译成机器码
编译之后的字节码在执行时,仍然是解释执行的,也就是逐行读出字节码,然后翻译成机器码,再交给 CPU 执行
只不过,从字节码到机器码的翻译过程,比从高级语言到机器码的翻译过程,耗时要少
这样既保证了 Java 代码的可移植性(同一份代码可以运行在不同的 CPU 和操作系统上),又避免了解释执行效率低的问题
实际上,在解释执行时,也存在编译执行
Java 虚拟机会将热点字节码(反复多次执行的代码,类似缓存中的热点数据)编译成机器码缓存起来,以供反复执行
这样就避免了热点字节码反复编译,进一步节省了解释执行的时间
这就是著名的 JIT 编译(Just In Time Compile,即时编译)
参考资料:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步