La domanda è abbastanza ampia e così com'è la risposta è sì. In effetti, la risposta è sì per la maggior parte dei linguaggi di programmazione, ma c'è un catch .
Devi tradurre il tuo codice OS in qualcosa che la macchina capisca. Ed è la macchina e la sua lingua madre e la tua capacità di tradurre dalla "tua" lingua alla lingua "nativa" che determinerebbe se puoi scrivere un sistema operativo nella tua lingua o meno.
Teoria generale
Diciamo che una macchina ha una leva. E sono possibili solo due cose: quando la leva viene spinta verso il basso, la macchina verserà il caffè e, una volta tirata, la macchina smetterà di versare il caffè. Ora immagina che il mio traduttore madrelingua sia un umano che può leggere il codice C stampato su un foglio e decidere se spingere la leva in alto o in basso. Quindi, ad esempio, leggendo la riga seguente il nostro "compilatore-linker" umano spingerà la leva verso il basso.
printf("pour coffee"); //Support more similar syntax in later versions!
E leggendo la seguente riga il nostro "compilatore-linker" umano tirerà la leva verso l'alto.
printf("stop pouring coffee"); //Support more similar syntax in later versions!
Abbiamo scritto con successo un sistema operativo per questa macchina da caffè interamente in C. Se è per questo, possiamo addestrare il nostro compilatore a tradurre Java, C #, KSH, Perl, inglese, slavok, sanscrito ecc ... e "gestiscono" la macchina. Da qui il termine, Sistema operativo.
Naturalmente molti computer moderni sono in grado di fare qualcosa di più complesso di questo. E quindi la complessità del loro set di istruzioni va oltre una semplice leva stato . Questi insiemi di istruzioni alla fine metteranno solo alcuni transistor / magneti / LED ecc. In qualche stato e noi umani lo interpreteremo come risultato.
Il problema quindi diventa quello di manipolare questa macchina per raggiungere gli stati che vogliamo. E se la tua lingua (ad esempio, C) può essere tradotta in quell'insieme di istruzioni native e se puoi usare questo bridge per fare in modo che la macchina faccia ciò che vuoi, allora avrai un sistema operativo di successo.
Esempio concreto
In questo momento sto utilizzando un sistema x86_64. Questo sistema non sa cosa sia C. Non sa cosa siano OS X, Windows o BSD. Alla fine sta eseguendo un codice assembly x86_64. Quel codice non è stato scritto dagli umani (per la maggior parte). Probabilmente è stato scritto da umani in C o C ++ e tradotto nel linguaggio assembly. Se copio questo codice compilato sulla mia macchina Power PC, non funzionerà. Ho bisogno del codice originale C / C ++ / whatever_language e ho bisogno di tradurre quel codice nella lingua del PC. Se sto provando qualcosa in C che non è traducibile per alimentare il linguaggio PC, quella funzione non funzionerà sul nuovo sistema operativo.
E i dispositivi?
Più dispositivi inserisci nella macchina (ad esempio un monitor, un mouse, una stampante, un'uscita audio, ecc.) più codice dovrai scrivere per i bridge. Questo è ciò che fanno i piloti. Puoi scrivere un driver in C se vuoi. Tutto ciò che serve è un modo per tradurre C nel "set di istruzioni" di quel dispositivo. Di solito, è più semplice incorporare del codice / circuito nel dispositivo che legge segnali elettrici standard e ingannare il core computer per generare quei segnali elettrici usando il set di istruzioni standard e i bus del dispositivo (ad esempio, USB).
Che cos'è il bootstrap?
Ora, naturalmente, il sistema operativo in questi giorni "spedisce" con la macchina. E ciò che le persone fanno è installare il codice [compilato nella lingua dell'insieme delle istruzioni della macchina] in un punto in cui la macchina può trovarlo da solo. Il trucco è solo quello di riavviare la macchina per trovare quel codice quando lo si avvia. Di seguito è riportato un JVM esempio di bootstrap:
public final class Hello {
public static void main(String[] args_) {
System.out.println("Hello, World!");
}
}
0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................
Che dire ...?
Vedi Tanenbaum o poni un'altra domanda.