C程序设计——编程语言极简史

机器语言

机器语言,就是计算机能直接运行的语言,当然计算机本身就是人设计的,机器语言人类也能理解,只不过要理解机器语言,需要一定的知识门槛。等你学了《离散数学》《模拟电路》、《数字电路》、《组成原理》以后,再看一个内核的文档(推荐看 LoongArc,因为全中文,没有语言障碍),就能理解机器语言了。

按照教材和内核手册的描述,每一条机器语言的指令,都可以分为两部分:操作码操作数。按照我个人的理解,操作码其实也是地址,只不过是控制器和运算器的片选地址;操作数,可以是操作数本身,也可以是操作数的片选地址。

比如,LoongArc 架构,有如下指令:

31~1514~109~54~0
\left ( 00000000000100000 \right )_{2}\left ( 00001 \right )_{2}\left ( 00010 \right )_{2}\left ( 00011 \right )_{2}
操作码:加法存放结果的寄存器地址存放加数的寄存器地址存放加数的寄存器地址

其中,31~15位的 \left ( 00000000000100000 \right )_{2},表示这是一个加法指令;14~10、9~5、4~0,是三个寄存器的地址,分别用来存放:(加法的结果)、加数另一个加数。表格中指令的含义是,把R2 + R3的和,放到R1寄存器中。

等你学习了计算机的相关课程,深入理解计算机后,就会发现,在机器语言中,一切皆是地址

按照目前的计算机语言分类,机器语言是一种低级语言,也被分为面向过程的语言。

汇编语言

按照前面的描述,机器语言就是由两部分数字组成的。这对于人类来说很难理解。我曾经看过一个故事,细节记不清了,但大差不差吧,如果有能给不全,欢迎评论区留言:

曾经有一个程序员,他觉得每天在纸带上,用打孔机编程太枯燥了,而且操作码还非常难记,一不小心就搞错了,于是他有了一个想法,为什么不让计算机来做这样的事情呢?

于是他搞了一套助记符,输入计算机,然后它自动给翻译成机器语言。

比如LoongArc 内核中:ADD.W R1, R2, R3  表示把 R2 + R3 的和,放到R1中,然后由计算机把这条指令翻译成机器语言指令\left ( 00000000000100000'00001'00010'00011 \right )_{2},这个翻译的过程,叫做汇编,ADD.W R1, R2, R3 叫做汇编指令。

说做就做,这个程序员还写出了第一版本的汇编程序,但是当他把成果拿给冯诺尼曼时,老冯把这个天才小伙子臭骂一顿,因为老冯觉得,计算机的时间很宝贵,编程序是一件没什么技术含量的活,怎么能让计算机去干没有意义的事情呢?

当然冯诺尼曼有他的历史局限性,工作多年以后的我,再回头看汇编语言,就是对机器语言的操作码抽象成了助记符,从而大幅度降低了编程的门槛。

按照目前的计算机语言分类,汇编语言是一种低级语言,也被分为面向过程的语言。

结构化的高级语言

按照现在理论,机器语言和汇编语言,被归类为面向过程的语言,虽然汇编大幅降低了编程的门槛,但目前看来,门槛依然很高。

等你将来学习了《形式语言与自动机》,里面有一个重要的结论:“所有问题,最终都可以化简为为:顺序、选择、循环三种结构”,这就是结构化语言的理论基础。

结构化的编程语言,把问题归结为两部分:数据、对数据的操作。

结构化编程语言,用语法限制程序员,只能使用顺序、选择、循环三种结构来解决问题。

因为结构化的编程语言更接近人的自然语言,而且语言制定标准的时候,将计算机内核的实现细节透明化,只对程序员放开了读、写内存的接口,因而又一次大幅降低了编程的门槛。

本文介绍的C语言,就是一种结构化的高级语言。

面向对象的高级语言

前面说了,结构化的编程语言,把问题归结为两部分:数据、对数据的操作,这种语言的数据和操作是分离的。

面向对象的语言,把数据和对数据的操作当做一个整体,称为对象,因此被叫做面向对象的编程。

我个人接触的面向对象编程,可以忽略不计,所以也讲不出什么,就这样吧。

常见的面向对象语言有:C++ ,java

面向对象的编程,更加接近自然语言,又双一次大幅降低了编程的门槛,因此也是高级语言。

可视化的高级语言

可视化的编程语言,就跟开发环境息息相关了,WPS、Office,都可以当做是一种开发环境,在上面编辑文档,可以认为是在编程,最终生成的文件,就是你写出来的程序。

可视化的高级语言,直接拆了编程的门槛。

编译执行和解释执行

前面讲了那么多计算机语言的极简史,无论汇编、结构化还是面向对象、可视化,最终都是要计算机来执行,因此它们最终都要翻译成机器语言。

据我了解,翻译成机器语言的方式有四种:

汇编

这个是汇编语言的专属,就是把汇编语言翻译成机器语言。

编译执行

把高级语言写的源码,一次性全部编译为机器语言,然后由计算机直接取指运行。

C、C++就是这种。

解释执行

高级语言的源码,翻译一句,执行一句,翻译的软件,被叫做解释器。

python、html等就属于这种。

编译+解释

高级语言的源码,先翻译为中间代码,再由解释器(虚拟机)翻译为机器码执行。

Java就是这种(据说Java 也可以直接编译成机器语言,然后由计算机直接执行)

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十三香炖猪肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值