所有的编程语言最后会编译成C,再编译成汇编,最后落实到硬件操作上吗?
扫一扫
分享文章到微信
扫一扫
关注99科技网微信公众号
首先上结论:
(1)不是所有的编程语言都要先编译成C
(2)甚至有编程语言连编译成汇编这一步都跳过了。
(3)不是所有的编程语言都需要编译,有的是纯解释型语言
1. 编程语言到硬件执行之间到底发生了什么?硬件执行的本质就是一堆电子元件的“开关”动作,开、关两种状态可以用二进制的1和0来表示,这样整个硬件的执行就和二进制对应了起来。硬件是无法理解上层的高级编程语言的(比如Java、C++、C,、C#、Javascript…… )。
那么为什么要发明高级编程语言呢?因为:
(1)人类直接与二进制打交道,比较费力,与自然语言相隔太远,不利于相互交流和协作,从而很难诞生高效的大规模团队协作来完成超复杂规模的软件设计、开发。
(2)每种硬件平台对应的二进制设计都不太相同,如果直接与二进制打交道,那么就要不断地重复造轮子,不利于跨平台的设计和协作。
既然需要高级编程语言,而硬件又只认识二进制,那么怎么去解决这两者之间的鸿沟呢?答案就是:编译和解释。
2. 编译是什么?你可以把编译类比成一次性翻译完整的文学著作。相当于把用高级编程语言编写的源代码一次性转换成二进制。
人们摆脱二进制的第一步尝试是设计汇编语言和开发汇编器。每一条汇编指令与对应的二进制是一一对应的,换言之,汇编语言只不过是二进制的一种助记方式。
在有了汇编器之后,可以在汇编语言之上,再来设计高级编程语言和高级语言的编译器,后者可以通过汇编器转换成二进制。通过这样的不断递归的设计、开发过程,就可以设计出非常高级的编程语言。具体的原理分析可以参见笔者的专栏《华为方舟编译器源代码分析》的《先有蛋还是先有鸡:编译器本身是怎么被编译出来的?》。
只要有能转换出最终二进制的高级语言编译器,那么其实是不需要有显式的汇编器和汇编语言的。
3. 解释是什么?解释相对于同声传译。Javascript这些脚本语言,大部分都是采用解释器来做翻译。它并不需要像编译那样,一次性把所有的源代码转换成最终的二进制。而是在运行的过程中,一边翻译一边执行。与上面设计高级编程语言的编译器的方式一样,高级语言的计时器也可以通过递归的方式设计、开发。到最后,只要有能转换出最终二进制的高级语言解释器,那么其实是不需要有显式的汇编器和汇编语言的。
关于解释器的具体原理,以及加强型算法——如JIT,可以参见笔者的专栏《华为方舟编译器源代码分析》的《干掉Java虚拟机来提升应用程序性能:只有华为想到了吗?》。
4. 一些直接面向高级语言的机器历史上还专门开发过面向高级语言的机器,中间是不需要汇编语言过渡的。比如大名鼎鼎的LISP语言。曾经人们专门为LISP语言开发过对应的机器。但是最终的商业成果并不理想,主要是当时一些条件还不成熟。
实际情况并不是这样的。
我们来一条条的看吧:
1.编程语言并不是都要编译成C,这个说法不知道是谁提出来的。C语言和java,python一样,也是一种高级语言。但是C语言有个优势,就是可以嵌套汇编,实现底层交互。
2.很多人存在一个误区,汇编语言就是最底层的语言了,其实计算机还是不认识汇编是个什么东西, 因为计算机只能识别一种语言,那就是机器语言,全都是0和1这样的二进制数。比方说MOV AX,BX,这条汇编的意思是寄存器将BX的内容转移到AX中,对应机器语言的,非常复杂。可以这么理解:汇编语言实际上是机器指令的一种简写形势。
可以看看下图,做一个简单的加法运算,分别用C语言,汇编和机器语言表示,各位就能理解高级语言的好处了。
无论是C还是其他什么语言,最终的目的都是实现某种功能,而这离不开硬件的支持,所以归根结底,还是要从程序和硬件的关系说起。
硬件,程序和编译器之间的关系在计算机中存在着大量的电子元件,电路就两种情况:开和关,这两种状态分别用1和0来表示,也就是众所周知的二进制, 在计算机中,所有的运算都是以二进制的形式进行的,比方说3+4,在CPU中的表现形式为00110000+01000000,如果是负数运算或浮点运算的话还会更复杂一些,这里不再累述。
通过0和1决定电路状态,那么操作者是通过编程语言操作硬件的呢?这里编译器的作用就体现出来了。
编译器就像是一个翻译一样,也就任人们口中俗称的编程软件。其实用更专业的话来说,编译器实际上是IDE(开发集成环境)中的一个工具。
虽然大家可能在操作中感受不是那么强烈,但如果你在windows控制台下用javac编译过java代码,或者你在linux的命令行下编译过程序,这个时候我们就直接使用了编译器。
最后提一点,并不是所有的语言都会被编译器直接编译成机器语言。C语言是一个比较特殊的语言,因为他是直接可以直接编译为汇编再编译为机器码的,这也是C语言可以和底层打交道的主要原因。像我们熟知的java,它会把源码先转换成一种叫做字节码的东西,通过JVM虚拟机将其转换为机器码。所以说,编译器的类型有很多,作用不能一概而论。
99科技网:http://www.99it.com.cn

