Qu'est-ce que LLVM exactement?

464

J'entends constamment parler de LLVM. C'est en Perl, puis en Haskell, puis quelqu'un l'utilise dans une autre langue? Qu'Est-ce que c'est?

Bodacydo
la source
45
Il y a un bon chapitre dans un livre expliquant tout bien ici: www.aosabook.org/en/llvm.html
David d C e Freitas

Réponses:

369

LLVM est une bibliothèque utilisée pour construire, optimiser et produire du code machine intermédiaire et / ou binaire.

LLVM peut être utilisé comme cadre de compilation, où vous fournissez le "front end" (analyseur et lexer) et le "back end" (code qui convertit la représentation de LLVM en code machine réel).

LLVM peut également agir comme un compilateur JIT - il prend en charge la génération d'assemblys x86 / x86_64 et PPC / PPC64 avec des optimisations de code rapides visant la vitesse de compilation.

Si vous êtes intéressé, vous pouvez jouer avec le code machine de LLVM qui est généré à partir du code C ou C ++ dans leur page de démonstration , mais la page de démonstration est actuellement désactivée depuis l'année 2013.

LiraNuna
la source
39
Si vous voulez jouer avec, regardez cet article étonnant: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna
29
Le lien fourni dans la réponse indique "La page de démonstration de LLVM est actuellement désactivée."
EngrStudent
5
ellcc.org/demo/index.cgi est une autre façon de jouer avec la compilation de C / C ++ via LLVM vers diverses cibles, y compris le code intermédiaire
Tom Goodfellow
1
pouvez-vous donner un exemple concret de ce que cela signifie?
Migrate2Lazarus voir mon profil
112

Voici un bon résumé de LLVM:

entrez la description de l'image ici

Au frontend, vous avez Perl et de nombreux autres langages de haut niveau. Au niveau du backend, vous avez le code natif qui s'exécute directement sur la machine.

Au centre se trouve votre représentation de code intermédiaire. Si chaque langage de haut niveau peut être représenté dans ce format IR LLVM, les outils d'analyse basés sur cet IR peuvent être facilement réutilisés - c'est la raison d'être de base.

Peter Teoh
la source
39
l'image vaut mille mots 👍
ipatch
3
Il semble donc que LLVM soit utile pour les concepteurs de compilateurs. Un programmeur devrait-il se soucier s'il compile avec un compilateur standard ou basé sur LLVM, en plus d'analyser le code généré indépendamment du code source?
jinawee
4
si vous pouvez compiler avec LLVM vers son IR, alors de nombreux outils peuvent vous être ouverts pour analyser l'IR. Mais si votre outil est uniquement capable d'analyser les binaires natifs (x86 par exemple), qu'il s'agisse de binaires générés par LLVM ou binaires générés par gcc, ou générés par un compilateur Intel, cela n'a aucune différence.
Peter Teoh
73

LLVM (qui signifiait auparavant «machine virtuelle de bas niveau» mais pas plus) est une infrastructure de compilation, écrite en C ++, conçue pour l'optimisation au moment de la compilation, de la liaison, de l'exécution et de «l'inactivité» des programmes écrits dans des langages de programmation arbitraires. Initialement implémentée pour C / C ++, la conception indépendante du langage (et le succès) de LLVM a depuis engendré une grande variété de frontaux, y compris Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , et d'autres.

Lisez ceci pour plus d'explications
Consultez également Hirondelle à vide

N 1.1
la source
13
.. donc ce que les docs essaient de dire; alors que LLVM est un acronyme pour Low Level Virtual Machine , le projet est simplement nommé LLVM , pas les mots entièrement épelés.
Jochem Kuijpers
2
Auparavant, il avait au-dessus de l'abréviation, mais plus tard supprimé en.wikipedia.org/wiki/LLVM
VVB
2
Pour résumer les commentaires. "La machine virtuelle de bas niveau (LLVM)" devrait être quelque chose comme "LLVM (qui signifiait" Machine virtuelle de bas niveau "plus tôt dans la durée de vie du projet)"
ssokolow
52

Selon le livre `` Mise en route avec les bibliothèques de base LLVM '' (c):

En fait, le nom LLVM peut faire référence à l'un des éléments suivants:

  • Le projet / infrastructure LLVM: il s'agit d'un parapluie pour plusieurs projets qui, ensemble, forment un compilateur complet: frontends, backends, optimiseurs, assembleurs, linkers, libc ++, compiler-rt et un moteur JIT. Le mot "LLVM" a cette signification, par exemple, dans la phrase suivante: "LLVM est composé de plusieurs projets".

  • Un compilateur basé sur LLVM: il s'agit d'un compilateur construit partiellement ou complètement avec l'infrastructure LLVM. Par exemple, un compilateur peut utiliser LLVM pour le frontend et le backend mais utiliser les bibliothèques système GCC et GNU pour effectuer le lien final. LLVM a cette signification dans la phrase suivante, par exemple: "J'ai utilisé LLVM pour compiler des programmes C sur une plateforme MIPS".

  • Bibliothèques LLVM: il s'agit de la partie de code réutilisable de l'infrastructure LLVM. Par exemple, LLVM a cette signification dans la phrase: "Mon projet utilise LLVM pour générer du code via son framework de compilation Just-in-Time".

  • Cœur LLVM: Les optimisations qui se produisent au niveau du langage intermédiaire et les algorithmes backend forment le cœur LLVM où le projet a commencé. LLVM a ce sens dans la phrase suivante: "LLVM et Clang sont deux projets différents".

  • LLVM IR: il s'agit de la représentation intermédiaire du compilateur LLVM. LLVM a ce sens lorsqu'il est utilisé dans des phrases telles que "J'ai construit un frontend qui traduit mon propre langage en LLVM".

Ittrin
la source
35

LLVM est essentiellement une bibliothèque utilisée pour construire des compilateurs et / ou des logiciels orientés langage. L'essentiel est que même si vous avez gcc qui est probablement la suite de compilateurs la plus courante, il n'est pas conçu pour être réutilisable, c'est-à-dire. il est difficile de prendre des composants de gcc et de l'utiliser pour construire votre propre application. LLVM résout bien ce problème en créant un ensemble de «technologies de compilation et de chaîne d'outils modulaires et réutilisables» que n'importe qui pourrait utiliser pour créer des compilateurs et des logiciels orientés langage.

redbandit
la source
6
Donc LLVM est la bibliothèque, et Clang est le compilateur?
Abdul
11
Clang est le compilateur frontal C / C ++ de LLVM. Il convertit le code C en bitcode LLVM, qui est traduit en langage Assembly par un compilateur backend.
Boris Mulder
6

L'infrastructure du compilateur LLVM est particulièrement utile pour effectuer des optimisations et des transformations sur le code. Il se compose également d'un certain nombre d'outils servant des usages distincts. llvm-prof est un outil de profilage qui vous permet de faire du profilage d'exécution afin d'identifier les points chauds du programme. Opt est un outil d'optimisation qui propose différentes passes d'optimisation (élimination du code mort par exemple).

Surtout LLVM vous fournit les bibliothèques, pour écrire vos propres passes. Par exemple, si vous devez ajouter une vérification de plage sur certains arguments qui sont passés dans certaines fonctions d'un programme, l'écriture d'un simple passage LLVM suffira.

Pour plus d'informations sur la rédaction de votre propre Pass, consultez ce http://llvm.org/docs/WritingAnLLVMPass.html

Hashim Sharif
la source