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

12

C ++ è un ottimo linguaggio in molti modi, ma alcune cose in particolare sono scomode da scrivere senza IDE. Come utente VIM, sarebbe molto interessante se avessi accesso a un linguaggio di livello superiore che mi permettesse di scrivere C ++ con S-Expressions e possibilmente con macro Lisp, consentendo la generazione di codice pulito evitando di riscrivere gli stessi pattern 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 codice C particolarmente pulito.

Ci sono dei lavori su questo problema?

    
posta MaiaVictor 29.08.2013 - 20:48
fonte

3 risposte

13

La compilazione di linguaggi di livello superiore a quelli di livello inferiore è una torta. Ci sono innumerevoli esempi di ciò che viene fatto. Senza andare su molto di una tangente, possiamo puntare ai primi compilatori C ++ compilati fino a C.

Quando inizi a lanciare "pulito" e "leggibile" nel mix, tuttavia, le cose diventano davvero difficili. Il codice pulito e leggibile esprime il significato e l'intento di ciò che stavi scrivendo. I computer sono notoriamente cattivi nell'interpretazione e amp; creare significato. È più probabile che tu finisca con le variabili denominate int_147 rispetto a input_buffer_length . Certo, se veramente volevi 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, per essere onesti, i compilatori Common Lisp sono piuttosto fottutamente bravo in quello che fanno.

Più importante della difficoltà di generare C ++ da un Lisp è l'utilità di questo. Quale scopo servirebbe a rendere leggibile il C ++ generato? Se il 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 pulito sul tuo Lisp?

Diciamo che l'abbiamo risolto. È un decennio più tardi e, dopo aver bruciato centinaia di milioni di dollari di donazioni del Dipartimento della Difesa, abbiamo costruito questo massiccio, complesso (ma impeccabile) motore di traduzione linguistica che può trasformare il Lisp in C ++ idiomatico e viceversa. Cosa abbiamo veramente guadagnato che non sarebbe stato meglio realizzato insegnando alle persone un nuovo linguaggio di programmazione o semplicemente sviluppando un nuovo compilatore che ci permettesse di collegare le due lingue?

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

    
risposta data 02.09.2013 - 02:40
fonte
3

Risposta breve, al momento non c'è niente che ti aiuti a convertire Lisp in C ++ leggibile. Certo, puoi convertire qualsiasi cosa in C ++ o C, ma il codice leggibile è scritto da umani, non da programmi. Certo, puoi produrre codice C ++ con una corretta formattazione, rientri, nomi di classi carini e magari anche ottenere in qualche modo una traduzione perfetta dagli oggetti di classe Lisp alle classi C ++. Forse puoi collegare correttamente le dipendenze della tua libreria, e forse puoi compilare binari molto vicini a quello che il linguaggio C avrebbe prodotto se avessi scritto tutto in C. Ma alla fine, il codice leggibile è una bellezza che non è compresa da nessuno, almeno non ancora, e forse mai considerando che il termine leggibile è piuttosto soggettivo e che 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 potranno capire meglio. Proprio come i libri, i programmi sono scritti con un pubblico specifico in mente e possono essere belli e commoventi se scritti bene, e offuscati e noiosi se non lo sono. E se non riusciamo a trovare un programma per scrivere romanzi di belle fiction per noi, allora non saremo in grado di trovare qualcosa da convertire in C ++ leggibile.

    
risposta data 02.09.2013 - 02:56
fonte
3

ViM è un ottimo IDE per C ++. Ha 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 tutti gli IDE mancanti; finisci per scrivere sistema di compilazione in CMake o comunque qualcosa. E non ho visto nulla per fornire qualsiasi aiuto per lisp, period.

Vero, il C ++ non ha macro in stile lisp, ma i template possono fare i macro igienici di tutto lo schema e altro ancora, perché è possibile implementarli in modo diverso in base ai tipi e in base alle loro capacità. È vero, la mancanza di garbage collector rende le chiusure un po 'più noiose, ma l'idioma RAII utilizzato per la gestione delle risorse ha invece i suoi vantaggi e le sue proprietà interessanti.

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

E per rispondere alla domanda diretta finale: C ++ ha così tanti altri idiomi sotto la cintura che non c'è modo di generare C ++ idiomatico da qualsiasi cosa. Semplicemente perché non ci sarà modo di esprimere la maggior parte di questi idiomi in qualcos'altro. Partendo dal fatto che nulla sarà garbage collection assegnerà tutto su heap mentre in C ++ è idiomatico sfruttare lo stack.

    
risposta data 02.09.2013 - 10:48
fonte

Leggi altre domande sui tag