2007年3月18日星期日

关于《C&P》这本书

为什么要写这样一本书?

当然,我可以理直气壮的说,我想赚些稿费(笑)。不过,要想赚钱,写作实在不是一个直接有效的方法。对我来说,写一本关于Python的书,是长久以来的心愿。而当我深入到Python与C/C++的混合开发领域,惊觉这方面的书竟然一本也找不到。

在与bug奋斗的日子里,我在想,既然没有人做,那么我就写一本介绍C/C++与Python结合开发的书吧。

C是一门高效的编程语言,C++是一门强大的语言,相比它们的强大和高效,Python是一门简单易学,容易使用,资源丰富,结构完备,但相对比较低效的脚本语言,双方取长补短的话,可以达到理想的平衡。难得的是,Python与C语言有良好的接口。我们可以用C语言编写Python的扩展模块,在Python代码中像普通的Python字节码包一样加载和调用,以此实现Python程序的性能优化。另一方面,也可以在C代码中嵌入Python虚拟机, 将它做为一个运行时的C框架来使用。这种优秀的结合能力加上C++的代码抽象能力,将C/C++语言与Python的结合简化到了一个很容易接受的程度。这得益于boost和swig等优秀的工具库对Python的有力支持。而我在这本书中,也着重介绍通过工具库(主要是boost::python)来实现混合开发。这本书定位于如何在C/C++中混入Python技术,而不是Python虚拟机的运行原理,这方面据我所知,国内也有一位专家正在撰写相关的书籍,而且会在本书面世之前与大家见面。

为什么这本书拖延这么久?

说起这个话题,我很惭愧,自元旦以后,我到现在才有一些比较整块的时间继续写作。中间这三个月,主要是搬家占用了太多的时间。再加上我决定改用ubuntu linux做为写作平台,这也占用了一些时间。但是今后我将会保持一个稳定的写作速度。

为什么要用windows之外的平台?

其实,我的本职工作是一个VC程序员。本书中所使用的代码,基本上都可以通用于windows和linux平台。我使用ubuntu linux做为本书的环境,最重要的原因,是希望可以摆脱盗版软件的问题。这么多年来,因为各种原因,我不得不使用各种各样的盗版软件。无论有什么样的理由,现在是时候甩开它们了。Python本身是一个开源技术,我不希望在这本书中满是各类破解软件的截图和使用说明,这对于秉承OpenSource精神发明和推广Python、Boost等技术的大师们,是一种不敬。

另一方面,做为有10年VC使用经历的我,深刻感觉IDE是一把双刃剑。VC并非不好,对于软件开发工作,好的IDE绝对可以大大提高生产力,而VC也的确可以达到这个目标。但是对于学习者,知其然且知其所以然,方能游刃有余。这里我也不会刻意使用过于简陋的工具,更不会强制读者使用这样的东西。但是我希望能够通过使用手动或者不那么“自动化”的工具,可以帮助大家了解代码之下的来龙去脉。所以我使用了GNU体系的开发工具,并且使用Emacs之类的编辑器来编写代码。这样的工具也一样可以有助于我们编写代码,但是它们不会影响我们了解底层的编译和调试过程。

Ubuntu Linux 6.10内置的Python是2.4,这给我带来了一些麻烦,但是我还是决定使用Python2.5做为主要的Python版本。很简单的原因——成书也需要时间,等到这本书面世,恐怕Python2.5已经成为主流的Python版本,到那个时间,再介绍Python2.4的内容,恐怕读者会有过时之感。

实际上,这可以说是一个假像,Python2.4到2.5的改进主要在在语言和VM效率方面,而Python API几乎没有什么变化,何况我们使用封装工具库来工作,这就将版本差异给混合开发带来的差异降到了可以忽略不计的程度,使用Python2.4甚至2.3的读者,都可以从这本书中找到对您有价值的内容。

技术的使用和选择,基于什么样的标准?

当然,每个操作系统都会有些自己的特产。不过,我们的讨论重点是与Python有关的混合开发技术,而不是操作系统的优劣,所以我尽可能使用跨平台的框架和技术。比如,在windows上,gcc/g++的表现并不见得就好过vc,但是前者有mingw和cygwin,vc却没有*nix实现。这方面,显然g++胜出。GUI框架的选择也是如此,选择wxWidgets,并非因为它的功能优于GTK或QT,甚至是WTL等,只是因为它是最容易使用,兼容性最好的GUI框架,在c++和Python上都有不错的表现。

编译工具方面,我本来准备使用make,但是在比较之后,我决定使用scons,这是一个使用Python脚本的编译工具。著名的3D软件Blender,就使用scons编译。相比make,对于Python使用者更容易上手。相信在国内,没有学习过make的C++程序员不在少数:),如果在同一个起步点上,Python语言更有学习趣味。而有makefile脚本经验的程序员,学习scons也不会是一件有任何难度的事。

我在本书中使用Emacs为主要的编码工具,这是因为近一段时间来,我业余时间使用最多的就是Emacs,它可以保证我用一套工具完成包括C++、Python以及其它多种编程语言的使用。但是,这不等于读者也一定要使用Emacs,我们介绍的是如何实现软件,不是如何使用编码的环境。您可以使用VI,也可以使用VC或Eclipse来编写同样的代码。这可以说是无IDE编码的一个优点。