计算机如何分析指令助记符,高级语言是如何被计算机“听”懂的呢?对,通过“翻译” 浅谈编译原理...

人与人之间交流需要语言,人与计算机之间交流同样需要语言,即为编程语言。按照计算机语言对硬件的依赖程度,通常把程序设计语言分为4类:机器语言、汇编语言、高级语言和第四代程序设计语言。

c3d3dcb2c49befcd05c187b235680dc3.png

在计算机还全都是些庞然大物的石器时代,写程序是靠「机器语言」。虽然名字叫做「语言」,实际上用到的就真的只有两个数字 0 和 1而已。一些特定的数字组合,对于计算机来说有特定的意义,会让计算机做出特定的动作——其实我们甚至不该叫它们「数字」,因为它们并不代表任何「数量」,而是代表「模式」(pattern)的信号。

这是什么意思呢?

就好比你伸出一只手去按钢琴键盘的同一部分,缩起来的指头记作 0,伸开来的指头记作 1,01000 和 11110 按出来的声音是不一样的,计算机接受的数字组合与之类似。01000000 这个指令输入一块小芯片的时候,芯片里面有八坨晶体管组成的小装置被「按下」了,其中第二个被通上高电压,另外七个则是低电压,而这个组合会继而引发更多的、由芯片工程师所预先设计的一系列连锁反应。无数这样的模式数字接踵而至,才最终让你面前的屏幕上出现一些能被人理解的图案来。

用纯数字的机器语言编程的难度可想而知,所以从数字到助记符号的转译很快随之出现,称作汇编语言。比如若是一组数字 0010 0000 可以让芯片把内部的一个存储单位,称作「寄存器 X」,加上一个值 Y,那么不妨就把这组数字和助记符「ADD」对应起来,上面的指令就可以写作「ADD X, Y」这样。一条条类似的指令写成一串,就是一个对于程序的描述。相对于纯数字来说,这是个质的飞跃——终于不必去扳开关了不是吗?而这样的一串字符,可以由专用的小程序来「翻译」成二进制的机器码,也就是真正可以输入处理器去按下晶体管的程序电子信号。当然,每种处理器的汇编语言仍旧是不同的。

机器语言、汇编语言的优点在于,每一条指令都几乎对应于芯片能做的一件事,比如一条指令把一个数字从内存转入寄存器,另一条指令给它加上一,第三条指令将它写回内存去——直接对于一块芯片下命令,效率非常高。相应的缺点则是,如果你只是想把一个数字加一,却每次都要连续写三条指令,时间一长非常痛苦。而且既然不同芯片支持的指令集不同,就意味着这块芯片上需要三条命令完成的事情,另一块芯片可能需要不太一样的五条命令。假如能将一部分固定出现的操作,像连续技一样一次性施放,每次只需要打一个指令,却能够在不同结构的芯片上都做同样的事该有多好?换句话说,如果能有一种更倾向于描述需要解决的问题(给一个数字加一)而不是描述计算机具体进行何种操作(读数,加数,写数)的语言,来封装那些不需要关心的细节,把细小步骤想要达成的意图抽象出来,该有多好?

de30509c66610364be53bf7e86df86b5.png

所谓「高级」计算机语言就是为了这一目的而出现的。

高级语言对于我们来说很容易理解,但是计算机却不认识,那么我们就需要一个“翻译”将我们程序员写的源程序翻译成计算机能识别的机器码。有同学可能已经猜到了,没错就是编译器!

那么编译器是什么原理呢?为什么这么神奇。

编译原理顾名思义,编译就是将源语言(高级程序语言)翻译成等价的目标语言(机器语言即计算机可以识别的语言即0和1或汇编语言)的过程。原理就是研究这一过程的思想方法、理论和技术。从本质上来讲编译是一个算法问题,但由于它的问题相当复杂,导致设计解决这个问题的算法也十分复杂。这里的算法和我们学习的数据结构和算法中的算法有些不同,后者讲述的是基础算法,是解决我们生活中遇到的问题,而编译中的算法则是在人与计算机交流时需要解决的“沟通”问题的算法,比较专注解决一种的算法。编译的过程包括:源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成->目标程序

学习编译原理的作用?

1、学习编译原理,了解高级语言是如何翻译成机器语言的,这有助于提高我们代码编译的效率,提高代码的质量。

2、了解计算机的运作原理,能写出更高效的代码。

3、由于编译过程是将高级语言等价的翻译成机器语言,这样我们就知道了它们之间是如何等价转换的,这对于我们学习其他语言更加得心应手,因为我们学习了它们的核心思想。

4、对于计算机编程及计算机整体运作方式开始有更深一层次的理解。

5、可能可以在自然语言语义分析方面会后一些了解。

6、获得分析、设计、实现和维护编译系统的初步能力,理解运用编译技术解决工程实践中的变换和转换问题的方法。

7、感受到经典理论和先进技术之间的紧密联系。

不学习编译原理,会使自己的计算机思维停留在程序之上,虽然可以用程序解决生活实际问题,但没有真正走进计算机的0,1世界,你和它的交流始终隔着一个编译器,不能自由、灵活的表达自己的意思,同时也受限于高级语言给你的思维。

编译系统的按照转换方式的不同分为:解释类和编译类(如图5-3所示)。解释类执行方式类似于我们日常生活中的“同声翻译”,编译类则有点像提前翻译好,现场对口型。前者修改方便但容易出错,后者不容易出错但修改较麻烦。

f2e7241134a358901b1da416fa2d50fb.png

图5-3

高级语言的两种编译方式 编译系统就是一个计算机语言的“翻译”,其作用是将高级语言源程序“翻译”成计算机能识别的机器语言。值得注意的是:不同类型的计算机上使用的编译软件是不相同的。

3ff1eaf38a4079b348437133403e3878.png

因此,在一台计算机上能运行某一种高级语言程序的条件是:必须在此计算机系统上配有此种语言的编译系统。举例来说,如果你要在一台微机上运行C语言程序,你就必须先将为该微机设计的C语言编译系统装入计算机内。否则就无法在该微机上运行C语言程序。

db8d6ed275a1119723f0387fa5f3f5b4.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值