Java的运行机制
Java语言属于高级语言,它既有解释型语言的特征,又有编译型语言的特征。我们需要先编译Java程序,然后再解释Java程序。编制完之后,Java会产生一个字节码文件(.class文件),然后再进行解释。
高级语言分为两种,一种是解释性语言,一种是编译型语言
一、编译型语言
编译型语言指有专门的编译工具、针对指定的平台/操作系统,将某种高级语言的源代码一次性“翻译”成该平台硬件执行的机器码(包括机器指令和操作数),然后再包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(compile)。编译后会生成一个可以脱离开发环境的可执行性程序,可以在很多平台上独立运行。
有些程序编译结束后,还可能需要对其他编译好的目标代码进行连接,也是就是组装两个以上的目标代码模块生成最终的可执行程序,通过这种方式实现低层次的代码复用。
因为编译型语言是一次性地编译成机器码,所有可以脱离开发环境独立运行,而且通常运行效率较高;但是因为编译型语言的程序被编译成特定平台的机器码,因此编译生成的可执行程序通常无法移植到其他平台运行;如果需要移植,则必须将源代码复制到特定平台上,针对特定操作系统进行修改。编译型语言的代表有C、C++等,可移植性比较差。
二、解释型语言
解释型语言是专门的解释器对源代码进行解释成特定操作系统的机器码,并立即执行的语言,解释型语言一般不会进行整体性的编译和链接处理,解释型语言相当于 把编译型语言中的编译和解释过程混合在一起同时完成。所以,解释型语言的程序运行效率较低,而且不能脱离解释器独立运行。但是,解释型语言有一个优势,那就是跨平台比较容易,也就是可移植性比较强,只需要提供特定平台的解释器就可以了。每个特定的平台解释器将源程序解释成特定平台的机器指令即可。解释型语言的代表有Ruby、Python等都属于解释型语言
三、Java的运行机制
上面两点分别介绍了编译型语言和解释型语言的原理和区别点,Java语言比较特殊,Java语言编写的程序,必须先进行编译,但是它不像编译型语言那样编译出机器码,而是生成一种和平台无关的的字节码文件,就是我们常说的.class文件,这种字节码文件是不能直接执行的,必须需要相应的Java解释器来执行,这一点又和解释型语言很像。所以,Java既有编译型语言的特征,也有解释型语言的特征。
Java中,解释字节码文件的Java解释器就是JVM,即Java虚拟机(Java virtual machine)。所有平台的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能够理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转化成特定系统的机器码执行,从而提高执行的效率。
当使用Java编译器进行编译Java程序的时候,会生成与平台无关的字节码文件,这个字节码文件不面向任何操作系统,它只面向JVM。不同平台的JVM不同,但是对于字节码,JVM都提供了相同的接口。然后由不同的JVM进行“解释”成不同平台的机器码。由此看来,JVM是Java程序能够跨平台的关键因素,只要为不同平台提供不同的JVM,就可以产生不同平台能读懂的机器码。
感谢《Java开发从入门到精通》扶松柏、陈小玉编著 这本书籍中的介绍。收益匪浅,以前只知道Java在编译中产生字节码文件,具体的Java运行机制不是很懂,感谢这本书中的详细介绍!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤