什么是编程语言

引言

在我刚接触计算机的时候,也整天闹着要编程编程,不时喊出像下面的口号:

是的,我们都知道学编程就要学 “编程语言”,却很少细想为什么叫编程语言。其实我们不了解这里面的原委也可以学习编程语言,但对于新手而言,往往会有一种莫名其妙的感觉——我正在编写的代码都是我臆想出来的,计算机是一个没有生命的机器,它为什么能理解呢?它为什么知道要这样执行呢?它难道有我们大脑的智慧吗?本篇就是为了解开大家的这些困惑而设置的,理解了程序的工作原理将有助于我们更好地编程。

现实世界

试想一下,如果两位互相不懂对方国家语言的人要进行沟通,他们应该怎么办?

 

很显然当右边美国人说出 “Hello World” 这句话后,左边的中国人并不能理解。那我们有什么办法可以克服语言的障碍呢?对!用一本词典

 

词典记录了对方语言的词汇、语法和语音,我们从词典分别找到了Hello和World的中文含义,再结合语法规则,最终将 “Hello World” 翻译为 “你好世界”。

计算机世界

人类与计算机的 “沟通” 也是同样的道理,只是在计算机的世界里,我们写的语言叫 “编程语言”,计算机认识的语言叫 “二进制语言”,我们写的内容不再叫 “句子”,而叫 “代码”,根据具体使用的编程语言不同,会写出不同的代码,比如 “Java代码”、“C代码”、“Go代码”,比如下面就是我们人类编写的一段 “求1+2等于几” 的代码:

 

但遗憾的是,计算机不认识上面的代码,它只认识自己的 “二进制代码”,像下面这样:

 

我想你肯定会问:为什么计算机只认识二进制代码呢?这是因为我们通常说的计算机都是电子计算机,它是一个硬件,是由无数个逻辑电路组合而成的(集成电路),而电路的逻辑只有低电平(0)和高电平(1),只能根据0和1的无线位数和组合来表达信息。

那么问题又来了,人类使用的是编程语言,而计算机使用的是二进制语言,互相不能理解…

 

但聪明的科学家突然联想到了现实世界里的 “词典”,并在计算机里发明了类似词典一样的东西——编译器。从此,人类和计算机便能够顺畅地 “沟通” 了,就像下面这样:

 

我们写好的代码后会生成一个 “源代码文件”,只要将这个文件交给编译器,它是计算机上的一个特殊的软件,能够将代码 “翻译” 为二进制代码,形成一个二进制文件,最后我们再敲一个执行命令,就可以让计算机去执行这份二进制文件,得到想要的结果啦~ 比如这个例子中,它就能将1+2的计算结果3显示在屏幕上。

当然,计算机世界远不止这样简单,这里列举了三处可进一步研究的地方,可以提升对计算机程序的认识,大家可以有选择地看,不看也不影响后面的学习。

编译过程的复杂性

编译其实是一个很复杂的过程,源代码到手后,编译器要先对其进行词法分析,得到词法称谓,再进行语法分析,得到语法树,再进行语义分析,得到中间代码,再经过一轮优化,最后生成目标代码(二进制代码),最后再集结其他源代码编译后的目标代码,经过链接,最终生成一份可真正执行的二进制代码。编译其实也是计算机里比较难的内容了,有兴趣的朋友可以了解,《编译原理》有深入的讲解。

不能随处运行的二进制文件

源代码被编译器编译成二进制文件以后,并不是说将这份文件随便拷贝到一台别的计算机也可以正常运行,这与计算机的操作系统和底层指令集有密切关系,需要都匹配上才行。这也是编译型语言的缺点——可移植性差。

编译型语言与解释性语言

上述我们是将一份完整的源代码交给编译器去编译,一口气生成可被计算机执行的二进制文件,程序后续的执行不再需要编译器参与,这其实是 “编译型语言” 的工作原理,比如C语言、C++语言、Objective-C语言都是。而还有很多语言是 “解释型语言”,这种语言编写的代码不再一气呵成地生成二进制文件,而是需要依赖一个解释器,这个解释器按照程序的执行顺序逐行编译和解释执行,常见的有Python语言、JavaScript语言、Shell等。其实这两种类型语言也可以用现实世界的例子来比喻:解释型语言就好比 “美国人说一句,中国人查词典翻译一句,理解了再说下一句…直到说完最后一句”,而编译型语言就是 “找一个同时懂两国语言的人,把美国人要说的话翻译成一本中文书,然后中国人直接读这本书就知道了”。很显然,解释型语言的工作方式比编译型语言效率低,但不依赖特定的机器和操作系统,跨平台性更好。关于两种类型语言的优劣,大家可以自己去了解。不过我们后面要讲的Java语言比较特别,它从不同角度看,其实既是编译型语言也是解释型语言。

结语

总而言之,这也就意味着人类可以通过编程语言写代码,进而操控计算机做一些事情了,而计算机尤其擅长重复性的劳动,比如不停地进行加减乘除运算、不停地存数和取数、不停地刷新屏幕上的内容…科学家们正是利用了计算机的这个特性,发明了编程语言,但编程语言究竟长什么样呢?都有哪些 “词汇” 和 “语法” ?写代码和做数学应用题有什么区别?怎么样写的代码才算是一份真正的代码呢?这个就需要理解什么是程序思维了,后面有空会写一篇。

 

Leave a Comment.