如何用汇编语言编写三重循环的延时程序_编程那些事儿:告诉你程序员们从事的编程到底是在做什么...

4ffdd679d65f7088483d678b27ff614d.png

编程与编程语言

说起编程这个词,它听上去像是个专业术语,其实很多行业也都有这种说法,只不过现在随着计算机信息技术的发展,它几乎成了这个行业工作的专有名词。它目前专用于一个场景就是人与机器的交互。

用最简单的话说,编程就是写一系列的指令来告诉计算机执行一个特定的任务。而为计算机编写的这些指令组合成的序列我们就称之为程序

那什么是编程语言呢? 跟我们人类的语言一样,我们要表达某种思想和事物首先需要统一定义一些概念以及标识,这些概念和标识就构成了一种语言,所以编程语言是一些概念和标识的汇总。编写程序的这些人就是我们说的程序员。他们都是掌握了某种编程语言来给计算机编写指令的人。

那么我们如何告诉计算机去执行一个任务呢?一个人能否告诉计算机执行某个任务,或者计算机是否有一组早就定义好的任务可以执行呢? 在了解人与机通信之前,我们先来看看人是如何与机器通信。一个人如何与另一个人交流? 你会说人与人之间的交流是通过口语来完成的,例如普通话,英语、德语、西班牙语等等。然而,口语并不是人类之间唯一的交流方式。我们也用书面语言或手势交流,而不需要说话。更夸张的是有些人甚至可以隔着几公里远的距离交流,而不用任何语言或手势; 他们可以在思想层面上交流。

其实要想有一个成功的沟通,仅仅使用像口语或书面语这样的沟通媒介是不够的。双方成功沟通的主要要求是双方都能理解对方传达了什么。比如,假设有两个人,一个人只会说英语,另一个人只会说汉语。他们能很好的互相交流吗? 显然不能。因为他们不能理解彼此的语言。这时候他们之间就需要一个既懂得汉语又懂得英语的人做翻译,如此即使他们不能直接理解彼此,他们也能在翻译的帮助下进行交流。

在计算机的世界里,它只懂得一种语言那就是二进制格式的指令,也就是0和1排列组成的序列。这种由0和1根据不同顺序组成的序列构成的语言,我们称之为机器语言,也常说是机器代码。每种类型的计算机都有一套自己能够理解的固定基本指令。它们的内核设计不同,指令集的设计也有不同。例如,一台计算机可以使用0010作为添加两个数字的指令,而另一台计算机可以使用0101作为相同的目的。因此,用机器语言编写的程序是与计算机相关联的。有时,机器代码被称为本机代码,因为它是为其某机器专门编写的本机代码。

但是现在我们都不会去用这种机器语言去编写计算机的指令,因为对于我们人类来说,这种二进制代码不但难写,而且难读懂,更不容易理解。假设我们要写一段程序来表示两个数组15和12相加的和,使用机器语言表示这两个数字样子是这样的:

0010010010 10010100000100110

0001000100 01010010001001010

这一堆0和1就表示这两个数字相加,只有计算机能够读懂它的意思。如果我们每次告诉计算机要执行什么任务都用这种样式去写,结果可想而知。我们现在可能意识到用机器语言编写、读取和理解程序是多么的困难。这完全有背我们发明计算机的初衷!

因此计算机科学家提出了另一种语言,称为汇编语言。就是将上面那些0和1构成的序列,用一些不同符号来代替,作为指令符号,能够帮助我们人类记忆和理解,所以说汇编语言是一切人类为自己设计的助记符号集合构成的一门语言。类似我们过去战争年代传递情报信息的密码。如果用汇编语言编写的一个两个数字相加的程序类似于:

li$t1, 15

add$t0, $t1, 12

比较用两种不同语言编写的执行相同任务的程序,我们会发现汇编语言比机器代码更容易编写、读取和理解。对于某种设计的计算机体系结构,它的机器语言指令都有自己专门的汇编语言。因为计算机只能理解设计自己时设计人员给自己指定的机器语言。所以,它的指令的助记符号也是它专有的。如同战场上传递秘密情报一样,我们向某台计算机传递信息需要用该计算机才理解的密码本中符号去编写信息,计算机才能够根据自己的密码本将我们用汇编语言,也就是助记符号编写的指令翻译成自己理解的二进制格式,这个翻译过程我们称之为汇编

2e2501f20436c8aadf9177680e75add9.png

汇编

机器语言和汇编语言也被称为低级语言,因为程序员必须了解计算机的底层细节,才能使用这些语言编写程序。因为这些指令都是在告诉计算机如何去读取和写入计算机的内存位置,要使用哪个寄存器来存储计算数值等操作,同时我们的程序员又无法具体的看到内存的形状,以及自己的操作过程,这让用汇编语言写任务指令也成了令人痛苦的事情。

为此,开发人员又想到了再次把这种操作内存位置和寄存器读取操作的细节隐藏起来,用某种符号替代一下,然后再给他们与汇编语言之间找个翻译,如此就有了更高层次的语言被设计出来,这就是更加接近人类语言的高级语言。像我们见过的COBOL、Pascal、FORTRAN、C、C++、Java、C#等都是由这种需求而催生出来的高级编程语言,它们都是基于英语语言,数学符号和标点符号来定义的,然后通过编译器也就是翻译来转换成各个机器自身的机器代码,进而让机器理解执行的。

我们通常把用接近于人类语言文字的高级编程语言写成的程序称为源代码。它们更接近人类所熟悉的书面语言。比如上面将两个数字相加的指令就可以写成:

int x = 15 + 12;

我们人类熟悉的数学表达式,理解起来容易多了,写起来也顺手多了,读起来也明白它要干啥了。

总结一下,计算机一堆破铜烂铁,只能通电后才有感觉,它只认识二进制0和1,因为它可以通过二极管用通电和断电两种状态表示出来,也可以用高电压和低电压表示这两个数字。而我们人类要是去用它们这种简单重复的语音表达是不可能的,所以用一些好记忆的符号代替,然后将这些符号组织成跟我们日常熟悉的语言文字相似内容来表示它们,让人来使用它。然后找翻译来帮助,这个翻译就是我们说的编译器或者解释器或者两个组合一起。

就是说,编译器是将用高级编程语言编写的程序翻译成机器语言的程序。编译程序类似是我们收到秘密情报翻看密码本去替换符号,从而理解信息。通常,它意味着将用高级语言编写的程序翻译成机器语言。

随着机器架构样式越来越多,找得翻译也越来越多,有些翻译可能不用懂的机器语言,它懂得另外一种语言,只要这种语言能够有人将它翻译成机器语言即可。这个过程称为编译,所以高级语言被编译的结果可能是低级语言,也可能不是,而是位于高级语言和机器代码之间的另外一种语言。比如Java语言的字节码,C#语言的IL等。它们要让机器理解并执行,还需要一个翻译就是我们的即时编译器JIT,来将它们翻译成各自的机器语言。

执行用高级编程语言编写的程序的另一种方法是以便翻译一边执行,即使用解释器。解释器不会立即将整个程序翻译成机器语言。相反,它一次读取一条用高级编程语言编写的指令,将其翻译成机器语言并执行它。我们可以将解释器看成一个模拟器。

f02691e9fdb8f16def3528bfabbe5db6.png

编程语言

有时编译器和解释器的组合可以用来编译和运行用高级语言编写的程序。例如,用Java编写的程序被编译成一种称为字节码的中间语言。用于Java平台的解释器,具体称为Java虚拟机(JVM),用于解释字节码并执行它。解释程序比编译程序运行得慢。现在大多数JVM都使用即时编译器(JIT),根据需要将整个Java程序编译成机器语言。有时,另一种编译器称为预编译器(AOT),用于将中间语言(例如Java字节码)中的程序编译成机器语言。

上面就是各种计算机编程语言的由来,细算起来也发展了有四五代了。一代比一代高级,一代比一代更接近人来的书面语言。

机器语言也被称为第一代编程语言或1GL。

汇编语言也被称为第二代编程语言或2GL。

高级过程式编程语言,如C、C++、Java和C#,其中必须编写算法来使用语言语法解决问题,也称为第三代编程语言或3GL。

高级非过程性编程语言称为第四代编程语言或4GL,在这种语言中,您不需要编写算法来求解程序。结构化查询语言(SQL)是应用最广泛的4GL编程语言,用于与数据库通信。

编程其实很简单,我们的世界里来了个只会说低等语言(0和1)的奇怪家伙,聪明又能干,我们人类就制造出了各种类型的中间翻译来想办法让他们理解我们人类的语言,从而听懂我们的话,替我们做事情。

我们从小学习的数学都是按照人类习惯的十进制法则进行的算术运算,可是计算机只能数0和1,只会进行二进制运算,所以要想理解计算机计算的秘诀,开始学习编程,先了解一下二进制算术运算吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值