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

来源:互联网 发布:linux服务器root密码 编辑:程序博客网 时间:2024/05/17 03:59

           关于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语言写的程序。。。。。。
这张计算机系统的构成图形象的说明了系统的层次性和屏蔽性,可以看到,只有操作系统才可以直接接触硬件系统,而程序语言和开发环境是建立在操作系统之上的,它依赖于操作系统。
       正是由于这种系统层次结构的封装和屏蔽性,才使得高级语言看上去可以直接“控制”硬件的假象。
       所以,我认为,高级语言是不能直接对硬件进行编程的,必须要有底层的支持,还要有一层一层的编程封装。




 


0 0
原创粉丝点击