人们常把程序称为计算机的灵魂。1976年瑞士计算机科学家Niklaus Wirth在他的惊世之作中提出了一个著名的公式:
程序 = 算法 + 数据结构
从今天的观点来看,它只能是对过程化程序的一个抽象定义,对面向对象的程序而言则不尽然。不过对我们学习C语言这样的面向过程的程序设计语言而言,是完全适用的。同时,C语言也能实现封装、继承、多态等面向对象风格的编程。从个人经验来看,当我理解用C语言编写面向对象的风格的编程案例后,面向对象编程中让人迷惑的那些初始化、this、方法(函数)多层次调用等概念恍然大悟,再也不感到恐惧和迷惑了。本文主要讨论面向过程编程常用的模块儿化程序设计思想。
图1 实现虚拟机原理
1、我们在计算机“大楼”的第几层
计算机这个大楼的基础是量子力学及半导体物理,自从图灵提出了理论模型,布尔创立了布尔代数,香农的硕士论文证明布尔代数可以用继电器的开关电路实现之后,随着晶体管的发明,计算机的电路才有可能微型化。计算硬件电路完成以后,还需要软件的支持,对程序语言的需求就凸显出来,最早的机器语言及汇编语言,后来慢慢出现的C, C++这样的高级语言等非常适合系统级编程,也是近距离观看和理解编程思想有效手段之一。
图2 计算机“大楼”的层次
在图2中各层具体含义为:1F量子力学、2F晶体管、3F逻辑电路、4F计算机体系结构、5F汇编语言、6F高级语言、7F应用程序。从这点可以看出,作为高级语言的C/C++在第六层(6F)。其中第三层(3F逻辑电路,即布尔代数可以用继电器的开关电路实现)是我们连接软件世界和电路(电子或电气)世界必经之路。工业和自控领域,继电器是理解二次侧回路和低压电路的必备概念,在后续文章中进一步讨论。
2、模块儿化程序设计
模块化程序设计就是进行大型程序设计的一种有效措施。其基本思想是将一个大的程序按功能进行分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。C语言是一种提供如下一些支持模块化软件开发的功能:
(1)函数式的程序结构:程序整体由一个或多个函数组成。每个函数都具有各自独立的功能和明显的界面。
(2)允许通过使用不同存储类别的变量,控制模块内部及外部的信息交换。
(3)具有编译预处理功能,为程序的调试、移植提供了方便,也支持了模块化程序设计。
无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一种,就是编写函数,至少也要编写一个main()函数。对新手来说,无论面向过程还是面向对象的编程,最终的难点在于函数编写(一般在面向对象编程中叫做方法)。因此,编写程序关键点在于将复杂问题分解成多个函数或对象后,逐步编写其中的运算操作语句和流程控制语句。
执行C程序就是执行相应的main()函数。即从它的main()函数的第一个前花括号开始,依次执行后面的语句,直到最后的后花括号为止。其它函数只有在执行main()函数的过程中被调用时才执行。如图3所示:
图3 将功能改为函数的过程
3、重新理解编程中的函数
高级语言中“函数”的概念和数学中“函数”的概念不完全相同。在英语中“函数”与“功能”是同一个单词即function。高级语言中的“函数”实际上是“功能”的意思。当需要完成某一个功能时,就用一个函数(可以是标准库函数或自己设计的函数)去实现它。在进行程序设计时,我们先集中考虑main()函数中的算法(相当于做事情前后顺序和处理步骤)。当main()中需要使用某一功能时,我们就先写上一个调用具有该功能的函数的表达式(或后缀为括号的具体函数名称)。这时的函数相当于一个黑盒子,如图4所示。
图4 函数代表着具有输入输出接口系统或黑盒子
我们只须知道它具有什么功能或作用,如何与程序通信(输入什么,返回什么),别的东西我们先不去处理它。图4好比“信号与系统”课程中的“系统”的抽象,但函数代表的系统输入和输出不是信号而是数据(当然信号也能用数据标识)。
如同设计一部机器一样,当需要在某处使用一个部件时,我们就先把它画上,并标明它的功能以及安装方法,至于如何制造先不用考虑,因为也许它可以直接购买来。设计完main()的算法并检验无误后,我们开始考虑它所调用的函数。在这些被调用的函数中,若在库函数中可以找到(像制造机器时,库房中已有的零部件),那就直接使用,否则再动手设计这些函数。这样设计的程序从逻辑关系上就形成图5所示的层次结构。
图5 C语言程序的层次结构
这个层次结构的形成是自顶向下的。这种方法称为自顶向下、逐步细化的程序设计方法。这种方法允许人在进行程序设计时, 每个阶段都能集中精力解决只属于当前模块的算法,暂不考虑与之无关的细节, 从而能保证每个阶段所考虑的问题都是易于解决的,设计出来的程序成功率高,而且程序层次分明、结构清晰。
4、结束语
函数不仅代表功能,也可以代表人或其他任何对象的抽象。一个部门的组织架构也用一个C语言多层次函数来描述。一个职责和任务没有划分清楚组织架构就像一个设计不合格的程序结构。许多大型软件系统包含了相当丰富的功能,意味着需要编写相当数量的函数来实现可供从事某种领域工作的人员使用。比如说,数据中心基础设施大致上可分为电源、电气、暖通、弱电、消防(气消)、装修、自控、柴油发电机组等。为了建设方方便,我们也可以将部分功能放到机房工程模块里。因此,怎么的划分各功能模块及其接口是某种程度上决定着软件系统性能、可扩展性和灵活性。
-
计算机
+关注
关注
19文章
7386浏览量
87646 -
布尔代数
+关注
关注
0文章
10浏览量
7857 -
半导体物理
+关注
关注
0文章
5浏览量
6404
发布评论请先 登录
相关推荐
评论