Est-il possible de compiler un langage de niveau supérieur en C ++ lisible? [fermé]

12

Le C ++ est un excellent langage à bien des égards, mais certaines choses en particulier sont lourdes à écrire sans IDE. En tant qu'utilisateur VIM, ce serait très intéressant si j'avais accès à un langage de niveau supérieur qui me permettait d'écrire C ++ avec des expressions S et éventuellement avec des macros de type Lisp, permettant la génération de code propre tout en évitant de réécrire les mêmes patters encore et encore.

J'ai demandé sur freenode et testé plusieurs idées, telles que la compilation de Lisp-> C avec des compilateurs tels que ECL et Bigloo, mais aucune de celles-ci n'a généré un code C particulièrement propre.

Y a-t-il des travaux sur cette question?

MaiaVictor
la source
3
Pourquoi ne pas écrire votre code dans un lisp avec des macros telles que c'est tout C ++ et ensuite les fonctionnalités que vous voulez mais sont difficiles à nettoyer proprement sont simplement développées par une macro LISP d'une syntaxe simple au C ++ plus complexe. Mieux encore, vous pouvez simplement écrire votre code dans LISP. :)
Jimmy Hoffa
2
Vous attendez-vous à ce que la traduction Lisp -> C ++ produise du code C ++ propre, lorsque l'assemblage C ++ -> (sans doute plus simple) produit un assemblage illisible (une question d'opinion)? À qui s'adresse la compilation de toute façon?
1
D'une manière ou d'une autre, je ne suis pas totalement convaincu que quelqu'un ait déjà écrit les macros pour développer exactement ce que vous souhaitez développer, mais en règle générale, les macros sont étonnamment simples à écrire, ce ne sont que des méthodes de traitement de liste, vous ne devriez pas avoir de difficulté à les écrire le tout à l'intérieur d'une seule expression s que vous délimitez lorsque vous voulez que l'expandeur de macro fasse attention, puis imprimez simplement la liste pour obtenir votre code C ++ avec expansion.
Jimmy Hoffa
2
Je suis d'accord que Lisp peut faire certaines choses difficiles en C ++ (comme les fermetures). Avez-vous besoin de faire ces choses? Puisqu'ils sont difficiles à faire en C ++, peu importe comment vous les intégrez en C ++, automatiquement ou manuellement, ce ne sera pas joli. Ma suggestion: si vous n'avez pas vraiment vraiment vraiment besoin de ces choses difficiles que Lisp peut faire, n'utilisez pas Lisp. Obtenez bon en C ++. Si vous devez utiliser ces choses, mais vous devez coder en C ++, alors découvrez comment le faire en C ++. C'est ce qui sépare les adultes des enfants dans cette entreprise.
Mike Dunlavey
3
Il y a plusieurs langages ayant des compilateurs qui émettent du code C, donc je ne vois pas pourquoi ce n'est pas possible, même si c'est du code C ++ de type C. Si votre question est "puis-je obtenir du code C ++ canonique et conforme aux meilleures pratiques en utilisant toutes les fonctionnalités disponibles en C ++", cela pourrait être un peu plus difficile.
Robert Harvey

Réponses:

13

Compiler des langues de niveau supérieur vers des langues de niveau inférieur est un gâteau. Il existe d'innombrables exemples de ce qui se fait. Sans aller sur une grande partie de la tangente, nous pouvons pointer vers les premiers compilateurs C ++ qui se sont compilés en C.

Cependant, lorsque vous commencez à lancer "clean" et "readable" dans le mix, les choses deviennent vraiment difficiles. Un code propre et lisible exprime la signification et l' intention de ce que vous écriviez. Les ordinateurs sont notoirement mauvais pour interpréter et créer du sens. Vous êtes plus susceptible de vous retrouver avec des variables nommées int_147que input_buffer_length. Bien sûr, si vous vouliez vraiment faire fonctionner ce projet, vous pourriez vous lancer dans un projet d'IA massif pour gérer la conversion de votre Lisp en une sorte de C ++ lisible décemment, mais, pour être parfaitement honnête, les compilateurs Common Lisp sont plutôt bons à faire. .

L'utilité de ceci est plus importante que la difficulté de générer du C ++ à partir d'un Lisp. À quoi cela servirait-il que le C ++ généré soit lisible? Si le Lisp est votre code source, les représentations intermédiaires ne devraient pas être pertinentes. Si vous voulez pouvoir remettre le C ++ à des programmeurs qui ne comprennent pas votre Lisp d'origine, vous avez maintenant un autre problème. Que se passe-t-il quand ils veulent modifier votre C ++ généré? Que se passe-t-il s'ils écrivent des choses en C ++ qui ne se traduisent pas proprement dans votre Lisp?

Disons que nous avons résolu cela. C'est une décennie plus tard et, après avoir dépensé des centaines de millions de dollars en subventions du DoD, nous avons construit ce moteur de traduction linguistique massif, complexe (mais sans faille) qui peut transformer Lisp en C ++ idiomatique et vice versa. Qu'avons-nous vraiment gagné qui ne serait pas mieux accompli en enseignant aux gens un nouveau langage de programmation ou en développant simplement un nouveau compilateur qui nous permet de lier les deux langages?

Oh, c'est vrai. Votre patron veut que vous écriviez C ++ et vous préférez ne pas. Mettez à jour votre CV et trouvez un nouvel emploi.

Sean McSomething
la source
J'aimerais pouvoir mettre à jour mon CV et trouver un autre emploi. Malheureusement, ce n'est pas si simple quand job = "étudiant" et boss = "professeur". Et malheureusement, je suis censé avoir un diplôme. Indépendamment du fait que je ne vais pas aux cours, je l'apprends moi-même à la maison. Du fait que je travaille déjà dans l'industrie et que je gagne plus d'argent que la plupart des diplômés que je connais. C'est comme ça que ça fonctionne. Malheureusement. Heureusement mon prof a accepté de me passer si j'écris quelque chose de compliqué en C ++. Je connais déjà le C ++. Je préfère donc profiter de l'occasion pour apprendre quelque chose de différent (; Rant de côté, excellente réponse. Merci.
MaiaVictor
@Dokkat: Je ne pense pas que vous connaissiez le C ++. Pouvez-vous écrire des modèles avec des implémentations spéciales selon que le paramètre a une méthode ou une fonction? Avez-vous effectué des calculs au moment de la compilation à l'aide de Boost.MPL? Comprenez-vous comment fonctionne Boost.ForEach? Si vous devez le faire en C ++, profitez-en pour apprendre le C ++ plus avancé. Il sera également plus utilisable pour votre travail.
Jan Hudec
1
Eh bien, j'ai fait des modèles assez compliqués quand j'ai travaillé avec C ++ ces tristes années. Oui, j'ai beaucoup utilisé Boost.ForEach, je me souviens d'avoir défini beaucoup de macros pour le rendre plus utile. Quoi qu'il en soit, je n'étais qu'un enfant, ce n'était pas une expérience amusante. Je n'arrive pas à en savoir plus, lorsque Lisp fournit un système de macro beaucoup plus solide et moins douloureux, qui accomplit exactement ce genre de métaprogrammation que C ++ nécessite des compétences gourmandes.
MaiaVictor
3

Réponse courte, il n'y a actuellement rien qui puisse vous aider à convertir Lisp en READABLE C ++. Bien sûr, vous pouvez convertir n'importe quoi en C ++ ou C mais le code lisible est écrit par les humains, pas par les programmes. Bien sûr, vous pouvez générer du code C ++ avec un formatage approprié, des retraits, de bons noms de classe et peut-être même obtenir une traduction parfaite des objets de classe Lisp en classes C ++. Peut-être que vous pouvez obtenir vos dépendances de bibliothèque liées correctement, et peut-être que vous pouvez compiler des binaires qui sont très proches de ce que le langage C aurait produit si vous aviez écrit le tout en C. Mais finalement, le code lisible est une beauté qui n'est pas comprise par quiconque, du moins pas encore, et peut-être jamais en considérant que le terme lisible est assez subjectif pour commencer et ce qui pourrait être considéré comme lisible par un groupe de développeurs peut être considéré comme atroce par d'autres.

Pour rendre le C ++ lisible, vous devez écrire en C ++, pas en Lisp. Vous devez également pouvoir modifier votre style de codage en fonction de ce que les personnes qui liront votre code comprendront le mieux. Tout comme les livres, les programmes sont écrits avec un public spécifique à l'esprit et peuvent être beaux et touchants s'ils sont bien écrits, et obscurs et fastidieux sinon. Et si nous ne pouvons pas proposer un programme pour écrire de beaux romans de fiction pour nous, alors nous ne pourrons pas trouver quelque chose à convertir en C ++ lisible.

Shashank Gupta
la source
Je suppose que vous surestimez ce que je veux dire par «lisible»! Cela n'a pas besoin d'être vraiment beau. Juste assez pour que vous puissiez le lire et comprendre ce qui se passe. Je suppose que j'irai avec quelques macros Lisp pour une traduction directe, comme JimmyHoffa l'a suggéré dans les commentaires.
MaiaVictor du
3

ViM est un excellent IDE pour C ++. Il a la meilleure finition que j'ai jamais vue jusqu'à présent, bien que cela devienne un peu lent si vous tirez beaucoup d'en-têtes, le clang est terminé . Et pour la compilation, j'ai trouvé que tous les IDE manquaient de toute façon; vous finissez par écrire le système de construction dans CMake ou quelque chose de toute façon. Et je n'ai rien vu pour apporter de l' aide pour le lisp, point final.

Certes, C ++ n'a pas de macros de style lisp, mais les modèles peuvent faire tout ce que les macros hygiéniques du schéma peuvent et plus encore, car vous pouvez les implémenter différemment en fonction des types et en fonction de leurs capacités. Certes, son manque de garbage collector rend les fermetures un peu plus fastidieuses, mais l'idiome RAII utilisé pour la gestion des ressources a ses propres avantages et propriétés intéressantes.

Si vous êtes étudiant, connaissez-vous vraiment tous les C ++ avancés? De la bibliothèque d'algorithmes à l'écriture de modèles avec des implémentations alternatives basées sur les propriétés des types d'arguments, de la compilation de calculs de temps à l'aide de la méta-programmation de modèles (à l'aide de Boost.MPL) à la compréhension du fonctionnement de Boost sous le capot? Si ce n'est pas le cas, je recommande de saisir cette opportunité pour apprendre du C ++ avancé. Le devoir d'école n'aura pas besoin d'être maintenu, vous pouvez donc jouer avec la langue pour voir ce que valent les fonctionnalités là où dans le code de production, vous devez faire attention à la lisibilité.


Et pour répondre à la dernière question directe: C ++ a tellement plus d'idiomes sous sa ceinture qu'il n'y a aucun moyen de générer du C ++ idiomatique à partir de quoi que ce soit. Tout simplement parce qu'il n'y aura aucun moyen d'exprimer la plupart de ces idiomes dans autre chose. En partant du fait que n'importe quoi, la récupération de place allouera tout sur le tas alors qu'en C ++, il est idiomatique de tirer parti de la pile.

Jan Hudec
la source
Mettez-vous d'accord sur VIM. Il tient comme un gant pour le développement C. Je suis un utilisateur de Vim mais pour Lisp j'utilise Emacs en mode diabolique avec SLIME et Paredit. Il existe une prise en charge de Lisping dans vim avec des crochets REPL de base, mais ils ne se rapprochent pas de SLIME.
mike30