12
votes

Langue de sortie du compilateur - LLVM IR vs c

Pour écrire un compilateur, quels sont les avantages et les inconvénients de l'utilisation de LLVM IR vs C pour une langue cible? Je sais que les deux sont utilisés, et j'imagine que le code de la machine final serait similaire si je devais utiliser Clang pour compiler le C. Alors, quelles sont les autres choses à considérer?


0 commentaires

5 Réponses :


1
votes

Architectures et systèmes d'OSES pour lesquels il n'y a pas de clang, ou pour lequel il est dans un état expérimental.

C est plus largement accepté, mais LLVM IR vous permet de verser la cuillère du moteur LLVM. Tous les chemins d'IR ne sont pas égaux.


0 commentaires

9
votes

J'ai utilisé LLVM IR pour quelques extrémités du compilateur et avez travaillé avec des compilateurs qui utilisent C comme arrière. Une chose que j'ai trouvée qui a donné à la LLVM IR un avantage est qu'il est typé. Il est difficile de faire une sortie complètement formée sans avoir à obtenir des erreurs des bibliothèques LLVM.

Il est également plus facile de conserver une corrélation étroite entre le code source et l'IR pour le débogage, à mon avis.

plus, vous obtenez tous les outils de ligne de commande Cool LLVM pour analyser et traiter l'IR Your Ford Emise.


2 commentaires

Que voulez-vous dire IR est typé? N'est-ce pas typé aussi?


Droite, c est typée. Mais vous n'obtenez pas d'indication de l'erreur avant d'essayer de compiler le code C. Avec LLVM IR, vous obtenez une indication de l'erreur lorsque vous générez l'IR. Beaucoup plus facile de déboguer.



3
votes

Je doute que vous puissiez mettre en œuvre un support de débogage correct pour votre langue lorsque vous ciblez c.


1 commentaires

C'était exactement la raison pour laquelle je mearse ce fil. Je ne vois aucune façon de faire des "cartes sources" sur les symboles de débogage, car il existe des modifications incompatibles avec les symboles de débogage de C compilateurs C. Il faudrait mettre à jour le logiciel de mappage de symboles de débogage avec chaque changement de compilateurs C pris en charge.



3
votes

Avantages LLVM:

  1. JIT - Vous pouvez compiler et exécuter votre code de manière dynamique. Assurez-vous que la même chose est possible avec c (par exemple, à l'aide d'un TCC incorporé ), mais c'est une option beaucoup moins robuste et portable.
  2. Vous pouvez exécuter vos propres passes d'optimisation sur l'IR généré.
  3. Réflexion gratuitement - Inspection à l'inspection du code généré est beaucoup plus facile avec LLVM.
  4. LLVM Bibliothèque n'est pas aussi gros que la plupart des compilateurs C (ne comptant pas TCC , bien sûr).

    inconvénients LLVM:

    1. Le code n'est pas portable, vous devez le modifier légèrement en fonction de votre cible. Il y a un sous-ensemble quelque peu portable de LLVM, mais c'est toujours une pratique louche.
    2. Dépendance d'exécution sur les bibliothèques C ++ pourrait être un peu un problème.

1 commentaires

Vous avez oublié: Si vous voulez C Interop (quelle langue ne pas?) Vous devez coder tous les méchants C Abis vous-même parce que LLVM ne le fait pas tout seul (il se sépare ce travail 50/50 avec Clang)



1
votes

Je vais utiliser LLVM pour faire référence au cadre, et LLVM IR pour faire référence à la langue cible.

Avantages C

  1. multi-plateforme
  2. Debugging (S'il vous plaît lire ci-dessous. Il est en partie lié au point 4).
  3. L'interopérabilité
  4. Facilité d'utilisation

    Avantages LLVM IR

    1. Performance
    2. Options de personnalisation
    3. empreinte mémoire
    4. typage fort / Saftey

      C

      1. Il existe C-compilateurs pour toutes sortes de systèmes embarqués même si LLVM a obtenu plus de cibles que de la fin. On peut affirmer que C a un léger avantage sur la LLVM IR (représentation intermédiaire) dans cette catégorie.

      2. Le principal avantage de communication destinée C au lieu de LLVM est que le code généré est à un niveau supérieur par rapport à LLVM. En utilisant des débogueurs standardisés tels que la GDB, on peut affirmer qu'il est plus facile de raisonner sur le comportement du code généré. Il est également plus facile d'utiliser un débogueur tel que GDB pour construire un débogueur pour le langage compilé C.

      3. Le troisième point. L'interopérabilité est fussier. Cependant, C dispose d'une interface binaire d'application standardisée. Il est donc plus facile aux bibliothèques d'écriture et de l'interface de ces bibliothèques avec d'autres programmes écrits en C et C ou +. Pourtant, de nombreuses langues telles que Java, fournissent des interfaces normalisées à C.

      4. On peut dire qu'il est plus facile de démarrer et obtenir quelque chose de travail en ciblant C

        LLVM

        1. C est tout à fait un langage de haut niveau, et si elle n'est pas écrit, idiomatiques, les performances peuvent se dégrader (Selon le compilateur cible, et quelles hypothèses dit compilateur marques). Il y a des journaux tels que Un backend LLVM pour GHC qui illustre certains inconvénients de C et avantages de LLVM IR comme langue cible.

        2. Depuis LLVM (Le cadre) est construit comme une collection d'unités réutilisables, il est facile de passe langue spécifique cible d'écriture pour votre langue cible spécifique. Il est également plus facile d'écrire un GC personnalisé ( Il y a à partir de 2020 un certain soutien à cette ) . Dans le cas de C il est également possible, et il y a des éboueurs tels que Boehm GC . Cependant, C n'a pas été conçu comme un langage intermédiaire.

        3. empreinte mémoire. code généré C a une empreinte mémoire plus importante par rapport à LLVM code binaire. Si vous compilez et relier un grand système, vous êtes susceptible d'obtenir des avantages de temps de compilation LLVM ciblage.

        4. Alors que C est le langage faiblement typé. LLVM IR est un fortement typé. Il peut donc affirmer qu'il est plus sûr de cibler LLVM IR.


0 commentaires