742 Shares 1660 views

Broadcaster – è … Tipi di compilatori. programmi trasmessi Convertire e

I programmi, così come le persone da tradurre da una lingua all'altra bisogno di un interprete o traduttore.

concetti di base

Il programma è una rappresentazione linguistica di calcoli: i → P → P (i). Un interprete è un programma che viene alimentato al programma di ingresso P e un input x. Si effettua al P x: I (P, x) = P (x). Il fatto che v'è un solo traduttore è in grado di eseguire tutti i programmi possibili (che possono essere rappresentati nel sistema formale) è molto profondo e significativo Turing scoperta.

Il processore è un interprete di programmi in linguaggio macchina. Generalmente troppo costoso per scrivere interpreti per linguaggi di alto livello, in modo che si traducono in una forma che è più facile da interpretare.

Alcuni tipi di traduttori hanno nomi molto strani:

  • L'assemblatore traduce programmi in linguaggio assembly in linguaggio macchina.
  • Il compilatore traduce un linguaggio di alto livello ad un linguaggio più bassa.

Emittente – è un programma che prende come dati di ingresso del programma in un linguaggio S e produce programma T in modo tale che entrambi hanno la stessa semantica: P → X → D. Cioè, ∀x. P (x) = Q (x).

Se in onda l'intero programma in qualcosa interpretabile, si parla di una compilazione prima della compilazione esecuzione o, AOT. AOT compilatore può essere utilizzato in serie, l'ultima delle quali è spesso l'assemblatore, ad esempio:

Il codice sorgente del compilatore → (traduttore) → → codice assembly assembler (compilatore) Codice → → macchina CPU (interprete).

compilazione operativa o dinamico si verifica se il programma viene trasmesso, quando eseguito da altre parti precedentemente compilato. JIT-compilatori ricordare quello che hanno già fatto in modo da non ripetere più e più volte il codice sorgente. Essi possono anche produrre la compilazione adattivo e ricompilazione sulla base del comportamento dell'ambiente esecuzione del programma.

Molte lingue permettono di eseguire codice in fase di compilazione e compilare il nuovo codice in fase di esecuzione.

fase di traduzione

Broadcast comprende le fasi di analisi e sintesi:

L'analizzatore di codice sorgente → → → generatore di rappresentazione concettuale (sintetizzatore) → codice di destinazione.

Ciò è dovuto a questi motivi:

  • Qualsiasi altro metodo non è adatto. traduzione Word semplicemente non funziona.
  • Buona soluzione tecnica: se si desidera scrivere traduttori per le lingue M e N di origine mirati necessario scrivere solo semplici programmi M + N (polukompilyatorov) piuttosto che complesso M × N (totale di traduttori).

Tuttavia, in pratica, una vista concettuale di un molto raramente abbastanza espressivo e abbastanza potente da coprire ogni concepibile lingua di origine e di destinazione. Mentre alcuni erano in grado di venire vicino a questo.

compilatori reali passano attraverso molte fasi. Quando si crea il proprio compilatore non ha bisogno di ripetere tutto il duro lavoro che le persone hanno fatto per creare rappresentazioni e generatori. È possibile tradurre la lingua direttamente in JavaScript o C e sfruttare esistente JavaScript-motore e il compilatore C per fare il resto. È inoltre possibile utilizzare la rappresentazione intermedia esistente e le macchine virtuali.

record di traduttore

Broadcaster – è un programma o hardware, che ha coinvolto tre lingue: l'origine, la destinazione e la base. Essi possono essere scritti in una forma a T, ponendo la base originale a sinistra, a destra e al di sotto di destinazione.

Ci sono tre tipi di compilatori:

  • Broadcaster – è samokompilyator se corrisponde alla lingua di partenza di base.
  • Compilatore che prendono di mira il linguaggio è la linea di base, chiamato samorezidentnym.
  • Broadcaster – un cross-compilatore, se mirati e varie lingue di base.

Perché è importante?

Anche se non si effettua un vero e proprio compilatore, una buona conoscenza della tecnologia della sua creazione, perché il concetto utilizzato per questo scopo vengono utilizzati ampiamente, ad esempio:

  • formattazione del testo;
  • query in linguaggio a banche dati;
  • architettura calcolatore avanzato;
  • problemi di ottimizzazione generalizzate;
  • GUI;
  • linguaggi di scripting;
  • controllori;
  • macchine virtuali;
  • traduzione automatica.

Inoltre, se si vuole scrivere un preprocessore, linker, caricatori, debugger e profiler, si deve passare attraverso la stessa procedura quando si scrive un compilatore.

Si può anche imparare a scrivere programmi migliori, dal momento che la creazione del traduttore per la lingua significa una migliore comprensione della sua complessità e ambiguità. Lo studio dei principi generali di trasmissione permette anche di diventare un buon linguaggio di design. Quindi è importante come ripida la lingua, se non può essere attuato in modo efficace?

tecnologia completa

La tecnologia compilatore copre molte aree diverse di informatica:

  • teoria formale del linguaggio: grammatica, analisi, computabilità;
  • architettura del computer. set di istruzioni, RISC o CISC, pipeline cicli di clock core di elaborazione, ecc;
  • concetti di linguaggi di programmazione, ad esempio, l'esecuzione di un controllo di sequenza, l'esecuzione condizionale, iterazione, ricorsione, decomposizione funzionale, modularità, sincronizzazione, meta-programmazione, portata, costanti sottotipi, modelli, tipo di output, prototipi, annotazioni, flusso, monadi, cassette postali, continuano , i caratteri jolly, espressioni regolari, la memoria transazionale, ereditarietà, polimorfismo, impostazioni di modalità, e così via, ecc..;
  • linguaggi astratti e macchine virtuali;
  • algoritmi e strutture dati: espressioni regolari, algoritmi di parsing, algoritmi di grafica, programmazione dinamica, formazione;
  • linguaggi di programmazione: sintassi, semantica (statici e dinamici), paradigmi di supporto (strutturale, OOP, funzionale, logico, pila, parallelismo, meta-programmazione);
  • creazione software (compilatori, generalmente grandi e complesse): localizzazione, caching, componentize, API interfacce, riutilizzo, sincronizzazione.

progettazione del compilatore

Alcuni dei problemi incontrati nello sviluppo del reale traduttore:

  • Problemi con la lingua di origine. E 'facile per compilarlo? C'è un preprocessore? Come sono i tipi? C'è una biblioteca?
  • Raggruppamento passaggi del compilatore: singola o multi-way?
  • Il grado di ottimizzazione desiderata. trasmissioni veloci e sporche con poca o nessuna ottimizzazione può essere normale. Over-ottimizzazione del compilatore rallenterà, ma meglio il codice a runtime può essere valsa la pena.
  • Il grado di rilevamento di errore richiesto. Può un traduttore basta fermarsi al primo errore? Quando si dovrebbe smettere? Sia a fidarsi della correzione degli errori del compilatore?
  • La disponibilità di strumenti. Se la lingua originale non è molto piccolo, sono necessari gli analizzatori dello scanner e generatore. Ci sono anche generatori, generatori di codice, ma non sono così comuni.
  • Tipo di codice target da generare. Essere selezionati dal codice macchina completato o virtuale pura. Oppure basta scrivere una porzione voce che crea una rappresentazione intermedia popolari come LLVM, RTL, o JVM. O fare una traduzione dell'originale nel codice sorgente in C o JavaScript.
  • Il formato del codice di destinazione. È possibile scegliere un linguaggio assembly, un codice macchina portatile, immagine di memoria codice macchina.
  • Il retargeting. Quando l'insieme di generatori è bene avere una porzione di ingresso comune. Per questo motivo è meglio avere un generatore per l'ingresso di molte parti.

compilatore Architettura: componenti

Queste sono le principali componenti funzionali di un compilatore che genera codice nativo (se il programma di uscita è un programma in C o una macchina virtuale, è necessario non così tanti stadi):

  • Il programma di input (marchi di flusso) viene alimentato nello scanner (analizzatore lessicale), che converte in un flusso di gettoni.
  • Parser (parser) costruzione di un albero astratto sintassi.
  • analizzatore semantico decompone l'informazione semantica e controlla i nodi della struttura per gli errori. Come risultato, costruito semantica grafico – albero di sintassi astratta con proprietà aggiuntive e dei legami stabiliti.
  • generatore di codice intermedio costruisce un grafico di flusso (tuple sono raggruppati in blocchi principali).
  • Machine-indipendente ottimizzatore di codice esegue l'ottimizzazione sia a livello locale (all'interno dell'unità di base) e globale (a tutti i blocchi) sostanzialmente rimanendo all'interno routine. Riduce codice ridondante e semplifica i calcoli. Il risultato è un grafico di flusso modificato.
  • Generatore di codice si lega bersaglio blocchi base in un codice di controllo di trasmissione rettilinea, creando un file oggetto assemblatori registri virtuali (eventualmente inefficace).
  • Machine-dipendente ottimizzatore, linker alloca la memoria tra i registri e rende le squadre di pianificazione. Esegue il programma di conversione in linguaggio assembly in questa assemblea con un buon uso di pipelining.

Inoltre, l'uso di rilevamento degli errori direttore sottosistema e tabelle dei simboli.

analisi lessicale (scansione)

Lo scanner converte i caratteri di origine flusso in un flusso di gettoni, eliminando gli spazi bianchi, i commenti e le macro in espansione.

Scanner spesso incontrano problemi, come o meno di prendere in considerazione il caso, i margini, interruzioni di riga e commenti incorporati.

Gli errori che possono verificarsi durante la scansione, chiamati lessicale e comprendono:

  • caratteri che non sono in alfabeto;
  • eccedenti il numero di caratteri in una parola o linea;
  • Non un segno chiuso o una stringa letterale;
  • fine del file in commento.

Analisi (parsing)

Il parser converte la sequenza di token in un albero di sintassi astratta. Ogni nodo nell'albero viene memorizzato come un oggetto con campi chiamati, molti dei quali sono essi stessi i nodi della struttura. In questa fase non vi sono cicli. Quando si crea un parser è necessario prestare attenzione al livello di complessità della grammatica (LL o LR) e scoprire se ci sono regole di disambiguazione. Alcuni linguaggi richiedono analisi semantica.

Gli errori trovati in questa fase sono chiamati sintassi. Ad esempio:

  • k = 5 * (7 – y;
  • j = / 5;
  • 56 = x * 4.

analisi semantica

Durante l' analisi semantica controlla la legittimità di regole e parti associare dell'albero di analisi (che consente nomi di riferimento inserimento operazione per conversioni di tipo implicite, e così via. D.) per formare il grafico semantico.

Ovviamente, l'insieme di ammissibilità delle regole in diverse lingue diverse. Se si compila i linguaggi Java-like, compilatori possono trovare:

  • dichiarazione variabile multipla nel suo ambito;
  • un riferimento a una variabile prima della dichiarazione;
  • riferimenti al nome del sommerso;
  • violazione dei diritti di brevetto;
  • numero eccessivo o insufficiente di argomenti in una chiamata di metodo;
  • tipo non corrispondente.

generazione

generazione del codice intermedio produce grafo di composto tuple, raggruppati in blocchi di base.

generazione di codice produce un codice macchina reale. In compilatori tradizionali per le RISC-macchine sul primo passo, si crea un assemblatore con un numero infinito di registri virtuali. Per CISC-machines probabilmente non accadrà.