在编程领域之中Java所拥有的口号乃是“Write Once, Run Anywhere”意思是一次编写能够在任何地方运行然而用C语言去编写的程序一般而言换了一个系统以后就无法运行起来了。这背后所存在的根本缘由是在于它们针对“运行环境”的处理模式是完全不一样的。1. 什么是“运行环境”首先我们需要通过一个公式来定义运行环境运行环境 操作系统 (OS) 硬件 (CPU)一个程序想要运行必须同时满足这两个条件。在硬件的层面上CPU 仅仅能够去解释它自身所固有的那种机器语言也就是指令集。举例来说x86 这种架构也就是 Intel/AMD 的机器语言和 ARM 架构也就是 Apple M1/M2 的机器语言是完全不一样的。在软件层面有这么一种情况应用程序借助API也就是Application Programming Interface朝着操作系统发送指令而关于Windows的API以及Linux的API它们是全然不一样的。2. 为什么 C 语言无法直接跨平台C语言被称作是“贴近硬件的那种语言”其运行机制决定了它对于环境有着高度的依赖。核心原因在于编译所生成的的确是“本地代码”也就是Native Code。当你运用C语言撰写出代码源代码并开展编译操作时编译器会依据当下的操作系统以及CPU架构径直把代码转译为机器能够理解的本地代码。这里有两个巨大的障碍CPU 的障碍要是你于Intel的CPU之上开展C代码的编译工作那所生成的机器指令便是x86指令。要是你将此程序径直拷贝至装有ARM CPU的电脑之上CPU根本就看不懂这些指令如同让仅仅懂得中文的人去阅读德语那样。操作系统的障碍 (API)即便中央处理器是相同的比如说全都是因特尔的要是操作系统不一样一个是微软视窗操作系统另一个是林纳斯操作系统则也是不可以的。结论是由 C 语言编译产生的程序属于“定制化”要是想在不一样的平台上运行那就得带着源代码去到那个平台之上重新进行编译。3. 为什么 Java 可以跨平台Java采用了一种称得上聪明的“中间人”策略此策略的内容是引入Java虚拟机也就是Java Virtual Machine简称为JVM。核心机制编译生成的是“字节码” (Bytecode)在你对Java代码进行编译之际它并非生成针对特定CPU的本地代码而是生成一种具备通用性的、于所有平台均一致的代码此代码被称作字节码。Java 的运行流程如下JVM 是如何填平差异的4. 总结对比特性C 语言 (Native Code)Java (Virtual Machine)编译产物本地代码 (机器语言)字节码 (中间代码)执行方式CPU 直接执行JVM 解释/编译执行运行速度极快 (无中间商)较快 (有翻译损耗但在优化中)跨平台性差 (需重新编译源码)强 (依赖安装 JVM)本质逻辑直面硬件效率优先抽象硬件兼容优先
C语言为啥不像Java能跨平台?运行环境依赖是关键
在编程领域之中Java所拥有的口号乃是“Write Once, Run Anywhere”意思是一次编写能够在任何地方运行然而用C语言去编写的程序一般而言换了一个系统以后就无法运行起来了。这背后所存在的根本缘由是在于它们针对“运行环境”的处理模式是完全不一样的。1. 什么是“运行环境”首先我们需要通过一个公式来定义运行环境运行环境 操作系统 (OS) 硬件 (CPU)一个程序想要运行必须同时满足这两个条件。在硬件的层面上CPU 仅仅能够去解释它自身所固有的那种机器语言也就是指令集。举例来说x86 这种架构也就是 Intel/AMD 的机器语言和 ARM 架构也就是 Apple M1/M2 的机器语言是完全不一样的。在软件层面有这么一种情况应用程序借助API也就是Application Programming Interface朝着操作系统发送指令而关于Windows的API以及Linux的API它们是全然不一样的。2. 为什么 C 语言无法直接跨平台C语言被称作是“贴近硬件的那种语言”其运行机制决定了它对于环境有着高度的依赖。核心原因在于编译所生成的的确是“本地代码”也就是Native Code。当你运用C语言撰写出代码源代码并开展编译操作时编译器会依据当下的操作系统以及CPU架构径直把代码转译为机器能够理解的本地代码。这里有两个巨大的障碍CPU 的障碍要是你于Intel的CPU之上开展C代码的编译工作那所生成的机器指令便是x86指令。要是你将此程序径直拷贝至装有ARM CPU的电脑之上CPU根本就看不懂这些指令如同让仅仅懂得中文的人去阅读德语那样。操作系统的障碍 (API)即便中央处理器是相同的比如说全都是因特尔的要是操作系统不一样一个是微软视窗操作系统另一个是林纳斯操作系统则也是不可以的。结论是由 C 语言编译产生的程序属于“定制化”要是想在不一样的平台上运行那就得带着源代码去到那个平台之上重新进行编译。3. 为什么 Java 可以跨平台Java采用了一种称得上聪明的“中间人”策略此策略的内容是引入Java虚拟机也就是Java Virtual Machine简称为JVM。核心机制编译生成的是“字节码” (Bytecode)在你对Java代码进行编译之际它并非生成针对特定CPU的本地代码而是生成一种具备通用性的、于所有平台均一致的代码此代码被称作字节码。Java 的运行流程如下JVM 是如何填平差异的4. 总结对比特性C 语言 (Native Code)Java (Virtual Machine)编译产物本地代码 (机器语言)字节码 (中间代码)执行方式CPU 直接执行JVM 解释/编译执行运行速度极快 (无中间商)较快 (有翻译损耗但在优化中)跨平台性差 (需重新编译源码)强 (依赖安装 JVM)本质逻辑直面硬件效率优先抽象硬件兼容优先