In principio, AT&T creò Unix. A causa delle leggi sul monopolio, tuttavia, non gli fu permesso di venderlo. Molte organizzazioni diedero in licenza Unix e crearono le loro varianti; la maggior parte erano imprese commerciali, ma l'Università della California a Berkeley fece una versione non commerciale, chiamata BSD.
Nel frattempo, Richard Stallman al MIT si avvicinò all'ideologia del "software libero" - oggi più comunemente chiamato "open source" - e iniziò un progetto per creare un sistema operativo "libero" compatibile con Unix chiamato GNU. La maggior parte del progetto GNU andò molto bene, ma GNU Hurd, il componente principale del kernel, fu ripetutamente ritardato.*
Un giovane programmatore di nome Linus Torvalds intervenne, iniziando il suo progetto di successo per creare un kernel chiamato Linux. Quando fu combinato con gli strumenti di GNU, Linux fornì un sistema operativo completo che funzionava proprio come Unix, ma era stato scritto da zero e concesso in licenza in modo tale da rimanere aperto per sempre.
In sostanza, GNU e Linux sono "imitazioni" di Unix come BSD - imitazioni di alta qualità, per essere sicuri, ma pur sempre imitazioni. Tutte le varianti di Unix - che siano modifiche come BSD o cloni come Linux** - hanno piccole differenze l'una dall'altra; in pratica, Linux non è più diverso da qualsiasi altra variante di Unix.
Questa non è proprio la fine della storia per OS X, però. Proprio come Linux ha adottato gli strumenti di GNU ma ha buttato via il suo kernel, Darwin (la parte Unix di OS X) ha adottato gli strumenti di BSD ma ha buttato via il suo kernel.
So, to review:
- Unix/Linux Family Tree
- +----------- Unix - - - - - -+
- | (modify) (clone) |
- BSD GNU
- | (replace kernel) |
- Darwin/OS X Linux
If operating systems were families, OS X and Linux would not be the same person. Non sarebbero nemmeno fratelli. Sarebbero cugini per adozione.
-
* Perché? Il modo teoricamente "corretto" di progettare un kernel è chiamato "microkernel". In un microkernel, ogni componente del kernel è un programma separato, tutti comunicanti tra loro. Se si vuole accedere a un file, si inviano messaggi al componente del file system; se si vuole un po' di memoria, si inviano messaggi al componente di gestione della memoria; se si vuole effettuare una connessione Internet, si inviano messaggi al componente di rete. Il problema è che questo è molto più difficile da progettare e costruire rispetto all'approccio "monolitico", dove si costruisce l'intero kernel in un unico grande componente e si permette ai programmi di chiamarlo.
Hurd è stato progettato come un puro microkernel, basato su un progetto di ricerca CMU chiamato Mach. Si è dimostrato molto difficile da implementare, però - dopo 24 anni di sviluppo, sono attualmente alla versione 0.5, che funziona ma non molto bene. Linux, d'altra parte, è un kernel monolitico più semplice e più brutto che ha funzionato abbastanza bene fin dall'inizio; la maggior parte del lavoro da allora è stato sull'espansione del suo supporto hardware, sul miglioramento delle sue prestazioni e sull'aggiunta di nuove caratteristiche.
Incidentalmente, anche BSD è un kernel monolitico. Il kernel di Darwin è in realtà uno strano ibrido: usa la stessa messaggistica Mach che usa Hurd, ma tutti i componenti del kernel sono in un processo monolitico. Mach è semplicemente il modo in cui i programmi comunicano con il kernel e tra loro.
** Se volete essere politicamente corretti senza una ragione particolarmente buona, fate finta che io abbia scritto GNU/Linux qui e altrove.