前言:
笔者心血来潮,特意站在初学者角度去思考为什么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等等各种硬件交互。
讲到这里,笔者认为还需要一定的论证,所以源码是最好的论证。


总结:
C语言的语法GCC是帮开发者实现了跨平台,但是不同的操作系统和不同CPU提供的接口不一致,所以需要C语言开发者去完成适配工作。
最后,如果本帖对您有一定的帮助,希望能点赞+关注+收藏!您的支持是给我最大的动力,后续会一直更新各种框架的使用和框架的源码解读~!