I compilatori devono essere scritti per ogni modello di CPU?

5

È necessario tenere conto dei diversi processori e delle loro istruzioni durante la scrittura di un compilatore? Le istruzioni sono state standardizzate? O quali strumenti e tecniche sono disponibili per aiutare con questo? Per esempio. Ignorando le istruzioni della macchina specifiche per un determinato modello di processore.

    
posta br3w5 07.10.2012 - 10:24
fonte

2 risposte

19

No, i set di istruzioni non sono "standardizzati" in modo da poter produrre assembly adatti - o semplicemente mappabili a - ARM, x86, PPC, MIPS, Itanium, Sparc, ... (e le loro varianti ).

I compilatori di codice nativo sono bestie piuttosto complesse. Non tutto il lavoro che fanno è specifico del processore. Tutto il lexing / parsing dipende dalla lingua ma non dai chip. Alcuni passaggi di ottimizzazione sono anche indipendenti dall'hardware, ma probabilmente non tutti - ad es. la giusta dimensione del codice v.s. i compromessi sulla velocità grezza potrebbero dipendere dal target.

A un certo punto, se stai producendo codice nativo, dovrai conoscere i dettagli del chip che hai scelto come target. È necessario essere consapevoli dei loro "quirks" (proprietà di coerenza della memoria per esempio) e set di istruzioni completi per produrre un flusso di istruzioni che sia sia corretto che ragionevolmente efficiente.

Anche se ti limiti a un set di istruzioni (ad esempio x86_64), diverse marche di chip hanno estensioni diverse che devono essere considerate. Diversi modelli della stessa marca hanno anche differenze nell'insegnamento (nuove funzionalità aggiunte, a volte vecchie funzionalità rimosse). Attenersi al "minimo comune denominatore" potrebbe funzionare, ma ti mancherai un sacco di cose.

Significa che si esegue una completa riscrittura del compilatore per ogni nuova serie di istruzioni o estensione che raggiunge il mercato? Ovviamente no. Quelli sono cambiamenti incrementali, a volte solo a "file di descrizione della macchina" o qualsiasi cosa il compilatore usi per modellare il set di istruzioni di destinazione.
Tuttavia, l'introduzione di un nuovo ISA non è un compito banale e richiede una conoscenza dettagliata del target.

Se hai intenzione di creare autonomamente un compilatore, dai un'occhiata a LLVM . È probabile che tu lo usi per la parte "che emette codice nativo" almeno, qualunque sia la lingua che stai cercando di compilare.

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.

    
risposta data 07.10.2012 - 10:47
fonte
2

Un compilatore di solito è composto da molte parti. La generazione del codice reale è solo una parte e una piccola. Quindi, per creare un compilatore per un nuovo processore, devi solo apportare piccole modifiche a un vecchio processore.

Inoltre, i processori arrivano in famiglie. Quando (ad esempio) Intel rilascia un nuovo processore, fa tutto ciò che fa il vecchio processore e altro ancora. Ciò significa che è possibile continuare a utilizzare il compilatore esistente. Creerà programmi che funzionano sul nuovo processore. Non useranno le nuove istruzioni che vengono offerte, ma funzioneranno comunque.

Ad esempio, i compilatori piuttosto vecchi produrranno solo programmi a 32 bit. I programmi funzionano ancora su nuovi computer a 64 bit, ma non eseguono bene .

Probabilmente vuoi un nuovo compilatore per trarre vantaggio dal nuovo chip, ma non è necessario .

    
risposta data 01.10.2015 - 10:26
fonte

Leggi altre domande sui tag