从机器码到面向对象

1.从机器码到面向对象

本章节主要探讨是什么驱动着编程从机器码发展到了汇编语言,又从汇编语言发展到了面向过程编程,最后从面向过程编程发展到面向对象编程。通过这些探讨最终明确多年来的软件工程发展我们都解决了哪些棘手的问题。

1.1机器码

在真正的电子计算机诞生初期,没有有效的编程语言。在这个时期的计算机提供了最基础的由0和1组成的机器指令来供初代的程序员进行编码。
用机器码写的程序如示例-1-1所示。

101100000000000000000011
000001010000000000110000
001011010000000000000101

示例-1-1 8086机器上完成“s=768+12288-1280”的数字运算,对应的机器码

有了示例-1-1所示的机器码指令后,会将指令编排到打孔纸带上,输入到计算机中。如示例-1-2所示。计算机持续读取指点上的指令来完成任务。
打孔纸带示意图
示例1-2 打孔纸带示意图(可以假设有孔为1,无孔为0)

可以想象在通过这种方式进行编程场景大致会是这样——手里拿着指令手册来查询指令所对应的机器码,然后对纸带按照指定进行打孔。在计算机应用的早期,计算机所处理的任务多为简单的数学问题,也就是说当时的程序员所面临的问题复杂度在当时看来并不复杂。所以程序员可以快乐地遇到一个问题就打孔一个纸带然后输入到计算机进行求解。
但是好景不长,随着计算机的发展,计算机所能处理能力越来越复杂,指令集也成百上千地增加,同时程序也越来越长。这时程序员第一次感觉到这些又臭又长,一眼看不到头的机器码维护起来是那么令人抓狂。这时的程序员所渴望的就是一种有自然语义的助记符来帮助自己进行编程,汇编语言应运而生。

1.2汇编语言

汇编语言被称为第二代计算机语言,用一些容易理解和记忆的缩写单词来代替一些特定的指令。通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的bug修复以及运营维护都变得更加简单方便。但计算机的硬件不认识字母符号,这时候就需要一个专门的程序把这些字符变成计算机能够识别的二进制数或机器语言(汇编编译器)。

用汇编语言编写代码如示例-1-3所示。

mov ax, 300h
add ax, 3000h
sub ax, 500h

示例-1-3 8086机器上完成“s=768+12288-1280”的数字运算,对应的汇编指令
可以看到示例-1-3所示的程序比起示例-1-1来简单了很多,并且每条指令都是一个人能读懂的指令。这样编写和维护起来就轻松了很多。但是汇编语言还是存在一定的缺陷——程序员依然在面向硬件编程。也就是说我们在编写程序的时候不是在编写我们要解决的问题,而是要将问题翻译成一堆硬件相关的操作。这就要求程序员非常了解底层的硬件结构。为了屏蔽底层的硬件复杂性,前辈们提出了高级语言。

1.3高级语言

最初的高级语言代表有Fortran、LISP、Cobol等,不过影响最深刻的应该是C语言。有了这些高级语言后程序员不需要关注机器底层的低级结构和逻辑,而只要关注具体的问题和业务即可。
用C语言编写代码如示例-1-4所示。

int s=768+12288-1280;

示例-1-4 使用C语言完成“s=768+12288-1280”的数字运算
在拥有了高级编程语言后,程序员的第一个春天到来了。由于高级语言对底层硬件的屏蔽,让编程的门槛大幅降低。越来越多的人参与到程序编写,越来越多的业务也通过编程软件来进行实现。但好景不长,随着软件的规模和复杂度的大大增加,20世纪60年代中期开始爆发了第一次软件危机,典型表现有软件质量低下、项目无法如期完成、项目严重超支等,因为软件而导致的重大事故时有发生。
之所以发生这样的危机,究其根源便是软件编码过于随意,缺乏有效的代码组织和模块划分。为了解决这次危机面向过程(结构化程序设计)的编程思想被正式提出。

1.4面向过程编程

面向过程编程的核心思想是“自顶向下、逐步细化、模块化”。在这种思想的指导下,面向过程编程以过程(可以理解为方法、函数、操作)作为组织代码的基本单元。面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
在这种指导思想的基础上,程序员首先会用流程图分析出解决问题的每一个步骤,然后使用函数将每一个步骤进行实现,最后使用条件判断和循环将这些函数组织在一起来实现业务逻辑。在这个过程中程序员将大段代码拆分成了一个个独立的函数,最终得到的就是层层调用的函数,就可以将复杂的业务分解成简单的任务。这种方式以函数为单元,将相关业务紧密内聚在函数内部,最终达到高内聚低耦合的目标。
有了一个又一个的函数来封装重复的功能,代码的可维护性和重用能力都大大提高了。
这时程序员在面对复杂的业务逻辑时已经可以进行很好的应对了。但是随着软件行业的发展越来越迅速,需求变化也就越来越频繁。为了适应各种场景,面向过程的编码往往会存在着大量的条件判断语句——大体就是条件1该走设么逻辑,条件2该走什么逻辑,条件3等等。随着这些特殊逻辑的增加,本身清晰的代码逻辑不再清晰,新增一个条件判断是要在很多地方进行修改等等让软件变得越来越难维护的噩梦开始出现。最终导致软件的声明周期变短——重新开发。
其根本原因来自于面向过程编程在应对软件扩展时缺乏有效的手段。所以面向对象编程便呼之欲出了。

1.5面向对象编程

为了能够更好地应对需求变化所带来的软件开发复杂性,构建具有扩展性的代码的需求越来越迫切。而面向对象编程似乎就成了仙丹妙药。通过以“封装”、“继承”和“多态”三大基础特性为基础,以“单一原则”、“开闭原则”和“里氏替换"等原则性的定理为发展,最后诞生了设计模式以及完整的代码重构理论这些过程的不断完善,程序员可以基于面向对象的编程来完成现代软件开发中的各种复杂问题。
基于面向对象的编程思想来进行软件设计产出的结果就是一个一个的拥有属性和行为的对象之间的相互调用。并且这些对象都是所谓的“充血模型”。

1.6总结

从机器码到面向对象编程的过程中,以引入了一层一层的中间层作为代价,最终得到了一种以“对象”为核心的抽象编程模式。这种抽象编程模式符合人类对自然的抽象——我们会描述一个人有眼睛、鼻子等,这些都是人的属性;描述这个人可以走路、说话这些都是人的行为。在面向对象产生的运行代码中,就仿佛有这么一群拥有自己特有属性和行为的“人”在相互协作来对外提供一个完整的系统功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】JavaWeb项目中配置数据库的连接池

在META-INF目录下新建context.xml <?xml version"1.0" encoding"UTF-8"?> <Context><Resource name"jdbc/TestDB" auth"Container" type"javax.sql.DataSource"maxActive"10" maxIdle"4&qu…

面向对象那么好,为什么贫血模型如此流行?

2.面向对象那么好&#xff0c;为什么贫血模型如此流行&#xff1f; 2.1我们身边真的没有面向对象吗&#xff1f; 我们总是在强调我们的身边都是贫血模型&#xff0c;但是当我们仔细观察我们所引用的jar包时&#xff0c;我们会惊讶地发现&#xff0c;原来面向对象开发一直在我…

spfa_队列

spfa:1.当给定的图存在负权边时&#xff0c;Dijkstra等算法便没有了用武之地&#xff0c;而Bellman-Ford算法的复杂度又过高&#xff0c;SPFA算法便派上用场了.2.我们约定有向加权图G不存在负权回路&#xff0c;即最短路径一定存在3.思路&#xff1a;用数组d记录每个结点的最短…

Tomcat配置解析

Tomcat文件配置 tomcat解压后目录 bin&#xff1a;可执行文件&#xff08;startup.bat shutdown.bat) conf&#xff1a;配置文件&#xff08;server.xml&#xff09; lib&#xff1a;tomcat依赖的jar文件 log&#xff1a;日志文件&#xff08;记录出错等信息&#xff09; temp&…

教你配置安全的ProFTPD服务器(中)

二、 基本加固ProFTPD服务器步骤 1.升级版本 注&#xff1a;如果当前版本已经是最新版本&#xff0c;可以跳过第一步。 升级陈旧的ProFTPD版本&#xff0c;因为早期的ProFTPD版本存在的安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择&#xff0c;…

前端动画 wow.js 效果

让花里胡哨的特效变简单 wow.js动画class介绍 引入css样式以及js插件 <link rel"stylesheet" type"text/css" href"./css/animate.min.css"><script src"./js/wow.min.js"></script><script> new WOW().init(…

Clob类型转换为String

SQL CLOB 是内置类型&#xff0c;它将字符大对象存储为数据库表某一行中的一个列值&#xff0c;使用CHAR来存储数据&#xff0c;如XML文档。 如下是一个Clob转换为String的静态方法&#xff0c;可将其放在自己常用的工具类中&#xff0c;想直接用的话&#xff0c;自己稍作修改即…

Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML

同一文档在不同的编译或阅读环境中&#xff0c;需要使用特定的文档格式来打开&#xff0c;通常需要通过转换文档格式的方式来实现。下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式&#xff0c;如PDF、图片png、svg、xps、rtf、txt、xml等。 使用工具&#xf…

CentOS7上GitLab的使用

生成SSH Keys 生成root账号的ssh key # ssh-keygen -t rsa -C "adminexample.com" 显示pub key的值 # cat ~/.ssh/id_rsa.pub 复制显示出来的 pub key 以root账号登陆gitlab&#xff0c;点击 "profile settings" 然后点击 "SSH Keys" 将复制的pu…

数据与计算机通信复习重点

数据与计算机通信讲义 第一次课 网络概论 自我介绍 主要承担网络方向课程教学&#xff1a;计算机网络、网络程序设计等 负责课程设计、工程实训等实践教学组织&#xff1a;程序设计基础实训、OS课设、程序设计综合实训 课程安排 课程性质 理论课46学时&#xff0c;限选、考试、…

数据库:除运算

除运算 设关系R除以关系S的结果为关系T&#xff0c;则T包含所有在R但不在S中的属性及其值&#xff0c;则T的原则与S的元组的所有组合都在R中。用象集来定义除法&#xff1a;给定关系R&#xff08;X&#xff0c;Y&#xff09;和S&#xff08;Y&#xff0c;Z&#xff09;。其中X&…

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorflow使用了自动化构建工具bazel、脚本语言调用c或cpp的包裹工具swig、使用EIGEN作为矩阵处理工具、Nvidia-cuBLAS GPU加速计算库、结构化数据存储格式…

现共收到 5 个分组,其目的地址分别为: (1) 128.96.40.10 (2) 128.96.41.12 (3) 128.96.41.151 (4) 192.4.123.17 (5) 192.4.

计算目的地址的下一跳&#xff1a; 设某路由器建立了如表 1 所示路由表。现共收到 5 个分组&#xff0c;其目的地址分别为&#xff1a;(1) 128.96.40.10(2) 128.96.41.12(3) 128.96.41.151(4) 192.4.123.17(5) 192.4.123.90试分别计算下一跳解答&#xff1a; 用目的IP地址和路由…

衡量模块独立性的两个定性标准

衡量模块独立性的两个定性标准- 耦合&#xff1a;- 内聚内聚和耦合 模块的独立程度可以由两个定性标准衡量&#xff0c;这两个标准分别是内聚和耦合。 耦合衡量不同模块彼此间互相依赖&#xff08;连接&#xff09;的紧密程度&#xff1b;内聚衡量一个模块内部各个元素彼此结合…

【转】Docker学习_本地/容器文件互传(5)

1、查找所有容器 #docker ps a 2、找出我们想要的容器名字并查找容器长ID #docker inspect -f {{.ID}} python 3、拷贝本地文件到容器 docker cp 本地路径 容器长ID:容器路径docker cp /Users/xubowen/Desktop/auto-post-advance.py 38ef22f922704b32cf2650407e16b146bf61c221…

数据流图典型例题

数据流图典型例题 1.假设一家工厂的采购部每天需要一张订货报表&#xff0c;报表按零件编号排序&#xff0c;表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下列数据&#xff1a;零件编号、零件名称、订货数量、目前价格、主要供应商、次要供应商。零件…

对称机密算法与非对称机密算法

1、对称加密算法&#xff0c; 加密和解密用的是同一个密钥&#xff0c;常见的为AES算法。缺点&#xff1a;秘钥才传输过程中可能被截取&#xff0c;存在安全问题&#xff0c; 2、非对称加密算法&#xff0c;常见的为RSA算法&#xff0c;它不是像对称机密的算法&#xff0c; 双方…

白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)

白盒测试逻辑覆盖&#xff08;语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖&#xff09; 逻辑覆盖测试&#xff1a; 语句覆盖&#xff1a;每条语句至少执行一次判定覆盖&#xff1a;每一判定的每个分支至少执行一次条件覆盖&#xff1a;每一判定中的每个条件&…

03 CSS听课笔记

CSS&#xff1a;页面美化和布局控制 1. 概念&#xff1a; Cascading Style Sheets 层叠样式表层叠&#xff1a;多个样式可以作用在同一个html的元素上&#xff0c;同时生效 2. 好处&#xff1a;(1)功能强大(2)将内容展示和样式控制分离   * 降低耦合度。解耦   * 让分工协作…

安装MySQL时出现“服务没有响应控制功能。请键入 NET HELPMSG 2186 以获得更多的帮助。”的问题解决

安装MySQL时出现“服务没有响应控制功能”的问题解决第一步&#xff1a;设置环境变量第二步&#xff1a;初始化my.ini第三步&#xff1a;添加文件第一步&#xff1a;设置环境变量 安装MySQL时&#xff0c;运行“net start mysql”时出现“服务没有响应控制功能。请键入 NET HE…