程序员想什么之:模块化

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,连接开发者,连接迭代成长者

以上是关于程序员想什么之:模块化的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何实现模块化?

c语言中如何实现模块化?

python模块之logging

Py之模块

模块

Spring源码分析之AOP