关于C语言等高级语言能不能直接控制硬件的问题

2023-05-16

           关于C语言等高级语言能不能直接控制硬件的问题,我认为C语言等高级语言不能直接控制硬件。

           这里谈论的问题本质是,C语言等高级语言能不能直接对硬件进行编程。我认为,不能。众所周知,计算机之初的程序员都是直接用机器语言0101编程玩的,这样太劳神费力了,后来出现了符号助记语言---汇编语言,与机器语言是一一对应的。再后来出现了C语言等高级语言(以下简称高级语言),降低了编程的难度,大大的解放了程序员而且编程语言越是高级,可移植性就越高。可移植性就是你写的源代码或者甚至是编译出来的程序,可以不加修改的拿到别的机器上(如果是源代码的话,可能需要重新编译,重新编译---生成对应机器上的机器指令)运行。
      汇编语言(其实也是机器语言)要实现可移植性,几乎可以说是不可能的:因为不同的机器,不同的CPU定义了不同的机器指令,比如这种机器定义0为开,1为关,而另一种机器恰好与之相反。还有就是对于计算的的外围硬件,不同的硬件厂商生产的同一种硬件(比如鼠标),其所定义的硬件接口也不一样(比如A厂商生产的鼠标用0代表鼠标移动,用1代表鼠标静止的状态,而B厂商生产的鼠标的状态定义又与之相反),这样汇编指令根本不具可移植性。高级语言出现的目的就在于此:屏蔽这种差异性,如何屏蔽呢?靠编译系统(不同的硬件平台有不同的编译系统,可生产对应的机器指令,编译系统还可以提供一些开发软件包,更方便编程),靠操作系统(操作系统屏蔽底层硬件差异,向上层提供统一的接口)。
      拿C51单片机来说,这就是一个硬件,我们要对其进行编程,必须要学习C51单片机的机器指令(汇编形式),要控制它工作,可以直接将机器指令输入进去,还可以在PC机上用高级语言进行编程,用相应的编译系统将其翻译成相应的机器指令(记得那个编译系统编译时有很多选项,有C51单片机选项,还有别的类型的单片机选项,我想,这就是为了要产相对应的机器硬件的机器指令吧,你总不能产别的类型单片机的指令放C51上去运行吧?而且编译系统提供了关于C51单片机的C语言编程的头文件),再放到机器上才能运行。
       再拿鼠标这种硬件来说,比如某公司刚研发出一种新型鼠标,要将其安装在现有电脑上并保证能实现和替代现有鼠标的功能,这时候就必须对其进行编程封装,按照操作系统要求的统一的鼠标软件接口进行编程实现,提供相应驱动程序。这时候,用C语言等高级是做不到的,因为说到底控制硬件的是电路,是高低电平,这必须由CPU的机器指令去完成,C语言等高级语言不提供这样的东西(我感觉原因就是,如果这样的话,就又回到汇编的时代了,突然想,Linux内核中嵌入的汇编指令,其实就导致了它的不可移植性,原理如此)。高级语言要完成的功能就是屏蔽底层,做到硬件无关性。既然都硬件无关性了,还怎么拿它对鼠标进行编程(在还没有进行过编程开发的前提下)。而且还得用各种平台的汇编指令对其进行编程封装,以在不同的平台上使用。
        突然想起以前做的一个东西,要求直接访问硬件---键盘。在一般情况下,我们写的程序要取键盘消息,其实访问的不是硬件键盘,而是经过操作系统处理过的键盘消息,操作系统将其放在消息队里供应用程序进行访问(这本质上是访问的内存这个硬件),要绕过操作系统直接去访问硬件,有点复杂,而且是高级语言直接做不到的,必须安装第三方库,还要安装一些东西,等等,很麻烦,但我想,在高级语言中引入的这些库和函数,必定是底层针对特定的硬件和操作系统平台,用汇编实现的。
       再结合读Linux内核得到的知识,其实在内核代码中已经说明高级语言是如“控制”硬件了:底层对硬件(比如磁盘,显示器)的编程,必定是用汇编---只有汇编这种机器指令才能控制CPU向硬件发送高低电平(指令),才能控制硬件的工作,将汇编控制硬件工作的代码封装成C语言可以调用的函数(这种代码不仅和机器指令相关还和被控制的硬件相关,但各厂商生产的硬件只要提供相应平台上的只要一个统一的接口就可以了),或是由汇编程序实现将特定的硬件数据和参数读入到内存中,再由C语言程序去访问这块内存,看起来就像C语言直接访问硬件一样。这样的函数就应该叫驱动吧?当然,还可以基于此驱动程序开发更高级的驱动程序。然后内核中的其他高级点的地方就可以用C语言来实现了,控制硬件的时候只要调整参数,调用相应的汇编驱动程序就可以了。所以,从整体层次上看,操作系统内核可以这样看:最内层是封装和屏蔽底层硬件特性的汇编驱动程序,而后一层是用可以调用这些汇编程序的C语言写的程序。。。。。。
这张计算机系统的构成图形象的说明了系统的层次性和屏蔽性,可以看到,只有操作系统才可以直接接触硬件系统,而程序语言和开发环境是建立在操作系统之上的,它依赖于操作系统。
       正是由于这种系统层次结构的封装和屏蔽性,才使得高级语言看上去可以直接“控制”硬件的假象。
       所以,我认为,高级语言是不能直接对硬件进行编程的,必须要有底层的支持,还要有一层一层的编程封装。
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C语言等高级语言能不能直接控制硬件的问题 的相关文章

  • 汉诺塔问题解析(C语言)

    目录 一 什么是汉诺塔问题二 汉诺塔移动图解三 代码实现总结 一 什么是汉诺塔问题 汉诺塔问题是一个经典的问题 汉诺塔 xff08 Hanoi Tower xff09 xff0c 又称河内塔 xff0c 源于印度一个古老传说 大梵天创造世界
  • Shell脚本学习——字符串处理

    最近在做很多的字符串处理的工作 xff0c 主要用的还是excel xff0c 但是很费神 xff0c 总是Ctrl 43 C和Ctrl 43 V 就想用shell脚本对对应的字符串进行批量处理 1 xff09 首先是读取文件中的每一行字符
  • DSP算法移植---总结

    总结 很久没有写文章了 xff0c 今天逛了逛博客 xff0c 看到DSP算法移植的文章 xff0c 至于这个项目 xff0c 本人解释下 本人7月份将硕士毕业了 xff0c 不久就要离开校园了 xff0c 所以我基本上不接触这个项目了 x
  • L2TP协议【转载】

    L2TP协议 一 43 L2TP Layer 2 Tunnel Protocol 第2层隧道协议 xff0c 是为在用户和企业的服务器之间透明传输PPP报文而设置的隧道协议 43 特性 灵活的身份验证机制以及高度的安全性 多协议传输 支持R
  • ROMFS文件系统分析

    ROMFS文件系统分析 ROMFS是一种简单的只读文件系统 xff0c 主要是用来当做初始文件系统来使用的 xff0c 在嵌入式linux或是uclinux中通常使用这中文件系统来作为引导系统的文件系统 xff0c 甚至uclinux有时就
  • Linux/Ubuntu 怎么设置打开远程桌面登录连接

    Liux Ubuntu 怎么设置打开远程桌面登录连接 Linux Ubuntu 下做一些设置在windows中就可以打开远程桌面登录Ubuntu 或者在本地Ubuntu远程登录windows或者Ubuntu远程登录别的Ubuntu桌面 xf
  • Latex论文复杂组合图片设计

    最近在使用Latex写博士论文 xff0c 中间遇到了一些想设计一幅图片中多个子图位置的问题 如果想画普通的横排多图或者竖排多图 xff0c 可以使用 begin figure centering subfigure includegrap
  • 打麻将清一色自摸后偏瘫?高血压患者这些事项要注意

    最近有一条让人哭笑不得的热搜 xff0c 上海一男子居然因为打麻将清一色自摸兴奋过度 xff0c 导致脑出血偏瘫了 细究原因 xff0c 是因为该男子平时就有高血压 xff0c 又爱打麻将 对此医生也提醒 xff0c 情绪过于激动时极易诱发
  • 对idea2020.1.1的遇坑实测【实时更新】

    1 第一坑 xff0c 你可以更换maven库 xff0c 但是不管你怎么换 xff0c idea2020 1 1还是会使用 m下的 虽然你在project structrue里看起来都很正常 xff0c 但是你一打包运行就会发现你的art
  • 在Ubuntu系统中编译C语言程序

    在Ubuntu系统中编译C语言程序 用gcc命令编译主程序main1 c 并运行在VC 43 43 6 0中编译主程序main1 c 并运行在ubuntu系统下用Makefile的方式编译主程序 用gcc命令编译主程序main1 c 并运行
  • STM32简单程序的编译——LED闪烁

    LED闪烁 程序编译总结 程序编译 默认已经完成MDK5软件和STM32包的安装 首先利用keil建立工程 打开Keil uVision5软件 xff0c 点击左上角的File xff0c 然后点击New建立新文件 然后点击Project选
  • Ubuntu下opencv的安装使用

    目录 一 Ubuntu下安装opencv二 Ubuntu下opencv摄像头的使用1 打开摄像头显示处理视频的程序2 改进 三 总结 一 Ubuntu下安装opencv 1 下载oencv 在ubuntu的浏览器中输入官网链接 https
  • Proteus仿真运行stm32程序

    目录 一 原理图二 keil程序编译三 proteus仿真四 总结 一 原理图 1 创建工程 打开proteus xff0c 选择新建工程 编辑名称和目录 xff0c 点击下一步 选择下图模板 选择创建固件项目 xff0c 系列选择Cort
  • 框式路由器MPU、SFU、LPU、SRU科普

    MPU xff08 Main Processing Unit xff09 主控单元SFU xff08 Switch Fabric Unite xff09 交换网板LPU xff08 Line Processing Unit xff09 线路
  • 在STM32下完成基于FreeRTOS的多任务程序

    目录 一 任务要求二 FreeRTOS移植1 简单介绍2 应用实例 一 任务要求 在STM32下完成一个基于FreeRTOS的多任务程序 xff0c 执行3个周期性task task1 xff0c 每间隔500ms闪烁 xff08 变化 x
  • 学习HTML后总结

    目录 一 HTML简介二 软件 插件使用三 HTML的文档结构1 元素2 文本格式3 标题4 超链接5 图片 文件路径img6 表格7 列表List8 表单Form9 其他内容 一 HTML简介 HTML是超文本标记语言 xff08 Hyp
  • 学习CSS后总结

    目录 一 CSS简介二 CSS语法三 CSS的生效方式四 CSS实际使用1 颜色 尺寸 对齐2 盒子模型3 边框与边距4 定位5 溢出6 浮动7 透明度8 组合选择器9 伪类和伪元素 一 CSS简介 CSS是级联样式表 xff08 Casc
  • 《通信软件开发与应用》课程结业报告

    目录 一 作业内容二 完成过程三 问题及解决办法四 仍然存在的问题五 总结 一 作业内容 要求 xff1a 完成一个静态网站的制作 可使用你喜欢的任何CSS框架如BootStrap MDB tailwind等 xff0c 页面不少于5个 x
  • prometheus + grafana 监控Mysql、主机、Redis超简入门

    文章目录 grafana安装启动如何导入需要的dashboard prometheus安装集成grafanaExportermysqld exporter安装配置 node exporterredis exporter grafana 安装

随机推荐

  • 地址栏中输入IP地址提示指定的网络名不再可用的解决方法

    在日常工作中 xff0c 我们有的时候为了省去在网上邻居查找相关资料的麻烦 xff0c 一般都直接在地址栏中输入远程地址 xff0c 如192 168 1 100 F xff0c 可有的时候偏偏输入地址后却提示 指定的网络名不再可用 的问题
  • ubuntu18.04添加用户

    文章目录 前言一 创建用户目录二 修改用户权限 前言 笔记 在远程服务的时候经常遇到用户登入冲突的情况 xff0c 在此做了总结 一 创建用户目录 span class token comment 创建deepstream user spa
  • 详细介绍如何在ROS 中使用自定义 msg 消息

    首先我们对Ros中的msg 消息做以简单的回顾 xff1a msg 消息是 ROS topic 通讯时 xff0c 节点之间进行传递的内容 msg 消息描述的是业务之间传递数据 xff0c 也可以理解为业务之间数据的抽象化 常见 Msg 消
  • linux下的信号量操作示例

    include lt sys types h gt include lt sys ipc h gt include lt sys sem h gt include lt pthread h gt include lt errno h gt
  • 用户行为分析的指标及其意义

    什么是用户行为 xff1f 用户行为由最简单的五个元素构成 xff0c 我们可以简单地记为3W2H xff1a 时间 xff08 When xff09 地点 xff08 Where xff09 人物 xff08 Who xff09 交互 x
  • 二层漫游和三层漫游(转载)

    漫游域 根据STA是否在同一个子网内漫游 xff0c 可以将漫游分为二层漫游和三层漫游 不同子网之间的漫游是三层漫游 xff08 同一个VLAN pool内的漫游仍然属于二层漫游 xff09 网络中有时候会出现以下情况 xff1a 两个子网
  • HTML DOM 事件

    1 HTML DOM 事件 参考文档 xff1a https www runoob com jsref dom obj event html HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序 事件通常与
  • 用户分类以及用户活跃度的衡量方法

    一个APP最根本的便是用户 xff0c 那么当然用户也分许多种类 xff0c 比如活跃用户 留存用户 流失用户等等 xff0c 那么一般情况下又是怎么来分析活跃用户的呢 xff1f 首先 xff0c 我们来看一下用户的具体分类 不同类型的用
  • 什么是用户标签?其实很好理解

    用户画像与用户标签 亚马逊的CEO Jeff Bezos曾说过他的梦想 xff0c 如果我有一百万的用户 xff0c 我就会做一百万个不同的网站 xff01 xff0c 做这个的基础是先对用户打标签 什么是用户画像呢 xff1f 就是根据某
  • 用户标签体系的意义及设计方法

    我们这次重点谈一下用户标签 对于市场层面 xff0c 用户标签能帮助我们什么 xff1f 1 完善数据仓 之前我们讲过 xff0c 企业或市场要有自己的数据仓来进行线索的存储与培育 xff0c 用户标签就是存在于此 xff0c 我们希望用户
  • 如何设计数据埋点方案?知道这2步就行了

    数据埋点是什么 xff1f 数据埋点是数据产品经理 数据运营以及数据分析师 xff0c 基于业务需求 xff08 例如 xff1a CPC点击付费广告中统计每一个广告位的点击次数 xff09 xff0c 产品需求 xff08 例如 xff1
  • 什么是UTM参数?这些你知道吗

    现在移动互联网发展比较迅速 xff0c 而且现在很多人都在做公众号 xff0c 公众号也要有自己的特色 xff0c 这样才能给自己的产品带来利益 现在也有很多的人关注APP运营 xff0c APP运营工作中的每一步都会讲求ROI xff08
  • 用户触达方式及用户触达渠道选择

    任何用户运营过程总离不开用户触达渠道的连接 可以说 xff0c 触达渠道的组合选择 xff0c 是与你最终运营效果直接挂钩的 xff0c 用户触达方式的选择直接影响了你运营的结果 如何做精准的用户触达 如何选择不同的用户触达方式 如何最大限
  • 用户行为分析之渠道分析、转化分析、留存分析

    数据分析脱离不了业务 xff0c 不同的业务所关注的数据不同 xff0c 比如互联网 快消等 xff0c 行业不同 xff0c 关注的数据点也不同 在互联网行业普遍产品的数据分析中 xff0c 我认为用户行为分析最重要的三个点是渠道分析 转
  • 通过用户分级实现精细化运营

    10年前 xff0c pc互联网时代 xff0c 当你浏览百度的网页 xff0c 你会普遍看到各种插件推广 弹窗广告等等 xff0c 这些弹窗就好似牛皮癣一样 xff0c 想关掉都不行 用户体验极其不好 xff0c 这是一个 卖方 占绝对优
  • 如何进行流失用户召回?做到这三步!

    如果按照每天渠道投放获客1000名 xff0c 次日留存率40 来算 xff0c 每天会有60 的用户 xff0c 第二天就再也不打开我们的APP xff0c 最终成为了流失用户 平均每日损失几百到数万元不等 虽然相比动辄几百万到几千万的融
  • Spring使用到的设计模式

    Spring涉及到的设计模式 简单工厂模式工厂模式单例模式适配器装饰器模式 Decortor代理模式观察者模式策略模式模板模式 简单工厂模式 一个工厂类根据传入的参数 xff0c 动态决定创建哪一个类 public abstract cla
  • 路由协议的优先级

    对于相同的目的地 xff0c 不同的路由协议 xff08 包括静态路由 xff09 可能会发现不同的路由 xff0c 但这些路由并不都是最优的 事实上 xff0c 在某一时刻 xff0c 到某一目的地的当前路由仅能由唯一的路由协议来决定 为
  • 自己动手写操作系统 将引导程序成功写入优盘启动电脑

    原文 xff1a http freesoftman iteye com blog 629598 输入命令 xff1a nasm boot asm o boot bin 一会儿就生成了一个镜像文件boot bin 该文件就是我所谓的操作系统了
  • 关于C语言等高级语言能不能直接控制硬件的问题

    关于C语言等高级语言能不能直接控制硬件的问题 xff0c 我认为C语言等高级语言不能直接控制硬件 这里谈论的问题本质是 xff0c C语言等高级语言能不能直接对硬件进行编程 我认为 xff0c 不能 众所周知 xff0c 计算机之初的程序员