Linux程序设计模式—机制与策略
什么是设计模式(Design pattern)?
    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、软件设计经验的总结。使用设计模式是为了提高代码或模块的重用、让程序更容易被他人理解、提高代码可靠性和可维护性。同时,通过学习设计模式可以降低解决一般性问题的开发难度。
Linux程序设计模式的起源和发展
    Linux程序的设计模式起源于Unix文化,是Unix哲学的重要组成部分,而Linux本身就是Unix的一个发展分支。Unix哲学说来不算是一种正规设计方法,它是自下而上的,而不是自上而下的。Unix哲学注重实效,立足于丰富的经验。你不会在正规方法学和标准中到它,它更接近于隐性的半本能的知识,即Unix文化所传播的专业经验。它鼓励那种分清轻重缓急的感觉,以及怀疑一切的态度,并鼓励你以幽默达观的态度对待这些。
什么是Unix哲学?
Unix管道的发明人、Unix传统的奠基人之一Doug McIlroy在[McIlroy78]中曾经说过:
    I. 让每个程序就做好一件事。如果有新任务,就重新开始,不要往原程序中加入新功能而搞得复杂。
    II. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的。输出中不要有无关的信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。
    III. 尽可能早地将设计和编译的软件投入试用, 哪怕是操作系统也不例外,理想情况下, 应该是在几星期内。对拙劣的代码别犹豫,扔掉重写。
    IV. 优先使用工具而不是拙劣的帮助来减轻编程任务的负担。工欲善其事,必先利其器。
后来他这样总结道(引自《Unix的四分之一世纪》):
    Unix哲学是这样的:一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。
从整体上来说,可以概括为以下几点:
01.模块原则:使用简洁的接口拼合简单的部件。
02.清晰原则:清晰胜于机巧。
03.组合原则:设计时考虑拼接组合。
04.分离原则:策略同机制分离,接口同引擎分离。
05.简洁原则:设计要简洁,复杂度能低则低。
06.吝啬原则:除非确无它法,不要编写庞大的程序。
07.透明性原则:设计要可见,以便审查和调试。
08.健壮原则:健壮源于透明与简洁。
09.表示原则:把知识叠入数据以求逻辑质朴而健壮。
10.通俗原则:接口设计避免标新立异。
11.缄默原则:如果一个程序没什么好说的,就沉默。
12.补救原则:出现异常时,马上退出并给出足够错误信息。
13.经济原则:宁花机器一分,不花程序员一秒。
14.生成原则:避免手工hack,尽量编写程序去生成程序。
15.优化原则:雕琢前先要有原型,跑之前先学会走。
16.多样原则:决不相信所谓“不二法门”的断言。
17.扩展原则:设计着眼未来,未来总比预想来得快。
    给大家推荐一本书《UNIX 编程艺术》————这不是一本讲如何编程的书,而是一本讲UNIX设计哲学的书,当然也适应于Linux。这本书是我来威胜工作后,同事们推荐我读的第二本书(范律推荐)。第一本书是《UNIX环境高级编程》(邱云松推荐),第三本书是《UNIX网络编程 第2卷 进程间通信》(张栋推荐),第四本书是《Linux设备驱动程序第三版》(刘利方推荐),第五本书是《linux程序设计第三版》(我推荐)。
什么是机制与策略?
我们通过下面文字来理解什么是机制与策略:
设备驱动程序的作用在于提供机制,而不是提供策略。
X(windows)致力于提供一套机制,而不是策略。
策略相对短寿,而机制才会长存。
前端实现策略,后端实现机制。
策略和机制是按照不同的时间尺度变化的,策略的变化要远远快于机制。
    把策略同机制揉成一团有两个负面影响:一来会使策略变得死板,难以适应用户需求的改变,二来也意味着任何策略的改变都极有可能动摇机制。
    相反,将两者剥离,就有可能在探索新策略的时候不足以打破机制。另外,我们也可以更容易为机制写出较好的测试(因为策略太短命,不值得花太多精力在这上面)。
机制与策略的实例:
(下面的讲解过程中,我会提出一些问题。如果回答错误将会有一个小小的惩罚)
1.Uboot的环境变量
    (bootcmd)
2.Linux驱动程序
    (examples/scull)
3.cmdline中的mtdparts解析程序
    (linux-2.6.32.2/drivers/mtd/cmdlinepart.c)
4.udev的rules文件自动执行U盘脚本
    (60-removable-storage.rules)
5.udev的net.agent,实现USB网卡的自动挂接
    (80-drivers.rules)
6.BusyBox工具集介绍
    (sed,awk,inetd,chat,crond,find,grep,getty-login-bash,start-stop-daemon,run-parts
7.嵌入式数据库
linux在线编程    (TokyoCabinet,Sqlite3)
8.脚本语言
    (SHELL,TCLSH,Lua,TCC,python)
9.图形界面库
    (qt,pyGTK)
MCU嵌入式系统中的机制与策略:
    MCU(Micro Control Unit,微控制器单元)片上集成外围器件,没有外扩总线,不带MMU单元是其的主要特征,比如ARM7,Cortex-M3系列等。与之相对的是MPU(Micro Processor Unit,微处理器单元)不带外围器件(例如存储器),是高度集成的通用结构的处理器,比如ARM926,Cortex-A8系列等。
    在资源非常紧张的深度嵌入式系统中,同样也有使用机制与策略设计模式的成功案例与成熟方案。例如:
    1.pForth,eForth,RetroForth
    Forth是六十年代末期,由Charles H. Moore发展出来在天文台使用的电脑自动控制系统及程序设计语言,允许使用者很容易组合系统已有的简单指令,定义成为功能较复杂的高阶指令。forth是一种可扩展的,交互式的语言。最初为小型的嵌入式电脑设计的,现在它几乎可以在任何主流的芯片上解译和编译,甚至已有多种可直接运行forth指令的芯片。
    /
    www.baymoon/~bimu/forth/
    www.softsynth/pforth/
    2. Pawn, Pawn+freeRTOS
    An embedded scripting language formerly called Small.
pawn is a simple, typeless, 32-bit extension language with a C-like syntax. A pawn "source" program is compiled to a binary file for optimal execution speed. The pawn compiler outputs P-code (or bytecode) that subsequently runs on an abstract machine. Execution speed, stability, simplicity and a small footprint were essential design criteria for both the language and the abstract machine.
    wwwpuphase/pawn/pawn.htm
    3. eLua, nutlua(Lua+Nut/OS)
    eLua stands for Embedded Lua and the project aims to offer the full implementation of the Lua Programming Language to the embedded world, extendi
ng it with specific features for efficient and portable software embedded development.
    www.eluaproject/
    hernut.de/en/firmware/nutlua.html
Forth、Pawn和Lua在其他领域的应用:
  Atari 的许多投币游戏机都是用 Forth 开发的。他们相信开发高性能代码的最快方法是使用 Forth ,加上使用汇编语言来重写最内层的循环。按照最近与著名的 Infocom 高级游戏开发者的谈话,他们的游戏解释器也是用 Forth 写成的。
  Unison World 为 CP/M 操作系统开发了许多游戏,全部都是用 FIG-Forth 编写的。按他们技术总监 Marc de Groot 的说法,把一个基于 Z80 的游戏移植到 6502 或者 MC6809 上,典型的时间不多于 3 个月。
  美国 Federal Express (联邦快递)公司的手持式行李分捡系统的程序是用 Forth 编写
的。项目经理 Gene Farrar 说,他可以按需要在几个星期内升级新固件,相比而言,其它的小组维护 C 语言代码则至少需要 6 个月的时间。
  1990 年 11 月哥伦比亚航天飞机的 4 个载荷中有 3 个是用 Forth 编程的。按设计团队之一Johns Hopkins University's Applied Physics Laboratory的 John Hayes 说法,他们选择 Forth 来解决飞行中的硬件问题,灵活性是一个主要的因素。
  SUN 公司把 Forth 用于它的工作站可编程 Boot ROM 中,以每天 500-1000 台的速度发货,是可编程 Forth 系统中数量最大的。 1994 年 IEEE 1275-1994 将 Forth 用于 BOOT (初始配置) 固件的标准,这也是 POWER PC 通用硬件平台的基础。
  在电影《终结者 II :世界末日》中, Cyberdyne Systems T1000 系统的特技效果是基于 Morphing 软件包 Forth 产生的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。