C语言为何跨平台难?编译后换系统就跑不了

有这么一种情况,在编程这个领域当中,Java它所拥有的口号是"Write Once , Run Anywhere",意思就是一次编写之后,能够在任何地方运行,然而呢,用C语言编写而成的程序,一般来说,只要是换了一个系统,那就运行不起来了。导致出现这种状况的根本缘由,在于二者对于"运行环境"的处理办法是全然不一样的。

  1. 什么是"运行环境"?

首先我们需要通过一个公式来定义运行环境:

运行环境 = 操作系统 (OS) + 硬件 (CPU)

一个程序想要运行,必须同时满足这两个条件。

硬体方面:中央处理器仅能够阐释它自身所固有的机器语言(指令集合),举例而言,86架构(英特尔/超微半导体)的机器语言跟进阶精简指令集机器架构(苹果M1/M2)全然不一样。

在涉及软件的范畴内,运行的程序借助被称作API(Application Programming Interface)的途径,朝着操作系统传达指令,Windows所拥有的API,与Linux存在的API,呈现出全然不一样的状况。

  1. 为什么 C 语言无法直接跨平台?

所谓"贴近硬件的语言"是 C 语言,其运行机制致使它对环境有着高度的依赖,这二者有所关联 ,是某种特定的关系。

根本缘由在于,所编译产生的是那种被称作"本地代码"的,也就是"Native Code"。

当你运用C语言撰写出代码(源代码),并针对其开展编译操作时,编译器会依据当下的操作系统以及CPU架构,径直把代码转译为机器能够理解的本地代码。

这里有两个巨大的障碍:

CPU 的障碍:

要是你于Intel的CPU之上开展C代码的编译工作,那所生成的机器指令便是x86指令,要是你把这般的程序径直拷贝至装有ARM CPU的电脑之上,CPU根本就看不懂这些指令,这就如同让仅仅懂得中文的人去阅读德语一样。

操作系统的障碍 (API):

即便CPU是相同的,并且具体为都是Intel,然而要是操作系统并不一样,一个是Windows,另一个是Linux,如此也是不行的。

结论是,由 C 语言编译而成的程序属于"定制化"的,若想要在不一样的平台上运行,那就必须携带源代码前往那个平台进行再次编译。

  1. 为什么 Java 可以跨平台?

Java采用了一种称得上机灵的颇具机巧性的"中间人"策略,此策略之中,它引入了Java虚拟机,也就是Java Virtual Machine,简称JVM。

核心机制:编译生成的是"字节码" (Bytecode)

在你对 Java 代码进行编译之际,它并不会去生成面向特定 CPU 的本地代码,而是会生成一种通用的代码,这种代码在所有平台都是一样的,它被称作字节码。

Java 的运行流程如下:

JVM 是如何填平差异的?

  1. 总结对比

特性

C 语言 (Native Code)

Java (Virtual Machine)

编译产物

本地代码 (机器语言)

字节码 (中间代码)

执行方式

CPU 直接执行

JVM 解释/编译执行

运行速度

极快 (无中间商)

较快 (有翻译损耗,但在优化中)

跨平台性

差 (需重新编译源码)

强 (依赖安装 JVM)

本质逻辑

直面硬件,效率优先

抽象硬件,兼容优先

相关推荐
一路向北he2 小时前
esp32库依赖
c语言·c++·算法
海参崴-3 小时前
深入剖析C语言结构体存储规则:内存对齐原理与实战详解
java·c语言·开发语言
小柯博客3 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(八)
c语言·git·stm32·单片机·嵌入式硬件·嵌入式·yocto
iFlyCai11 小时前
C语言中的指针
c语言·数据结构·算法
良木生香14 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
无巧不成书021815 小时前
C语言零基础速通指南 | 1小时从入门到跑通完整项目
c语言·开发语言·编程实战·c语言入门·零基础编程·c语言速通
jimy117 小时前
C语言函数指针
c语言·开发语言
眺望电子-ARM嵌入式19 小时前
RK3588 Type-C一线通,DP显示输出实战指南
c语言·开发语言
wangjialelele19 小时前
从磁盘查找理解 B 树 | B+树:原理、插入、分裂与性能分析
c语言·开发语言·数据结构·c++·b树