1.7 编程语言的发展
编程语言以既定的语法规则,使用一组自定义的特定标记字符流或关键字,实现基本的顺序、条件、循环处理,这样的逻辑通过编译或解释形成计算机底层硬件可以执行的一系列指令,来自动化执行某种逻辑计算或实现某种需求。计算机语言诞生的历史虽然很短,可是已经产生了上千种编程语言。为什么编程语言如此之多?其实这反映了一种生物多样化的自然属性。随着时代的进步,编程语言就像一棵树,树根是0 与1,越往上生长树枝越多,这些树枝快速产生的原因和计算机技术应用的快速蓬勃发展有关。计算机从单机时代,到网络时代、移动时代、云计算,直至目前的AI时代,总有一批编程语言随着大潮退去,又有一批新的语言随着浪潮诞生。从编程语言类型的角度,可划分为三个编程语言时代:
第一代,机器语言时代。机器语言的编程就是单纯的0 与1 的二进制流输入。机器语言的优点是可以直接对芯片进行指令操作,最大的问题也来源于此。换一套不同的硬件环境,机器语言几乎100% 卡壳。另外,指令不利于记忆,语言的生产率非常低。汇编语言本质上与机器语言处于同一个时代,只是在与机器指令对应的字符编程方式,以及助记符之上增加了编译功能。
第二代,高级语言时代。高级语言正是当前百花齐放的时代。正因为机器语言面向机器编程,理解度差,复用度低。无论是面向过程,还是面向对象,都是面向问题程,不是描述计算机具体应该执行什么样的分步操作,而是更倾向于描述需要解决的问题本身。面向过程更多描述的是解决问题的步骤,在实际步骤中协调各个参与方达成最后的目标;面向对象是抽象问题各方的参与者,包括领域对象、问题域、运行环境等,然后定义各个参与者的属性与行为,最后合力解决问题。高级语言时代,尤其是C、C++、Java、Python 等这些工业级语言的诞生和发展,使计算机行业得到极大的发展,推动了互联网和人工智能的快速发展。
第三代,自然语言时代。自然语言编程是面向思维或模糊语义的编程方式,软件生产只是思考问题本身的存在性和合理性,而不是定义问题的解决方式和解决步骤。这个时代很遥远,但很唯美。相信随着AI 科技的不断进步,一定会实现。
存在即是合理,本节并非讨论编程语言的高低优劣;对编程语言历史的回顾,只是让我们更加热爱从事的编程事业,了解那些大师们的伟大,体验语言背后的魅力与时代特征。
早在1936 年,图灵在《论数字计算在决断难题中的应用》论文中提出了图灵机的设想。图灵机假想有一条无限长的纸带,纸带上有一系列带有某种信息的方格,机器会根据当前状态和控制规则,处理当前方格上的信息,然后纸带移动或跳转一格。编写这个纸带的过程就是最初的编程雏形,形成的规则来操控图灵机进行顺序读取,或者直接跳至某个方格,在另一条纸带上写入某些信息。
冯·诺依曼被称为“计算机之父”,从世界上第一台计算机ENIAC到现在的服务器、笔记本、手机,基本上沿用了他的计算机结构设计理念。它根据电子元件双稳工作的特点,从简化机器逻辑线路的角度出发,明确提出了二进制理论,采用0 与1 代表十进制数值;提出计算机的基本工作原理是存储数据、处理数据、相关控制,定义出新一代机器的雏形,即分成五个部分,运算器、控制器、存储器、输入设备和输出设备。任何程序要想运行都需要加载到内部存储器(内存)中,在内存中才有资格和运算器、控制器进行对话,执行逻辑运算和数据处理,计算机雏形如图1-34 所示。
图1-34 计算机的基本结构
1946 年,按此设想的第一台计算机诞生,从此自动化处理的场景越来越多。计算机能够自动化处理的事情是需要以它可以理解的方式进行设计并录入的,这个过程称为编码。计算机只能消化两种录入的信息:0 或1。在机器语言编程的时代,编码就是这样枯燥的0 与1 的数据流录入。汇编语言以方便记忆的代号表示0 与1 的指令流,在执行时,再反向转成0 或1 的二进制流,这个过程称为编程。不再直接编写0 或1的机器码指令,而是以一定的方式组织成程序。至此,可以阅读的代码开始出现。到了20 世纪70 年代,丹尼斯·里奇设计的C 语言在BCPL 语言基础上诞生。UNIX 和Linux 系统成功推动了C语言的普及,至今C语言仍然是TOP 的主流语言,在操作系统、底层编译、硬件设备上依然发挥着不可替代的价值。C 语言是高级语言时代中的低级语言,低级的意思是更加贴近于硬件底层。这类低级语言使编程者有机会深入了解底层硬件,后续的众多高级语言的编译器本身就是由C 语言编写的。
后来出现的一种高级语言,火了一个岛屿和一种饮料:爪哇岛和咖啡,即Java语言。它的校验首字段即为十六进制的cafe babe,诉说着与咖啡的不解之缘,这是第一个真正面向对象的语言。
据不完全统计,当前编程语言超过1000 种,优秀的程序员至少需要掌握3 门语言,这有助于知晓不同语言的各自特性,更重要的是洞悉语言的共性和编程语言思想,跨越语言的抽象思维和架构掌控力。但是掌握不等于精通,真正的大师,需要醉心在某种语言,不断研究、不断打磨、不断回炉,才能达到炉火纯青、登峰造极的境界。我们写的每一行代码都是站在巨人的肩膀上,使我们看得更远。虽然任何编程语言的结构都是顺序、条件、循环,任何编程语言的本质都是输入与输出,但是0 与1 的世界一定会因为编程而变得更加智能、更加美好。