在本章中,我们来探究Linux是什么,以及它与它的引领者——UNIX有何关系。我们将带领大家了解Linux开发系统提供了哪些机制,并且编写和运行我们的第一个程序。在本章中,我们将介绍以下几方面的内容:
l UNIX、Linux和GNU。
l Linux程序及其编程语言。
l 如何寻找开发资源。
l 静态库和共享库。
l UNIX哲学。
1.1 UNIX、Linux和GNU简介
近年来,Linux已成为一种现象。几乎每天,Linux都以某种方式出现在媒体上。我们已经数不清在Linux上有多少应用程序以及有多少机构在使用Linux。
Linux的成功要归功于为它引路的系统和应用程序——UNIX和GNU软件。在本节中,我们将看到Linux是怎样产生的,以及它植根于何处。
1.1.1 什么是UNIX
UNIX操作系统最初是由贝尔实验室(Bell Laboratory)开发的,当时的贝尔实验室是电信业巨头——AT&T(美国电报电话公司)旗下的一员。UNIX是在20世纪70年代为DEC(数字设备公司)的PDP系列计算机设计的,现在已成为一种非常流行的多用户、多任务操作系统。UNIX操作系统可以运行在大量不同种类的硬件平台上,其适用范围从PC工作站一直到多处理器服务器和超级计算机。
1.UNIX简史
严格来说,UNIX是由Open Group(开放组织)管理的一个商标,它指的是一种遵循特定规范的计算机操作系统。这个规范也称为单一UNIX规范(The Single UNIX Specification),定义了所有必需的UNIX操作系统函数的名称、接口和行为。这个规范在很大程度上是早期由IEEE(电气和电子工程师协会)开发的一系列规范(P1003或POSIX规范)的超集。
UNIX的源代码属于SCO公司。有许多商用的类UNIX系统,如SCO的Unixware、IBM的AIX、HP的HP-UX和Sun的Soloris,还有一些可以免费获得,如FreeBSD和Linux。如今只有少数系统完全遵守开放组织的规范,从而允许它们挂上“UNIX”的商标。
过去,不同UNIX系统之间的兼容性一直是一个实际的问题,虽然POSIX规范在这一方面起了很大的作用。现在,通过遵守一些简单的规则,创建可以运行在所有UNIX和类UNIX系统上的应用程序已成为可能。关于Linux和UNIX标准的更多细节内容可以在本书的第19章中找到。
2.UNIX哲学
在后续的章节里,我们希望能够向读者传达一种Linux(UNIX)程序设计的风格。虽然在任何平台上用C语言编程在很多方面都是一样的,但UNIX开发者对编程和系统开发确实有其独特的观点,而这种观点对Linux来说也是完全适用的。
UNIX操作系统(包括Linux)鼓励一种特定的编程风格。典型的UNIX程序和系统具有如下特点:
l 简单性:许多很有用的UNIX工具是非常简单的,因此也是很小并易于理解的。“小而简单”是值得学习的,更大、更复杂的系统注定包含更大、更复杂的bug,而调试是所有人都想避免的。
l 集中性:通常,让一个程序很好地执行一项任务要好过把所有功能都乱七八糟地堆在一起。功能肿胀的程序难于使用和维护。单一目标的程序更容易随着更好的算法或界面被开发出来而得到改进。在UNIX中,当用户出现新的需求时,通常是把小工具组合起来以完成更复杂的任务,而不是试图将一个用户可能期望的所有功能放在一个大程序里。
l 可重用组件:将应用程序的核心实现为库。具有简单而灵活的编程接口、文档齐备的库可以帮助其他人开发出同类程序,或者把这些技术应用到新的应用领域。dbm库就是一个例子,它是一组可重用的函数,而不是单一的数据库管理程序。
l 过滤器:许多UNIX应用程序可用作过滤器。也就是说,它们对输入进行转换并产生输出。正如我们将在后面看到的,UNIX提供了一些机制,让我们可以把一些UNIX程序通过一种新颖的方式组合起来,以开发出相当复杂的应用程序。当然,这种类型的作用是靠前面提到的开发方法支撑的。
l 开放的文件格式:比较成功并流行的UNIX程序都使用纯ASCII码的文本文件作为配置文件和数据文件。如果你在开发程序时采用了这种做法,那你做对了!它使用户可以用标准工具修改和搜索配置项,并且可以开发出在数据文件上执行新功能的新工具。ctags源代码交叉引用系统就是一个好例子,它把符号位置信息以适合于搜索程序使用的正则表达式的形式记录下来。
l 灵活性:你不能期待用户都能正确地使用你的程序。所以,在编程时要尽量考虑到程序的灵活性;尽量避免对字段长度或记录数目作人为的限制。如果你能做到的话,则你编写的程序既能在单机上运行,也能跨网络运行。永远不要认为你知道用户想做的一切事。
1.1.2 什么是Linux
可能你已经知道,Linux是一个类UNIX内核的可以自由发布的实现版本,是一个操作系统的底层核心。因为Linux以UNIX为其灵感来源,所以Linux程序和UNIX程序是非常相似的。事实上,几乎所有为UNIX编写的程序都可以在Linux上编译运行。而且,一些专用于UNIX商用版本的商用应用软件也可以不加改变地以二进制形式运行在Linux系统上。
Linux是由赫尔辛基(Helsinki)大学的Linus Torvalds开发的,期间得到了因特网上广大UNIX程序员的帮助。它最初只是受Andy Tanenbaum教授的Minix(一个小型类UNIX系统)启发而开发的个人爱好的程序,但后来它逐步发展成为一个拥有自己版权的完整系统。其目的是,保证Linux除包含自由发布的代码外,不会集成任何私有代码。
现在,对于各种使用不同类型CPU的计算机系统都有Linux的版本可以运行其上,包括基于Intel x86及其兼容处理器的个人计算机,使用SUN SPARC、IBM PowerPC、Intel Itanium的工作站和服务器,甚至一些手持PDA和Sony PS2游戏机。只要这个设备有处理器,就会有人试图让Linux运行其上。
1.1.3 GNU项目和自由软件基金会
Linux能够存在并发展到今天是无数人协同努力的结果。操作系统内核本身仅仅是可用开发系统的一小部分。传统上,商业化的UNIX系统都包含提供系统服务的应用程序和工具。对Linux系统来说,这些额外的程序是由许多程序员编写并自由传播的。
Linux社团(以及其他的软件开发组织)支持自由软件的概念,即软件本身不应受限,它们应遵守GNU通用公共许可证(GPL)。虽然获得软件可能要支付一定的费用,但此后就可以随意使用,并且它们通常是以源代码的形式发布的。
自由软件基金会(Free Software Foundation)由Richard Stallman创立,他是UNIX及其他系统上最著名的文本编辑软件之一的GNU Emacs的作者。Stallman是自由软件这一概念的倡导者,并发起了GNU项目(GNU代表GNU’s Not Unix),这个项目的宗旨是:试图创建一个与UNIX系统兼容,但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。GNU在底层可能与UNIX有很大的不同,但仍支持UNIX应用程序。
GNU项目已为软件社区提供了许多UNIX系统上应用程序的仿制品。所有这些程序,即GNU软件,是在GNU通用公共许可证(GPL)的条款下发布的。可以在http://www.gnu.org上找到该许可证的一份拷贝。这份许可证阐述了copyleft(copyleft是一个生造的词,是英文copyright的反话)的概念。copyleft的目的是防止有人给自由软件的使用加上限制。
在GPL条款下发布的一些主要的GNU项目软件有:
l GCC:GNU编译器集,包括GNU C编译器。
l G++:C++编译器,是GCC的一部分。
l GDB:源代码级的调试器。
l GNU make:UNIX make命令的免费版本。
l Bison:与UNIX yacc兼容的语法分析器。
l bash:命令解释器(shell)。
l GNU Emacs:文本编辑器及环境。
许多其他的软件包也是在遵守自由软件的原则和GPL条款的情况下开发和发行的,包括图形图像处理工具(如Gimp)、电子表格、源代码控制工具、编译器和解释器、因特网工具以及两个完整的基于对象的环境——GNOME和KDE。我们将在第16章和第17章讨论GNOME和KDE。
现在有这么多可用的自由软件,再加上Linux内核,我们可以说:创建一个GNU的、自由的类UNIX系统的目标已经通过Linux系统实现了。由于认识到GNU软件所做出的贡献,现在许多人都把Linux系统称为GNU/Linux。
可以在http://www.gnu.org上找到更多关于自由软件的概念。
1.1.4 Linux发行版
正如前面提到的,Linux实际上只是一个内核。你可以获得内核源代码,编译并安装它,然后获得并安装许多其他自由发布的软件,从而创建一个完整的Linux。虽然完整的系统远不止仅仅包含一个Linux内核,但我们通常将其称为Linux系统。其中大多数的工具都来自于自由软件基金会的GNU项目。
你可能会意识到,单单从源代码开始创建Linux系统是一件很不容易的事。幸运的是,许多人制作了Linux的发行版(通常称为flavor);发行版一般以CD-ROM为载体,它不仅包含内核,还包含许多其他编程工具和应用程序,通常都会包含一个X视窗系统的实现,即在许多UNIX系统上都常见的一个图形环境。Linux发行版通常还带有安装程序和附加文档(这些一般也都在CD上)以帮助你安装自己的Linux系统。著名的Linux发行版(特别是在Intel x86和奔腾体系结构的处理器上的发行版)有Red Hat Linux、SuSE Linux和Debian GNU/Linux,当然还有许多其他的发行版。







