È possibile compilare un linguaggio di livello superiore in C ++ leggibile? [chiuso]


12

Il C ++ è un grande linguaggio in molti modi, ma alcune cose in particolare sono ingombranti da scrivere senza un IDE. Come utente VIM, sarebbe molto interessante se avessi accesso a un linguaggio di livello superiore che mi ha permesso di scrivere C ++ con S-Expressions e possibilmente con macro simili a Lisp, consentendo la generazione di codice pulito evitando di riscrivere gli stessi schemi ancora e ancora.

Ho chiesto su freenode e testato diverse idee, come la compilazione di Lisp-> C con compilatori come ECL e Bigloo, ma nessuno di questi ha generato un codice C particolarmente pulito.

Ci sono lavori su questo problema?


3
Perché non scrivere il tuo codice in un lisp con le macro in modo tale che sia tutto C ++ e quindi quelle funzionalità che desideri ma che sono difficili da pulire in modo semplice vengono semplicemente espanse da una macro LISP da una semplice sintassi al C ++ più complesso. Meglio ancora, potresti semplicemente scrivere il tuo codice in LISP. :)
Jimmy Hoffa,

2
Ti aspetti che la traduzione Lisp -> C ++ produca un codice C ++ pulito, quando l'assembly (probabilmente più semplice) C ++ -> produce un assembly illeggibile (una questione di opinione)? A chi si rivolge comunque la destinazione della compilazione?

1
In qualche modo non sono del tutto convinto che qualcuno abbia già scritto le macro per espandere esattamente quello che vuoi espandere, ma come regola le macro sono sorprendentemente semplici da scrivere, sono solo metodi di elaborazione degli elenchi, non dovresti avere molte difficoltà a scriverlo tutto all'interno di una singola espressione s che delimiti quando vuoi che il macro expander presti attenzione, quindi semplicemente stampa l'elenco per ottenere il tuo codice C ++ con l'espansione.
Jimmy Hoffa,

2
Concordo sul fatto che Lisp può fare certe cose difficili in C ++ (come le chiusure). Devi fare quelle cose? Quindi poiché sono difficili da fare in C ++, indipendentemente da come li porti in C ++, automaticamente o manualmente, non sarà carino. Il mio consiglio: se davvero non hai davvero bisogno di quelle cose difficili che Lisp può fare, non usare Lisp. Diventa bravo in C ++. Se devi usare queste cose, ma devi scrivere il codice in C ++, allora scopri come farlo in C ++. Questo è ciò che separa gli adulti dai bambini in questo business.
Mike Dunlavey,

3
Esistono diverse lingue con compilatori che emettono codice C, quindi non vedo perché questo non sia fattibile, anche se è un codice C ++ simile a C. Se la tua domanda è "posso ottenere codice C ++ canonico e best practice usando tutte le funzionalità disponibili in C ++", potrebbe essere un po 'più difficile.
Robert Harvey,

Risposte:


13

Compilare le lingue di livello superiore con quelle di livello inferiore è un gioco da ragazzi. Ci sono innumerevoli esempi di ciò che viene fatto. Senza andare troppo avanti, possiamo indicare i primi compilatori C ++ compilati in C.

Quando inizi a lanciare "pulito" e "leggibile" nel mix, tuttavia, le cose si fanno davvero difficili. Il codice pulito e leggibile esprime il significato e l' intento di ciò che stavi scrivendo. I computer sono notoriamente cattivi nell'interpretare e creare significato. È più probabile che tu finisca con variabili nominate int_147di input_buffer_length. Certo, se davvero volessi far funzionare questo progetto, potresti impegnarti in un enorme progetto di intelligenza artificiale per gestire la conversione del tuo Lisp in una sorta di C ++ decentemente leggibile ma, ad essere sinceri, i compilatori Common Lisp sono fottutamente bravi in ​​quello che fanno .

Più importante della difficoltà di generare C ++ da un Lisp è l'utilità di questo. Quale scopo servirebbe affinché il C ++ generato fosse leggibile? Se Lisp è il tuo codice sorgente, le rappresentazioni intermedie dovrebbero essere irrilevanti. Se vuoi essere in grado di consegnare il C ++ ai programmatori che non capiscono il tuo Lisp originale, ora hai un altro problema. Cosa succede quando vogliono modificare il C ++ generato? Cosa succede se scrivono cose in C ++ che non si traducono in modo chiaro nel tuo Lisp?

Diciamo che l'abbiamo risolto. È passato un decennio più tardi e, dopo aver bruciato centinaia di milioni di dollari di fondi DoD, abbiamo creato questo motore di traduzione linguistica massiccio, complesso (ma impeccabile) che può trasformare Lisp in C ++ idiomatico e viceversa. Cosa abbiamo davvero guadagnato che non sarebbe meglio realizzare insegnando alle persone un nuovo linguaggio di programmazione o semplicemente sviluppando un nuovo compilatore che ci permetta di collegare le due lingue?

Oh giusto. Il tuo capo vuole che tu scriva C ++ e preferiresti non farlo. Aggiorna il tuo curriculum e trova un nuovo lavoro.


Vorrei poter aggiornare il mio curriculum e trovare un altro lavoro. Sfortunatamente non è così semplice quando job = "student" e boss = "professor". E, sfortunatamente, dovrei avere un diploma. Indipendentemente dal fatto che non vado alle lezioni, ma lo imparo da solo a casa. Del fatto sto già lavorando sul settore e guadagno più soldi della maggior parte dei laureati che conosco. Funziona così. Purtroppo. Fortunatamente il mio prof ha accettato di passarmi se scrivo qualcosa di complicato in C ++. Conosco già C ++. Quindi preferirei cogliere l'occasione per imparare qualcosa di diverso (; a parte Rant, ottima risposta. Grazie.
MaiaVictor

@Dokkat: non credo che tu conosca il C ++. Puoi scrivere modelli con implementazioni speciali a seconda che il parametro abbia qualche metodo o funzione? Hai fatto calcoli in fase di compilazione utilizzando Boost.MPL? Capisci come funziona Boost.ForEach? Se devi farlo in C ++, approfittane per imparare C ++ più avanzato. Sarà più utilizzabile anche per il tuo lavoro.
Jan Hudec,

1
Beh, ho fatto alcuni template piuttosto complicati quando ho lavorato con C ++ in quegli anni tristi. Sì, ho usato Boost. Per ogni cosa, ricordo di aver definito molte macro per renderlo più utile. Comunque ero un bambino, non è stata un'esperienza divertente. Non riesco più ad imparare, quando Lisp fornisce un sistema macro così più solido, meno doloroso, che realizza esattamente quel tipo di metaprogrammazione che il C ++ richiede abilità guru.
MaiaVictor,

3

Risposta breve, al momento non c'è nulla che ti aiuti a convertire Lisp in C ++ READABLE. Sicuramente puoi convertire qualsiasi cosa in C ++ o C ma il codice leggibile è scritto da umani, non da programmi. Sicuramente puoi generare codice C ++ con una corretta formattazione, rientri, nomi di classe carini e forse anche in qualche modo ottenere una traduzione perfetta dagli oggetti della classe Lisp in classi C ++. Forse puoi collegare le dipendenze della tua libreria proprio nel modo giusto, e forse puoi compilare binari che sono molto vicini a ciò che il linguaggio C avrebbe prodotto se tu avessi scritto tutto in C. Ma alla fine, il codice leggibile è una bellezza che non è compresa da parte di qualcuno, almeno non ancora, e forse mai considerato il termine leggibile è abbastanza soggettivo per cominciare e ciò che potrebbe essere considerato leggibile da un gruppo di sviluppatori può essere considerato atroce da altri.

Per rendere leggibile il C ++, devi scrivere in C ++, non in Lisp. Devi anche essere in grado di cambiare il tuo stile di codifica in base a ciò che le persone che leggeranno il tuo codice capiranno meglio. Proprio come i libri, i programmi sono scritti pensando a un pubblico specifico e possono essere belli e toccanti se scritti bene e offuscati e noiosi se no. E se non riusciamo a trovare un programma per scrivere bellissimi romanzi di narrativa per noi, allora non saremo in grado di trovare qualcosa da convertire in C ++ leggibile.


Immagino che stai interpretando ciò che intendo con "leggibile"! Non deve essere davvero bello. Quanto basta per poterlo leggere e capire cosa sta succedendo. Immagino che andrò con alcune macro Lisp per una traduzione diretta, come suggerito da JimmyHoffa nei commenti.
MaiaVictor

3

ViM è un ottimo IDE per C ++. Ha anche il miglior completamento che abbia mai visto finora, anche se diventa un po 'lento se si inseriscono molte intestazioni, il clang completo . E per la compilazione ho trovato comunque carenti tutti gli IDE; finisci per scrivere il sistema di compilazione in CMake o qualcosa del genere. E non ho visto nulla per fornire alcun aiuto per il periodo lisp.

È vero, C ++ non ha macro in stile lisp, ma i modelli possono fare tutto ciò che possono fare le macro igieniche dello schema e altro ancora, perché è possibile implementarle in modo diverso in base ai tipi e in base alle loro capacità. È vero, la sua mancanza di garbage collector rende le chiusure un po 'più noiose, ma il linguaggio RAII usato per la gestione delle risorse ha invece i suoi vantaggi e proprietà interessanti.

Se sei uno studente, conosci davvero tutto il C ++ avanzato? Dalla libreria di algoritmi alla scrittura di modelli con implementazioni alternative basate su proprietà dei tipi di argomenti, calcoli del tempo di compilazione utilizzando la meta-programmazione dei modelli (utilizzando Boost.MPL) per capire come funziona Boost sotto il cofano? In caso contrario, ti consiglio di cogliere questa opportunità come opportunità per imparare un po 'di C ++ avanzato. Non sarà necessario mantenere il compito scolastico, quindi puoi giocare con la lingua per vedere quanto valgono le caratteristiche in cui nel codice di produzione dovresti fare attenzione alla leggibilità.


E per rispondere alla domanda diretta finale: il C ++ ha così tanti altri modi di dire che non c'è modo di generare C ++ idiomatico da nulla. Semplicemente perché non ci sarà modo di esprimere la maggior parte di quegli idiomi in qualsiasi altra cosa. A partire dal fatto che qualsiasi cosa garbage collection stanzierà tutto sull'heap mentre in C ++ è idiomatico sfruttare lo stack.


Accetto su VIM. Si adatta come un guanto per lo sviluppo C. Sono un utente Vim ma per Lisp uso Emacs in modalità malvagia con SLIME e Paredit. C'è un po 'di supporto per Lisping in vim con hook REPL di base ma non si avvicinano allo SLIME.
mike30,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.