04 | 编程语言的进化
该思维导图由 AI 生成,仅供参考
软件是活的书籍
- 深入了解
- 翻译
- 解释
- 总结
编程语言的进化是信息科技发展中的重要组成部分,如同人类文明中的语言一样,为软件工程师和计算机之间的交互提供了基础。编程语言的多样性和对技术的精确还原使得软件成为了知识传承的重要工具。随着信息科技的发展,编程教育已经成为了基础教育的一部分,并且编程语言的范式也在不断进化,包括过程式、函数式和面向对象等。文章还介绍了面向对象和面向连接的编程思想,并将其进行了详细的对比。此外,文章还探讨了编程语言对架构的影响,包括开发效率和后期维护等方面。总的来说,编程语言的进化不仅体现在编程范式的演进上,还体现在工程化能力的完善和对架构的影响上。文章鼓励读者建立批判性思维,不断总结与反思,以期产生新的突破。
《许式伟的架构课》,新⼈⾸单¥68
全部留言(112)
- 最新
- 精选
- jilur置顶“我的演讲”,我也打不开。。
编辑回复: 我复制了一份出来,放到了网盘。链接: https://pan.baidu.com/s/1mQen5iJw5Ojwt2nEaePn0Q 提取码: swgb
2019-04-28328 - 有铭对象范式的原始概念其实根本不包括类和继承,只有1,程序由对象组成,2,对象之间互相发送消息,协作完成任务。最初世界上第一个面向对象语言是 Simula-67,第二个面向对象语言是 Smalltalk-71。Smalltalk 受到了 Simula-67 的启发,基本出发点相同,但是最大的不同是Smalltalk是通过发消息来实现对象方法调用,而Simula是直接调用目标对象的方法。Bjarne Stroustrup 在博士期间深入研究过 Simula,非常欣赏其思想,C++的面向对象思路直接受其影响,因为调用目标对象的方法来“传递消息”需要事先知道这个对象有哪些方法,因此,定义对象本身有哪些方法的“类”和“继承”的概念,一下超越了对象本身,而对象只不过是类这个模子里造出来的东西,反而不重要。随着C++的大行其道,继承和封装变成了面向对象世界的核心概念,OOP 至此被扭曲为 COP ( Class Oriented Programming,面向类程序设计)。 但是COP这套概念本身是有缺陷的:每个程序员似乎都要先成为领域专家,然后成为领域分类学专家,然后构造一个完整的继承树,然后才能 new 出对象,让程序跑起来。 到了 1990 年代中期,问题已经十分明显。UML 中有一个对象活动图,其描述的就是运行时对象之间相互传递消息的模型。1994 年 Robert C. Martin 在《 Object-Oriented C++ Design Using Booch Method 》中,曾建议面向对象设计从对象活动图入手,而不是从类图入手。而 1995 年出版的经典作品《 Design Patterns 》中,建议优先考虑组合而不是继承,这也是尽人皆知的事情。这些迹象表明,在那个时候,面向对象社区里的思想领袖们,已经意识到“面向类的设计”并不好用。只可惜他们的革命精神还不够,delphi 之父在创建.Net Framework 的时候,曾经不想要继承,在微软内部引起了很大的争议,最后是向市场低头,加上了继承。 2000 年后,工程界明确的提出:“组合比继承重要,而且更灵活”,Go和Rust也许是第一批明确的对这种思路进行回应的语言,他们的对象根本不需要类本身来参与,也能完成对象范式的多态组合。 历史让 C++走上了舞台,历史也终将让 COP 重新回到 OOP 的本来面目
作者回复: 赞。很好的学习材料。
2019-04-267284 - Junho关于许老师说关于继承的看法,我拜读后深有同感。尤其多层的继承,理解成本多项式上升。有点像,你想了解清楚眼前的这位妹子,不但要知道她已有的一切(所有逻辑成员),还要知道她所有祖上(继承链)的一切(包括private),更要知道这位女孩做了什么叛逆行为(override),还不得不知道,这些叛逆行为,会对祖传的既有秘方产生怎样的影响(调用override函数的函数)… 回顾一下最近自己工作的代码,的确不少的设计,最后会倾向于组合的方式。原本的想法主要是感觉,用继承的话,更像是可以去为了聊天而去相亲…不好意思说错了,是为了面向对象而去面向对象,一个月后,自己理解这部分设计也有不小的成本。读了许老师的课,才从更深层次的意识到这个特性的确有它天生的缺陷。
作者回复: 挺形象的比喻
2019-04-2828 - chitanda我的工作是Python后台。 Python开发效率是相当快的,能想到的功能基本都有比较稳定的库,开发起来贼快。 我公司三个后台,每个人写的Python都不一样,一个喜欢面向对象,一个喜欢类似过程式那种,另一个喜欢自创式。 自己开发功能虽然相当快,但是一旦涉及到维护其它人的代码,效率就一落千丈,总是看不懂或者想要重构😂😂。 最近裸辞了在家里学go,第一眼就爱上了这个语言。
作者回复: 👍
2019-04-26321 - 东次哒呲使用java四年了,看到封装,继承,多态的描述,特别精准,又有了更深刻的理解。 不了解go语言,比如有一个表单的基类,里面有基本的处理,子类继承这个基类,有自己特殊的实现。 这种情况,如何用组合实现呢?
作者回复: 这是受继承思维的影响了。其实继承实现了代码复用和多态两个东西,揉在一起。在go里面,组合实现代码复用,接口实现多态,彼此完全独立,非常清晰。
2019-05-09320 - 1900编程框架和编程范式具体有什么区别呢?感觉都具备约束、规范的作用。
作者回复: 最主要的差别是:编程框架通常是领域性的,比如面向消息编程是多核背景下的网络服务器编程框架;编程范式则是普适性的,不管解决什么领域的问题都可以适用。
2019-04-2619 - 1900变量不可变我理解的就是一切变量皆常量(或者只能被初始化一次),但是函数没有副作用就不懂了,副作用具体指啥?为什么内部有IO行为的函数就有副作用呢?
作者回复: 没有副作用是指对外界不产生影响,是纯函数。修改全局变量、发生io行为都是对外界的影响。
2019-04-26217 - 虎哥如果你想用函数式编程,你需要重修数据结构这门课程,大学里面学的数据结构是不顶用了。那应该学习什么可以给个建议吗?
作者回复: 资料不多。我当年翻过的资料: Purely Functional Data Structures - https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf
2019-04-2813 - 觉感恩大佬分享 随喜大佬 学生是java使用者 个人认为类之间具备‘is-a’的关系这种情况时 还是很有必要的;继承使所有子类公共的部分都放在了父类,使得代码得到共享,避免重复。 这是学生一点自己的理解 望老师批评指正,再次感恩老师分享这么好的课程 我当奉持 如法修行
作者回复: 逻辑上如此,这也是继承被发明的原因。但是软件工程的实践表明,继承带来了收益🈶️,但它带来的伤害更大。
2019-04-2611 - gopherliu后端服务可能趋向于标准化或者固定化,可能前端才是真正的战场。
作者回复: 这个我认同,我去年ecug大会演讲就是讲这个
2019-04-26310