Come funziona un compilatore? [chiuso]


17

Nota: sono sorpreso che questo non sia stato chiesto prima e, in caso affermativo, non sono riuscito a trovarlo in una ricerca.

Sono stato su tonnellate di siti Web, ho letto tonnellate di articoli e ho sentito tonnellate di spiegazioni. Molti di loro erano buoni, ma erano tutti troppo ampi o troppo complicati o semplicemente cattivi. Quindi la mia domanda è: come funziona un compilatore?

Se questa è una domanda ampia e difficile, per favore dimmelo. In caso contrario, rispondi alla domanda.


4
Troppo ampia, almeno la parte "Come funziona". Ci sono interi libri scritti su quell'argomento.
Oded,

1
en.wikipedia.org/wiki/Compiler sarebbe il link di Wikipedia che è banale da trovare, che cosa ti stai chiedendo in particolare? La domanda è abbastanza ampia che sarei tentato di dare la risposta intelligente di alec, "I compilatori traducono il codice da una lingua all'altra", in quanto questa è l'idea generale che ha molte sfumature al suo interno quando si inizia a guardare cosa comporta veramente.
JB King,

1
Sì e penso che abbia avuto una risposta abbastanza buona.
Jeremy,

1
Qualsiasi spiegazione del funzionamento di un compilatore sarà troppo ampia o troppo complicata. È un argomento complicato e le lezioni dei compilatori sono state i corsi di informatica più difficili che abbia mai seguito.
David Thornley,

1
@David Naturalmente i compilatori sono complicati e non puoi spiegare tutti i dettagli di come funzionano qui. Tuttavia, sono sicuro che tu avessi una conoscenza di base di alto livello su cosa sia un compilatore o su come funzioni prima di seguire il tuo corso di compilatore.
Dima,

Risposte:


24

Un compilatore è un programma che traduce il codice sorgente per un altro programma da un linguaggio di programmazione in codice eseguibile.

Il codice sorgente è in genere in un linguaggio di programmazione di alto livello (ad es. Pascal, C, C ++, Java, Perl, C #, ecc.). Il codice eseguibile può essere una sequenza di istruzioni della macchina che può essere eseguita direttamente dalla CPU oppure può essere una rappresentazione intermedia interpretata da una macchina virtuale (ad es. Codice byte Java).

In breve, un compilatore converte un programma da un formato leggibile dall'uomo in un formato leggibile dalla macchina.

Quanto a come funziona un compilatore, questo è davvero complicato. Ci sono libri e corsi universitari sull'argomento. Cercherò di delineare brevemente le fasi principali del processo, ma questa sarà una panoramica molto superficiale.

  1. Lexing: suddividere il testo del programma in "token". I token sono le "parole" del linguaggio di programmazione, come identificatori (parole chiave, nomi di variabili, nomi di funzioni, ecc.) O operatori (=, *, &, ecc.).
  2. Analisi: converte la sequenza di token in un albero di analisi, che è una struttura di dati che rappresenta vari costrutti di linguaggio: dichiarazioni di tipo, dichiarazioni di variabili, definizioni di funzioni, loop, condizionali, espressioni, ecc.
  3. Ottimizzazione: valuta espressioni costanti, ottimizza le variabili inutilizzate o il codice non raggiungibile, se possibile esegui lo svolgimento di cicli, ecc.
  4. Traduci l'albero di analisi in istruzioni macchina (o codice byte JVM).

Ancora una volta, sottolineo che questa è una descrizione molto breve. I compilatori moderni sono molto intelligenti e, di conseguenza, molto complicati.


2
In realtà, trasforma una lingua in un'altra. Il compilatore C ++ iniziale è stato compilato in C. Lo stesso vale per il compilatore Vala. Il compilatore Java viene compilato in bytecode che non è eseguibile senza un compilatore JIT di JVM.
deadalnix,

1
@deadalnix IMHO, il punto è che si passa dal codice non eseguibile al codice eseguibile. Direi che C-front non era un compilatore ma un front-end per il compilatore C. O una fase del processo di compilazione, se vuoi. Le macchine virtuali sfocano il confine tra "eseguibile" e "non eseguibile", ovviamente. Qui considererei semplicemente il codice eseguibile come qualunque cosa accada nella macchina virtuale, come il codice byte, e astraggo tutto ciò che accade all'interno della VM, come JIT.
Dima,

1
@Dima, non deve essere da codice non eseguibile a codice eseguibile. Ad esempio, non è possibile eseguire il codice byte JVM direttamente sui computer Windows.

1
@ Thorbjørn Ravn Andersen: ma il codice byte è eseguibile dalla JVM. Il punto centrale di una "macchina virtuale" non sembra al programmatore una vera macchina?
Dima,

2
Direi che tradizionalmente un compilatore ha convertito un programma da un formato leggibile dall'uomo in un formato leggibile dalla macchina, proprio come ha detto Dima. Variazioni come Cfront che converte C ++ in C o javac che converte Java in bytecode sono argomenti più avanzati che probabilmente dovrebbero essere lasciati fino a dopo aver spiegato il concetto tradizionale di base a qualcuno che non ha familiarità con esso.
Carson63000,

5

Un compilatore è un programma per computer (o un insieme di istruzioni) che trasforma il codice sorgente scritto in un linguaggio di programmazione (la lingua di origine) in un altro linguaggio per computer (la lingua di destinazione, spesso con una forma binaria nota come codice oggetto). Il motivo più comune per voler trasformare il codice sorgente è creare un programma eseguibile.

I compilatori collegano i programmi sorgente in linguaggi di alto livello con l'hardware sottostante. Un compilatore richiede:

  1. Determinare la correttezza della sintassi dei programmi
  2. Generazione di codice oggetto corretto ed efficiente
  3. Organizzazione run-time
  4. Formattazione dell'output secondo le convenzioni assembler e / o linker.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.