In qualsiasi sistema interdipendente ci sono fondamentalmente due scelte. Astrazione e integrazione. (Non sto intenzionalmente usando termini tecnici). Con Abstraction, stai dicendo che quando effettui una chiamata a un'API che, mentre il codice dietro l'API può cambiare, il risultato sarà sempre lo stesso. Ad esempio, quando chiamiamo fs.open()
non ci importa se si tratta di un'unità di rete, un SSD o un disco rigido, avremo sempre un descrittore di file aperto con cui possiamo fare cose. Con "integrazione" l'obiettivo è quello di fornire il modo "migliore" di fare una cosa, anche se il modo cambia. Ad esempio, l'apertura di un file potrebbe essere diversa per una condivisione di rete rispetto a un file su disco. Entrambi i modi sono ampiamente utilizzati nel moderno desktop Linux.
Dal punto di vista degli sviluppatori si tratta di "funziona con qualsiasi versione" o "funziona con una versione specifica". Un ottimo esempio di ciò è OpenGL. La maggior parte dei giochi è impostata per funzionare con una versione specifica di OpenGL. Non importa se stai compilando dalla fonte. Se il gioco è stato scritto per usare OpenGL 1.1 e stai cercando di farlo funzionare su 3.x, non ti divertirai. All'altra estremità dello spettro, alcune chiamate dovrebbero funzionare indipendentemente da cosa. Ad esempio, voglio chiamare fs.open()
, non voglio preoccuparmi di quale versione del kernel mi trovo. Voglio solo un descrittore di file.
Ci sono vantaggi in ogni modo. L'integrazione offre funzionalità "più recenti" a scapito della compatibilità con le versioni precedenti. Mentre l'astrazione fornisce stabilità rispetto alle chiamate "più recenti". Anche se è importante notare che è una questione di priorità, non di possibilità.
Da un punto di vista comune, senza una ragione davvero valida, l'astrazione è sempre migliore in un sistema complesso. Ad esempio, immagina se ha fs.open()
funzionato diversamente a seconda della versione del kernel. Quindi una semplice libreria di interazione del file system dovrebbe mantenere diverse centinaia di metodi "open file" (o blocchi probabilmente). Quando è uscita una nuova versione del kernel, non saresti in grado di "aggiornare", dovresti testare ogni singolo pezzo di software che hai usato. Il kernel 6.2.2 (falso) potrebbe semplicemente rompere il tuo editor di testo.
Per alcuni esempi del mondo reale, OSX tende a non preoccuparsi di interrompere lo spazio utente. Mirano a "integrazione" piuttosto che a "astrazione" più frequentemente. E ad ogni importante aggiornamento del sistema operativo, le cose si rompono. Questo non vuol dire che un modo sia migliore dell'altro. È una scelta e una decisione di progettazione.
Ancora più importante, l'ecosistema Linux è pieno di fantastici progetti open source, in cui persone o gruppi lavorano al progetto nel loro tempo libero o perché lo strumento è utile. Con questo in mente, il secondo smette di essere divertente e inizia a essere un PIA, quegli sviluppatori andranno da qualche altra parte.
Ad esempio, ho inviato una patch a BuildNotify.py
. Non perché sono altruista, ma perché uso lo strumento e volevo una funzione. È stato facile, quindi qui, avere una patch. Se fosse complicato o ingombrante, non userei BuildNotify.py
e troverei qualcos'altro. Se ogni volta che uscisse un aggiornamento del kernel il mio editor di testo si rompesse, avrei semplicemente usato un sistema operativo diverso. Il mio contributo alla comunità (per quanto piccolo) non continuerebbe o esisterebbe, e così via.
Quindi, la decisione di progettazione è stata presa per astrarre le chiamate di sistema, in modo che quando lo faccio fs.open()
funzioni. Ciò significa mantenere la popolarità guadagnata fs.open
molto tempo dopo fs.open2()
.
Storicamente, questo è l'obiettivo dei sistemi POSIX in generale. "Ecco un insieme di chiamate e valori di ritorno attesi, ti capisci a metà." Ancora una volta per motivi di portabilità. Perché Linus scelga di usare quella metodologia è interno al suo cervello e dovresti chiedergli di sapere esattamente perché. Se fossi in me, sceglierei l'astrazione piuttosto che l'integrazione su un sistema complesso.