美文网首页程序员编程语言爱好者
如何理解所有的编程语言和语言

如何理解所有的编程语言和语言

作者: Oswinr | 来源:发表于2018-12-09 15:39 被阅读77次

我对上帝说西班牙语,对女人说意大利语,对男人说法语,对我的马说德语。
——法国国王查理五世(1500——1558)

首先,让我们先来玩个记忆游戏,请你仔细地浏览这张图,并尽可能记住所有的细节。仔细浏览的意思是说,从上至下,从左至右,从实线到虚线,每一个字、每一幅图都仔仔细细地看一遍。

自然 - 语言 - 符号


吾爱汝。
我愛你。
I love you.
Te amo.

上面四句话,是什么意思?换句话说,它背后的本质是什么?相信你一定懂得第一句和第二句话,即便你不懂第四句话,但通过前三句话,你也一定知道第四句话表达的是同样的意思——“我爱你”——就是这四句话的本质,它们唯一的区别是符号不同。
发现了吗?文字仅仅只是一种符号,光是看着 Te amo 这些符号的组合,你什么都不明白,也什么都做不了。只有当你把Te amo背后的那个“东西”与前面三个等同起来,它才有了意义和本质。
你完全可以自己设计出一套符号系统,用来表达,你想表达的含义,摩尔斯电码和盲文就是很好的例子。
数学,也是一种语言,某知名高数教材,面向大一新生直接引入极限的精确定义,使得初学者无法理解背后的本质,学起来必然痛不欲生。

机器语言与动物语言


小猫喵喵喵喵,小狗汪汪叫,语言学家和动物学者可能会说小动物不会语言。我不这么认为,难道发不出26个汉语拼音,英文字母的音就无法交流吗?实际上,小动物才是真正的交流高手。高手过招往往都是点到为止,因此小动物的交流也很简单,吃、喝、拉、睡——一个动词,无需多余的编码(code)组合就能表达完所有意思,且不会造成歧义,快捷又高效。

编码(code)
a. 一种在信息传输过程中用来表述祖母或数字的信号系统。
b. 由被赋予了一定主观意义的符号、字母以及单词所组成的系统,该系统可用于传输需要保密或简短的信息。
c. 一种由若干符号和规则组成的系统,用来向计算机表述指令。

相比之下,我们的语言就复杂得很多了,一说到学习英语,一些人就会苦恼,小的时候记26个字母的发音、写法,再大一点要记住它们的排列组合,也就是编码,再来还有它们的语法规则,主、谓、宾、定、状、补、从句……甚至人类的语言还有很多的“噪音”,歧义重重——往往越解释,越不清楚,越描越黑。

被误解是表达着的宿命。
——马东《奇葩说》

20世纪40年代末,第一台计算机诞生了,随着计算机的出现,一种新的语言也诞生了,叫做机器语言(machine language)。程序员使用这种语言编写程序,输入到计算机中,经过计算机的处理,产生结果再返还给程序员。机器语言(也称机器指令、机器码)是计算机可以直接识别的二进制位(binary digit)编码,之所以采用二进制,因为电路的电压便于用“高”和“低”两种状态来表示,就像这样:

10001100 10100000 // A加B

同样的它们都是符号,一旦经过设计和编码,就可以表达特定的含义。
和小动物一样,计算机也有基本的需求——做算术运算。“0”和“1”经过编码,就可以做出加、减、读、写等基本操作了。
但是,编程人员很快就发现了——作为人类自身的不足,用两种状态表达计算过程,容易出错,记忆困难,不便阅读,编写起来十分枯燥。

机器语言(machine language):以二进制形式表示的机器指令。
二进制位(binary digit):也成为位。基数为2的数字中的0或1,它是信息的基本组成元素。

汇编语言


程序员认识到这个问题,很快就设计出了汇编语言(assembly language),利用助记符来编写程序,顾名思义,是帮助编程人员记忆的符号语言。

add $t0, $s0, $s1 // 将寄存器$s0的值和$s1值相加,赋值给$t0
add $t1, $s2, $s3 // 将寄存器$s2的值和$s3值相加,赋值给$t1
sub $t0, $t0, $t1 // 将寄存器$t0的值和$t1值相减,赋值给$t0

但是根本问题依旧没有解决,计算机懂的是机器语言,不是汇编语言,因此每次使用汇编语言编写完程序后,还是需要程序员翻译为机器语言,这时,汇编器(Assembler)就诞生了,它充当翻译官的角色,将汇编语言翻译为机器语言。
由于汇编语言与机器语言十分接近,机器语言与汇编语言又统称为低级语言。虽然助记符比机器语言要容易记忆,但用它编写程序依旧十分繁琐,编程人员必须将注意力和时间消耗细节上,告诉计算机每一条指令的执行:第一步从内存的某一个位置取一个数,第二步加到某个寄存器中,第三步再……这些工作,费时费力,因此产生了新的需求。

汇编语言(assembly language):以助记符形式表示的机器指令。
汇编器(Assembler):也叫汇编程序,将指令由助记符形式翻译成二进制形式的程序。

高级语言与自然语言


记忆、阅读与理解起来困难,不符合人类的认知规律,高级语言应运而生。只要你学过四则运算,和初等代数,你就一定能理解下面这句话在做什么,满足了什么样的需求。

a = (b + c) – (d + e);

这段代码,和上面的汇编代码本质所做的事,满足的需求,所表达的含义是等同的,却更符合,人类的认知,容易记忆。

高级语言:如C、C + +、Java、Visual Basic等可移植的语言,由一些单词和代数符号组成,可以由编译器转换为汇编程序。
编译器:将高级语言翻译为计算机所能识别的机器语言的程序。这个过程相当复杂,不作过多介绍。

高级语言与低级语言在某些方向上是一致的,因为其本质的工作,所需要完成的任务本质上并无变化,不外乎要做基本的运算,所有的高级语言都有基本的运算符号,运算规则:

I love you.
She needs me.
They eat hamburgers.

人也有基本的需求,我爱你,我需要你,我吃汉堡,我喝可乐。语法老师在教你时,肯定会告诉你:

I 是 主语
love 是 动词
you 是 宾语

一个完整的句子必须有动词,同时你必须按照主+谓+宾的顺序来听说读写,那是因为“我”和“你”本身本无任何联系,“她”和“我”本身并无联系,“他们”和“汉堡”也无联系,而 love, need, eat 产生了动作,才使得他们产生了联系。自然语言中 I, you, she, me, they, hamburger 归类为名词,在编程语言中我们把它们称为类型。我们用编程语言的形式,可以将上面的三句话改写为:

love(I, you);
she(needs, me);
eat(they, hamburgers);

这时 I, you, she, me, they, hamburger 也叫作参数。love, she, eat 表示它们所完成的动作,称为函数
汉语和英语相比较而言,英语有16种时态变化,我们在学习与理解不同的语言时,要注重的是它们的共性与特性:

  • 词性(名词,动词,形容词,副词···)
  • 句子结构(主+谓+宾···)
  • ···

同样的,学习现代编程语言,也需要去学习和理解它们的特性:

  • 面向过程
  • 面向对象
  • 变量定义、引用
  • 算术运算
  • 函数定义、调用
  • ···

一部分初学者,甚至某些已经学过编程语言的人,还纠结于在选择什么样的编程语言这种问题上,是不正确的。
学习、理解或者掌握一门编程语言别无他法,就是学会使用其语言的特性,编写出一定数量的代码,像学英语一样仅仅靠背语法规则,但从不去使用在听、说、读、写上是行不通的。
更重要的是,带着问题,带着目的去运用语言。

后记


还记得开篇的图吗?同样的,与汇编语言一样,机器永远只能识别二进制,无法识别高级语言,我们需要将高级语言先转化为汇编语言,编译器就是用来翻译高级语言的。
我已经带着你遍历了自然语言、低级语言甚至是动物语言,希望看完之后你对所有的语言都有了更进一步的认识。
为了便于初学者学习,基本上已在文中出现的计算机相关术语下方,给出了较为准确的解释,希望可以帮助初学者更好的理解这些专业术语。

感谢阅读,全文完,喜欢记得关注打赏

版权所有,禁止转载

相关文章

网友评论

    本文标题:如何理解所有的编程语言和语言

    本文链接:https://www.haomeiwen.com/subject/wjahhqtx.html