Come generare codice C ++? (probabilmente WITH (non FROM) Python) [chiuso]

4

Per una simulazione scientifica ho bisogno di scrivere alcuni calcoli in C ++. Poiché questo è diventato estremamente noioso, mi sono costruito un piccolo generatore di codice: In un linguaggio di scripting (Python) si crea un albero di sintassi composto da assegnazioni e operazioni matematiche . Un codegeneratore auto-scritto trasforma l'albero in codice C ++. (Ad ogni modo, un buon esempio per il pattern dei visitatori.) Va bene e ok.

Ora il progetto sta crescendo e la richiesta di codice più sofisticato arriva. È molto difficile per me vedere quali strumenti potrebbero essere utili. Che cosa fanno e usano le persone quando devono generare codice di programma in modo programmatico? (con Python come "linguaggio generatore" o in generale)

(Siamo spiacenti, ma in questo caso, Google non è davvero mio amico. Google non può trasformare un'attività in risultati di ricerca, sfortunatamente.)

    
posta Michael 23.03.2016 - 11:26
fonte

2 risposte

3

Quindi vuoi tradurre alcuni (i tuoi) lingua specifica per il dominio (DSL) con qualche tocco di C ++. Sto facendo esattamente lo stesso nella mia implementazione GEL MELT . È un linguaggio di dominio Lisp-y specifico per personalizzare il compilatore GCC . Vedi anche questa risposta dando un po 'più di dettagli, e questo uno che fornisce riferimenti pertinenti.

Ecco alcuni consigli; Non posso essere più specifico perché non ho assolutamente idea di quale sia la lingua del tuo dominio. È Turing-complete (forse accidentalmente)? Probabilmente sì!

  • se non l'hai mai studiato, studia le tecniche compilatore (incluso < a href="https://en.wikipedia.org/wiki/Lexer"> lexing & analisi ). Sono molto pertinenti.

  • leggi il libro di Scott Programming Pragmatic Language (almeno per ispirazione)

  • considera (invece di sviluppare la tua DSL) incorporare un interprete esistente , forse Guile o Lua . Potrebbe essere considerevolmente più semplice.

  • sappi che progettare e implementare un DSL passabile che è compilato (forse in C ++) è un lotto di lavoro (anni!). Leggi il mese dell'uomo mitico , Legge di Hofstadter , ecc ... Forse vuoi (o non) per bootstrap la tua implementazione linguistica ...

  • se il tuo DSL è in qualche modo utile (ad esempio non sei l'unico script di scrittura al suo interno), sappi che alla fine qualche pazzo utente codificherebbe in esso script di grandi dimensioni (molte migliaia di righe). Quindi progetta seriamente la lingua!

  • per prima cosa, hai bisogno di una rappresentazione ben definita (nella tua testa!) del albero di sintassi astratto ( che potrebbe non essere un albero , ma un graph ) del codice C ++ generato e dovresti costruire (in memoria) l'AST prima di emettere il corrispondente codice C ++

  • potresti voler emettere #line direttive (facendo riferimento alle posizioni all'interno degli script DSL). È molto utile (per il debug) ma emetterli è piuttosto difficile.

  • potresti aver bisogno di diverse altre rappresentazioni interne, tra l'origine DSL e il codice C ++ generato, e il tuo generatore di codice C ++ (in realtà un compilatore specializzato) sta trasformando alcune rappresentazioni in altre, e infine in un AST che viene emesso come codice C ++.

  • dovresti preoccuparti del modello di memoria; leggi quindi le tecniche garbage collection (per lo meno, per la terminologia e i concetti), vedi Manuale GC . Probabilmente non vuoi uno script utente stupido per mandare in crash il computer o il processo. Quindi devi gestire la memoria (& perdite di memoria ).

  • forse potresti prendere in considerazione, invece di generare codice C ++, utilizzare le tecniche di compilazione JIT : GCCJIT , LLVM , libjit , asmjit , ...

  • forse SciLab , R , Octave , Julia potrebbe essere rilevante per il tuo lavoro (perché potrebbe evitare di iniziare la propria DSL)

risposta data 23.03.2016 - 15:43
fonte
1

Hai bisogno di generare C ++, o codice compilato? Puoi sfruttare LLVM per produrre output compilati da strumenti con script. Il linguaggio intermedio clang è prolisso ma potente - è il codice C ++ (o qualsiasi altra lingua supportata) che viene analizzato prima della compilazione. In alternativa puoi generare C ++ da strumenti che sfruttano ancora il parser Clang, quindi invece di manipolare il testo, puoi manipolare l'AST interno che contiene il parser.

Per un esempio, guarda cmonster , che è un (rudimentale) wrapper python per il parser C ++ di clang.

    
risposta data 23.03.2016 - 16:03
fonte

Leggi altre domande sui tag