http://www.thinknext.net/archives/614

        UNIX高级编程Advanced UNIX Programming第二版是前一段时间UINX届比较引人瞩目的事情,informIT刊登了该书作者Marc Rochkind 回顾自第一版发布以来20年间变化的文章Has UNIX Programming Changed in 20 Years? 。

        Marc在1984年出版Advanced UNIX Programming的时候,UNIX已经走过了15个年头;完成第二版的时候,又一个20年过去了。人们会好奇地问,自1984年来,UNIX编程发 生了怎样的变化?嗯,实际上,有些事情丝毫未变--当然,也有很多已经大不相同。
       
        基本部分基本未变
        相同的部分是,UNIX仍然以本质上相同的方法工作着。用fork创建进程,用exec选择进程运行的程序,用open打开文件等等。现在很多--可能是 大部分--访问Internet的UNIX程序,以及那些系统调用(socket,connect等等)也基本未变--自从他们在上世纪80年代被引入 BSD UNIX以来。甚至最初的实现语言C,也没有多大改变,尽管C已经长大:其标准已经经过几次修订,每个人都使用函数原型,也不再去假设整数和指针的大小。
        实际上,Marc在准备该书第二版的时候,他就发现1984版中的示例代码仍然可以运行,尽管GCC会抱怨这些程序的基本形式。
       
        有些事情大不相同
        这些东西改变了:
        .系统调用的数量
        .我们使用的语言
        .我们编程的子系统
        .可移植性需求
        .UNIX标准的实用性
       
        更多的系统调用
        系统调用数量已经是原来的4倍,当然,这或多或少依赖于你对“系统调用”这个词的定义。Advanced UNIX Programming 的第一版只关注了大约70个真正的内核系统调用--例如,open,read和write,没有包括库函数比如fopen,fread和fwrite。该 书的第二版则包含了大约300个系统调用(总共有1100个左右的标准函数调用,但是大多数是标准C库的一部分,显然不是内核服务)。今天的UNIX有线 程,实时信号,异步I/O和新的进程间通信机制(POSIX IPC),这些在20年前都不存在。这一现象的原因--或结果--是UNIX的演化过程--从教育和研究系统成为通用操作系统。UNIX出现在嵌入式系统 里(停车计时器,数字视频录像机);出现在Macintosh中;出现在成百万的Web服务器中;甚至出现在大众的桌面系统上。上面这些所有的应用场合在 1984年都是未曾预料到的。
       
        更多的语言
        1984年时,UNIX应用通常都用C编写,偶尔会混合shell脚本,Awk和Fortran。C++才刚刚出现,是作为C编译器的前端实现的。今 天,C不再是主要的UNIX应用语言,尽管对底层编程和作为参考语言来说,C仍然重要(该书两个版本中的例子都用C编写)。在应用的需求证明可以实施的情 况下,C++完全有足够的效率可以替代C,但是很多项目选择了Java,Marc还从来没遇到过一个程序员觉得Java比C++坏的。计算机现在足够快 速,解释型的脚本语言也很重要了,这个潮流是由Perl和Python带领着的。此外还有些Web语言:HTML,JavaScript和各种XML语言 比如XSLT。
        即时你使用这些现代语言中的一种,你仍然应该知道系统下层是如何运作的,因为UNIX仍然定义着--某种程度上,限制着--高层语言能做什么。对很多想学 UNIX而不想学C的学生来说,这是个挑战。对他们那些厌倦了调试内存问题或者解释声明和定义之间的区别的老师来说,这同样是个挑战。
        要想让学生不必先学C就能学习UNIX,Marc开发了一个Java-to-UNIX 系统调用接口,Marc称之为Jtux。Jtux允许从Java执行几乎全部UNIX系统调用,使用相同的参数和数据类型,和标准C调用一样。关于 Jtux更多信息及下载源码可以访问http://basepath.com/aup/
       
        更多的子系统
        第三个改变的领域就是UNIX既比以前更直观可见(沃尔马特都在卖!)又比以前隐藏得更深,现在的UNIX隐藏在下层子系统比如J2EE和web服务 器,Apache,Oracle和KDE,GNOME这样的桌面之下。很多应用程序员为这些子系统编程而不是直接对UNIX编程。此外,子系统自身也由一 层薄的可移植层和UNIX隔离,可移植层在不同操作系统上有不同实现。因此,今天的许多UNIX系统程序员在中间件上--而不是更多层以上的最终用户应用 上--工作。
       
        更好的可移植性
        第四个改变是在不同UNIX系统之间可移植性上的需求,这些不同的UNIX系统包括Linux和BSD衍生,后者的一个例子就是Macintosh OS X 内核(Darwin)。可移植性在1984年是人们的某种兴趣所在,今天则已变成根本需求了。没有一个开发者愿意被锁定在一个商业版本的UNIX上,不能 自由转移到Linux或BSD上,也没有一个Linux开发者愿意被锁定在一个发行版上。Java等平台发挥了极大作用,但是只有对内核API的严肃关注 以及仔细测试才能保证代码是真正可移植的。实际上,你几乎没有听说过一个开发者说他/她正在为某某的UNIX写程序。更通常的是听到“UNIX和 Linux”,暗示这供应商的选择是以后才决定的(3个最大的专有UNIX硬件公司--SUN,HP和IBM--都是Linux的强有力支持者)。
       
        更完备的标准
        对可移植性的需求与第五个改变的领域--标准的角色--是有联系的。1984年时,UNIX标准方面的努力才刚刚开始。IEEE的POSIX组还未成立。 1988年的第一个标准,是为优异质量和精确程度付出的一次巨大努力,不过对现实世界的开发者来说,基本上无用,因为这个标准忽略了太多的API,比如那 些用于进程间通信和网络的API。这种最低要求标准的制定方法在 X/Open和Open Software Foundation1996年合并成立The Open Group后发生了巨大变化。The Open Group的目标把重要应用所使用的所有API都包括进来,进行说明,制定允许的执行时间--这意味着不像POSIX那么精确。The Open Group甚至把其中一个标准命名为Spec 1170,这个数字表示了926个API,70个头文件和174个命令。数量一增再增,甚至可能过多了点,不过结果是,程序员第一次可以在标准中找到他们 实际需要的API。今天,The Open Group的Single UNIX Specification 是期望编写可移植程序的程序员的最好指导材料。
       
        结论
        没错,UNIX编程发生了很多变化,因为UNIX和运行在UNIX之上的子系统更复杂了,语言技术也在演化。不过我们仍然公认UNIX没有改变,并且,虽然我们中很多人不再]

]>