Perché non hai un sistema operativo basato su linguaggio di alto livello? Le lingue di basso livello sono più efficienti?

44

Senza essere presuntuoso, mi piacerebbe che tu considerassi la possibilità di questo. La maggior parte dei sistemi operativi oggi si basa su linguaggi di basso livello (principalmente C / C ++) Anche quelli nuovi come Android utilizzano JNI e amp; l'implementazione sottostante è in C

In effetti, (questa è un'osservazione personale) molti programmi scritti in C funzionano molto più velocemente delle loro controparti di alto livello (es .: Transmission (un client bittorrent su Ubuntu) è molto più veloce di Vuze (Java) o Deluge (Pitone)). Anche i compilatori Python sono scritti in C, sebbene PyPy sia un'eccezione.

Quindi c'è una ragione particolare per questo? Perché tutti i nostri cosiddetti "linguaggi di alto livello" con i grandi concetti di "OOP" non possono essere utilizzati per creare un sistema operativo solido?

Quindi ho sostanzialmente 2 domande.

  1. Perché le applicazioni scritte in linguaggi di basso livello sono più efficienti delle loro controparti HLL? I linguaggi di basso livello hanno un rendimento migliore per il semplice motivo che sono di basso livello e sono tradotti in codice macchina più semplice?
  2. Perché non abbiamo un sistema operativo completo basato interamente su un linguaggio di alto livello?
posta rtindru 28.06.2013 - 09:46
fonte

10 risposte

38

Microsoft ha svolto alcune ricerche molto interessanti in questa direzione, se si esamina Singularity:

link

Inoltre, Mothy Roscoe e altri hanno lavorato a Barrelfish che utilizza il linguaggio di programmazione dei vincoli Eclipse come servizio del sistema operativo per risolvere tutti i tipi di problemi di gestione del sistema operativo e allocazione delle risorse:

link

    
risposta data 28.06.2013 - 09:51
fonte
38

Molto dipende da dove si mette la divisione tra lingue di basso livello e di alto livello. Ad esempio, persone diverse tendono a mettere una lingua come C ++ su diversi lati di quella divisione.

Riguardo alle tue domande:

  1. Non credo che ci sia una tale differenza tra i linguaggi di basso livello e di alto livello, ma più una differenza tra le lingue e i linguaggi interpretati che vengono compilati con le istruzioni native.

    Ma potrebbe anche esserci una differenza di cultura tra i programmatori, in cui i termini che utilizzano un linguaggio di basso livello si concentrano maggiormente sugli aspetti delle prestazioni delle scelte (di progettazione) che fanno.

  2. Se consideri il C ++ di alto livello, esiste almeno un sistema operativo scritto interamente in un linguaggio di alto livello (il sistema operativo Symbian è scritto in C ++). Ciò che ti impedisce di scrivere un sistema operativo nella maggior parte dei linguaggi di alto livello sono due cose:

    • Un sistema operativo richiede un accesso di basso livello a memoria e hardware ed esegue trucchi sporchi su di essi. Questo tipo di accesso è generalmente considerato non sicuro per i programmi a livello di applicazione, quindi molti linguaggi di alto livello non lo consentono.
    • Un sistema operativo deve essere eseguito senza la presenza di software di supporto, come gli interpreti. Ciò rende estremamente difficile scrivere un sistema operativo in una lingua che non può essere facilmente compilata in istruzioni native.
risposta data 28.06.2013 - 10:06
fonte
15

Ci sono una serie di buone ragioni per questo.

La lingua di basso livello di oggi era la lingua di alto livello di ieri

Sì, che ci crediate o no, una volta anche C era considerato un linguaggio di alto livello. Anche ~ 20 anni fa era abbastanza comune vederlo descritto come una lingua di "medio livello". Questo era un tempo prima che OO fosse popolare come lo è oggi, Java non esisteva, C # non esisteva, anche il C ++ non era ancora correttamente standardizzato.

inerzia storica

I sistemi operativi che usi oggi hanno radici profonde e profonde nella storia. Windows risale agli inizi degli anni '80, Unix risale agli inizi degli anni '70. C'è un sacco di codice vecchio e funzionante nei sistemi operativi e in genere non si desidera riscrivere il vecchio codice funzionante.

A un certo punto devi andare all'hardware

Questo succede nel kernel, succede nei driver, succede nei sottosistemi di gestione della memoria, succede nel filesystem. Certo, puoi aggiungere un linguaggio di alto livello su di esso, ma devi comunque avere la possibilità di accedere più direttamente all'hardware offerto da un linguaggio di livello inferiore.

Portabilità

Non intendo la portabilità su hardware diverso o su un SO differente, come è più comunemente inteso oggi; questo è più sottile. C'è un grande vantaggio nel fornire un'interfaccia basata su C per qualcosa, e questo è il fatto che virtualmente ogni altra lingua esistente può collegarsi a C. Anche per questo motivo l'API di Windows è ancora un'AP basata su C per questi motivi.

Preferenze personali

Alcune persone preferiscono semplicemente programmare in questo modo, e questo può essere un fattore importante. Per esempio, Linus Torvalds ha un famoso rant contro C ++ che rende abbastanza chiaro come Per quanto lo riguardi, C sarà sempre il suo strumento di scelta per questo tipo di lavoro (il contenuto dello sproloquio e se non sei d'accordo con esso è irrilevante per questa discussione, il fatto che lo sfogo esiste è sufficiente). p>

Nel loro insieme, questi dovrebbero chiaramente stabilire il motivo per cui un sistema operativo è stato originariamente scritto in qualcosa come C ai vecchi tempi, e perché pezzi molto significativi di esso - anche oggi - rimangono tali.

    
risposta data 03.07.2013 - 21:54
fonte
13

Un motivo principale per il predominio di C per i sistemi operativi risiede nella storia - i sistemi operativi correnti tradizionali come Windows e tutte le forme di Unix (BSD, Solaris, HP-UX, MacOS X, ... così come i cloni come Linux ) tornare indietro per molto tempo, prima che OO e altri costrutti di "alto livello" diventassero mainstream.

Per il core del sistema operativo oltre alle prestazioni, è necessario essere molto specifici sulle istruzioni hardware e si ha bisogno di un controllo completo sulla memoria che i linguaggi come C fanno molto bene.

Per i sistemi embedded a volte ci sono sistemi operativi che utilizzano linguaggi di livello superiore per parti più ampie del sistema. Un esempio notevole è JavaOS di Sun.

Per i sistemi operativi diffusi un esempio notevole che non usa C è anche il classico MacOS prima di MacOS X - che era in grandi parti scritto in un dialetto di Pascal che ha consentito alcune forme di orientamento agli oggetti.

    
risposta data 28.06.2013 - 10:46
fonte
12

Innanzitutto, ci sono alcuni problemi di bootstrap. La maggior parte delle funzionalità che rendono più semplici i linguaggi di alto livello sono basate sulle astrazioni che un kernel deve fornire. Come si scrive un gestore di memoria in una lingua che richiede un gestore di memoria? Come si scrivono i driver I / O senza utilizzare le belle librerie standard I / O della propria lingua? Come si creano le primitive di threading e sincronizzazione senza utilizzare le librerie del linguaggio?

In secondo luogo, è estremamente utile e molto più leggibile quando si scrivono sistemi operativi per poter assegnare una variabile a una posizione di memoria specifica. Questo è facile in C, e ogni singolo programmatore C sa come farlo. Se è persino possibile nelle lingue di livello superiore, è così raro che solo i guru sanno come farlo.

In altre parole, quando conti tutti i limiti e le modifiche che dovresti accettare, C e C ++ iniziano ad apparire molto più semplici.

    
risposta data 28.06.2013 - 17:53
fonte
6

Prima di tutto, il bootstrap richiede che almeno una piccola parte sia scritta in Assembly o equivalente.

In secondo luogo, era un sistema operativo scritto in una HLL indiscutibile - Macchina Lisp . (Il fatto che abbia fallito commercialmente ha avuto più a che fare con altri hardware diventando più veloce più velocemente e il trionfo di Peggio è meglio che con carenze della sua filosofia o del suo design).

In terzo luogo, il C ++ è piuttosto orientato agli oggetti e di alto livello, quindi, come altri hanno sottolineato, Symbian OS è un altro esempio.

In quarto luogo, c'è poco bisogno di nuovi sistemi operativi in questo momento. Abbiamo già alcuni gusti di linux e bsd che funzionano praticamente su qualsiasi hardware, e la creazione di un nuovo sistema operativo da zero è piuttosto costosa.

    
risposta data 28.06.2013 - 19:08
fonte
4

Per migliorare la fase di ciò che ho scritto in precedenza.

Le macchine Burroughs 5xxx - 6xxx non avevano un linguaggio assembly. La lingua più bassa disponibile era un'estensione di Algol. L'Algol è stato implementato nell'hardware. Il sistema operativo e tutte le lingue sono state scritte in Algol. Ha sovraperformato tutte le macchine concorrenti dell'epoca. Richiedeva anche molto meno codice che rendeva molto più facile la manutenzione. Aveva stack hardware che supportava un linguaggio ricorsivo come un Algol.

Il sistema operativo Burroughs si è evoluto in una versione chiamata MCP. MCP è attualmente in esecuzione su sistemi Unisys.

    
risposta data 03.07.2013 - 21:00
fonte
3

La maggior parte delle lingue di livello superiore che hai menzionato hanno una funzionalità che non si adatta bene ai sistemi operativi: gestione automatica della memoria. Non si può fare affidamento su un garbage collector quando si scrive un sistema in tempo reale - sia soft (che è ciò che è un sistema operativo) o anche il più difficile. Per citare Tanenbaum [i]:

Some things that C does not have include built-in strings, threads, packages, classes, objects, type safety, and garbage collection. The last one is a show stopper for operating systems. All storage in C is either static or explicitly allocated and released by the programmer, usually with the library function malloc and free. It is the latter property -- total programmer control over memory -- along with explicit pointers that makes C attractive for writing operating systems. Operating systems are basically real-time systems to some extent, even general purpose ones. When an interrupt occurs, the operating system may have only a few microseconds to perform some action or lose critical information. Having the garbage collection kick in at an arbitrary moment is intolerable.

Ora, si potrebbe sostenere che il C ++ è anche un buon candidato poiché offre la gestione manuale della memoria. C ++ è già stato utilizzato in alcuni sistemi operativi come Symbian (citato da Bart ) e BeOS. Ma IMHO C è ancora il linguaggio più veloce che può essere portato su molte architetture senza un grande sforzo (contrariamente all'assemblaggio di un'architettura specifica).

[i]: Modern Operating Systems 3rd edition, pagina 73

    
risposta data 28.06.2013 - 19:35
fonte
2

Come altri hanno sottolineato, diversi sistemi operativi sono stati scritti in linguaggi di alto livello. Forse quello che intendi è che tutti gli OS di successo, di massa e generici sono stati scritti in alcune combinazioni di assembly, C e C ++?

La maggior parte dei linguaggi di alto livello ha tonnellate di utili funzionalità che comportano un costo associato alle prestazioni. La gestione automatica della memoria è un esempio ovvio, il controllo dei limiti degli array è un altro. Se stai scrivendo un sistema operativo generico, è probabile che ti imbatti in situazioni in cui la penalizzazione delle prestazioni di queste utili funzionalità è maggiore di quanto sei disposto a pagare. A quel punto ti piacerebbe essere in grado di spegnerli. Linguaggi come Python, C # e Java variano a seconda delle funzionalità che puoi disattivare, ma nessuno di questi è versatile come C o C ++ a questo proposito.

In questo aspetto C e C ++ sono quasi altrettanto versatili del puro assemblaggio. Se si decide che sono necessari dieci diversi gestori di memoria che coprono dieci diversi scenari di allocazione della memoria, è possibile implementarli tutti in C e C ++ e caricarli e scaricarli come si ritiene opportuno. Diamine, non devi nemmeno collegarti alle librerie di runtime C standard o al codice di avvio se non vuoi.

    
risposta data 28.06.2013 - 20:22
fonte
0

La vera risposta è Money . Non c'è abbastanza vantaggio percepito di un sistema operativo di lingua di alto livello per giustificare la spesa delle risorse per costruirne uno e poi inserirlo nel mainstream. Ci sono enormi costi coinvolti nella creazione di un nuovo driver per ogni componente hardware di cui ha bisogno per sostenere, per esempio.

Ci sono vari sistemi operativi scritti in linguaggi di alto livello, con lo scopo principale della ricerca, come Oberon e Singolarità .

    
risposta data 11.06.2016 - 15:12
fonte