从机器码到面向对象

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,一经查实,立即删除!

相关文章

spfa_队列

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

Tomcat配置解析

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

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

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

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

同一文档在不同的编译或阅读环境中,需要使用特定的文档格式来打开,通常需要通过转换文档格式的方式来实现。下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式,如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,点击 "profile settings" 然后点击 "SSH Keys" 将复制的pu…

数据库:除运算

除运算 设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,则T的原则与S的元组的所有组合都在R中。用象集来定义除法:给定关系R(X,Y)和S(Y,Z)。其中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.

计算目的地址的下一跳: 设某路由器建立了如表 1 所示路由表。现共收到 5 个分组,其目的地址分别为:(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试分别计算下一跳解答: 用目的IP地址和路由…

【转】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.假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下列数据:零件编号、零件名称、订货数量、目前价格、主要供应商、次要供应商。零件…

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

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

03 CSS听课笔记

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

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

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

时间序列模型——ARIMA模型实现预测

ARIMA模型和因子预测 文章目录ARIMA模型和因子预测一、ARIMA模型(整个周期)1.数据预处理2.展示时序图2.数据建模(1)差分d(2)p和q(3)选择模型(4)检验残差序列&…

线段树 离散化

题目一:E. Infinite Inversions 这个题目没什么思维量,还比较简单,就是离散化要加上每一个值的后面一个值,然后每一个值放进去的不是1 ,而是这个值与下一个点的差值。 因为这个数代表了一堆数,然后每一次的…

时序模型——如何用Python进行时序模型预测的baseline预测(简单规则)

时序模型——如何用Python进行时序模型预测的baseline预测(简单规则) 在对时间序列问题进行建模预测之前,通常可以通过一些简单的规则对结果进行提前的预测,可以作为baseline,供之后的模型进行参考。很多数据分析的比…

简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5}...},并使用python实现简单关联规则

题目: 简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5},{I2,I4},{I2,I3},{I1,I2,I4},{I1,I3},{I2,I3},{I1,I3},{I1,I2,I3,I5},{I1,I2,I3}},求频繁项集;并用py…

ASP.NET AJAX (Atlas) 拖放(Drag Drop)功能6种实现方法总结

在Ajax程序中实现传统桌面程序中异常简单的拖放功能却并不是件容易的事情。然而Web上的拖放功能又如此的让人痴迷,所以几乎每个成熟的Ajax类库都提供了自己的一套实现拖放的封装,ASP.NET AJAX (Atlas) 自然也不例外。本文将总结并简要分析ASP.NET AJAX (…

python实现决策树-数据集如下图所示,根据我们对决策树的理解,设计一棵决策树,并输入{Age:36,Salary:H,STU:No,Credit:OK} 测试数据,是否与预期结果一致?

题目:数据集如下图所示,根据我们对决策树的理解,设计一棵决策树,并输入{Age:36,Salary:H,STU:No,Credit:OK} 测试数据,是否与预期结果一致?注意,不允许直接调用Sklearn提供的决策树方法 决策树算…

047 一维数据的格式化和处理

目录 一、概述二、数据组织的维度2.1 从一个数据到一组数据2.2 维度:一组数据的组织形式2.3 一维数据2.4 二维数据2.5 多维数据2.6 高维数据2.7 数据的操作周期三、一维数据的表示3.1 如果数据间有序:使用列表类型3.2 如果数据间无序:使用集合…