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

news2025/7/10 20:35:14

前言:

笔者心血来潮,特意站在初学者角度去思考为什么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语言开发者去完成适配工作。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(续)SSM整合之springmvc笔记(SpringMVC获取请求参数)(P131-135)

目录 一 通过ServletAPI获取 1 . 新建TestParamController类 2 . index.html 3 . 在TestParamController类里面写getParamByServletAPI 4. 测试 重新部暑 二 通过控制器方法的形参获取请求参数 1 . index.html 2 . TestParamController 3. 测试 三 RequestPar…

Vue2.0开发之——Vue基础用法-事件绑定$event(20)

一 概述 事件参数对象$event表示事件参数对象event事件修饰符 二 事件参数对象 2.1 说明 在原生的 DOM 事件绑定中&#xff0c;可以在事件处理函数的形参处&#xff0c;接收事件参数对象 event 2.2 示例 布局代码 <button v-on:click"addCount">1</bu…

高光谱解混和图片去噪(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

使用id限定优化mysql分页查询limit偏移量大问题

在工作中可能偶尔会遇到&#xff0c;当使用limit实现分页查询时&#xff0c;当limit的偏移量越大时&#xff0c;sql语句的耗时也越大。 如图&#xff1a; 偏移量为0时&#xff0c;sql语句耗时在35毫秒。 顺便说下偏移量与页码、页大小的关系&#xff1a; 偏移量 (页码 - 1…

Spark的内存管理机制

在执行Spark 的应用程序时&#xff0c;Spark 集群会启动 Driver 和 Executor 两种 JVM 进程&#xff0c;前者为主控进程&#xff0c;负责创建 Spark 上下文&#xff0c;提交 Spark 作业&#xff08;Job&#xff09;&#xff0c;并将作业转化为计算任务&#xff08;Task&#xf…

深度学习基础--神经网络(1)激活函数

文章目录从感知机到神经网络激活函数阶跃函数&#xff08;感知机的激活函数&#xff09;sigmoid函数阶跃函数和sigmoid函数绘制和对比ReLU函数本文为学习笔记参考书籍&#xff1a;《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电…

根据水声和摄影测量数据建立数字测深模型

无人船和无人车正越来越多地用于水深地形测量。使用这些平台采集数据的技术得到普遍的应用&#xff0c;但数据的融合仍然需要深入研究&#xff0c;其融合方法通常依赖于所使用的传感器和测量区域的特性。本文提出了一种融合无人艇&#xff08;USV&#xff09;和无人机&#xff…

[附源码]java毕业设计基于的前端课程学习网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Mybatis—SqlNode

SqlNode的主要职责就是描述Mapper文件中配置的SQL信息&#xff0c;在Mybatis源代码中随处都能看见其身影&#xff0c;可见SqlNode地位是相当高的。SqlNode接口只定义了一个apply方法&#xff0c;且该方法只有一个DynamicContext对象作为入参。DynamicContext对象中不仅封装了Ma…

抓包工具 Charles 使用手册

Charles 是一款抓包软件&#xff0c;通过代理的形式拦截所有的 HTTP 和 HTTPS 请求&#xff0c;是开发测试的一大利器 下载和激活 在 Charles 下载安装包&#xff0c;在 此处 获得注册码&#xff0c;点击下方输入注册码激活软件 抓主机的 HTTP 包 选中 Proxy > Windows P…

第五章 数组和广义表

数组和广义表 5.1多维数组 5.1.1数组的逻辑结构 数组是我们熟悉的一种数据结构&#xff0c;可以看作线性表的推广。 数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据&#xff0c;但属于同一类型。比如&#xff1a;一维数组可以看作一个线性表&#…

NDepend v2022.2.1.9665 专业版

NDepend 基本上被描述为.NET 托管代码的静态分析工具。这个特定的工具能够支持大量代码度量&#xff0c;允许使用直接图和依赖矩阵来可视化依赖关系。 NDepend 工具还能够通过架构验证过程以及规则及其质量为用户和开发人员执行基于代码的快照比较。有些规则基本上是用户定义的…

联想中国上半财年业绩:转型深入 方案服务同比增24%

11月15日&#xff0c;联想中国举办2022/23财年上半财年工作总结会。会上透露&#xff0c;联想中国经受住诸多不利因素的考验&#xff0c;PC市场份额保持稳定&#xff0c;3S新业务&#xff08;3S指智能设备、智能基础设施和方案服务&#xff09;顽强成长、收入占比达到28.6%&…

MCE 虚拟筛选、小分子化合物库

CNS Library &#xff08;含 47,040 种化合物&#xff09;高血脑屏障穿透率的小分子化合物数据库 CNS library 精选具有低极性表面积(TPSA< 70 2)、低 ClogP (平均为1.63)、低氢键形成程度(氢键供体和受体的总数小于 8 )、低 MW(平均为283) 等具有高血脑屏障穿透率的化合物…

css毛玻璃效果/el-progress进度条渐变/axios的基本使用/跨域配置/关闭eslint验证

css磨砂效果 效果图 实现方法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&qu…

NNG pair 异步通信

一&#xff0c;利用NNG pair模式&#xff0c;实现异步通信。 二&#xff0c;manager端 绑定地址&#xff0c;回调函数里 接收 异步消息&#xff1a; #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <…

HTTP协议中Gzip格式的流量分析与识别

背景 在协议分析过程中&#xff0c;经常会发现gzip压缩的数据&#xff0c;例如在HTTP协议中&#xff0c;在HTTP头中会标示&#xff0c;内容编码为gzip、DEFLATE。 但是&#xff0c;还有很多情况&#xff0c;例如一些非HTTP协议&#xff0c;特别是私有协议中&#xff0c;数据同…

强大的图片处理工具GraphicsMagick

前言 项目中我们经常需要对图片进行压缩、剪切、添加水印、生成缩略图、图片合成等图片处理操作&#xff0c;关于这些图片复杂处理&#xff0c;我们将如何实现呢&#xff0c;本文将介绍GraphicsMagick对图片进行相关处理功能。 简介 GraphicsMagick是一个免费的创建、编辑、…

16.Redis系列之Redisson分布式锁原理

本文学习Redisson分布式锁的原理以及优缺点 1. Redisson分布式锁原理 lua脚本是原子操作&#xff0c;redis会将整个脚本作为一个整体执行&#xff0c;中间不会被其他命令打断 # RedissonLock.tryLockInnerAsync方法内lua脚本加锁 <T> RFuture<T> tryLockInnerAs…

代码随想录算法训练营第三十四天| LeetCode1005. K 次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果

一、LeetCode1005. K 次取反后最大化的数组和 1&#xff1a;题目描述&#xff08;1005. K 次取反后最大化的数组和&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过…