• 2006-08-30

    源自GIMP的胡思乱想

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/3193040.html

    GIMP,GNU Image Manipulation Program的缩写,一个图像处理程序,熟悉Linux的人对这个名字应该不陌生,几乎所有Linux的发行版中都有它的身影,它的功能相当于Windows的Photoshop。工作需要,最近开始跟它打交道,悲喜皆有,于是有了一些胡思乱想。

    关于C程序的安装
    在*nix下,标准的安装过程是./configure, make, make install。

    屏幕上闪过一片片让人眼花缭乱的命令。幸福总是相同的,编译成功。不幸的却各有各自的不幸:不幸中的幸运是缺少东西,至少没有立刻宣判死刑,踏上未卜的前路,寻找拼图缺失的一角;更为不幸的是编译错误,稍微幸福一点的见错知意,手到病除,最为不幸的是只有对着屏幕发呆,一个陌生的程序,一大堆令人费解的错误。

    最初拿到GIMP,我试图在Cygwin下编译,我的Cygwin对于它来说并不那么完整。于是翻开INSTALL,寻找缺少的部件,未曾料到竟一路找了下去,GTK+、Glib、ATK、Pango、Cairo……。到最后,我停在了一个不知从何入手的编译错误上。这时,我想到了GIMP的INSTALL上的一句话:除非你对从源码构建软件非常有经验,否则不要尝试自己构建所有这些库。果然是经验之谈!遂转到Linux上,支撑环境的健全使得构建一次成功。

    对比Java的经验,从源码构建应用,C这套方法麻烦更多一些,当然,我这里指的是出问题的时候。因为Java出的问题多是缺少相应的类,一般都可以很容易找到,通常发布的会有源码和JAR两种形式选择,不愿意从头构建,就选择JAR。而对于C,一旦出了编译错误,基本上都很难解决,毕竟不是自己熟悉的。即便是缺少组件,因为C发布的大多是源码,而从源码开始构建本身就是一种风险,不要忘了,我们来自一个没有从源码构建成功的项目。现在各种各样的包管理器试图去协助解决这个问题,但标准的方法是根源,也是应用的最为广泛的形式,所以,问题很难得到完全的解决。

    关于移植性
    找几个C的项目来,你会发现稍微大一些的项目里面都有很多相同的东西,比如对于数据类型的定义,比如内存管理函数的封装,比如对多线程的封装……。这不是偶然,一切都来自C的可移植性。C当年凭借着自己的可移植性成功击溃了汇编语言,成为了一代语言霸主。平台的千差万别都要通过C来屏蔽,最初的时候,没有统一的标准,所以,每个项目都要通过自己的努力来做倒这些,所以,我们会看到类似的数据类型定义,类似的内存管理,类似的多线程……,以致于C程序员认为这是一种天经地义,于是有些年轻的项目一上来也是定义一套属于自己的东西。在程序设计的世界中,Java成功的解决了这些问题,它用虚拟机去解决平台问题,于是,C语言的这些问题随之烟消云散。当然,这并不是说Java世界就那么完美,社会在进步,所以同样的问题在Java世界以更高级的形式体现出来,君不见那么多的Web框架、那么多的持久化手段,那么多的DI解决方案。再造轮子不是坏事,新轮子总会拥有一些旧轮子不具备的东西,而旧轮子如果不甘心退出舞台,那就拿出更好的表现来。人们的选择是最好的评判。

    与Java的跨平台方式不同,C的跨平台常常是通过宏定义对平台的差异进行枚举。枚举的问题显而易见,稍不留神,便会遗漏。所以,对于Java那样,几乎一个平台编译没问题别的平台基本就没什么问题,而对于C,只要编译平台未能覆盖到,就可能出现编译错误。就像bug一样,找到的越多,也许剩下的就越多。

    顺便说一下,C用得越多,我越喜欢宏,它几乎就是一种元语言。现在DSL的概念开始流行,宏是一个不错的DSL载体。当然,它是一把双刃剑,所以,在实际开发中,我也不便多用。

    关于插件结构
    GIMP是一个基于插件的架构,我知道,熟悉Java的人脑子里出现了Eclipse。Eric Raymond在他的《Unix程序设计艺术》中讨论模块化时谈到了它。从我了解的情况来看,对于那些跨越时间的程序都有很强的可扩展性,比如TeX,比如Emacs,比如Unix。时间会改变一切,再好的设计师也无法预测未来的所有变化,与其费尽心力去完成不可能的预测任务,倒不如敞开大门,让程序拥有可扩展性,让未来的人来编写代码满足自己的需求。从这点上来看,Eclipse已经有了很好的基础,至于它是否能够跨越时间,慢慢来。

    设计是为了应对变化,如果不变,再好的设计也是枉然。看过那么多关于设计的书,了解了那么多设计的原则,不妨再向这些拥有悠久历史的软件学习,它们真正体现了程序设计之道。

    分享到:

    历史上的今天:

    引用地址:

    评论

  • 你到北京了?
    回复yanger说:
    没错,已经在北京了。
    2006-09-02 22:33:07