为什么C语言需要指定平台开发?

本文探讨了C语言为何需要指定平台开发的原因,从汇编语言到C语言的演变,解释了GCC如何实现跨平台编译。尽管GCC能够将C代码转换为不同CPU平台的指令,但操作系统和CPU接口的差异仍然需要程序员进行平台适配,例如在Linux和Windows上的系统调用差异以及针对不同CPU的内存屏障实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

笔者心血来潮,特意站在初学者角度去思考为什么C语言需要指定平台去开发呢?

物有本末,事有终始,知其先后,则近道矣。

语言历史:

读者应该能明白程序最底层无非就是01010101二进制被CPU给调度执行。那么需要考虑,程序开发者需要记住这么多01么?那么编程无非就是比较记忆力了?

大佬觉得这样不行,得发明人类通俗易通的语言来编写代码,此时就出现了助记符的方式,也即英语单词的方式来编程——大家熟知的汇编语言(而此时,根据大佬(大佬可能是各大平台,比如intel之类的平台)的习惯,那么肯定是争先恐后的指定规范,所以就出现了ARM汇编,x86汇编等等)

最终把汇编语言通过汇编器(GNU套件之as),编译成指令平台(CPU平台)的认识10101010101010指令让CPU去调度执行。

 

最终发现个个大佬(CPU平台)都有自己的一套规范,程序开发起来,为了让程序在各种CPU上能运行起来,需要对不同的CPU平台做定制的开发,并且汇编跟内存强相关很容易出现致命的错误,所以大佬们发现要开发一个更便捷的语言,屏蔽掉底层的细节,那么C语言就出现了。

C语言拥有了类型系统,如int、float、long、short等等,而汇编(这里特指intel平台)只能通过esp开辟栈大小,然后通过b、w、d、q后缀规定几个字节放然后放数据,这也是屏蔽底层细节之一。

GCC的作用?

上面大致的给读者讲解了语言的历史,从01的ISA指令集到汇编,从汇编到C语言的出现,其实就是屏蔽底层的细节,让开发者便捷的开发。也可以看到从汇编语言就出现了指令平台的适配问题了,如果要开发的程序能被不同CPU平台调度执行,那么你就得满足不同CPU平台的汇编规范编写程序,也即要编写几套程序。

出现了C语言以后,那就需要把C语言编译成汇编语言,再把汇编语言编译成CPU平台的10101010101010100110的指令集被CPU调度执行

所以就出现了编译器GCC(GNU Compiler Collection或者GUN C Compiler ) 。他能帮开发者把C语言代码编译成当前CPU平台需要的01010101010指令集,也即跨平台的出现。

为什么有了GCC,C语言还需要指定平台呢?

读者需要理解,对于某些C/C++语言代码来说可能平台有操作系统和CPU指令集2个平台

笔者,花了大量的篇幅来介绍语言的历史,和GCC的出现解决了什么。

可能看到此处的读者会发现,既然GCC的出现已经可以把C语言实现跨平台。那么为什么C语言还需要指定平台开发呢?

 

读者应该知道程序,也即进程是运行在操作系统上的,操作系统在与CPU交互完成程序的调度和执行,那么市面上操作系统有Linux、windows等等操作系统,他们的实现都不一样,那么程序要与操作系统交互,就需要走系统调用,所以当C语言程序要运行在Linux和Windows上时就需要使用宏定义的方式来适配不同平台的参数和方法的差异。

并且C语言程序运行在不同的CPU上也需要适配,为什么这么说呢?

我们那一个简单的列子来说,内存屏障的问题,每个CPU平台的执行细节不一致,导致效率和安全问题也不一致,所以对于内存屏障的实现也不一致,所以C语言需要使用宏定义的方式实现CPU产商的不一致。

那么对于Linux等等操作系统来说,更是需要面对CPU做开发了,因为操作系统的出现就是为了解决程序员与CPU的交互难题。所以上图所示,Linux内核上面与应用程序交互,下面与CPU等等各种硬件交互。

讲到这里,笔者认为还需要一定的论证,所以源码是最好的论证。

Linux内核的实现

 

Hotspot的实现

 

总结:

C语言的语法GCC是帮开发者实现了跨平台,但是不同的操作系统和不同CPU提供的接口不一致,所以需要C语言开发者去完成适配工作。

最后,如果本帖对您有一定的帮助,希望能点赞+关注+收藏!您的支持是给我最大的动力,后续会一直更新各种框架的使用和框架的源码解读~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员李哈

创作不易,希望能给与支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值