Introduction à la compilation avec LLVM

a marqué ce sujet comme résolu.

Bonjour à tous.

J'ai commencé la rédaction d'un tutoriel intitulé « Introduction à la compilation avec LLVM ». Le tutoriel a pour objectif d'être une vulgarisation du Dragon Book, et se veut accessible à des personnes n'ayant aucune notion dans le domaine. Le plan et l'introduction sont achevés. Voici le lien de la bêta :

Merci d'avance pour vos retours.

+10 -0

Chouette ! Quand penses-tu rédiger l'introduction du tutoriel ? Je préfère ne pas faire de commentaire sur ton cours avant d'en connaître les objectifs et les pré-requis.

+0 -0

Pas tout à fait. Tu peux comparer ce cours à celui-ci pour t'en rendre compte. Une telle introduction consiste à :

  • Accrocher le lecteur
  • Lui indiquer ce qu'il va apprendre dans le tutoriel (et ce qu'il ne va pas apprendre)
  • Ainsi que les pré-requis à satisfaire pour pouvoir suivre correctement
+0 -0

Bonjour les agrumes !

La bêta tutoriel « Introduction à la compilation avec LLVM » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


J'ai ajouté une introduction générale et fait quelques modifications mineures dans la partie 1.

+0 -0

Là, il y a une introduction. ^^

Par contre, "vous apprendrez les bases de la compilation" n'est pas très explicite. Notamment, je me demande s'il sera question de théorie des langages (automates et compagnie).

+0 -0

Bonjour à tous.

J'aurais quelques remarques et questions sur le projet de cours. - Clang est un front-end de LLVM, ce n'est pas un compilateur en soi-même, ni un analyseur (bien qu'il soit la base de l'analyseur statique http://clang-analyzer.llvm.org/). - Dans la logique de LLVM, il me semble que les étapes d'optimisation ont lieu avant le transfert de l'IR au back-end, qui lui est chargé de la génération de code (http://llvm.org/devmtg/2014-04/PDFs/Talks/Passes.pdf) - Avant de rentrer dans le détail de l'implémentation d'un nouveau langage, un overview plus détaillé de clang (clang-tidy, exploration de l'ast avec libclang, etc) aurait pu simplifier la compréhension des concepts qui seront ensuite utilisés. - Mentionner l'état courant du projet LLVM/Clang (compilateur par défaut de XCode, possibilité de brancher clang dans l'IDE VS2015 http://www.theregister.co.uk/2015/10/21/microsoft_promises_clang_for_windows_in_november_visual_c_update/)

Clang est un front-end de LLVM, ce n'est pas un compilateur en soi-même, ni un analyseur (bien qu'il soit la base de l'analyseur statique http://clang-analyzer.llvm.org/).

C'est la combinaison frontend/backend dans un programme complet qui donne le compilateur. La combinaison de LibClang et de LLVM donne Clang, le compilateur.

Dans la logique de LLVM, il me semble que les étapes d'optimisation ont lieu avant le transfert de l'IR au back-end, qui lui est chargé de la génération de code (http://llvm.org/devmtg/2014-04/PDFs/Talks/Passes.pdf)

Effectivement. Tu peux me citer le passage ? J'ai peut-être dit le contraire dans un moment d'inattention.

Avant de rentrer dans le détail de l'implémentation d'un nouveau langage, un overview plus détaillé de clang (clang-tidy, exploration de l'ast avec libclang, etc) aurait pu simplifier la compréhension des concepts qui seront ensuite utilisés.

Ça peut être intéressant, je verrai comment l'aborder.

Mentionner l'état courant du projet LLVM/Clang (compilateur par défaut de XCode, possibilité de brancher clang dans l'IDE VS2015 http://www.theregister.co.uk/2015/10/21/microsoft_promises_clang_for_windows_in_november_visual_c_update/)

J'en parlerai.

Merci pour tes commentaires.

+0 -0

C'est la combinaison frontend/backend dans un programme complet qui donne le compilateur. La combinaison de LibClang et de LLVM donne Clang, le compilateur.

Je me suis fait peut-être avoir par le terme "clang" qui est un tout petit peu ambigu. Bien sûr qu'il existe le binaire clang.exe (entre autres), mais fait attention : "clang: a C language family frontend for LLVM" est quand même écrit bien en gros sur http://clang.llvm.org/... De fait, j'en déduis que "clang" réfère plutôt au front-end.

Effectivement. Tu peux me citer le passage ? J'ai peut-être dit le contraire dans un moment d'inattention.

Le paragraphe "Génération de code" est avant le paragraphe "Optimisation". Ce n'est que ça.

Je me suis fait peut-être avoir par le terme "clang" qui est un tout petit peu ambigu. Bien sûr qu'il existe le binaire clang.exe (entre autres), mais fait attention : "clang: a C language family frontend for LLVM" est quand même écrit bien en gros sur http://clang.llvm.org/... De fait, j'en déduis que "clang" réfère plutôt au front-end.

En fait, Clang désigne à la fois le compilateur et le projet entier. Du coup oui, c'est parfois compliqué de s'y retrouver.

Le paragraphe "Génération de code" est avant le paragraphe "Optimisation". Ce n'est que ça.

Le paragraphe parle de la génération de la représentation intermédiaire. Je vais modifier pour lever l’ambigüité.

+0 -0

Qu'est ce que la compilation ?

La compilation AOT est la plus ancienne et probablement la plus courante. Ici, le programme source est directement converti en code machine, et un fichier exécutable est produit.

Autrement dit, c'est de la compilation vers l'ASM, non ?

La compilation JIT est quasiment identique à la compilation AOT, à un détail près : le code machine généré est directement exécuté par le compilateur.

Tu veux dire par là qu'on n'a pas de fichier à exécuter ?

Ces langages reposent sur un interprète, qui exécute le programme source instruction par instruction, sans passer par le langage machine.

Peut-être pourrais-tu clarifier le "sans passer par le langage machine" en le remplaçant par un truc du genre "sans le transformer en langage machine" ?

On retrouve des techniques de compilation dans les moteurs de recherche, les agents conversationnels, et même dans des domaines éloignés de l'informatique, comme la génétique.

Aurais-tu des liens à fournir pour le lecteur curieux ? :)


Un truc qui me praît étrange, c'est que tu ne parles pas de compilation d'un langage quelconque vers un autre. En effet, les compilations AOT et JIT semblent compiler vers de l'ASM uniquement. Du coup, dans quelle catégorie se situerait un compilateur Python vers JavaScript ?

En outre, il me semble intéressant d'expliquer les avantages et inconvénients de chaque type de compilation. Notamment, la question qu'on risque de se poser c'est : pour interpréter un langage au lieu de le compiler (à proprement parler) ?

Je me demande si ajouter des schémas pour chaque type de compilation n'aiderait pas à comprendre.

Déroulement d'une compilation

Partons d'une expression mathématique :

Je ne comprends pas trop ce que tu veux dire par là, dans le sens où je ne comprends pas trop ce qu'on est en train de faire : quel est le langage de départ et quel est celui d'arrivée ?

En fait, je ne suis pas sûr qu'il soit judicieux d'introduire les étapes de la compîlation via un exemple. Illustrer par un exemple, complètement, mais se restreindre à un exemple (surtout mathématique, alors qu'on s'attend plutôt à avoir un code source) risque, je pense, de priver le lecteur d'une vision globale sur le processus.

Je ne commente pas la suite maintenant, il faut que je relise pour faire un truc constructif.

Merci. ^^

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte