摘要: 介绍在普适计算的编程中遇到的问题。从传统的编程模式讲起,介绍了几种当前流行的普适计算编程模式,并比较它们的优劣点。最后,对各种编程模式做了一个总结。
关键词:普适计算;编程模式
1、前言
导致普适计算编程困难的一个很重要的原因是执行中的程序的运行环境随着用户的不断移动而一直在变化,甚至特定地理位置中的环境变量也随着时间推移而不断的在变化。这导致包括软件应用和设备功能在内的服务不能保证可用性。这就需要程序行为要能够频繁的随着环境的变化而调整,以保证其可用性。这篇文章将讨论在普适计算中适用的编程方法。
2、普适计算在编程上遇到的挑战
普适计算给我们带来了对未来美好生活的向往,但是同时也让我们面对一些棘手的问题。其中一个非常显著的问题是,用户的移动性和各种新设备的不断出现导致程序的运行环境不断的在发生变化。这导致很难确定服务包括软件服务和硬件设施服务的可用性。快速变化的运行环境需要程序不断根据当前环境调整自身行为,是导致困难和挑战产生的主要原因。
总体说来,建立这样的应用需要两部分协调工作:环境信息的收集、管理和传送;应用程序运行逻辑。做这样的划分可以极大的减小开发者在收集信息花费的精力和提高程序的工作效率。
3、传统的编程模式
在讨论普适计算编程之前,先回顾一下普适计算出现之前的编程模式,从中得到一些启发。
在汇编语言编程中所有底层机器的细节都没有得到屏蔽,程序员不得不理解和操作各个CPU内部寄存器和标志位。在比较两个数的大小的时候,我们关心的是数据间的逻辑关系,而不是一次减法操作会影响到哪些标志位。
在C语言编程中,程序员从复杂的寄存器操作中解放出来,可以精力集中在关注数据间的关系。然后提出数据结构的概念,其主要思想有三个:

数据赋予其意义后它才有了生命;
数据可以而且经常需要按一定结构组织起来描述一个事物;
程序可以分解成数据和对数据的操作。

C语言被称为面向过程的编程语言,站在面向对象编程的对立面。但是事实上,我们在使用C语言的时候都是在做模块化的程序设计。把每个工作主题分成一个模块,并给模块外部提供接口和服务。对于模块的使用者来说,不需要知道模块内的工作细节。
在模块化程序设计中,每个模块维护自己内部的数据。内部数据不论是全局还是局部都不会对其它模块有影响。每个模块完成自己相对独立的功能,并给外部提供接口和服务。 当模块同时为几个对象提供服务时还可以为每个对象创建其私有数据。那么对象和私有数据难道只能出现在C++或Java等面向对象的编程语言里?实事上在模块化的编程中已经产生的了封装和对象的概念。面向过程的C语言也能够在一定程度上实现“对象化的编程”。
面向对象的程序设计是一种思想,而不仅仅局限在C++或者Java。一般面向对象的编程语言和面向过程的编程语言相比有下面几个优点:

对数据和操作的封装更为严密。
增加了继承、多态和重载的概念。

面向对象的程序设计集合了之前程序设计理论的很多优点。但是对面复杂多变的普适计算应用环境仍然不能满足需求。
传统编程模式应用在普适计算中表现出它的不足。主要是因为,程序运行方式要随着环境变化而变化。不论是面向对象还是面向过程,都要依靠条件跳转实现。如果条件跳转情况复杂程序就变得复杂,不能针对特定应用环境独立开发。程序员需要考虑复杂多变的应用环境,使得程序开发无法进行。而且一旦有任何新的环境变量或者需要支持新的设备还要重新编写程序。
4、普适计算的编程模式
由于传统编程模式无法解决在普适计算中的程序设计中的复杂性,一些适用于普适计算的编程模式被提出来。这些编程模式关注于解决在较高的抽象层次上支持动态的变化的运行环境。让程序员可以真正关注程序运行的逻辑。
4.1基于环境变量的编程
在这种开发模式中,开发者把环境变量的定义和特定环境下和程序行为拆分开来。程序员只开发特定环境下和程序,然后组装起来运行。 在基于环境变量的编程模式中,使用内容过滤操作来选择特定程序组件去执行,这个内容过滤操作是基于环境信息和用户需求的。内容过滤操有两个问题要解决:一是使用什么方式来选取程序组件;二是如何切换程序组件。在这种编程模式中,开发者需要知道资源的状态,这显得有些不切实际而且定义大量的不同环境变量下的程序使问题变得非常复杂。而且环境变量情况复杂,经常有未预计到的情况出现,程序员将疲于应付枯燥的环境变量。
4.2基于设备间的关系
这种编程模式试图从较高的抽象层考虑问题。程序运行的环境不断的在变化:不停的有用户迁移;在同一地理空间也因设备的加入和移出而发生变化;随着技术的提高空间中的设备能力也会得到提高。所以很明显我们需要管理好空间中普遍存在的资源。
我们把不同的资源对应更具体的应用。在传统的编程中,程序员被普适计算中复杂的情况过度限制了,导致他们不能清晰的表达他们的需求,他们经常疲于处理细节和同步问题而不知道如果没有这些问题他们到底需要的是什么。这种编程模式通过强调程序元素之间的关系来更好的适应环境的变化。一种应用环境对应着一系统组件的组合。环境的变化对应这种组合关系的变化。
这种模式把关系分为:对象关系、设备关系和抽象关系。
5总结和展望
这篇文章从不同的抽象层讨论了各种编程模式。最有生产效率的编程环境是那些允许你在不同层次上进行抽象的编程环境。程序设计最一般的最有效的模式就是让程序组件化,让各个开发人员关注特定的事物,而不是面对着整个复杂的系统束手无策。在组件化的设计中,让各个功能或设备独立又协调的工作在一起组成一个大的可伸缩的自动调整的系统,这就是普适计算要达到的目标。
6参考文献
[1] Qingsong Yao,  Shan Chang,  Yong Qi,  Li Ming. New Programming Model for Pervasive Computing .
[2] JuanF.Navas, Jean-PhilippeBabau, OlivierLobry. MinimalyetEffectiveReconfigurationInfrastructuresin Component-BasedEmbeddedSystems.

该记录一下了。2009,能耗测试项目。但是所谓的能耗测试,在我这里完全就是一个软件开发过程,而且是一个开发没有什么具体功能的软件:和测试仪表通信;数据写入数据库。考虑系统扩展,通信方式可能变化,选用仪表可能变化。通信可能使用TCP/IP或者串口,仪表变化就面临通信协议的变化。设计方案采用类似网络通信的分层模型,分为通信层和协议层,以及更高层的数据处理。通信层实现不同方式的通信,统一的封装在一起,对上提供统一的接口。通信层用到的通信参数不由上层提供,而是自己由属于自己的界面获得用户输入。协议层负责实现通信协议,根据用户选用不同的仪表选择不同的通信协议。
每层做成DLL(动态链接库)封装。每一层只直接和其下一层接触。这种设计模式可以方便的实现扩展。
通信层和协议层实现可以理解为软件下层实现,通过这两层可以获得有用数据。然后进入软件上层实现。软件上层分主面板和子面板,子面板也由DLL做成封装,上层主面板只负责调用并显示子面板。子面板DLL中对上提供约三个函数调用:建立面板,设置面板属性,销毁面板。建立面板要传递父面板句柄给子面板,由设置属性可以确定子面板在父面板中在大小和位置。子面板的具体有哪些功能和控件父面板完全不用理会,只要生成子面板并确定其位置就行了。各功能模块可以在子面板中独立设计,父面板相当于只提供了软件运行的骨架。

一直在进行程序设计工作,没有功夫管理博客。现在有些不爱写“教科书”式的博客了。写了也没啥意思,飘逸潇洒在思维可能只会让大家大脑一片空白。

程序和文档本质上是一样的:都是对事物描性的文字,描述物体和过程;都是致力于再现现实生活,把现实中的事物抽象到大脑或者抽象到电脑再到大脑;使得人和人、电脑和电脑、人和电脑都是可以互相交流的;使得人类的知识可以得到碰撞、传承、积累和提高。
程序员应该锻炼这样一种能力:他能够清晰的再现他的想法,无论是以程序的方式还是以文档的方式。程序方式要求人和电脑都能够准确理解程序设计人员的想法;文档方式更接近人类自然思维,是人类更易理解的方式,常常这种方式更能容纳进步的和创新的思想。文字表达或许有的程序员并不擅长,也不在意,认为他们只需要有聪明的头脑就够了。而一些严格认真的软件开发团队在招募内测人员的时候都要求内测者有一定的表达能力,能够描述BUG发生的相关信息。
有时我们并没有让我们的思想——我们的程序和文档,变成有形的——纸质的或电子的——物理形式。而是更为快截的,口头或者就让它做为抽象的思想在我们大脑里。有时候我们应该保护这样的思想,不要让它一不小心溜走,再也不回来。因为这些最为活跃的形式,就像存在Cache里的数据还没来得及存回硬盘一样,需要程序员小心谨慎。