Sviluppo di un compilatore per un'architettura CPU autoprodotta

5

Recentemente sono stato consumato creando la mia semplice architettura CPU che a un certo punto potrebbe essere facilmente implementata nell'hardware (nessun FPGA, ma circuiti Logic Gate reali). Naturalmente per soddisfare questo requisito sono andato con una semplice CPU a 4 bit, con uno spazio di programma di 4 KB e 256 byte di RAM.

Supporta tutte le operazioni fondamentali come ADD, Sottrai, AND, LOAD, STORE ecc. Prima di iniziare a trasmettere questo all'hardware voglio sviluppare uno stack software moderatamente potente che possa compilare un linguaggio C / C come architettura, quindi la cpu potrebbe essere programmata usando un linguaggio di alto livello. Attualmente ho scritto un assemblatore funzionante in VB.NET, ma ora sono bloccato su come affrontare l'obiettivo finale di un compilatore funzionante.

In particolare, ho le seguenti domande:

Quale dovrebbe essere il mio prossimo passo, e come dovrei approcciare alla scrittura di un compilatore?

Anche se una CPU a 4 bit è semplice, non è molto utile in quanto non può gestire calcoli di grandi dimensioni contemporaneamente, quindi il mio obiettivo finale sarebbe astratto questa incapacità sviluppando uno stack software che all'utente sarebbe come programmare un 16 CPU bit (o più grande). Attualmente scrivo manualmente un assembly che può estendersi su più numeri su più registri ed eseguire calcoli tra di loro, ma alla fine quale parte dello stack software si occupa della gestione di numeri e calcoli che sono maggiori delle dimensioni dei registri fisici?

Quale parte dello stack del software riguarda la chiamata di subroutine ecc?

Per favore fatemi sapere se ho bisogno di chiarire qualsiasi cosa.

    
posta Adil Malik 27.12.2014 - 13:56
fonte

1 risposta

8

Il back-end LLVM è il modo più semplice per farlo. Se si abbassa LLVM IR all'assemblaggio o al microcodice, è possibile eseguire il rollover da lì e utilizzare solo i numerosi frontend LLVM per convertire linguaggi superiori come C ++ in LLVM IR.

In altre parole, LLVM è stato progettato esplicitamente per supportare questo scenario.

Lo stack completo va così:

  • Frontend (ad esempio Clang per C e C ++) - codice sorgente - > LLVM IR
  • Optimizer (LLVM) - LLVM IR - > LLVM IR
  • Backend (tu) - LLVM IR - > montaggio / microcodice / qualunque cosa

La prima parte viene fornita per te in base alla lingua. Quindi per C e C ++, è possibile utilizzare Clang, per D è possibile utilizzare LDC, ecc. La seconda parte è fornita da LLVM: forniscono un gran numero di routine di ottimizzazione indipendenti dall'obiettivo e alcune basate su target. Infine, fornisci un servizio di traduzione da LLVM IR al tuo codice specifico per l'architettura.

Si noti che LLVM IR offre alcune garanzie, poiché sono mirate su piattaforme reali. Ad esempio, presuppongono il supporto in virgola mobile IEEE754 e byte a 8 bit nonché vari tipi di supporto puntatore. Dovrai comunque supportare tutti questi elementi se vuoi compilare linguaggi come C per indirizzare la tua architettura in generale . Se si è disposti a limitare la lingua di partenza un po 'oltre la normale, è possibile allontanarsi senza implementare tutte queste funzionalità, ad esempio, se il codice C non utilizza float, in linea di principio non c'è motivo per cui il frontend debba emettere float-using Codice IR LLVM.

LLVM IR è una via di mezzo comune che è possibile compilare qualsiasi lingua per il targeting, e da lì, può essere abbassata per qualsiasi CPU. Fondamentalmente, tutto ciò che devi fare è supportare le primitive e quindi fornire un back-end LLVM per convertire da LLVM IR al tuo assembly. LLVM e frontend del linguaggio faranno tutto il resto.

    
risposta data 27.12.2014 - 15:29
fonte

Leggi altre domande sui tag