-->

后端面试38讲_08_07丨编程语言原理面向对象编程是编程的终极形态吗

你好,我是李智慧。

软件架构师呢必须站在一个很高的高度去审视自己软件的架构,去理解自己的工作在更宏大的背景中的位置和作用,才能构建出一个经得起时间考验的软件系统。

这个高度呢既包括软件的高度和深度,也包括对软件编程这件事认知的程度。

比如说对软件编程的历史和未来的理解,以及对软件工作的价值和使命感的理解。

计算机软件编程啊是一个非常新型的行业程序员,这个职业的出现也不过半个多世纪。

但是人类进行软件编程的探索却要久远的多,这听起来有点不可思议。

人类在计算机出现以前,甚至在蒸汽机出现以前,就开始探索软件编程了。

最早开始探索软件编程的人是德国人、莱布尼茨。

早在十八世纪初,莱布尼兹呢就期望将各种事物通过一种逻辑语言进行描述,然后啊用一种可执行演算规则的机器进行计算,就可以计算出事物的各种结果。

这种思想其实和我们现在的软件编程与计算机已经差不多了。

莱布尼兹为了实现这个想法,进行了大量的工作,获得了丰硕的成果,其中呢就包括微机分号、二进制,但是人不能超越自己的时代。

莱布尼兹制造可编程计算机的梦想并没有实现。

又过了一百年,其中呢人卡尔发明了一台可编程的织布机。

这种织布机呢可以通过读起纸袋上的打孔,进而控制织布机织出不同的图案。

于是呢人们就开始尝试将打孔纸袋用于计算机编程。

十九世纪中叶,当英国人阿达利用打孔纸袋写出人类第一个软件程序的时候呢,距离能够运行这个程序的计算机的发明,还有一百年的时间。

而这个程序甚至已经包含了循环和子程序。

阿达因此被认为是人类第一个程序员科技发明受时代的限制。

而天才们的想象力和聪明才智,却可以超越时代。

人类发明制造计算机器,其实呢有非常悠久的历史。

但是这些计算机器都是专门进行数值计算的,加减乘除了、微积分了等等。

而从雷布明兹阿达到图灵芬诺依曼这些现代计算机的开创者们试图创造的呢是一种通用的计算机。

这些计算机不是读取数值进行计算,而是读取数据进行计算。

这些数据啊本身包含着计算的逻辑,这个数据呢就是程序。

当芬诺依曼在NEX计算机上输入第一个程序的时候,也就标志着现代计算机的诞生也意味着软件编程这一新型的行业即将出现。

信息时代,互联网时代将接踵而至,人类开启了有史以来最大的一次科技革命。

现在呢我们编程已经习惯打开IDE编写程序代码,然后编译执行或者解释执行。

认为编程好像就该如此,觉得那些不需要IDE,只需要写字板或者wim就可以编程的人就是大牛了。

事实上啊,最早的计算机编程非常麻烦,程序员需要将电线编来编去输入数据,控制计算机的执行,这也是编程这个词由来的传说。

不过呢很快人们就把打孔纸袋应用到计算机上,编程的效率也就提升了很多。

接近我们现在理解的软件编程呢要追溯到一九四九年,随着第一台可重塑程序的计算机的发明而出现,程序员呢终于可以写代码了。

这个阶段的程序需要牢记计算机指令的二进制编码。

软件开发就是直接利用这些二进制指令进行编程,所个程序指令,后面要带操作数。

操作数呢也是二进制编码。

所有这些二进制就是程序的代码,由程序员输入到计算机中。

现在的程序员们光是听听早期软件编程,这一番神操作怕就是崩溃了。

早期的程序员呢也意识到这一点,宝贵的时间和聪明才智不应该浪费在基于计算机指令的二进制编码上呀。

于是他们发明了汇编语言和使用机器指令二进制编码。

唯一不同的呢就是汇编语言提供了机器指令助记服务。

编程的时候,机器指令二进制可以用助记符代替。

但是呢软件编程依然需要使用计算机指令一个指令一个指令的进行编程。

因此啊,机器指令二进制编程和汇编语言编程本质上都是面向机器编程在计算机出现的早期,即便是对程序员来说,计算机也是一个神奇的存在。

同一台计算机可以进行科学计算计,可以进行弹道轨迹计算,还可以进行财务核算计算。

计算机强大神奇,而且编贵程序员们匍匐在计算机的脚下,使用计算机的指令进行编程,面向机器编程。

但是呢随着计算机技术的不断发展和计算机的普及,程序员们逐渐的意识到,计算机本身呆板,而机械真正强大,无所不能的是软件程序。

程序员为了更高效的进行编程,应该采用一种对程序员更加友好的编程方式,一种更接近人类语言的编程语言。

于是,各种各样的高级编程语言就出现了最早的高级编程语言,是fortune.这是一种专门用于科学计算的高级语言,诞生于一九五七年。

但是真正主流的被广泛使用的各种高级语言则诞生于一九七零年前后。

其中呢就包括c语言传说丹尼斯里奇发明了c语言,然后为了验证c语言的束缚,开发了一个demo,这就是unix操作系统。

那个年代,美国正限于越战的泥潭,大量的美国青年混沌东南亚的存林,更多的美国青年则在国内聚集起来,聚会示威游行,他们要独立、自由、和平。

有的人呢背着吉他,从一个城市流浪到另一个城市,而另一些人呢则坐在计算机终端前,摆脱了对计算机指令的束缚,使用高级编程语言进行软件编程,用另一种方式表达独立和自由。

这些高级语言呢使用人类语言作为编程指令,if else while break for go to.这些语句呢更符合人类的习惯和逻辑思维方式。

由于这些语言关注逻辑处理过程,所以呀也被称作面向过程的编程语言。

事实上,这些语言的本质是面向人的,因此这一时期爆发了各种编程语言,本质上说是面向人的编程语言,准确的说是面向程序员的编程语言。

高级编程语言的普及吗?释放了程序员的自主性,软件开发也就迎来了黄金语期。

程序员的一个极客时代到来了,比尔盖茨、乔布斯都是那个时代成长起来的。

但是啊人的欲望是没有止境的,人能做到的越多,想得到的也就越多。

越来越庞大的软件开发计划被不断的提得出来。

但是呢面向过程的复杂性,伴随着软件规模的膨胀,以更快的速度膨胀。

面向过程的软件关注逻辑流程,更容易被设计成面条式的程序,长长的过程调用执行。

像一根根面条,使大型项目最后由这样一根一根的面条组成,就成了一个毛线团。

最后呀谁也理不清了。

于是很多大型软件的开发过程开始失控,最终以失败告终。

人们遇到了软件危机,软件危机是人们重新审视软件编程这件事的本质。

除了一部分科学计算或者其他特定目的的软件,大部分的软件呢是为了解决现实世界的问题。

企业的库存管理啊,银行的账务管理啊这些。

所以软件编程的本质呢使程序员用代码的方式使现实世界的事物运行在计算机上。

计算机软件是为了解决现实世界的问题而开发出来的。

那么软件编程在这件事情应该关注的重点是客观世界的事物本身,而不是程序员的思维方式或者计算机的指令。

如果软件编程的重点是客观世界的事物本身,那么编程语言如何才能更好的满足这一需求呢?这就是面向对象的编程语言产生的原因。

面向对象编程,以对象作为软件编程的基本单位,提出一切接对象客观世界的用户账号商品是对象创建组合关联这些对象的工厂适配器。

观察者呢也是对象将所有这些对象分析设计开发出来,一个软件系统就完成了。

这个软件系统灵活强大,最重要的是可以根据需求变化快速更新维护。

我们回顾一下现代编程技术的发展,发现大体经过了面向机器编程、面向程序员、编程、面向对象编程三个阶段。

这正好对应了马克思经济学关于劳动力的三个要素。

劳动工具、计算机、劳动者、程序员劳动对象客观对象编程,从面向劳动工具进化到面向劳动者,在进化到面向劳动对象,面向对象编程似乎进化到了编程这件事情。

哲学意义上的终点是编程语言的终极形态。

现实看起来也确实如此,最近三十年诞生的编程语言呢,几乎全部都是面向对象的编程语言,面向对象似乎一统天下,但事实真的如此吗?回望历史,我们站在上帝视角,一切都如此清晰,充满条理,凝望未来,我们还能如此笃定吗?情况也许并非如此。

事实上啊,现实中的面向对象编程几乎从未实现人们意义中的面向对象编程。

我在文章中举了一个java的user对象势力,这是一我们经常见到却非常不面向对象的对象。

这个对象呢只有属性,没有行为,但现实中的user对象显然不是这样啊。

也许有部分企业和部分程序员做到了真正的面向对象编程,但是绝大多数程序员并没有做到面向对象编程,普及几十年了,大多数程序员依然做不到真正意义上的面向对象编程。

那么,是程序员的问题还是编程语言的问题呢?另一方面,一些新出现的面向对象编程语言,对对象的态度呢似乎也有点暧昧,对象的边界和封装性开始模糊。

文章的这一段有一段勾语言代码示例,在这里,nokiiphone和iphone都实现了封接口,但并不是显示的。

而随着科技的不断发展,特别是大数据、人工智能以及物联网的发展,面向数据的编程需求越来越多,能够更好的迎合这一需求的编程模型开始得到青睐,比如函数式编程。

而极客型的程序员对于强类型的面向对象编程越来越不感冒,他们希望在编程的时候能够得到更多的自由编程语言的重心,似乎重新向面向程序员的驱势。

随着计算机性能的不断增强,以及互联网应用对计算资源需求的不断增加,如何更好的利用CPU的多核,以及分布式集群的多服务器特性,逐渐的成为软件编程以及架构设计你要考虑的重要问题。

软件编程越来越需要考虑机器本身相对应的呢。

反应式编程得到了越来越多的关注。

编程唯物主义告诉我们,事物发展轨迹是波浪式、前进、螺旋式上升,有的时候似乎重新回到过去,却有了本质的区别和进步。

软件编程的进化史还在继续,你是否对未来充满期待和信心呢?今天我们回顾了编程技术的发展,通过这样的脉络梳理,你能更清楚目前面向对象编程的来源,更好的利用这一技术如何利用面向对象编程的特性进行真正的面向对象编程,而不仅仅是利用面向对象编程语言进行编程。

我呢将在第十六篇为你讲解不同的编程语言,在不同的应用场景中各有自己的优势和劣势。

你觉得哪些编程语言更适合用在哪些地方,适合处理哪些问题呢?欢迎在评论区写下你的思考,也欢迎把这篇文章分享给你的朋友,和同事一起交流进步。