《编程机制探析》第二章 计算机语言

关于外语的重要性,怎么强调也不过分。
关键时刻,外语甚至能救命。
我们先来看一则小故事。
老鼠妈妈带着孩子拼命奔逃,一只猫在后面紧追不舍。
跑着跑着,老鼠母子俩被逼到了一个死角中,无处可逃,眼看就要命丧猫口。
这时,老鼠妈妈临危不惧,直面大猫,狂吠几声:“汪!汪!汪!”
那只猫吓了一跳,转身就跑。
老鼠妈妈松了一口气,抓紧机会,对惊魂未定的孩子教育道:“看见没?学好一门外语是多么的重要啊!”
计算机语言实则也是一门外语。掌握这门外语也非常的重要。掌握了计算机语言,就等于掌握了与计算机交流的渠道。
人类发明了各种工具,作为自己身体的延伸。交通工具是脚的延伸,操作工具是手的延伸,而计算机,则是大脑的延伸。
计算机在中文里有一种十分形象化的翻译——电脑。由于这种翻译形象生动,言简意赅,很快就流行起来,成为大众化的称呼。
不过,业内人士对电脑这种叫法却抱有一种略带不屑的心理,感觉那是非专业的老百姓的叫法。业内人士只把计算机准确地叫做计算机。计算机的英文是Computer,就是计算器、计算工具的意思。
一些更专业的人士,甚至直接把计算机叫做机器。在他们的眼里,计算机只不过是机器的一种,和其他种类的机器没有什么本质上的区别。这种叫法体现了作为人类的专业人士的一切尽在掌握的优越感。而电脑这种称呼则无形中把计算机提高到与人类大脑平齐的程度,体现了老百姓对计算机这种神秘的、先进的事物的尊敬和崇拜感。所以,如果你需要昭显自己的专业程度,最好把计算机叫做计算机,或者直接叫做机器。
不过,我个人十分喜欢电脑这种形象而浪漫的称呼。计算机、机器这些称呼过于机械化,无形中为这个行业中多增加了一分枯燥和呆板。
当然,为了准确起见,本书还是会使用计算机这个名词。毕竟,虽然计算机能够做的工作越来越多,但本质上做的还是计算工作,还不能代替人类思考,达不到“脑”的程度。也许将来某一天,随着人工智能的发展,计算机能够真正地成为“电脑”。
人类发明的现有工具中,有哪些与计算机比较类似呢?首先跃入脑海的自然是计算工具,比如,算盘,计算器,等。
没错,顾名思义,计算机本质上做的就是计算工作。不过,计算机的计算工作方式与其它计算工具却大相径庭。
传统的计算工具,比如,算盘,计算器,其工作方式就如同懒蛤蟆一样,按一下,跳一下。每一个计算步骤,都需要人的参与,才能继续下去。
计算机完全不同。计算机的优越之处在于奇快无比(当然是和人类相比)的计算速度,一秒钟之内能够进行成千上万、甚至上亿次运算,远远超过了人类的反应速度。如果计算机的每一步计算都需要人的参与,那么必将极大拖慢计算机的速度,极大浪费计算机的工作潜力。
计算机的这种特性决定了计算机的工作方式:先由工作人员(即程序员)事先编制好计算过程(即计算机程序),然后,把计算过程传给计算机,并让计算机按照计算过程执行;然后,就是计算机的活了;马儿,你快些跑哎,快些跑!计算机就飞快地运转起来,以瞬息万千的速度执行着计算程序。
最早的计算机概念模型——图灵机,就是这样一个机器:一方面,它接受一条输入纸带,上面印满了计算过程;另一方面,它吐出一条纸带,上面写满了计算结果。
[img]http://dl.iteye.com/upload/attachment/545418/c0b362f6-f90c-3000-ba06-65af3c76397d-thumb.jpg[/img]
上图为“图灵机的艺术表示”,源自于互联网自由共享资源(作者Schadel授权任何人为任何目的使用这项作品)。
注:这里说明一下,为了增强本书的趣味性,我会在书中引用一些生动有趣的图片。为了表达对作者的尊重,并避免版权问题,我会尽量使用公共授权的自由共享图片,并给出作者信息。
如果你曾经见过八音盒的内部构造的话,你就不会对这种结构感到陌生。八音盒是一种机械播放音乐的装置,可以看作是一种固化版的、不需要用电的留声机。
我小时候没有见过八音盒,甚至不知道这种东西的存在。长大之后,我才见到了八音盒。那么一个小小的装置可以发出连续清脆的音乐,令我感到很奇妙。我很想弄懂它的工作原理。恰好,不久之后,我就见到了一个被拆开的八音盒。其内部工作原理立刻昭然若揭了。八音盒的发音装置很简单,就是一个小金属滚筒,加一排细细的金属簧片。金属滚筒上布满了小小的凸起。
当金属滚筒在发条的带动下,开始转动的时候,那些小小的凸起就会拨动和金属滚筒挨在一起的那排细细的金属簧片,就像一个人在弹钢琴一样,只不过乐谱早已固化在金属滚筒上了。那些小小的凸起,实际上就是一部乐谱,其位置排列都是按照乐谱来设定的。
有一个叫做akko golenbeld的艺术家,根据八音盒的原理做出了一个叫做“城市音乐”(CityMusic)的巨型八音盒:一个巨大的木桶上雕刻了一座城市的浮雕,旁边挨着一个钢琴;当木桶转动的时候,就会拨动琴弦,奏出这个城市的音乐。
[img]http://dl.iteye.com/upload/attachment/545420/cdcbf405-c3d8-3111-8fac-88399e008a8d-thumb.jpg[/img]
在akko golenbeld的网站,http://akkogoldenbeld.com/,你可以看到一段完整的动画,演示了这个作品的整个工作原理。
从外部观察到的工作原理上来说,图灵机模型和八音盒的工作机制是一样的。八音盒滚筒上的按照乐谱编制的凸起排列,就相当于图灵机模型中的布满了计算过程指令的输入纸带;八音盒播放出来的音乐,就相当于图灵机模型的输出计算结果的纸带。
当然,两者的区别还是很大的。八音盒构造极为简单,只是一个简单的发音装置。图灵机的内部计算部件则极为复杂。两者不可同日而语。两者只是在“事先编制”、“按章办事”这方面比较相似。
讲到这里,先说两句关于图灵的题外话。图灵机这个名字来自于英国著名的数学家艾兰•图灵。图灵机这个模型就是图灵提出来的,并因此而得名。计算机的最高奖项——图灵奖,也因此而得名。可以说,图灵在计算机界的地位,无人可以撼动。但是,图灵的一生,却在悲剧中结束。
1952年,图灵的同性恋倾向曝光,并因此而被判有罪——“有伤风化罪”(根据英国当时的刑法,从此案例中可以窥见当时所谓文明国家的文明程度),被迫接受了“化学阉割”——即女性荷尔蒙注射,消退性欲。此种刑法在不少欧美国家和地区实行。据说,此法能够有效遏制性犯罪。
两年后,图灵服用毒苹果自杀身亡。据说,其灵感来自于迪斯尼动画片《白雪公主》中的一句歌词——“毒液浸透苹果如睡之死渗入”。有一种说法,苹果公司的标志——被咬了一口的苹果——就是为了纪念图灵的死亡。
看了图灵的往事,令人不得不想到另一位同样性倾向的跳楼自杀的香港华人巨星——张国荣。不过,时过境迁,两者境遇已经完全不同。张国荣并非因为社会压力而自杀,而是因为不堪病痛折磨而选择结束了自己的生命。生在不同时代的两个名人,同样是同性恋,同样是日不落帝国英联邦势力辐射下的地区,虽然终点相似,人生遭遇却完全不同,令人不由心生唏嘘感叹。
好了,题外话就说到这里,我们言归正传,回到计算机语言的话题上。
首先,我们需要考虑的问题是,计算机为什么需要一门语言?或者说,计算机凭什么需要一门语言?
人类自诩为万物之灵长,一向自以为优越于其他物种,其最为自豪的能力之一就是语言能力。
而计算机,不过是人类发明出来的一种计算工具,它凭什么可以拥有一门语言?
其他的计算工具,比如算盘、计算器,从来都是人类拨一下,动一下,从没有奢望拥有什么语言。计算机为什么就这么特殊呢?
计算机确实就是这么特殊。前面说了,计算机的最为强大的能力,就是奇快无比的运算速度。为了最大发挥它的效能,不至于让人类的极低反应速度拖累它的功效,人类尽可能提前编制好计算过程,一次性地传给计算机,让它独立而不受干扰地运行。
这份提前编制好的“计算过程”是要交给计算机来执行的。计算机必须能够理解这份“计算过程”,才能够按章办事。这意味着,人类与计算机之间需要一种交流方式,换句话说,需要一种语言,这就是计算机语言。
计算机语言是人类设计出来的、由计算机理解并执行的一种语言。计算机虽然计算速度远超人类,但语言能力极其有限,只能理解最为基本的单词和语法。
计算机能够理解的单词,只有那么几个,基本上全是和本职工作相关的动词。其中,大部分都是关于计算的动词,比如,加、减、乘、除。这几个运算动词,由计算机的“脑部”执行。这些计算动词的意义和我们熟悉的四则运算基本一样,不难理解,不多做解释。
除此之外,计算机还有一个用“手”来执行的动词——存取。关于存取的内容比较容易理解,就是数据。但是,这个动作的关键在于来源地址和目标地址。比如,从哪里“存”到哪里?从哪里“取”到哪里?这个问题涉及到计算机的存储体系结构,比较复杂,我们后面慢慢阐述。现在,只要知道计算机有这么两个用“手”的动作用来存取数据就可以了。当然,这个“手”,只是计算机内部的手,只能在计算机内部伸来伸去,并不能伸到计算机的外部。
另外,计算机还有一个用“脚”的动作——跳转。同样,这个动作涉及到来源地址和目标地址的问题。比如,从哪里“跳”到哪里?这个问题同样涉及到计算机的存储体系结构,我们后面慢慢阐述。现在,我们只要知道计算机有这么一个用“脚”的动作就可以了。当然,这个“脚”,只是计算机内部的脚,只能在计算机内部跳来跳去,并不能跳到计算机的外部。计算机进行“跳转”动作的时候,并不是像我们人类跳槽一样,从一个公司跳到另一个公司,而是转换工作内容——放下手头现有的工作,去做另一样工作。
有了上述这些基本动词之后,我们就可以让计算机做事了。我们可以事先写好计算过程,比如,“先算这个,再算那个。先做这个,再做那个。跳到那里,再跳到这里……”
计算机接受到这些指令之后,就会一丝不苟地按章办事,乐此不疲,运转不停(如果不出错的话),直到运行到最后一条指令为止。
这种工作方式,很像是日本当年的产业工人的工作方式。日本有一种“手册工人”的说法,即一切按照手册办事,不需要思考,不需要质疑,只需要按章办事。这种工作方式确实极大地提高了日本企业的生产力。但是,这种把人类机械化的做法,必然会付出代价。日本企业已经认识到这一点,开始采用更加人性化的管理方式,不仅保护了工人的身心健康,还提高了工作效率和产品质量。
计算机是电子机械产品,没有情绪波动,没有思想活动,更没有心理健康的问题,承担“手册工人”的工作是再合适不过了。
但是,现实中总是充满了意外情况,“手册工人”也会碰到意外。这就像一个产业工人在安装螺丝的时候,恰好拿到了一颗坏螺丝,如果严格按章办事的话,就会把坏螺丝装上去。
这时候,就需要在工作流程上加上一条——如果螺丝坏了,那么换一个新螺丝,安装上去;如果螺丝没坏,安装上去。
这就需要产业工人拥有判断螺丝坏没坏的能力。同样,计算机也要拥有类似的判断能力。这就引入了一个新的计算机语指令——判断指令。
判断指令的引入,给计算机带来了基本的逻辑判断能力。当计算机遇到“坏螺丝”的情况时,会跳转到“换螺丝”的工作手册,进行“换螺丝”的工作流程,直到换到一个好螺丝,才会跳转到“安装螺丝”的工作手册。
好了,现在,我们已经凑齐了必备的计算机指令——加减乘除、存取、跳转、判断。
我们可以看到,这些词汇全都是动词,并没有名词,形容词,副词,助词,感叹词。这很好,很符合计算机的气质。计算机没有情感(至少现在还没有),计算机不会思考(至少现在还不会),计算机不需要读心情散文,也不需要读生活哲理,它只需要按章办事,它只需要看懂工作手册就行了。
计算机的字典里,全都是动词,而且全都是祈使动词,全都是人类发给它的命令——做这个,做那个,做十遍,等等。
用计算机语言编制的“计算过程”——即计算机程序——就是一篇充满了祈使命令语句的工作流程。这种以祈使命令为主题的计算机语言,也叫做命令式语言,从英文Imperative Language翻译而来。Imperative这个词的意思,就是命令的,强制的,祈使的。
现在就有一个问题了。既然专门有一个词语来定义计算机的命令式语言,难道计算机还有非命令式语言吗?答案是,没错,确实有其他类型的非命令式的计算机语言,但都是非主流,非主旋律,我们后面再讲到它们。现在,还是让我们回到计算机语言的最基本的词汇表上来。
前面讲了,计算机的字典中,词汇极其有限,主要就是那么几个动词——加减乘除、存取、跳转、判断。
与人类日常生活中使用的自然语言相比,计算机语言是如此的简单和贫乏,简直侮辱了“语言”这个词儿。如果外语都这么简单,那就太好了。
在我个人看来,计算机“语言”还根本不配称为一种“语言”,它还达不到语言的级别。
之所以称之为“语言”,主要是表达一种期待。
人们期望计算机某一天能够理解人类的自然语言,那时候,事情就简单了,人们可以像吩咐助手一样,用日常使用的自然语言吩咐计算机(那时候,应该叫做智能机器人了)做事,也不用编什么程序了。
好了,让我们回到现实。我们现在面对的现实是,计算机就那么一点可怜的理解能力,我们必须去理解它,而不是指望它来理解我们。当然,我们还是抱有一种奢望,尽可能地提高计算机的理解能力,让它尽量地理解我们。这就要具体分析计算机的理解能力了,看看它到底能够理解到什么层次。
首先,计算机从出厂开始,就可以理解最基本的词汇集——加减乘除、存取、跳转、判断。这些语言指令是固化在计算机硬件芯片里面的。如果没有软件支持的话,计算机的语言理解也就到这个层次了。这种语言叫做汇编语言,是计算机天生就能够理解并执行的语言,因此,也叫做计算机底层语言。
在计算机行业里,底层这个词,与社会底层这个词里的底层含义不同,甚至恰好相反。在计算机术语里,底层,意味着硬件层次。越底层,就越接近硬件层次,意味着专业程度越高、技术难度越高。
汇编语言,就是计算机不需要软件支持,仅凭本身硬件,能够直接理解并且执行的语言。因此,汇编语言可谓是最底层的语言。
这门语言为什么叫做汇编语言。说实话,我也不知道。这个词是从英文Assembly Language翻译过来的。Assembly这个词带有集成、装配的含义,意思是把一堆大大小小的零件装配在一起,集成一个整体。我们可以大致把汇编语言理解为一种最基本的配件级别的语言。
汇编语言的几个基本单词——加减乘除、存取、跳转、判断——可以直接交给计算机理解并执行,只是其中还要经过一个机器语言编码的过程。这种机器语言编码的原理和过程极为类似于电报收发时采用的“摩尔斯”电码。
原始的电报发报机只能发出极为有限的音节,比如,短音的嘀,长音的嘀。为了让发报机能够表达丰富多样的自然语言文字,人们必须给每个文字定义一个由一串短音嘀和长音嘀组成的编码。这就叫做“摩尔斯”电码。
同样,计算机能够识别的基本信号,也是极为有限的,只有“0”和“1”两种信号。那么,汇编语言中的每一个基本词汇,都必须指定一个由一串“0”和“1”组成的编码,计算机才能够识别并执行。
计算机有了汇编语言,就有了与人类交流的最根本的基础。人类可以通过汇编语言来编制各种各样的计算机程序,交给计算机执行。
但是,汇编语言太基础了,以至于基础到人们无法容忍的程度。
比如,如果想对计算机表达这么一个意思——“遇到前面的路口,向左转”,那么,你必须写一大串的基础语句来定义这个流程:
第一步,向前走。
第二步,判断是否遇到路口。
第三步,如果不是路口,跳转到第一步;如果是路口,继续向下执行第四步。
第四步,向左转。
这种写法实在太繁琐,太烦人了。为了解决这个问题,人们又创造出来了更高级的计算机语言,可以用更简单、更类似于自然语言的词汇来命令计算机做更多的事情。
所谓高级语言,只是比汇编语言高级一些,其实也高级不到哪里去,只不过是多加了像“如果…就…”、“重复”、“调用”这样的几个单词和语法结构而已,与人类的自然语言相比,还是简陋得要命。
不过,既然有汇编语言垫底,我们也姑且从众,称之为“高级”语言吧。
汇编语言是计算机硬件级别支持的,而高级语言通常是计算机软件级别支持的。
硬件和软件,这两个词前面也反复提到过。那么,究竟什么是硬件,什么是软件呢?这就涉及到计算机体系结构的问题了,这也是下一章我们要探讨的问题。

《编程机制探析》第二章 计算机语言相关推荐

  1. 《编程机制探析》第六章 面向对象

    <编程机制探析>第六章 面向对象 面向对象(Object Oriented)是命令式编程的主流编程模型,其概念极其重要.可以说,命令式编程几乎就是面向对象的天下. 面向对象(Object ...

  2. 《编程机制探析》第七章 设计模式

    第七章 设计模式 什么是真正的面向对象的设计?这是一个困扰我多年的问题. 当年,面向对象的各种神话甚嚣尘上,一个程序员要是不能侃上两句面上对象,都不敢出门见人. 那时候,我接触的第一门面向对象语言是C ...

  3. 《Java语言程序设计与数据结构》编程练习答案(第二章)(二)

    <Java语言程序设计与数据结构>编程练习答案(第二章)(二) 英文名:Introduction to Java Programming and Data Structures, Comp ...

  4. 并发编程的艺术:第二章

    第二章:Java并发机制的底层实现原理 Java代码在编译之后会生成字节码文件,也就是.class文件.class文件经过类加载器的加载到JVM中,JVM解释字节码文件,最终转化为汇编指令在CPU上执 ...

  5. python编程入门经典 评分-《Python编程入门经典》--第二章:数值和运算符

    一.在字符串中包含不同的数字 在第一章中使用格式说明符将两个字符串连接在一起时,用到了格式说明符%s,它的含义是"一个字符串".由于数值和字符串有不同的类型,必须使用不同的说明符将 ...

  6. 战场态势感知中的注意力机制探析

    摘要:战场态势感知是指挥决策的基础.开展对战场态势感知机制的研究,可以从理论上厘清机理, 为将来设计智能认知模型与算法,辅助指挥员进行态势感知奠定基础.从注意力机制入手,综述了 心理学和态势感知理论中 ...

  7. Python编程高手之路——第二章:流程控制

    二.流程控制 2.1 运算方式 计算机的核心部件是CPU,CPU有两个功能,控制和运算: 2.1.1 数学运算 print(a ** b) # 幂 print(a // b) // 取整数 2.1.2 ...

  8. Linux编程手册读书笔记第二章(20140330)

    内核:管理和分配计算机资源(即CPU.RAM和设备)的核心软件层 Linux内核可执行文件采用/boot/vmlinuz或类似的路径名,"z"表明内核是经过压缩的可执行文件. 内核 ...

  9. 【Java并发编程的艺术】第二章读书笔记之原子操作

    前言 今天的笔记来了解一下原子操作以及Java中如何实现原子操作. 概念 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意 ...

  10. Java编程思想学习-《第二章 一切都是对象》

    第2章 一切都是对象 尽管Java是基于C++的,但是相比之下,Java是一种更"纯粹"的面向对象程序设计语言.Java语言假设我们只进行面向对象的程序设计.也就是说,在开始用Ja ...

最新文章

  1. Interpreter - 解释器模式
  2. 机器学习:从入门到第一个模型
  3. 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
  4. CF700E-Cool Slogans【SAM,线段树合并,dp】
  5. LeetCode 1838. 最高频元素的频数(二分查找)
  6. [秘技]解决QQ音乐超出服务区域问题
  7. 直角三角形的边角关系_三角形的边角关系巩固练习
  8. Spark面试题梳理
  9. OpenPDF 或 itext5 根据pdf模板生成多页PDF
  10. win10提高开机速度只需要5步
  11. 请问如何让路由器信号增强
  12. 学系统集成项目管理工程师(中项)系列17a_范围管理(上)
  13. 无需公网IP,免费内网穿透【cpolar】访问内网服务
  14. p1904 p1903
  15. SuperSocket 入门,实现客户端和服务端消息互发
  16. openLayers交互
  17. PHP源码分析(内存管理)
  18. JavaScript正则表达式大全(过滤Emoji的最佳实践)
  19. 抖音实战~发布短视频流程梳理
  20. 上机作业:日历(java)

热门文章

  1. Mac - 当前位置打开终端
  2. 苹果Pro安装win10鼠标不能用的问题
  3. 什么短视频更吸引人?考虑到三点,吸粉引流不在话下
  4. 美团智能配送系统的运筹优化实战
  5. excel计算机一级打不开,电脑打不开excel表格是怎么回事呢?
  6. python怎么读取api接口_python 获取api接口
  7. 抖音微信登录服务器繁忙,抖音微信登录不了_抖音微信登录不上原因解决介绍_游戏吧...
  8. 中兴新支点操作系统_中兴新支点操作系统下载
  9. iOS相册权限、相机权限、麦克风权限
  10. win10系统迁移到新固态硬盘,win10系统备份还原