Domanda

Sono in fase di realizzazione un cross-platform (Mac OS X, Windows e Linux) applicazione che farà un sacco di CPU intensive analisi dei dati finanziari. La maggior parte del motore di analisi sarà scritto in C ++ per ragioni di velocità, con un motore di scripting accessibile all'utente interfacciamento con il C ++ test motore. Voglio scrivere parecchie scripting front-end nel corso del tempo per emulare altri software popolare con grandi basi di utenti esistenti. Il primo fronte sarà un VisualBasic-come linguaggio di scripting.

Sto pensando che LLVM sarebbe perfetto per le mie esigenze. Le prestazioni sono molto importante a causa della enorme quantità di dati; può richiedere ore o giorni per eseguire una singola esecuzione di test per ottenere una risposta. Credo che l'utilizzo di LLVM inoltre mi permette di utilizzare un'unica soluzione di back-end, mentre a implementare diversi front-end per i diversi sapori del linguaggio di scripting nel corso del tempo.

Il motore di test si sarà separata dall'interfaccia e testando sarà anche avvenire in un processo separato con progressi e risultati comunicati all'interfaccia di gestione test. Prove consisteranno codice di script integrato con il codice di test motore.

In una precedente implementazione di un simile sistema di test commerciale che ho scritto, ho costruito un interprete veloce che facilmente interfacciato con la libreria di test perché è stato scritto in C ++ e collegato direttamente alla libreria di test motore. Le richiamate da codice di script per testare biblioteca oggetti traduzione coinvolto tra i formati con grande carico di lavoro.

sto immaginando che con LLVM, ho potuto implementare i callback in C ++ direttamente in modo che avrei potuto fare il codice di script lavoro quasi come se fosse stato scritto in C ++. Allo stesso modo, se tutto il codice è stato compilato in formato byte-code LLVM, sembra che gli ottimizzatori di LLVM potrebbero ottimizzare attraverso i confini tra il linguaggio di scripting e il codice del motore di prova che è stato scritto in C ++.

Non voglio avere a compilare il motore di test ogni volta. Idealmente, vorrei JIT compilazione solo il codice di script. Per le piccole prove, mi piacerebbe saltare alcuni passaggi di ottimizzazione, mentre per le grandi prove, mi esibisco ottimizzazioni pieno durante il collegamento.

Quindi, è possibile? Posso precompilare il motore di prova in un file oggetto .o o .a file di libreria e quindi collegare il codice di script utilizzando il JIT?

Infine, idealmente, mi piacerebbe avere il codice di script implementare metodi specifici come sottoclassi per una specifica classe C ++. Così il motore di C ++ test vedrebbe solo gli oggetti C ++ mentre il codice compilato codice di script di installazione JIT che ha implementato alcuni dei metodi per gli oggetti. Sembra che se ho usato il nome giusto algoritmo per l'elaborazione sarebbe relativamente facile da configurare la generazione LLVM per il linguaggio di scripting per assomigliare ad una chiamata di metodo C ++ che potrebbero poi essere collegato nel motore di test.

In questo modo la fase di collegamento sarebbe andato in due direzioni, chiamate dal linguaggio di scripting nel motore di prova oggetti per recuperare informazioni sui prezzi le informazioni e lo stato di test e le chiamate dal motore sperimentazione di metodi di qualche particolare C ++ oggetti in cui il codice è stato non in dotazione da C ++, ma dal linguaggio di scripting.

In sintesi:

1) Posso collegare in file precompilati (sia .BC, .o o .a) come parte della compilazione JIT, processo di generazione di codice?

2) Posso collegare nel codice utilizzando il processo in 1) di cui sopra, in modo che io sono in grado di creare codice che si comporta come se fosse tutto scritto in C ++?

È stato utile?

Soluzione

  1. Yes we can! A seconda della versione di LLVM si utilizza ci sono diverse chiamate API. avrete bisogno di LLVM :: getBitcodeModuleProvider sul 2,5.
  2. Il modo più semplice per chiamare funzioni C ++ è quello di creare una funzione (LLVM :: :: funzione Create) utilizzando il flag LLVM :: :: Funzione ExternalLinkage e poi addGlobalMapping per renderlo puntare alla funzione C ++.

Altri suggerimenti

  1. Credo di sì.
  2. Questo è peloso. È necessario abbinare il C ++ ABI delle funzioni che si sta chiamando in, e la necessità di assicurarsi che il codice generato utilizza lo stesso strutture dati, le classi, il layout, etc (tramite un equivalente di file di intestazione). Il ++ ABI C ha un certo numero di sfumature e problemi di portabilità. Forse prototipo con fare interoperabilità con C prima. clang ha un supporto limitato per C ++ al momento.

1) è possibile caricare e collegare i file .BC, .o file se sono state comnpiled ad un .so archivio deve essere caricabile ed i simboli in essi dovrebbero essere in grado di essere utilizzato.

2) Fino a quando non si vuole fare le cose orribili con i callback probabilmente si può semplicemente passare puntatori a funzione C standard e fare callback da puntatori a funzione. È possibile fare certe altre cose, ma che fare con il tentativo di definire gli oggetti C ++ o modelli o le funzioni di membro chiamata pur non essendo un compilatore C ++ è qualcosa che si desidera non fare.

È necessario conoscere il C ++ ABI, è necessario conoscere la piattaforma di destinazione, è necessario conoscere un sacco di cose, è necessario essere in modo efficace un compilatore C ++ per generare il codice che sembra che è C ++. Il nome Mangler è una delle parti più fastidiose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top