Come funzionano i linguaggi di programmazione?

3

Questa è probabilmente una domanda stupida, ma come funzionano i linguaggi di programmazione a un livello basso? Se vai alla pagina GitHub della lingua Go qui , si dice che quasi il 90% dei file sorgente sono file Go. Com'è possibile che un linguaggio di programmazione sia costituito da se stesso, in particolare il 90% di se stesso? Riesco a capire come un linguaggio come Lua è scritto in C, ma Go è composto principalmente da file Go. Non ha molto senso per me, come usano gli sviluppatori Go per creare Go?

    
posta connorb08 14.10.2016 - 00:51
fonte

3 risposte

5

Un compilatore o interprete è un programma come qualsiasi altro programma. È possibile scrivere programmi in qualsiasi linguaggio di programmazione desiderato, incluso Go. Ergo, puoi scrivere un compilatore in Go. Compreso un compilatore Go.

Perché no?

Naturalmente, per utilizzare effettivamente il compilatore o l'interprete, è necessario avere anche un compilatore o un interprete per quella .

Nel caso di Go, ad esempio, le prime versioni del compilatore erano scritte in C. Quindi, avevano già un compilatore Go funzionante. Quindi, non è un problema scrivere un compilatore Go in Go, dato che hai già un compilatore Go funzionante scritto in C, che puoi usare per compilare il compilatore Go scritto in Go. E ora, hai compilato la versione del tuo compilatore Go scritta in Go, e puoi usarla per compilare versioni future del tuo compilatore Go scritto in Go.

Questo è chiamato "bootstrap" (dopo la vecchia storia del barone Münchhausen, che si è tirato fuori dal fango con i suoi stivaletti).

Nota che per Go in particolare, ci sono diversi compilatori per Go, e almeno gccgo continua ad essere scritto in C ++; non c'è alcun codice Go in gccgo. Quindi, puoi sempre usare gccgo per riavviare il processo di bootstrap, nel caso dovessi perdere il tuo binario Go compilato.

Un compilatore che è scritto nella lingua che compila e che è in grado di compilarsi, è chiamato "self-hosting". Ci sono un paio di vantaggi per un compilatore auto-hosting:

  1. Quando lavori su un compilatore, devi conoscere tre lingue: la lingua che stai compilando (la lingua sorgente ), la lingua che stai compilando (la lingua di destinazione ), e la lingua in cui si sta scrivendo il compilatore (il linguaggio di implementazione ). Il self-hosting ti consente di sbarazzarti di uno di essi. Ciò aumenta la quantità di persone in grado di lavorare nel compilatore riducendo la quantità di conoscenza che un potenziale contributore deve possedere.
  2. I compilatori ad alte prestazioni di livello industriale di livello industriale sono programmi grandi, complessi e ad alta intensità di risorse. Sono un buon test per la tua lingua (le funzionalità di astrazione della tua lingua possono gestire un progetto così ampio e complesso?) E il tuo compilatore (se il compilatore può compilare se stesso, probabilmente può anche compilare altri programmi grandi e complessi).
  3. Se il tuo compilatore è molto semplice, il codice del compilatore può servire come una specifica del comportamento della lingua. (In generale, i compilatori di produzione non sono semplici e semplici compilatori non sono di produzione, tuttavia, questa non dovrebbe essere la specifica solo , altrimenti non sarai mai in grado di dire se il tuo compilatore è corretto o meno.)
  4. Il self-hosting è considerato un traguardo importante per una lingua.

Ci sono anche alcuni svantaggi:

  1. Il complesso processo di bootstrap.
  2. Se lo scrittore del compilatore è anche il progettista del linguaggio, c'è il pericolo che aggiunga funzionalità che può usare mentre scrive il compilatore, e tralascia le caratteristiche per cui è difficile scrivere un compilatore, finendo quindi con un linguaggio che è buono solo per scrivere compilatori e nient'altro. (Non è necessariamente una brutta cosa se stai progettando una lingua per scrivere i compilatori.)

In uno dei suoi articoli, il Prof. Niklaus Wirth ha dato un buon esempio di quest'ultimo: quando ha progettato la lingua di Oberon, ha scritto il compilatore nello stesso momento in cui stava progettando la lingua. Il sistema su cui stava scrivendo aveva solo un oscuro dialetto proprietario di Fortran. Dopo lo stesso tempo, si rese conto di essersi lasciato inconsciamente o di aver cambiato le caratteristiche che avrebbero reso più facile scrivere programmi in Oberon perché non riusciva a pensare a un bel modo per implementarli nell'oscuro dialetto di Fortran. Quindi, buttò via il compilatore, esaminò di nuovo il suo progetto e iniziò un nuovo compilatore nello stesso Oberon. Oberon doveva essere un linguaggio di programmazione dei sistemi, quindi scrivere un compilatore e una libreria standard era una scelta naturale.

Ora, la domanda è: come ha risolto il problema del bootstrap? Beh, era un professore, dopotutto: distribuiva porzioni del compilatore ai suoi studenti, per tradurre manualmente a mano in Fortran.

    
risposta data 14.10.2016 - 01:38
fonte
3

Questa è una domanda molto semplice con una risposta molto profonda. Una spiegazione completa va oltre lo scopo di un sito come questo, ma ti darò abbastanza per iniziare a impararlo.

Innanzitutto, che cos'è un linguaggio di programmazione? O, meglio, che cosa definisce un linguaggio di programmazione? La maggior parte degli sviluppatori professionisti concordano sul fatto che una lingua è definita da due cose principali: il compilatore / interprete e la libreria standard. Il compilatore definisce le regole sintattiche e semantiche su come funziona la lingua, e la libreria standard aiuta a stabilire paradigmi e idiomi per il linguaggio più utile.

Comprendendo ciò, possiamo rispondere alla tua domanda. La versione rapida è che se un linguaggio di programmazione è in grado di eseguire l'elaborazione di dati e file di base, è in grado di implementare un compilatore per una lingua, compresa la propria lingua. Come scrivono Go in Go? Hanno scritto un compilatore Go in Go, ovviamente!

Ma quella non è la cosa che vuoi veramente sapere, vero? Stai chiedendo del problema del pollo e dell'uovo inerente a questa affermazione: come puoi scrivere il primo compilatore in una lingua che non ha ancora un compilatore per sé?

Ovviamente non puoi, quindi scrivi il primo compilatore in un'altra lingua. Questo è noto come "bootstrap". Non ha nemmeno bisogno di implementare l'intero linguaggio, però; quel tanto che basta per compilare un compilatore Go che può fare le stesse cose che può fare il compilatore bootstrap (per esempio compilare sé stesso).

A quel punto, hai un compilatore funzionante in Go, puoi quindi creare nuove funzionalità nel compilatore, compilarle e avere un compilatore nuovo e migliorato, e così via, fino a quando non avrai creato il linguaggio completo come progettato.

    
risposta data 14.10.2016 - 01:04
fonte
1

Allo stesso modo in cui posso usare l'inglese per descrivere e definire l'inglese.

I linguaggi di programmazione non sono scritti come tali. Invece sono più una descrizione di come dovrebbero funzionare.

Il compilatore è l'effettiva implementazione. Originariamente penso che sia stato scritto in C. Ma una volta che puoi compilare il linguaggio, puoi creare un compilatore con quella lingua.

Domanda simile: Quando qualcuno scrive un nuovo linguaggio di programmazione, cosa lo scrive IN?

    
risposta data 14.10.2016 - 00:57
fonte

Leggi altre domande sui tag