Rochi7992

Nuovo Utente
17
0
CPU
Ryzen 7 5700u
HDD
SSD Nvme 2.0 1tb
RAM
16 3200mhz
GPU
Vega 8 (Radeon)
Monitor
KOORUI Gaming Monitor 27 pollici, schermo di superficie 1800R 2560X1440 (QHD), 144HZ 1ms
OS
Linux/Windows
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.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
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:
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili