DOMANDA Sviluppo sistemi operativi

Pubblicità

Rochi7992

Nuovo Utente
Messaggi
17
Reazioni
0
Punteggio
26
Buon giorno, avrei una domanda da fare, i sistemi operativi vengono scritti in parte (minima) in "Assembly", la maggioranza in "C" ma ho letto anche che viene utilizzato il "C++", non ho capito dove viene utilizzato nello sviluppo dell' OS.
Grazie in anticipo.
 
Si, come giustamente dici la parte minima in Assembly è riservata a quelle parti che non si può scrivere in C.

Considera che C è nato prima di C++, quindi a sviluppo iniziato ai tempi hanno proseguito sulla strada già intrapresa. Con il kernel Linux subentrano probabilmente anche questioni filosofiche, oltre che dovute strettamente ai due linguaggi. C++ ovviamente ha un overhead maggiore, e in quegli anni il linguaggio usato per lo sviluppo di kernel era C.
Questo è il pensiero di Torvalds, almeno in quel momento, su C++ (e non è cambiato): https://harmful.cat-v.org/software/c++/linus

Sicuramente C è un linguaggio più semplice, si porta dietro sicuramente meno dipendenze, e il codice che produce è molto più semplice da leggere (parlo proprio a livello di assembly); quindi in caso di bug di qualche tipo, si faceva sicuramente meno fatica a capire il problema. Inoltre hai un controllo differente sulle allocazioni di memoria.

Se guardi Linux su github, noterai che C++ non è presente (guarda a dx, c'è l'elenco dei linguaggi usati e le rispettive percentuali).


In merito a Microsoft è difficile dire esattamente la quantità di codice C rispetto a quella in C++ che utilizza, per il semplice fatto che è chiuso. Sicuramente qualcosa in Assembly c'è, e sicuramente l'API che espone (Windows API) è scritta in C. Presumo che il kernel non sia stato propriamente riscritto, ma anche qui, per un kernel forse ci sono meno ragioni per un passaggio a C++ rispetto al C.

Per la scrittura di driver, che sono poi una componente che gira in "kernel mode", Microsoft consiglia l'utilizzo di C++ e non di C. In effetti a quanto ho visto è anche piuttosto comodo, specie negli ultimi anni. Ma alla fine è un "C++ strutturato", più simile al C, che a un classico programma in C++ (niente classi e template, ad esempio).

Questo è dovuto a un motivo: nel kernel non è presente il runtime per C++, quindi tante sue funzionalità non le si può utilizzare: try/catch per gestire le eccezioni, la libreria standard di C++, e gli operatori new/delete, ad esempio.


Oggi come oggi poi ci sono altre scelte alternative, come Rust, a cui Linux ad esempio sta iniziando a guardare (ti eviti i problemi legati a C dovuti a bug che hanno a che fare con la gestione della memoria errata da parte del programmatore... e non solo).
Pare che anche nel kernel Linux qualche modulo venga/verrà scritto in Rust, Rust in the Linux Kernel by 2023, Linus Torvalds Predicts.
 
Oh boy, questa è una bella domanda, difficile rispondere in due parole.

Innanzi tutto il termine “sistema operativo” è molto generico, esistono diversi tipi di sistemi operativi, e ciascuno può essere poi implementato in maniera diversa. Ad ogni modo, al minimo un sistema operativo ha un “kernel” che gira nella sua area di memoria protetta ed è responsabile della gestione dell’hardware. Il linguaggio C venne creato da Ritchie and Kernighan proprio per il kernel della versione di Unix che stavano scrivendo, è un linguaggio quindi pensato per quello, e tutt’ora è il preferito per i kernel. Il Assembly viene usato solo quando un processore ha istruzioni particolari che non possono essere chiamate dal C, e questo è vero non solo per i sistemi operativi ma per qualsiasi programma che richiede un livello di alta ottimizzazione. Purtroppo questione rende i programmi non “portatili”, ossia si compilano e girano solo su quel processore. I videogiochi sono un classico esempio.

Nulla vieta di scrivere le parti del sistema operativo che non siano parte del kernel in altri linguaggi, per esempio C++ almeno nella sua versione “unmanaged” (escludiamo quindi il C++ di Windows .NET), avere un garbage collector aiuta tantissimo lo sviluppo di applicazioni complesse, ma ha un costo in termine di efficienza.

Per concludere, ricorda che in C è possibile includere direttamente istruzioni Assembly, vedi per esempio per il compilatore GNU gcc:
 
Pubblicità
Pubblicità
Indietro
Top