程序员想什么之:模块化
Posted 老王AI路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员想什么之:模块化相关的知识,希望对你有一定的参考价值。
模块化
如果你是一个新手程序员,或者新加入一家公司,不太熟悉业务流程,你会对代码的哪些方面感兴趣呢?
我一般会对这两个方面比较感兴趣:
1. 程序的启动阶段干了什么?
2. 程序的各个模块是如何调用的?
第2点包含了一个很重要的计算机思维:模块化。
「吴军的谷歌方法论」讲如何掌握计算机思维时,提到了模块化原则:
我们在生活中,做一个桌子,或者一个椅子,会直接去做。而在计算机的世界里,永远是先制作几个非常简单,能够大量复制的乐高积木块,然后用很多这样简单的模块,搭出复杂的桌子和椅子。
在软件世界里,模块是之于系统的一个概念,极客时间李运华讲架构的专栏里说(来自维基百科):
系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。是总体、整体或联盟的意思。
软件模块是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位。模块的接口表达了由该模块提供的功能和调用它时所需的元素。模块是可能分开被编写的单位。这使它们可再用和允许人员同时协作、编写及研究不同的模块。
总结一下就是:模块是从逻辑的角度对系统进行拆分后得到的。其实在软件构建开始阶段就需要考虑模块化了,这就是设计,设计需要在不同的细节层次上进行,大概有5个层次:
1. 软件系统
2. 分解为子系统和包
3. 分解为包中的类
4. 分解为类中的数据和子程序
5. 子程序内部
从机器指令到高级语言
我们知道,用原始的机器指令或汇编语言编写程序十分费事和乏味,效率低下,而且依赖于特定机器的CPU,这几乎是令人无法接受的。人们期望能够采用类似自然语言的语言来描述程序。
但自然语言的形式不够精确,所以类似于数学定义的编程语言很快就诞生了,20世纪的六七十年代诞生了很多高级语言。
FORTRAN语言。产生于50年代,是世界上第一个高级程序设计语言,由John Backus领导的一个小组研制。Backus当时一边开发FORTRAN语言,一边研究如何将这种代数语言翻译成机器语言,当时人们很关心这种语言被翻译后执行效率如何。FORTRAN最早引入了与汇编语言中助记符有本质区别的变量的概念,这奠定了程序设计语言中名字理论的基础。它所引入的表达式、语句、子程序等概念也是高级程序设计语言的重要基石。
FORTRAN语言因为高效率和完善的输入输出功能得到像IBM这样大公司的支持,一直受到人们的欢迎,至今仍在科学计算领域内使用。FORTRAN是一个固定格式的块结构语言,在某种意义上这是模块程序设计和分别编译概念的始祖。
可见,程序设计模块化的思想由来已久,程序模块化一直是人们追求的目标。一个软件太复杂时,我们不得不把它分割为一个个小的代码模块,各个突破,然后再根据需要将它们组装起来,这个组装模块的过程就是链接。链接的主要内容就是把各个模块之间互相引用的部分都处理好,使得各个模块之间能够正确地衔接。
刚才提到,我们需要将高级语言翻译成计算机硬件认识的东西,即0和1这两种状态。这个翻译的过程可分为:预编译、编译、汇编、链接四个过程。
预编译过程主要处理代码中以#开始的预编译指令,比如#include、#define等,经过预编译后的文件,不再包含任何宏定义,所有的宏已经被展开。
编译过程则是把预编译处理完的文件进行一系列词法分析、语法分析、语义分析及优化,生成汇编代码文件。
汇编过程是汇编器将汇编代码转变为机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
链接的概念早于高级语言
有了前面认识,我们再仔细看一下汇编和链接的概念是如何产生的。计算机的程序开发并非一开始就有着复杂的自动化编译、链接过程。最开始,程序员将程序在纸上写好,都是些机器指令,程序需要被执行时,再写到当时的存储设备(纸带)上,即在纸带上打孔表示相应的机器指令,如穿孔表示0,未穿孔表示1。
这种事,程序员显然是不能忍的,于是就想到了用符号来帮助记忆,比如跳转到程序某个位置这样编写:
jmp foo
有个汇编之后,生成力得到解放。软件规模日益膨胀,人们开始将代码按照功能或性质划分,分别形成了不同的功能模块,如C语言中的.c源代码文件,包含变量和函数这样的最小单位;更高级的语言如Java,每个类是一个基本的模块,若干个类模块组成一个包,若干个包组合成一个程序。
前一篇文章:
12周,坚持周更之3/12,连接开发者,连接迭代成长者
以上是关于程序员想什么之:模块化的主要内容,如果未能解决你的问题,请参考以下文章