7
votes

Choisir une langue intermédiaire

Je joue actuellement avec des langages de programmation. J'ai passé du temps à écrire des analyseurs et des interprètes dans des langues de haut niveau (plus particulièrement hax).

J'ai eu des résultats, que je pense être vraiment agréable, mais maintenant je voudrais les faire vite.

Mon idée était de traduire la langue d'entrée en C.
Ma connaissance C est limitée à ce que vous apprenez à l'université. Au-delà des exercices, je n'ai jamais écrit les programmes C réels. Mais je me sens confiant que je peux le faire fonctionner.

Bien sûr, je pourrais essayer d'écrire un frontend pour le LLVM ou de générer MSL ou JVM Bytecode. Mais je pense que c'est trop pour apprendre en ce moment et je ne vois pas beaucoup de gain.
De plus, C est parfaitement lisible humain, donc si je bousille, il est beaucoup plus facile de comprendre pourquoi. Et c est, après tout, haut niveau. Je peux vraiment traduire des concepts de la langue d'entrée sans trop grandir. Je devrais avoir quelque chose à travailler et à courir dans une durée raisonnable, puis à l'optimiser comme je vois en forme.

Alors: Y a-t-il des descentes pour utiliser c? Pouvez-vous recommander une alternative?
Merci pour votre aperçu :)


edit: une clarification

  • La raison pour laquelle je veux aller jusqu'au bout, c'est que j'écris une langue avec le soutien de l'OOP et que je souhaite mettre en œuvre ma méthode d'expédition à la main, car j'ai quelque chose de très spécifique à l'esprit.
  • Une zone d'utilisation principale rédigerait des services HTTP, mais j'aurais pu ajouter des liaisons à une bibliothèque de l'interface graphique (WxWidgets peut-être) ou autre chose.

2 commentaires

La plupart des compilateurs que je peux penser à cela, prenez une étape intermédiaire avant que l'indigène aille à C, alors, oui, je pense que c est un bon choix, d'autant plus que cela vous donne automatiquement beaucoup de portabilité. Si votre langue est orientée objet, vous pourriez avoir un meilleur moment à la traduction de C ++ ou de l'objectif-C; De même, si c'est fonctionnel, vous pourriez avoir un meilleur moment à traduire à Haskell.


@Rafe Kettler: Postez-le comme une réponse, pourquoi limiter à un commentaire? :)


4 Réponses :


2
votes

C est en fait un très bon choix pour une langue cible pour un petit ou un compilateur expérimental - sa largement disponible sur de nombreuses plateformes, votre compilateur devient donc immédiatement utile dans de nombreux environnements. L'inconvénient principal concerne des éléments qui ne sont pas bien supportés en C ou ne sont pas bien définis dans la spécification C. Par exemple, si vous souhaitez effectuer une génération de code dynamique (compilation JIT), C est problématique. Des choses comme la pile déroulant et la réflexion sont difficiles à faire en C (bien que SETJMP / LONGJMP et une utilisation minutieuse des structures pour lesquelles vous générez des descriptions de mise en page peut faire beaucoup). Des choses comme des tailles de mots, une taille de mots grosse ou petite-endienne et une précision arithmétique varie entre les compilateurs C, vous devez donc en être conscient, mais ce sont des choses que vous devez traiter si vous souhaitez prendre en charge plusieurs machines cibles de toute façon.

D'autres langues peuvent également être utilisées - l'avantage principal de C est son ubiquité.


1 commentaires

Big / Little Endian sera un problème, quelle que soit la langue. Bien sûr, des langues trop élevées pour même que les choses sur un octet ne subiront aucun problème de Endian, car ils ne les soutiennent même pas.



6
votes

C est un choix bon et assez populaire pour ce que vous essayez de faire.

Néanmoins, jetez un coup d'œil à la langue intermédiaire de LLVM (IR). C'est assez lisible et je pense qu'il est plus propre et plus facile à générer et à analyser que C. LLVM est livré avec une grande collection d'outils de travail. Vous pouvez générer du code natif pour une variété de plates-formes (comme avec C mais avec un contrôle légèrement plus de contrôle de la sortie) ou pour des machines virtuelles. Possibilité de compilation JIT est aussi un plus.

voir L'architecture des applications open source, chapitre 11 pour l'introduction à l'approche LLVM et Quelques extraits d'IR.


Quel est votre environnement cible? Cela pourrait nous aider à mieux vous donner une meilleure réponse.


1 commentaires

@RubenVB: Oui, c'était. C'est pourquoi il vaut la peine de le regarder même si vous ne l'utiliserez pas à la fin. Et vous ne pourrez peut-être pas l'utiliser directement (E.G. LLVM est C ++, il peut donc être difficile de l'utiliser dans certains environnements). Ou cela pourrait vous inspirer de faire quelque chose exactement en face de votre plan initial: utilisez LLVM frontend pour une langue existante (et populaire) et fournissez votre propre backend personnalisé ou VM pour votre application.



2
votes

Vous pourriez envisager C-- , une langue semblable à C destiné à être une meilleure cible pour la génération de code que c.


1 commentaires

Merci, ça sonne très intéressant;)



0
votes

C est un bon choix, imho. Contrairement à de nombreuses langues, C est généralement considéré comme "élégant" en ce que vous n'avez que 32 mots-clés et des constructions très basiques (séquence, sélection, itération), avec une collection très simple et cohérente de jetons et d'opérateurs.

Parce que la syntaxe est très cohérente au sein de C (supports et accolades, blocs et déclarations, utilisation des expressions), vous ne mettez pas en marche dans un monde sans bornes d'expansion linguistique. C est une langue mature, a bien résisté, et maintenant - un jour est une "quantité connue" (qui est vraiment difficile à dire sur de nombreuses autres langues, même "mature").


0 commentaires