Existe-t-il un langage qui transpile en C, avec une meilleure syntaxe? [fermé]
19
CoffeeScript est un langage qui transpile en JavaScript, avec une syntaxe propre, inspirée de Ruby. Existe-t-il un langage similaire qui transpile en C, permettant un code plus lisible sans compromettre les performances? Si rien de tel n'existe, y a-t-il une bonne raison de ne pas le créer?
Notez cependant que "compile en C" n'est pas synonyme de "aussi vite que les programmes C d'origine". Quand quelque chose se compile en C, il génère souvent du code plutôt (ou complètement) différent de ce que toute personne normale écrirait en C.Il pourrait facilement être considérablement plus lent (ou parfois plus rapide) que ce que vous écririez normalement à la main.
Jerry Coffin
4
Ce que je n'aime pas dans ces réponses, c'est qu'elles proposent des langues totalement différentes, comme Vala. La chose à propos de CoffeeScript est qu'il s'agit de Javascript, mais avec une syntaxe différente.
Je souhaite vraiment que "transcompiler" (le mot) meure. C'est "compiler" et "compilateur". Vous n'avez pas besoin d'un nouveau mot simplement parce que le langage de sortie n'est pas x86 (et si vous pensez que vous le faites, vous ne comprenez pas les compilateurs).
Leushenko
2
Le mot transpile signifie (ou est récemment devenu signifiant) pour traduire du code vers le code source d'une autre langue avec la même sémantique , généralement une instruction pour une instruction équivalente (permettant également de créer une carte source). Personne ne prétend que les transpilers font quelque chose de différent des compilateurs. Les transpilers sont un type spécifique de compilateur.
Carl Smith
Réponses:
23
CoffeeScript compile en JavaScript pour une raison très simple, JavaScript est le langage côté client de facto et il serait déraisonnable de s'attendre à ce que les fournisseurs de navigateurs prennent en charge nativement CoffeeScript, alors que tout ce qu'il offre est une syntaxe alternative.
De manière très similaire, le point principal des traducteurs de haut niveau en langage C est la portabilité immédiate, car il existe un compilateur C pour presque toutes les plates-formes et une abondance de bibliothèques C. Vala , par exemple, a été conçu pour :
construire des exécutables natifs (via le compilateur C de la machine),
automatiser le comptage des références, et
être toujours accessible aux programmeurs GNOME C
GNOME est un projet traditionnellement orienté C et GObject est spécifiquement écrit en C, Vala ne trouverait probablement pas beaucoup d'amour parmi les développeurs GNOME s'il était compilé en code machine, quelle que soit sa nature (et sa syntaxe) plus conviviale. Tout le monde ne semblait pas aimer la syntaxe, au point qu'une autre langue, Genie , a été conçue pour l'améliorer.
Pour un exemple C ++, Facebook a développé HipHop , un traducteur PHP vers C ++. Ils essayaient de résoudre un problème très spécifique, l'utilisation du processeur, sans avoir à remplacer tout leur code PHP et à recycler leurs ingénieurs (ou pire, à les remplacer). Ceci est un exemple beaucoup plus spécifique, car les problèmes d'évolutivité de Facebook sont, bien, uniques, et encore une fois avoir accès au code C ++ intermédiaire peut être utile, car les extensions PHP sont écrites en C et C ++.
Un traducteur d'une langue de haut niveau vers une autre est donc une bonne idée, surtout lorsque vous avez besoin d'accéder au code intermédiaire. Pour CoffeeScript, le code JavaScript est nécessaire en raison de sa large adoption par le navigateur, et pour Vala, Genie et HipHop en raison de la base de code existante. De toute évidence, avoir accès au code intermédiaire signifie que vous pouvez l'optimiser davantage si nécessaire.
Mais d'une manière générale, ce ne serait pas une si bonne idée de construire un langage qui se traduit en C, ou tout autre langage, si vous n'aviez aucune utilisation du code résultant. Il y a tellement de langues là-bas, si vous ne pouvez pas gérer le C, choisissez-en simplement un autre. Par coïncidence, le premier compilateur C ++ écrit par Bjarne Stroustrup, CFront, était un traducteur C avec Classes en C, mais c'était principalement parce qu'en tant que nouveau langage, il était impossible d' amorcer C avec Classes.
Je vais couvrir quelques points que Yannis Rizos n'a pas abordés dans sa réponse par ailleurs excellente.
Oui, de nombreuses langues existent. C est une cible courante pour les back-ends de compilateur car il est incroyablement portable et fortement optimisé, bien qu'avec LLVM cela ne sert à rien.
Voici quelques implémentations que je connais:
C ++ (au moins dans les premiers jours)
GHC Haskell (bien que le générateur de code principal soit C--)
Non, ce n'est pas parce qu'il utilise C comme langage intermédiaire que vous atteindrez sa vitesse. La raison pour laquelle C est rapide est à cause de la méthode d'écriture du code qui est évidemment différente pour les autres langages. C'est juste un assemblage portable, rien de spécial.
Certaines personnes pensent que C est un «assembleur de haut niveau». C'est assez proche de la machine, mais bien sûr, ce n'est pas un tas d'opcodes.
dstromberg
6
Rock est un compilateur ooc qui génère une source C99. Le ooc-lang est un langage de programmation avec des objets, des fonctions de première classe et des licornes roses. L' oc est un langage dynamique et marche si loin. Il génère des codes c plus gros et plus lents. vous avez besoin de plus de modifications pour répondre à vos besoins. Mais c'est un bon point de départ.
Pourriez-vous développer un peu plus sur chacune de ces ressources et pourquoi les recommandez-vous comme répondant à la question posée? Les «réponses de lien uniquement» ne sont pas tout à fait les bienvenues à Stack Exchange
gnat
4
OCaml peut compiler en bytecode, en code natif, peut être interprétée directement, ou peut compiler à C .
Pourriez-vous expliquer davantage ce qu'il fait et pourquoi le recommandez-vous comme répondant à la question posée? Les «réponses de lien uniquement» ne sont pas tout à fait les bienvenues à Stack Exchange
gnat
3
Je ne vois pas comment ma réponse est une "réponse de lien uniquement". En fait, je pourrais supprimer le lien et ce serait toujours une réponse valide. La question est "Y a-t-il une langue qui fait X" et ma réponse est "la langue Y fait X". Ce commentaire s'applique également à la réponse de Bilijk.
barjak
3
Le compilateur C ++ original de Bjarne Stroustrop, "cfront", a compilé C ++ en C, avec lequel il pourrait éventuellement exécuter le compilateur C pour produire du code objet. Le C ++ est à peu près aussi "non théorique" que possible :-)
Les compilateurs-compilateurs Unix "yacc" et GNU "Bison" traduisent leurs langages d'entrée en C. De très nombreux systèmes sophistiqués ont été écrits avec eux.
Réponses:
CoffeeScript compile en JavaScript pour une raison très simple, JavaScript est le langage côté client de facto et il serait déraisonnable de s'attendre à ce que les fournisseurs de navigateurs prennent en charge nativement CoffeeScript, alors que tout ce qu'il offre est une syntaxe alternative.
De manière très similaire, le point principal des traducteurs de haut niveau en langage C est la portabilité immédiate, car il existe un compilateur C pour presque toutes les plates-formes et une abondance de bibliothèques C. Vala , par exemple, a été conçu pour :
GNOME est un projet traditionnellement orienté C et GObject est spécifiquement écrit en C, Vala ne trouverait probablement pas beaucoup d'amour parmi les développeurs GNOME s'il était compilé en code machine, quelle que soit sa nature (et sa syntaxe) plus conviviale. Tout le monde ne semblait pas aimer la syntaxe, au point qu'une autre langue, Genie , a été conçue pour l'améliorer.
Pour un exemple C ++, Facebook a développé HipHop , un traducteur PHP vers C ++. Ils essayaient de résoudre un problème très spécifique, l'utilisation du processeur, sans avoir à remplacer tout leur code PHP et à recycler leurs ingénieurs (ou pire, à les remplacer). Ceci est un exemple beaucoup plus spécifique, car les problèmes d'évolutivité de Facebook sont, bien, uniques, et encore une fois avoir accès au code C ++ intermédiaire peut être utile, car les extensions PHP sont écrites en C et C ++.
Un traducteur d'une langue de haut niveau vers une autre est donc une bonne idée, surtout lorsque vous avez besoin d'accéder au code intermédiaire. Pour CoffeeScript, le code JavaScript est nécessaire en raison de sa large adoption par le navigateur, et pour Vala, Genie et HipHop en raison de la base de code existante. De toute évidence, avoir accès au code intermédiaire signifie que vous pouvez l'optimiser davantage si nécessaire.
Mais d'une manière générale, ce ne serait pas une si bonne idée de construire un langage qui se traduit en C, ou tout autre langage, si vous n'aviez aucune utilisation du code résultant. Il y a tellement de langues là-bas, si vous ne pouvez pas gérer le C, choisissez-en simplement un autre. Par coïncidence, le premier compilateur C ++ écrit par Bjarne Stroustrup, CFront, était un traducteur C avec Classes en C, mais c'était principalement parce qu'en tant que nouveau langage, il était impossible d' amorcer C avec Classes.
la source
Je vais couvrir quelques points que Yannis Rizos n'a pas abordés dans sa réponse par ailleurs excellente.
Oui, de nombreuses langues existent. C est une cible courante pour les back-ends de compilateur car il est incroyablement portable et fortement optimisé, bien qu'avec LLVM cela ne sert à rien.
Voici quelques implémentations que je connais:
Non, ce n'est pas parce qu'il utilise C comme langage intermédiaire que vous atteindrez sa vitesse. La raison pour laquelle C est rapide est à cause de la méthode d'écriture du code qui est évidemment différente pour les autres langages. C'est juste un assemblage portable, rien de spécial.
la source
Rock est un compilateur ooc qui génère une source C99. Le ooc-lang est un langage de programmation avec des objets, des fonctions de première classe et des licornes roses. L' oc est un langage dynamique et marche si loin. Il génère des codes c plus gros et plus lents. vous avez besoin de plus de modifications pour répondre à vos besoins. Mais c'est un bon point de départ.
la source
Vala et Genie sont les deux langages qui se compilent en C. haxe se compile en C ++, mais je ne suis pas sûr que c'est ce que vous voulez.
la source
OCaml peut compiler en bytecode, en code natif, peut être interprétée directement, ou peut compiler à C .
la source
la source