面向对象程序设计的由来

前言

程序设计思想是计算机科学的核心之一,它随着硬件技术、软件需求和人类思维的进步而不断演进。从最初的面向机器编程,到面向过程、结构化程序设计,再到面向对象思想,程序设计思想的发展不仅提高了编程效率,还极大地改善了软件的可维护性、可扩展性和可重用性。本文将详细回顾程序设计思想的发展历史,并探讨其未来趋势。

1940 年以前:面向机器的艰难起步

机器语言:二进制的世界

最早的程序设计采用机器语言,直接使用二进制码来表示机器能够识别和执行的指令和数据。简单来说,就是编写 0 和 1 的序列来代表程序语言。例如,用 0000 代表加载(LOAD),0001 代表存储(STORE)。机器语言由机器直接执行,速度快,但编写和修改极其困难,程序编写效率十分低下,编写时间往往是运行时间的几十倍甚至几百倍。有个关于机器语言和比尔盖茨的笑话,说比尔盖茨拿着绣花针在一张光盘上戳出 Windows,若真如此,连简单的“Hello world”都能让人戳到眼睛冒烟。

汇编语言:符号的进步

由于机器语言编写难度大,汇编语言应运而生。汇编语言用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。例如,用 LOAD 代替 0000,用 STORE 代替 0001。虽然汇编语言提升了可读性,但本质上仍是面向机器的语言,编写依然困难且容易出错,很多计算机专业学生对汇编课程的练习程序仍心有余悸。

脱离机器第一步:面向过程的飞跃

高级语言的诞生

面向机器的语言被视为“低级语言”,为解决其存在的问题,计算机科学家们创建了面向过程的语言,即“高级语言”。面向过程的语言不再关注机器本身的操作指令和存储等细节,而是关注解决问题的过程。

面向过程的优势

相比面向机器的思想,面向过程是一次思想上的飞跃。它将程序员从复杂的机器操作中解放出来,关注具体问题的解决;具备移植性和通用性,不再依赖于具体的机器;更易于编写和维护,大大提升了程序员的工作效率,促进了软件行业的快速发展。典型的面向过程语言有 COBOL、FORTRAN、BASIC、C 语言等。

第一次软件危机:结构化程序设计的应对

危机的根源

一些面向过程语言中的 goto 语句导致了面条式代码,极大地限制了程序的规模。随着计算机硬件的飞速发展和应用复杂度的提高,原有的程序开发方式无法满足需求,1960 年代中期爆发了第一次软件危机,表现为软件质量低下、项目无法如期完成、严重超支等,如 1963 年美国水手一号火箭发射失败就是因为一行 FORTRAN 代码错误。

解决方案的提出

为解决软件危机,1968、1969 年连续召开两次著名的 NATO 会议,提出了“软件工程”的概念,但后来证明它无法完全解决软件危机。与此同时,“结构化程序设计”作为另一种解决方案被提出。Edsger Dijkstra 发表了《GOTO 有害论》的论文,引发了论战,并产生了结构化程序设计方法。第一个结构化的程序语言 Pascal 也在此时诞生并流行起来。

结构化程序设计的特点

结构化程序设计抛弃 goto 语句,采取“自顶向下、逐步细化、模块化”的指导思想。它本质上还是面向过程的设计思想,但通过这种方法将软件的复杂度控制在一定范围内,符合人类思维的 7±2 原理,成为 1970 年代软件开发的潮流。

第二次软件危机:面向对象程序设计的崛起

危机再现

结构化编程在一定程度上缓解了软件危机,但随着硬件的快速发展、业务需求的复杂化和编程应用领域的扩大,第二次软件危机很快到来。这次危机主要体现在“可扩展性”和“可维护性”方面,传统的面向过程方法已无法适应快速多变的业务需求。

面向对象思想的发展

面向对象的思想早在 1967 年的 Simula 语言中就已提出,但第二次软件危机促进了其发展。1980 年代,C++的出现使面向对象开始流行,后来的 Java、C#将其推向了新的高峰。虽然面向对象也不是解决软件危机的银弹,但它更加贴近人类思维的特点,是软件设计思想上的一次飞跃。

编程语言详细发展历史

早期萌芽(1940 之前)

第一个编程语言比现代计算机还早诞生。1801 年的提花织布机运用打孔卡上的坑洞代表缝纫织布机的手臂动作,实现图案自动化。爱达·勒芙蕾丝在 1842 - 1843 年间翻译文章时附加的计算伯努利数方法的细节,被部分历史学家认为是世界上第一个电脑程序。Herman Hollerith 用打孔卡编码并纪录 1890 年的人口统计数据。早期的计算机代码针对应用面设计,20 世纪前十年主要用十进制算数,后来发现可用数字表现逻辑。

现代编程语言的开端(1940 年代)

最早的现代化、电力引导的计算机约在 1940 年代被创造出来。程序员在有限的速度及存储器容量限制下,撰写人工调整过的汇编语言程序,但这种方式花费大量脑力且容易出错。康拉德·楚泽于 1948 年发表了 Plankalkül 编程语言的论文,但未能实现。这期间开发的重要语言有 Plankalkül、ENIAC coding system、C - 10 等。

蓬勃发展(1950 与 1960 年代)

1950 年代设计出三个现代编程语言,其派生语言至今仍广泛使用:Fortran(公式翻译器)、LISP(枚举处理器)、COBOL(通用商业导向语言)。1950 年代晚期的 ALGOL 60 报告强化了计算想法,提出嵌套区块结构、词汇范围等创新功能,并用巴科斯 - 诺尔范式描述语言语法。Algol 68 延续了 Algol 的构想,但因一些复杂功能而名声不佳,尼克劳斯·维尔特开发了更简单的 Pascal 语言。这期间开发的重要语言众多,如 Regional Assembly Language、Autocode、FORTRAN 等。

基础范式确立(1967 - 1978)

1960 年代晚期至 1970 年代晚期,大多数现在使用的主要语言范式被发明:Simula 是第一个支持面向对象开发的编程语言;C 是早期的系统程序设计语言;Smalltalk 是完全从零开始设计的面向对象编程语言;Prolog 是第一个逻辑程序语言;ML 是静态类型函数编程语言的先驱。这期间结构化程序设计引发争议,但后来程序员普遍认为除少数情况外使用 GOTO 是不良风格。开发的重要语言有 Logo、Pascal、C 语言等。

增强与模块化(1980 年代)

1980 年代的编程语言更强大。C++合并了面向对象和系统程序设计;美国政府标准化了 Ada 语言;日本等对第五代语言进行研究;函数编程语言社区聚焦于标准化 ML 及 Lisp。语言设计出现运用模块进行大型系统开发的趋势,Modula、Ada、ML 发展出模块化系统。编译技术也因 RISC 的进展得到关注。开发的重要语言有 Ada、C++、Common Lisp 等。

互联网时代(1990 年代)

1990 年代主要推动提升程序员生产力,出现了许多“快速应用程序开发”(RAD)语言,大多是面向对象的编程语言,如 Object Pascal、Visual Basic、C#。Java 具备垃圾回收机制,受到更多关注。新的脚本语言在网络应用上表现出色。开发的重要语言有 Haskell、Python、Visual Basic 等。

现今趋势

编程语言持续发展,目前的趋势包括增加安全性与可靠性验证机制、提供模块化的替代机制、组件导向软件开发、元编程、更重视分布式及移动式应用、与数据库集成、支持 Unicode 编写程序、图形用户界面使用 XML 等。开发的重要语言有 C#、Visual Basic .NET、F# 等。

编程语言发展史上的杰出人物

编程语言的发展离不开众多杰出人物的贡献:

  • 约翰·巴科斯,发明了 Fortran。
  • 阿兰·库珀,开发了 Visual Basic。
  • 艾兹格·迪杰斯特拉,开创了正确运用编程语言的框架。
  • 詹姆斯·高斯林,开发了 Oak,为 Java 的先驱。
  • 安德斯·海尔斯伯格,开发了 Turbo Pascal、Delphi 以及 C#。
  • 葛丽丝·霍普,开发了 Flow - Matic,影响了 COBOL。
  • 肯尼斯·艾佛森,开发了 APL,并与 Roger Hui 合作开发了 J。
  • 比尔·乔伊,发明了 vi,参与了 BSD Unix 和 SunOS 的开发。
  • 艾伦·凯,开创了面向对象编程语言,发起了 Smalltalk。
  • Brian Kernighan,与丹尼斯·里奇合著 C 程序设计语言书籍,是 AWK 与 AMPL 语言的共同作者。
  • 约翰·麦卡锡,发明了 LISP。
  • 约翰·冯·诺伊曼,发起了操作系统概念。
  • 丹尼斯·里奇,发明了 C。
  • 比雅尼·斯特劳斯特鲁普,开发了 C++。
  • 肯·汤普逊,发明了 Unix。
  • 尼克劳斯·维尔特,发明了 Pascal 与 Modula。
  • 拉里·沃尔,创造了 Perl 与 Perl 6。
  • 吉多·范罗苏姆,创造了 Python。

结语

程序设计思想的发展是计算机科学进步的重要体现。从面向机器到面向对象,再到多范式融合,程序设计思想不断适应新的技术和需求。未来,随着人工智能、分布式系统和低代码平台的普及,程序设计思想将继续演进,为构建更加复杂和高效的软件系统提供强大的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网搬砖工老肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值