|
主要包含如下内容:
? GNU C、C++ 编译器
? GNU make 工具
? GNU 的调试器
? RCS 版本控制系统
并简单介绍了 Linux 系统上广为流行的 Perl 脚本语言。
对比了 Linux 和 Windows NT 两种不同的编码风格。
在 BBS 上看有些困难,拿回家慢慢看吧。
第十三章 软件开发
由于操作系统只是一个工具,对大多数读者来说,学习操作系统的最终目的是利用操
作系统上的应用软件完成自己的工作,或者利用开发工具开发应用程序。因此,对一个
操
作系统来说,可获得的开发工具,以及这些开发工具是否有效,就成为评价操作系统的
一
个重要因素。
这一部分的后三章将主要从开发人员的角度比较 Linux 和 Windows NT。本章的主要
内容如下:
? 介绍操作系统为开发人员提供的各种系统服务;
? 介绍操作系统上的主要开发工具。
考虑到许多读者可能对 Linux 上的开发工具了解不多,因此,本章将介绍一些 Linux
上常用的开发工具。当然,软件开发并不是区区一章就能够讲得清楚的,更多的需要读
者
自己去实践。
13.1 POSIX 标准和操作系统接口
13.1.1 Linux 和 Windows NT 对 POSIX 标准的支持
从第一章的内容我们知道,POSIX 是一种标准,主要定义了操作系统的系统调用接口,
POSIX 标准最初为提高 UNIX 系统之间的移植性而开发。Linux 是一种 POSIX 兼容系统
,
而 Windows NT 中包含了 POSIX 子系统。但这两个操作系统的 POSIX 之间有什么区别
呢?
POSIX 是由非常复杂的标准体系组成的,其中广为接受的 POSIX 标准是 POSIX.1 标
准。POSIX.1 是一个源代码级的兼容性标准,提供了操作系统的 C 语言编程接口,内容
涉及到POSIX.1a(系统接口扩展),POSIX.1b(实时),POSIX.1c(线程),POSIX.1d
(实
时扩展),POSIX.1e(安全性),POSIX.1f(透明文件访问),POSIX.1g(协议无关服
务)
以及POSIX.1h(容错)等。POSIX 的另外一个重要标准是POSIX.2 标准,它定义了操作
系统的 Shell 和工具标准。通常谈到的 POSIX 标准就是这两个标准。Linux 支持完整
的
POSIX.1 和 POSIX.2 标准;而 Windows NT 只提供对 POSIX.1 的支持,而且是一个不
完
整的系统,许多方面(例如 I/O)需要 Win32 API 来完成。实际上,Windows NT 的许
多
POSIX.1 接口是通过 Win32 API 间接实现的。
Windows NT 中的 POSIX.1 版本基本上没有什么用处,在 Visual Studio 6.0 中,
甚至取消了对 POSIX.1 的支持。如果读者要在 Windows NT 上进行一些 POSIX 的开发
工
作,建议不要使用 Windows NT POSXI.1。用户可以使用第三方POSIX 系统,或者由 GN
U 提
供的 GNU Win32 工具。这些产品提供了更强大的功能,例如 Software System Inc. 的
POSIX.2 工具箱(OpenNT)具有如下特征:真正的 UNIX Shell,以及在 Windows NT 中
运行 X Window 的能力等。这些软件为 Windows NT 的非完整 POSIX.1 系统增加了如下
特性:
? POSIX.1、POSIX.2 和 ANSI C 接口;
? 可在 Intel 和 Alpha 平台上使用;
? BSD 套接字支持;
? System V 的共享内存和信号灯 IPC 机制;
? X11R5 客户、库和头文件;
? OPENNTIF(OSF/Motif 1.2.4 窗口管理器和开发库);
? Color curses库;
? 完整的 Shell 作业管理;
? 磁带设备支持;
? UNIX 开发工具:make、rcs、yacc、lex、cc、c89、nm、ar、strip 等。
GNU Win32 是针对 x86 和 PowerPC 的 Windows NT/95 的 GNU 开发工具。使用这些
开发工具开发的应用程序能够访问 Microsoft Win32 API,也能访问 Cygwin32 API,它
提供了附加的类似 UNIX 的功能,包括 UNIX 套接字和进程控制等。利用这些工具,可
增
强 Windows NT 上 POSIX 子系统:
? 利用标准的 Microsoft Win32 API 或/和 Cygwin32 API 编写 Win32 控制台或
GUI应用程序;
? 能够方便地从源代码中配置和建立许多 GNU 工具,包括 GNU Win32 开发工具
本身;
? 可将许多重要的 UNIX 工具移植到 Windows NT 而不用对源代码进行大规模修
改;
? 包含有相当完整的 UNIX 环境工具,可使用许多普通的 UNIX 系统工具。
有关上述这两种软件,读者可访问如下站点:
http://www.softway.com/OpenNT/homet.htm
htt://www.cygus.com/misc/gnu.win32
和 Windows NT 相反的是,Linux 是一个 POSIX.1标准的完全兼容系统。Linux 上
的 POSIX.2 标准实现是由 GNU 工具和函数库提供的,其中最主要的 C 函数库是 glib
c。
该函数库包含如下内容:
? ISO C:C 编程语言的国际标准。GNU C 函数库与美国国家标准局(ANSI)公布
的 C 标准兼容。这一标准后来被国际标准化组织所接收(ISO/IEC 9899:1990)。
? POSIX:操作系统的 ISO/IEC 9945(即 IEEE 1003)标准。GNU C 函数库实现了
ISO/IEC 9945-1:1996 (POSIX 系统应用程序编程接口,即 POSIX.1)指定的
所有函数。该标准是对 ISO C 的扩展,包括文件系统接口原语、设备相关的终
端控制函数以及进程控制函数。同时,GUN C 函数库还支持部分由 ISO/IEC
9945-2:1993(POSIX Shell 和 工具标准,即 POSIX.2)指定的函数,其中包
括用于处理正则表达式和模式匹配的函数。
? Berkeley Unix:BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标
准化的函数,尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统(即“Berkeley Unix”)
以及“SunOS”(大众化的 4.2 BSD 变种,其中包含有某些Unix System V 的功
能)。BSD 函数包括符号链接、select 函数、BSD 信号处理函数以及套接字等
等。
? SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&T Unix Syste
m
V 操作系统的文档,它是对 POSIX 标准的扩展超集。GNU C 函数库定义了大多
数由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V 的
支持函数包括进程间通信和共享内存、hsearch 和 drand48 函数族、fmtmsg 以
及一些数学函数。
? XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.
出版),是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权,而 XPG 则
指定成为 Unix 操作系统必须满足的需求。GNU C 函数库遵循 X/Open 可移植
性指南(Issue 4.2)以及所有的 XSI(X/Open 系统接口)兼容系统的扩展,
同时也遵循所有的 X/Open Unix 扩展。
同时,Linux 也包含有许多字符界面管理、网络协议处理以及图形图象处理的函数库,
这些函数库均作为一般 Linux 商业发行版的一部分而一同发行。有关这些函数库的详细
介绍,读者可参阅附录 C。
实际上,Microsoft 并没有打算自己的操作系统做到与 UNIX 完全兼容,如果读者看
到过由微软(中国)有限公司编著的《Microsoft SQL Server 6.5 技术参考》(科学出
版
社、龙门书局 1997 年出版)一书,就可以明白微软和 UNIX 阵营的激烈竞争。既然
Microsoft 在该书中说 UNIX 如何如何不好,当然就不会对来自 UNIX 的 POSIX 有什么
好的支持了。
那么,Windows NT 的操作系统接口包括哪些内容呢?
13.1.2 Windows NT 的操作系统接口
Windows NT 的操作系统服务主要体现在 Win32 API 上,大体可分为如下几类:
? 窗口管理。应用程序可用来创建和管理窗口的部分,涉及到窗口、消息、消息
队列、控件、对话框、鼠标和键盘输入、定时器、菜单、键盘加速键以及其他
与窗口管理有关的内容。
? 图形设备接口。应用程序用来实现设备无关图形的部分,涉及到设备描述表、
坐标转换、元文件、位图、图标、画刷、画笔、区域、直线和曲线、字体、颜
色、路径、剪切、打印等。
? 系统服务。应用程序用来实现基本多任务管理的 Win32 API 部分,涉及到进程
和线程、内存管理、网络、动态链接、安全性以及其他有关系统的内容。
? 多媒体服务。Win32 API 中多媒体支持,涉及到音频、视频、媒体控制、多媒
体文件输入和输出以及增强的定时器功能等。
? 扩展库。为 Win32 API 额外增加的库,涉及到公用对话框、简化动态数据交换
(DDE)的管理函数、Shell 中增强的拖放操作、文件安装函数以及数据解压缩
函数。
可明显看出,POSIX 和 Win32API 是两个完全不同的操作系统接口体系。如果仅比较
这两个操作系统为用户提供的接口及函数库的话,可明显看到有如下特点:
? 基于 POSIX 的操作系统接口部分比 Win32 的系统服务部分要简洁得多。POSIX 的
接口函数大概只有二百多个;而 Win32 的系统服务部分的函数约有上千个,而
且调用接口相对复杂。
? Linux 上除操作系统接口之外的函数库非常丰富。笔者曾经在 MS-DOS、Windows
3.1、Windows 95/NT 下进行过 C/C++ 的开发工作,当我接触到 Linux 时,发
现许多原来需要自己编写程序实现的功能,Linux 上已经有的可用的函数库。
13.2 Visual Studio 和 GNU
在 Windows NT 上进行开发,用户主要使用的通用开发工具有:
? Microsoft Visual Studio。该开发工具包是 Microsoft 最完整的开发工具包,
也是使用最为广泛的开发工具包,其中包含有 Visual C++、Visual Basic、Visual
FoxPro 等开发工具。这些工具一般是集成开发环境,利用这些工具,可在一个
程序中完成编辑、编译、调试等各项工作,对提高开发效率有帮助。
? Borland C++。该工具是 Borland 公司的 C/C++ 编译器,和 Visual C++ 类似,
也是一个集成环境。
? Borland Delphi。该工具是 Borland 公司开发的 Pascal 编译器,Borland 公
司为了和 Visual Basic 竞争而开发,拥有较为广泛的用户群,也是一个集成
环境。
Windows NT 上的开发工具都有一个特点,它们均是一些集成开发工具。作为一个程
序员,笔者对集成开发环境是否能够真正提高开发效率,或者能够在多大程度上提高开
发
效率保持怀疑态度。因为许多程序员并不使用集成的开发环境,但也同样富有效率。Li
nux
内核开发小组就是一个例子,在开发操作系统的时候,是无法使用集成开发工具的。使
用
集成开发环境有一个缺点,就是容易让程序员养成懒惰的习惯。笔者就更加愿意在程序
出
问题的时候去认真地分析程序,而不是一味依赖调试工具。
和 Windows NT 上的集成开发环境不同,Linux 上的开发工具是一些零散的 GNU 工
具。例如,程序员可能使用 VIM 编写程序,然后用 make 或 gcc 编译程序,如果程序
有
错误,用 gdb 调试程序等。当然,也有一些集成的开发环境可以使用,例如 xwpe(Wi
ndow
Programming Environment)就是一个集成开发环境。如果使用 Emacs,程序员也可以借
助 Emacs 的强大配置能力为自己定制一个集成的开发环境。
Linux 下的程序开发还有一个特点,就是可以借助许多脚本语言构造复杂的程序。例
如,程序员可借助 Shell 脚本编写处理文件、目录的脚本程序,也可以利用 Perl
(Practical Extraction Report Language)编写用来处理文本文件和生成报表的脚本
程
序,还可以利用 Tcl/Tk 的脚本程序编写图形用户界面。如果恰当地使用这些脚本语言
,
可以达到事半功倍的效果。在 Windows NT 下,能够被称为脚本语言的大概算是 VBA(
Visuual
Basic for Application),但 VBA 仅在有限的应用软件中支持,例如,Microsoft Of
ficee,
而并不被操作系统支持。现在,Microsoft 正打算将 Perl 的支持添加到它的操作系统
中。
本章将简单介绍一些 Linux 下常见的开发工具以及有关 Perl 脚本编程的知识。由
于 Tcl/Tk 主要是用来编写图形用户界面的,我们将在下一章讲解 Tcl/Tk 的使用。
13.3 Linux 上的开发工具
13.3.1 获取帮助
在 Linux 上,程序员获取帮助的最常用工具是 man 或 xman。利用 man 或 xman,
程序员可以查看特定函数的说明。例如,键入 man printf 将显示 printf 函数的详细
调
用接口。由于 Linux 上大部分软件开发工具都来自自由软件基金会的 GNU 项目,因此
,
程序员可以使用另外一个程序获得有关开发工具使用的详细帮助信息,这一程序就是
info,它是 GNU 的超文本帮助系统。程序员可在命令行键入 info 进入 info 帮助系统
,
也可在 Emacs 中键入 Esc-x, info(或 C-h, i)而进入 info 帮助系统。
在 info 中,在线帮助文本被组织成一个个节点(node),每个节点代表一个特定的
主题。屏幕上的第一行显示了该节点的标题,如图 13-1 所示。
(屏幕图)
图 13-1 在 Emacs 中访问 info 帮助系统
info 帮助系统的初始屏幕显示了一个主题目录,你可以将光标移动到带有 * 的主题
菜单上面,然后按回车键进入该主题,也可以键入 m,后跟主题菜单的名称而进入该主
题。
例如,你可以键入 m,然后再键入 gcc 而进入 gcc 主题中。
如果你要在主题之间跳转,则必须记住如下的几个命令键:
? n:跳转到该节点的下一个节点;
? p:跳转到该节点的上一个节点;
? m: 指定菜单名而选择另外一个节点;
? f:进入交叉引用主题;
? l:进入该窗口中的最后一个节点;
? TAB:跳转到该窗口的下一个超文本链接;
? RET:进入光标处的超文本链接;
? u:转到上一级主题;
? d:回到 info 的初始节点目录;
? h:调出 info 教程;
? q:退出 info。
13.3.2 GNU C 和 C++ 编译器
Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,
GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 g
cc
昧羁赏?北嘁氩⒘? |
|