开源世界的爱恨情仇
开源系统和工具在我们生活中扮演着越来越重要的角色,作为一个软件开发人员,不可避免的会与各种开源环境打交道,今天就大体介绍一些开源世界中如雷贯耳的名词到底是什么意思,有什么关系,这些提到的产品,也是开源世界的根基。
Multics ("Multiplexed Information and Computing Service") 1964
由MIT (Project MAC with Fernando Corbató), General Electric, Bell Labs一起开发的一款操作系统。目的是为了研发一种可以更多人在同一个电脑上同时使用的分时系统。不过由于设计过于复杂和超前,导致产品迟迟无法落地。贝尔实验室在后续的研发中选择退出。最终Multics还是研发成功了,但是并不是一款流行的产品。
Bell Labs 贝尔实验室
在技术领域,大家肯定都听说过,因为它研发了太多奠定了当今科技的产品:radio astronomy, the transistor, the laser, the photovoltaic cell, the charge-coupled device (CCD), information theory, the Unix operating system, and the programming languages B, C, C++, S, SNOBOL, AWK, AMPL。并且获得了9次诺贝尔奖。
AT&T American Telephone and Telegraph Company 美国电话电报公司
贝尔实验室属于AT&T,AT&T大家也很熟悉,很多IEEE的行业规范都是由AT&T参与制定的。
Unix
贝尔实验室退出Multics后,参与研发的Ken Thompson(业界大佬)为了正常运行自己的一款游戏着手开发一个新的系统。随着Ken Thompson的开发,Dennis Ritchie(另一个大佬)等人也加入了其中。他们吸取了Multics的教训,一开始尽可能简洁(这也是Unix哲学的一部分),很快做出了第一版。
C programming language
Unix第一版是用汇编完成的,开发和移植都很不方便,他们准备找一个新的语言来代替汇编。一开始尝试了Fortran,但是并不能满足要求,于是在Fortran的基础上创建了B语言,但是B语言还是不够完美,最后在B语言的基础上创建了大名鼎鼎的C语言。由于C语言是Brian Kernighan和Dennis Ritchie创造的,所以也被叫做K&R C。
Unics (Uniplexed Information and Computing Service)
一开始Unix的名称是Unics,是对Multics一种调侃,但是后来大家觉着没人会记着这个名字,所以就改为Unix(估计就是把单词中cs的发音用x代替了)。
发展
Unix很快获得了成功,AT&T意思到Unix的价值,开始售卖Unix版权,所以市面上出现了一大堆移植的系统:University of California, Berkeley (BSD), Microsoft (Xenix), Sun Microsystems (SunOS/Solaris), HP/HPE (HP-UX), and IBM (AIX)。这也为后来的Unix wars和Linux的出现埋下了伏笔。
Berkeley Software Distribution BSD
这是一个很重要的Unix分支,伯克利(全球顶尖学府,计算机领域也是名列前茅)拿到Unix后,在其基础上做了各种开发,然后发布了一个开源的BSD版本。由于其他的很多版本都是付费的,所以BSD的衍生品比较多,比如FreeBSD, OpenBSD, NetBSD, DragonFly BSD, Darwin, and TrueOS。
TCP/IP
1989年,伯克利同意把为BSD开发的TCP/IP相关的代码公开,推动了TCP/IP协议的传播。很多公司这时把TCP/IP相关的功能增加到了自己的系统中,包括IBM,微软(Windows 95)
FreeBSD
FreeBSD是BSD的一个比较重要的分支,由于其人性化的协议,很多功能或者内核模块被各大公司广泛利用,其中比较有名的有苹果的macOS和iOS;Playstation的Orbis OS和Nintendo Switch的Horizon。
Unix wars
随着Unix的流行,Unix的碎片化也越来越严重,大家拿到Unix授权后,在原有的代码基础上分别开发自己的功能,差异越来越大,并且这时候AT&T想收回Unix进行统一,而以BSD为代表的开源组织却非常痛恨这种行为,就导致了Unix的纷争。
AT&T依靠自己的强大背景和实力,与IEEE一同推出了用于统一Unix系统的Portable Operating System Interface (POSIX)。POSIX的目标是好的,便于大家统一接口,方便软件开发移植,但是AT&T制定POSIX却是为了独揽Unix的商业价值。
Unix wars经历了好多年,Unix版权兜兜转转到了Novell手中,Novell选择结束与BSD的官司,只是要求BSD删除原始Unix的代码,允许BSD继续发行。由于最开始Unix内容比较少,BSD基本没做太多修改,只删除了少部分代码,作为一个重要的Unix分支延续下来。
POSIX Portable Operating System Interface
POSIX中并没有"X"开头的单词,增加这个也是因为Richard Stallman(GNU的发起者)提议,改名为POSIX,增加一个"X"便于发音,所以IEEE就接受了这个意见。
System V
为了统一Unix市场,AT&T推出了System V系统,这也是Unix的一个重要分支。因为其各方面也很优秀,并且由AT&T做背书,很多公司为了避免在Unix wars中被牵扯进来,选择使用System V作为开发版本,也衍生出多个商用闭源系统HP-UX, IBM AIX, Solaris, Xenix。
Unix-like operating systems 类Unix操作系统
继承Unix设计,一定程度上遵循POSIX协议,都属于类Unix系统。目前市面上,除了Windows,常见到的操作系统基本上都是类Unix操作系统,比如BSD、System V、GNU/Linux。UNIX商标已经归属于The Open Group,The Open Group提出了一个协议Single UNIX Specification,只有完全通过该协议的审核,The Open Group才会准许该产品中使用UNIX。市面上绝大部分发行版并不能通过Single UNIX Specification,所以都不能在系统名称中使用UNIX,只能叫做类Unix系统。
GNU GNU's Not Unix! September 27, 1983
从GUN的名字也能看出,当时的出现是为了抵制Unix。Unix的出现极大的推动了计算机领域的发展,但是由于Unix wars导致当时的很多技术大佬对此很不满,这其中就包括了Richard Stallman。Richard Stallman创建GNU的主旨就是让人们可以自己完全控制在自己电脑上运行的各种软件包括操作系统:发布源码,可以下载、编译、学习、修改。Richard Stallman的提议得到了很多人的响应,很多工具被开发出来,包括大家熟知的:Emacs, bash, GCC, GDB, make等。
Copyleft 反著作权
这个很明显是针对于Copyright(著作权)。Copyleft意思是任何人可以基于任何目的对著作品进行修改使用发布等。
GNU General Public License GPL
这是大家在Linux下或者开源界最常见到的一个协议,它就是Copyleft的一个实例,由Richard Stallman编写。总体思想就是使用该协议发布的代码,允许任何人修改、允许任何方式收费(但是必须让付费者知道这是一个免费开源的产品)、但是使用GPL协议发布的代码也必须遵循GPL协议开源。
GPL协议是一个非常自由的协议,极大的方便了技术的传播。但是由于GPL中比较重要的一点是如果以发布为目的使用修改了GPL协议的代码,你的代码也必须遵循GPL协议。如果只是使用了一个GPL协议的功能或者在原来功能比较简单得的GPL源码上做了大量开发(比如BSD),导致所有的代码都要开源,这对商业公司来说是不可接受的。
GPL是一个非常理想的协议,也是GNU组织的初衷,就是技术无国界,大家靠着对技术的热爱进行分享和学习。很多技术大佬(真正的Hacker)都是偏执狂,对技术有着绝对的热爱,任何东西都需要自己了解和掌控,不允许私人或者某个组织公司独自拥有一个好的产品。
除了GPL,还有很多其他协议,我们比较熟悉的LGPL, MIT, BSD, Apache等,有些协议对商业是比较友好的,比如可以使用二进制(类库的形式)而不需要开源,或者可以任意使用源码用于开源或者商业用途而不受任何限制。
GNU Hurd GNU组织开发的系统内核
从上文中Richard Stallman提议修改POSIX名称也可以看出GNU组织与POSIX协议也有着千丝万缕的联系。
GNU最终也是想创建一个类Unix的系统,周边的工具都完成了(支持了POSIX),只差一个内核,但是GNU自家的内核Hurd一直不能满足要求,这时Linux流行了起来。
GNU toolchain
GNU组织开发了一系列的用于软件编译发布的工具,由于其好用(由众多技术大佬开发),免费,支持POSIX协议,所以基本上是现在开发编译的标准。
- GNU make: an automation tool for compilation and build
- GNU Compiler Collection (GCC): a suite of compilers for several programming languages
- GNU C Library (glibc): core C library including headers, libraries, and dynamic loader
- GNU Binutils: a suite of tools including linker, assembler and other tools
- GNU Bison: a parser generator, often used with the Flex lexical analyser
- GNU m4: an m4 macro processor
- GNU Debugger (GDB): a code debugging tool
- GNU Autotools (GNU Build System): Autoconf, Automake and Libtool
Cygwin MinGW等
有些软件介绍在Windows下如何编译的时候,需要下载Cygwin或者MinGW等,就是因为这些软件是在Windows下实现了POSIX协议,并且有GNU toolchain。
Linux
实际上应该称为Linux kernel,而市面上熟知的Linux系统,正确的应该称为GNU/Linux,这也是GNU组织一直强调的。
Unix流行其间,大家都在使用这个系统,也包括Linus Torvalds。但是Linus Torvalds使用的是其教授自己编写的一个类Unix操作系统Minix,因为各种原因Linus Torvalds想能否自己重新编写一个类Unix系统,完全从头开始,按照Unix的设计思路开发功能,代码与Unix没有任何关系,所以就在网络上发布了自己的想法,需求其他人的帮助。
Linus Torvalds的提议得到了很多人的响应,所以在Linus Torvalds的带领下一个成熟的系统内核很快就完成了迭代,可能功能并没有当时的Unix那么完善,但是已经可以用了。
Linux仅仅是一个内核,并不能是一款真正的系统,而这时的GNU组织看上了这一点(因为GNU现在只差一个内核),由于Linux又是GPL协议发布的,所以两边一拍即合,在很多人的努力下,把GNU和Linux kernel整合到一起,一个完整的GNU/Linux系统就诞生了。从这里可以理解为什么市面上的Linux发布版本要叫GNU/Linux了吧,这也是为什么GNU强调必须叫GNU/Linux,而不能因为一个内核把自己的功劳全占了单单叫做Linux。如果你仔细观察,会发现常见的Linux发行版本官方介绍的时候都会说是GNU/Linux。
由于Linux kernel是开源的,所以任何人和公司都可以拿来使用,这也涌现了大量的Linux发行版本:Debian, Ubuntu, CentOS, Red Hat Enterprise Linux, SUSE, openSUSE等。虽然Linux kernel是GPL协议,但是基于Linux kernel开发的其他组件,比如桌面系统KDE, GNOME确可以以其他协议发布,因为他们并没有修改使用Linux kernel,仅仅是遵循了Linux kernel的接口协议,这也是很多商业公司可以存活的原因。同样由于这个原因,也导致了Ubuntu可以基于Debian开发,CentOS可以基于商业软件Red Hat Enterprise Linux,因为上游基于GNU/Linux,有些东西必须是开源的,而大公司或者一个成熟的社区的内核版本肯定是稳定的,其他社区或者组织就可以拿来在其基础上继续开发。而像Red Hat Enterprise Linux或者Ubuntu卖的是他们的服务,因为系统越来越复杂,各种安装的软件漏洞等需要人维护,系统出现问题需要人调查,一个公司是没有这个精力和能力做这些事情的,如果有,它就可以经营一家类似于Red Hat的公司而不需要继续现在业务了。
Freax "free", "freak", and "x" (as an allusion to Unix).
一开始Linux名称为Freax,Linus Torvalds曾想用Linux,但是他觉着这样太自负了。后来Linus Torvalds的同事Ari Lemmke,也是当时存放Linux项目的FTP服务器的管理员,认为Freax不是一个好名字,在没经过Linus Torvalds同意的情况下把工程改名为Linux,后来Linus也认同了这个修改。
KDE GNOME
KDE(K(ool) Desktop Environment)是第一个Linux上的高级的桌面环境,但是是基于当时的商业软件Qt(虽然后来也开源了)开发的。GNU组织不能接受商业软件的使用,于是就研发了GNOME(GNU Network Object Model Environment)。这也是当前Linux桌面环境最流行的两个,还有一些其他的比如Xfce, MATE等。
Android
基于Linux kernel修改的操作系统。现在智能手机的两大阵营基于Linux kernel的Android和当时基于Unix的iOS。
总结
随着Linux的流行,Unix的市场被迅速挤压,如果没有Unix wars或者Unix选择开源,Linux也有可能不会出现(这也是Linus Torvalds表达过意思),GNU组织也有可能不会创立。Unix一直是一个优秀的系统,其上面的很多设计到现在都不过时,有些功能可能比Linux还要先进,比如Kqueue和Linux的epoll。
GUN/Linux的发布与Windows和Unix是有区别的,Windows是整个系统发布,内核和GUI是配套的,Unix也是(比如macOS),从来没有过Windows发布一个内核,然后界面可以有很多选择(类似于GNOME和KDE)。所以Linux的系统理论上比Unix更加碎片化(同样也更加繁荣)。
https://en.wikipedia.org/wiki/Multics
https://en.wikipedia.org/wiki/Bell_Labs
https://en.wikipedia.org/wiki/AT%26T_Corporation
https://en.wikipedia.org/wiki/Unix
https://en.wikipedia.org/wiki/C_(programming_language)
https://en.wikipedia.org/wiki/Berkeley_Software_Distribution
https://en.wikipedia.org/wiki/Internet_protocol_suite
https://en.wikipedia.org/wiki/GNU_Project
https://en.wikipedia.org/wiki/GNU_General_Public_License
https://en.wikipedia.org/wiki/Linux
https://en.wikipedia.org/wiki/GNU_toolchain
https://www.gnu.org/
https://www.kernel.org/