一天我与一位程序员同事进行了一场关于将程序从一种平台移植到另一种平台时所引起的棘手问题的谈话。当我们在抱怨字节存储次序,对齐限制和编译器的怪异行为时,这位朋友问了我一个天真但又很重要的问题:“如果想要编写可移植代码,我应该去买本什么样的书来看?” 答案令人大吃一惊,市场上根本没有这一类图书。尽管关于Java、C#、.NET、游戏编程、DirectX、极端编程和敏捷开发方面的图书有好几百本,但就是没有一本关于跨平台软件开发的现代书籍!这使我感到震惊,特别是考虑到近来运行在服务器、桌面电脑、手提式电脑,甚至移动电话上的各种新的操作系统的大量通现。是否至少应该有一本书讨论有关可移植软件的开发原理呢?当然应该,但是事实上并没有。 这就是我撰写本书的原由。 在我的一生中只有几次感到了自己需要做些什么—— 其推动力是如此强烈,使我用将近一年的时间去研究和编写关于跨越平台软件的开发。 本书读者对象 在我第一次提出编写可移植程序这个概念时,并不确切明白本书预期的读者对象。但是当完成本书时,就非常确定本书的典型读者了:对编写不同平台软件感兴趣的中高级程序员。下面是那些将会从本书受益的读者群中的几个例子: (1) Windows程序员,他希望在家里获得Linux的经验; (2) Mac OS X软件开发人员,他需要将软件移植到Windows上去,以便获得更大的市场; (3) 索尼PlayStation 2的游戏开发人员, 他必须为其游戏的多用户组件编写Solaris服务器应用程序; (4) Palm OS软件开发者,他需要将他的软件移植到Windows Mobile上; (5) 大的纵向集成供应商刚刚发现他的传统开发平台被中止了,现在必须将他的产品移植到新系统上。 对于软件开发者为什么会需要或者想要将软件移植到新平台上去,存在着数不清的理由。但是值得庆幸的是,相同的原则在大多数的情况都适用,而与具体的细节无关。本书讨论那些可移植软件开发的普遍原则。 本书主要是为中高级程序员而写,但是本书很多读者可能是编程新手,他们只是抽象地听说过移植性,但是并不完全确切了解这将会如何影响他们。事实上,他们之所以不理解问题是什么,只是因为他们尚未遇见这个问题。有的具有更多经验的程序员也可能未遇见这个问题,因为他们长时间内工作于同一系统,不需要处理可移植性问题。 为了帮助那些尚未在与可移植性快速碰撞中“弄伤脚趾”的人,我罗列出了几个假设的程序员和他们的情况。如果您能够和他们之中的任何一个人对上号,那就应该警惕了,将可移植性上升到让自己“必须要关心的事情”的清单之中去。 Bob,Java程序员 Bob在过去3年中使用Borland 公司的JBuilder工作平台开发Windows应用程序。他一直在使用由Sun公司提供的Java运行时环境(JRE),并且很高兴能够编写有效、高质量的程序。作为一名Java程序员他对自己的能力充满了自信。 但是有一天他被告知,他的雇主希望使用 IBM AIX。起初他以为Java语言是“高层次的”、“可移植的”,并且是 “编写一次,到处运行”(这一点众所周知),转变不应该存在任何实际问题—— 只要将代码复制到新机器上,然后运行就行了。 Bob很快就发现在AIX上不能够使用JBuilder,在Windows JRE上的某些特性与AIX JRE上的特性有所不同。而且某些程序包在Windows上可用,而在AIX上则不可用。他需要确认它们在特征、性能特点、Bug和程序包方面的区别,而且还必须学习像Eclipse这样一整套新型开发工具。原本认为是理所当然“很容易的”事情,就这样迅速地变成了一场噩梦。 Janice,VB程序员 Janice多年来一直从事编写VB软件的工作,提供与Microsoft公司的Access数据库交互的窗体。她还没有意识到可移植性这个概念,因为她从来不用去考虑Microsoft Windows(或者是Microsoft公司产品)以外的世界。 她被要求将她的软件移植到Mac OS X上,不幸的是她作为一位以Microsoft为中心的开发者过着“与世隔绝”的生活。她惊慌地发现在Mac OS X上没有VB和Access。她不知道如何在这个工作平台上安装和运行软件。毋庸置疑,未来几个月对于Janice来说将是非常困难的,因为她需要学习跨平台软件开发的原委始末。 Reese,用户界面程序员 使用Visual C++和Microsoft Foundation Classes(MFC)作为工具,Reese在Microsoft Windows上设计并且实现了许多用户接口。他已经使用这些工具和框架迅速地开发了所要求的几乎任何类型的应用程序原形。 他公司的一位最大客户非常重视软件开发的经济性,因而偏爱低成本的Linux。所以Reese需要将他所开发的成套应用程序移植到该工作平台上去。Reese从未在Windows领域之外工作过,而且认为MFC很流行,在Linux上也会存在着兼容的版本。了解之后,他发现他的想法是不正确的。他现在必须学习新的开发环境、操作系统和C++变量。当然他还必须找到一个能够在Linux上取代MFC的替代品并移植它。 Jordan,Linux/PPC开发者 Jordan的专长是服务器软件开发。她被要求将她的成套服务器应用软件移植到Windows上,起初她认为这应该是一件很容易的事,因为她的应用程序没有任何用户界面。 她发现几乎她所使用的每一个主要的API(套接字、文件I/O、安全性、内存映射、线程等)外观以及行为与在Windows上的都完全不相同。她原想,她的程序很简单,而且使用了GCC(它在Windows上也可以使用),移植只需要用一两天的时间,但实际情况让她不知所措。 接着她发现Windows和Linux/PPC甚至在内存中表示数据的方式都是不相同的,她的程序中的大部分代码是依靠内存映射文件的,它们在Windows上无法执行。原本以为是很简单的事,现在看起来则要逐行地检查整个程序了。 在以上这些情况中,每一位能干的程序员都突然处于一种尴尬的境况:他们感到自己不那么胜任和有才能了,这主要是由于缺乏跨平台的经验。一个共同的错误则是严重低估了完成经理要求的“简单”任务所需的工作量。 本书并没有具体涉及到Java或者是VB,但无论是哪种语言,原理基本上都是相通的。本书揭示了与移植软件相关的问题和障碍。用这些信息武装起来,那些喜欢与单一工作平台打交道的人,当他们被迫走到自己专长领域之外时,就不再会感到如此震惊了。 联机信息资源 下面是与本书相关的可用资源信息: (1) 关于本书的信息,可以在作者的网站上找到,网址为 (2) 简单音频程序库(SAL)可以从网址上获得; (3) 可移植开源装置(POSH)可以从网址上获得。