汇编不能被C语言取代

来源:互联网 发布:三星ml2161清零软件 编辑:程序博客网 时间:2024/03/29 16:53

最近一直在研究C和汇编的关系,得出了以下的几个结论,希望能够和大家一起探讨。

当你在学习计算机时,我发现了一个很经典的问题,到底是先有Complier还是现有计算机语言?这问题令我想起,到底是有鸡先还是先有蛋?我想答案应该是:先有Complier!

任何一种计算机语言,无论遵从什么语法结构,它的唯一实现就是靠一个Complier来实现,Complier负责检测语法,把计算机语言翻译成最终的机器语言。但实际上,没有机器语言这个东西,我们应该称其为机器指令,而机器指令都是由CPU的硬件设计来实现,也就是我们平常说的INTEL指令集。所以更准确的叫法应该是机器指令。

可能大家都了解计算机的发展过程,由最古老的使用Punch Card来输入程序的计算机,到现在只有手指头大的闪存就能存储高达100G程序的年代。即使发展最快,都离不开一个本质,就是人类想法设法地把程序存放到某种介质上,能让计算机可以处理。同时,人类也在不断地改进编写程序的方式。

我们由最古老的Punch Card程序说起。以前的程序员编写程序的难道极大。没有磁盘介质,没有计算机语言。他们要实实在在的用机器指令来编写,困难的是,不像现在敲敲键盘就把程序输了进去。他们要在一张称为“Punch Card“的硬纸板上钻孔,0代表有孔,1代表没孔。有时候一个程序,几万行代码,这恐怕不是几天的功夫就能完成。在最开始的时候,人类还没有操作系统这个概念,能够使用计算机的人士也不是一般人,能拥有计算机的一般是政府,军队这些部门。当时人们只会在为实现某种解决方案才会编写一个程序来放到计算机上运行。比如,需要做某种数学运算。不久后,随之科技发展,有了磁带的存储介质,人们把程序存储到磁带上。到了这个时候,计算机语言就将要产生了。程序员已经厌倦了直接使用机器指令来”组装"程序(我不认为他们在编写程序,当时还没有计算机语言)。有人提出了疑问:我们能不直接使用机器指令来组成程序吗?能用近似人类语言的指令来编写程序吗?有人对这问题思考:既然我们懂得如何生产一个程序,那为什么就不生产一个程序来作为一个翻译器,然后我们制定一套指令,一套人类容易读懂的指令来让这个翻译器去翻译成机器指令呢!这是,第一套计算机语言产生了——汇编语言。从此,程序员编程方式有了革命性改变,他们开始使用汇编语言来编写程序。正因为这改变使得编程更简单,并且存储介质也得到改进。程序员开始编写大量的大型程序。

  不久微型计算机也出现了(就是我们现在的PC),像我说的那样,当时的计算机不是每个人都会使用,只有专业人士才会使用。但由于微型计算机的出现,一般人都想去使用它,但总不是每个人都会花费时间去学习怎么使用。这是,操作系统的概念就诞生了。操作系统帮我们简化了很多操作,一般人都很容易就学懂使用计算机。一个大家都很熟悉的操作系统,也都是一个流行至今的OS——UNIX。它就是用汇编语言来编写。

 那么更高级的语言C语言又是怎么诞生的?道理一样,程序员觉得汇编编写更大型的程序也相当困难,所以创造了更高级的C语言。同样的道理,日后如果要为编程带来更多的便利,就会有更高级的语言诞生。

 在介绍完计算机语言发展历史后,我们有足够的基础来研究几种语言的关系和定位。但在讨论前,我认为在学习计算机的同时,去学习计算机历史是很有必要的,原因是计算机行业发展速度相当快,但计算机有着一个特性就是"向后兼容“。现代最新最快的计算机也保留着一些最原始特性。学过计算机原来的朋友会知道,即使现在的64位的I5,I7CPU,在开机时也是从16位的Real模式开始,这个东西就是从16位的8086CPU继承过来的。哪怕日后发展到128位这个东西也会一直延续下去。

 现在我们可以开始讨论这几种语言的关系。汇编语言的为最低级的计算机语言,它能够生成指令直接操控计算机硬件。C语言为高级的计算机语言,它的语法和汇编完全不同,正应为这样所有有着不相同的功能。

A、C语言既然比汇编高级,就能却带汇编?

C语言不能取代汇编!我曾经也不停地做试验,想办法去论证C语言能取代汇编语言。我知道在TURBO C的TCC编译器里面可以使用一些“伪寄存器”,如_AX,_BX。并且C语言有这指针的特性,可以自由读写指定的内存空间。当时我在想C语言不就可以操控寄存器和内存了吗?但是遗留的问题是,即使我能够用C语言来操作寄存器和内存,但如果我要使用CPU的栈机制可以吗?如果我要通过IN,OUT指令来操作IO设备,又该怎样做。最后我得出的结论就是C不能取代汇编。

B、可以让C语言取代汇编吗?

在验证C能取代汇编失败后,我在想,能不能编写一个Complier来支持那些IO和栈的操作。答案是完全可以的,但这样必须在原有的C语言语法基础上增加新的语法。这样就引出了一个新问题。这个编译器还是C语言的编译器吗?它不已经是个变种了吗?也就是说这还会是C语言?

C、为什么不让C语言来取代汇编?

既然可以在C原有的基础上增加新功能,那为什么没人这么做?这样不是可以放弃用汇编了吗?在我认为,C语言和汇编语言有着不同的功能定位,就像上面的计算机历史介绍到汇编语言的诞生是取代了机器语言,程序员完全可以用汇编来编写任何程序。但C语言的诞生却是在有操作系统后才出现,它的出现不是为了取代汇编,而是为了更好地辅助汇编来编程。这两种语言是有着不同的功能定位。

 C语言和汇编语言各有这不同的特性,不同的定位。C语言是用于开发有格式的文件如:ELF,PE,MZ。在LINUX下GCC编译出来的是ELF格式程序。在DOS下是MZ,在WINDOWS下是PE。这可以看出C语言本来就是给开发应用程序用。很多人会说,那WINDOWS和LINUX都是用C开发出来的。这两个操作系统的内核的确是用C开发出来的,了解内核的朋友就会知道,这两个操作系统内核实际上都是一个有格式的文件。所以说C语言的定位是开发基于文件格式的应用程序。如果你说要开发一个MBR的bootloader那C语言就恐怕做到不了。这就是为什么C的编译器都不能编译出BIN格式的文件。即使TURBO C的TCC编译出来的TINY模式的EXE文件,通过EXE2BIN可以转换为COM文件(无格式文件),也不能改变C语言的功能定位,因为始终它就不能操作IO。或者学过单片机的朋友会问单片机编程不也可以直接用C来编写一个BIN文件吗?不是可以操作IO吗?没错,但单片机的C语言不是我们的讨论范围,我们研究的是PC机的C语言。

 结论:C语言不能取代汇编语言。因为C语言的结构和语法就和汇编完全不同。他们的定位也完全不同,C能编写的,汇编都能编写。但汇编能编写的C不一定能编写。汇编用于编写驱动程序,编写BOOTLOADER,编写直接和操作IO的程序。一般不会用汇编来写应用程序,因为效率相当低,而C语言则是主要用于编写应用程序,和系统内核。这点就是C语言的优势。任何一样东西的存在都有它的道理。何况这两门语言已经有着多年历史。

 现在时下的计算机语言又岂止这两种,只不过这两门语言已经能够完全满足编程的需求。至于那些JAVA,PHP,JAVASCRIPT,OBJECTI-C等等的语言就是为某个计算机行业领域而诞生的。像JAVA就是为了能够开发不同平台的应用程序而出现,JS和PHP是用来开发WEB前,后台程序,而OC就是用来开发苹果程序。如果说到取代关系,C语言可以把他们都给取代了,所以说C语言强大就在于此。


原创粉丝点击