Quali sono le implicazioni perUtilizzando bytecode LLVM per le librerie (invece di file oggetto nativo)
- portabilità (convenzione di chiamata: è veramente importante a livello LLVM in cui solo chiamando in C o funzioni di libreria OS)
- tempo collegamento
- ottimizzazioni
vorrei compilare un linguaggio giocattolo con LLVM, a causa di tutte le parti dure essendo già presente (ottimizzazione, la generazione di codice oggetto), ma sono lottando con un concetto che vorrei mantenere se ne vale la pena: i file di libreria dovrebbero essere ridistribuibili, utilizzabili come lib statici e condivisi (per il collegamento, nel caso condiviso verrà generata una vera e propria o dll quando l'app finale è collegata), portatile. Credo che ciò ridurrebbe una parte del tempo di compilazione (come la generazione del codice nativo e forse l'ottimizzazione viene eseguita una volta sola, al momento del collegamento binario finale). Immagino che il linker si occupi della convenzione di chiamata (se possibile) e della conversione in una libreria condivisa, se richiesta. In un'aggiunta molto estesa, forse LLVM potrebbe essere sfruttato per il collegamento non e utilizzare il JIT LLVM per eseguire direttamente il codice byte generato, rimuovendo completamente i tempi di collegamento durante la scrittura del codice.
Questo suona
- Fattibile?
- Ne vale la pena? So che il tempo di collegamento C/C++ è relativamente lungo, il che è problematico quando si ricostruisce frequentemente. Per quanto riguarda l'ottimizzazione del tempo di collegamento gratuito (cfr
/GL
e-flto
poiché sarà essenzialmente collegato il bytecode LLVM, che verrà quindi trasformato in un binario nativo).
Questa potrebbe essere una domanda vaga, se devo chiarire qualcosa, per favore chiedi.
Tempo di collegamento più lungo di quello? Il tempo di collegamento Afaik dipende in gran parte dal numero di simboli per unità di compilazione che devono essere risolti (originati in altre unità di compilazione) e non in lingua.Non sono nemmeno sicuro che il codice byte LLVM in realtà cancelli automaticamente le convenzioni di chiamata. Quindi il codice C++ compilato con LLVM non ha potuto accedere a nessun elemento compilato da LLVM. –
@MarcovandeVoort: LLVM si occupa della convenzione di chiamata quando genera codice oggetto nativo. Se chiamo solo codice LLVM (quindi nessuna libreria OS) tutto seguirà la stessa convenzione di chiamata generata da LLVM. In primo luogo, il codice C/C++ è compilato tenendo conto di una certa convenzione di chiamata. Il codice bitmap LLVM generato da Clang non è indipendente dalla piattaforma. Non vedo perché il mio linguaggio giocattolo debba preoccuparsi delle convenzioni di chiamata di C internamente. – rubenvb