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)

本质逻辑

直面硬件,效率优先

抽象硬件,兼容优先

相关推荐
ao-weilai30 分钟前
MySQL数据库:C语言连接MySQL教程
c语言·数据库·mysql
C++ 老炮儿的技术栈2 小时前
C++ const 的3个核心作用
服务器·c语言·c++·算法·c
Escalating_xu14 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
神仙别闹21 小时前
基于C语言开发的捕捉流星小游戏
c语言·开发语言
水饺编程1 天前
第1章,[Win32 章节]:API 及 内存管理模式
c语言·c++·windows·visual studio
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出优秀项目组中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
彦1 天前
C和C++笔记
c语言·c++·笔记
Code_Solitude1 天前
反码,补码,原码
c语言
FLJwu1 天前
运动相机按键与连接器硬件选型实战02:USB‑C接口选型|防水失效、虚接断连、腐蚀烧口量产大坑
c语言·开发语言·经验分享·数码相机·相机·运动相机·oem 量产
Zw-awa1 天前
陀螺小车传奇之00011000
c语言·stm32