打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
所有的编程语言最后会编译成C,再编译成汇编,最后落实到硬件操作上吗?

首先上结论:

(1)不是所有的编程语言都要先编译成C

(2)甚至有编程语言连编译成汇编这一步都跳过了。

(3)不是所有的编程语言都需要编译,有的是纯解释型语言

1. 编程语言到硬件执行之间到底发生了什么?

硬件执行的本质就是一堆电子元件的“开关”动作,开、关两种状态可以用二进制的1和0来表示,这样整个硬件的执行就和二进制对应了起来。硬件是无法理解上层的高级编程语言的(比如Java、C++、C,、C#、Javascript…… )。

那么为什么要发明高级编程语言呢?因为:

(1)人类直接与二进制打交道,比较费力,与自然语言相隔太远,不利于相互交流和协作,从而很难诞生高效的大规模团队协作来完成超复杂规模的软件设计、开发。

(2)每种硬件平台对应的二进制设计都不太相同,如果直接与二进制打交道,那么就要不断地重复造轮子,不利于跨平台的设计和协作。

既然需要高级编程语言,而硬件又只认识二进制,那么怎么去解决这两者之间的鸿沟呢?答案就是:编译和解释。

2. 编译是什么?

你可以把编译类比成一次性翻译完整的文学著作。相当于把用高级编程语言编写的源代码一次性转换成二进制。

人们摆脱二进制的第一步尝试是设计汇编语言和开发汇编器。每一条汇编指令与对应的二进制是一一对应的,换言之,汇编语言只不过是二进制的一种助记方式。

在有了汇编器之后,可以在汇编语言之上,再来设计高级编程语言和高级语言的编译器,后者可以通过汇编器转换成二进制。通过这样的不断递归的设计、开发过程,就可以设计出非常高级的编程语言。具体的原理分析可以参见笔者的专栏《华为方舟编译器源代码分析》的《先有蛋还是先有鸡:编译器本身是怎么被编译出来的?》。

只要有能转换出最终二进制的高级语言编译器,那么其实是不需要有显式的汇编器和汇编语言的。

3. 解释是什么?

解释相对于同声传译。Javascript这些脚本语言,大部分都是采用解释器来做翻译。它并不需要像编译那样,一次性把所有的源代码转换成最终的二进制。而是在运行的过程中,一边翻译一边执行。与上面设计高级编程语言的编译器的方式一样,高级语言的计时器也可以通过递归的方式设计、开发。到最后,只要有能转换出最终二进制的高级语言解释器,那么其实是不需要有显式的汇编器和汇编语言的。

关于解释器的具体原理,以及加强型算法——如JIT,可以参见笔者的专栏《华为方舟编译器源代码分析》的《干掉Java虚拟机来提升应用程序性能:只有华为想到了吗?》。

4. 一些直接面向高级语言的机器

历史上还专门开发过面向高级语言的机器,中间是不需要汇编语言过渡的。比如大名鼎鼎的LISP语言。曾经人们专门为LISP语言开发过对应的机器。但是最终的商业成果并不理想,主要是当时一些条件还不成熟。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
让小朋友懂一点计算机(八)|编程语言的发展历史
C语言汇编语言机器指令CPU之间是怎么联系起来的(假设加法器和乘法器都具有使能端两个使能端为01就是加法器工作是10就是乘法器工作为了便于记忆于是你给01起了个名字叫add10起名叫mul你的这组运算
选择学什么计算机语言来编程,先了解语言通常是如何开发出来的
深入理解编译系统
从零开始的计算机系统,从本质上深入理解计算机
计算机科学与技术
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服