Qu'est-ce que LLVM et pourquoi est-il nécessaire?

salut! Je pense que beaucoup de gens ont immédiatement eu une autre question - pourquoi avons-nous besoin d'un autre article sur LLVM, car il y en a plus d'une centaine sur Habré ? Ma tâche était d'écrire une "introduction au sujet" pour le reste d'entre nous - des développeurs professionnels qui ne prévoient pas de créer des compilateurs et ne sont pas du tout intéressés par les particularités du dispositif LLVM IR. Autant que je sache, cela ne s'est pas encore produit.



La principale chose qui intéresse presque tout le monde - et ce dont j'ai l'intention de parler - est dans le titre de l'article. Pourquoi avez-vous besoin de LLVM lorsque vous avez GCC et Visual C ++? Si vous n'êtes pas un programmeur C ++, devriez-vous vous inquiéter? Est-ce que LLVM Clang est de toute façon? Ou pas? Et que signifient réellement ces quatre lettres?



Qu'est-ce qu'il y a dans un nom?



Commençons par la dernière question. Qu'y a-t-il derrière les lettres LLVM? Il était une fois l'acronyme de "Low Level Virtual Machine", mais de nos jours, ils ne signifient ... absolument rien.



LLVM est né d'un projet de recherche par Chris Latner (alors étudiant en master à l'Université de l'Illinois à Urbana-Champaign) et Vikram Adwe(alors et à ce jour professeurs de la même université). Le but du projet était de créer des programmes de représentation intermédiaire (IR) qui permettent une "optimisation agressive tout au long de la vie de l'application" - quelque chose comme le bytecode Java, mais plus cool. L'idée principale est de faire une représentation qui convient également à la compilation statique (lorsque le compilateur reçoit un programme écrit dans un langage de haut niveau, par exemple C ++, en entrée, le traduit en LLVM IR, optimise et obtient du code machine rapide en sortie), et dynamique (lorsque le système d'exécution reçoit le code machine en entrée avec LLVM IR stocké dans le fichier objet lors de la compilation statique,l'optimise - en tenant compte du profil dynamique collecté à ce moment - et obtient un code machine encore plus rapide en sortie, pour lequel vous pouvez continuer à collecter le profil, à optimiser, etc. à l'infini).



? ? .



, " ":





, , LLVM — , "LLVM" . ! — llvm.org , LLVM , , .



? 2005 ...



Apple, Google --



Apple Objective-C ( ) LLVM. Apple ? , Apple , . , Apple PowerPC, (Symantec) , .



2005 Apple GCC, , GPL. GPLv3, GCC GCC 4.3. Apple , GCC, XCode, GCC 4.2. GPL , "": GCC, , , — ! LLVM "" ( UIUC, Apache 2.0), , .



Apple , " ", LLVM - GCC. "-" , ; "-" — , LLVM IR. GCC-- LLVM-- , — , , "". 2006 , "Clang".



"clang" — "C" "language". "C" C- , C C++ Objective-C. , "clang" "-", "-"! — !



- Clang - LLVM Clang/LLVM Clang. ( !) C++ .



LLVM Clang Google. Apple, Google LLVM — GCC , . Google — , , . Clang . Clang — Windows. GCC Windows, GCC , . , PDB, GCC — - .



Google , GCC; - Intel Microsoft. Google - Clang. Windows ( Google, - : Chromium Google Earth) LLVM Android. Android: " Android. , ( ) ."



, Google, LLVM . LLVM: ARM, IBM, Sony, Samsung, NXP, Facebook, Argonne National Lab… , " ". GCC, LLVM — , Intel Qualcomm. " " — LLVM , , , .



LLVM GCC



, : " , , Apple Google, … - ? LLVM? GCC ?"



— ! GCC , . , , , , , GPL , GCC — GCC, , ?



, GCC — GCC LLVM. "" ARM (Google, Samsung, Qualcomm ARM) LLVM — , ARM LLVM "" , GCC.



C++. , Google, ISO C++ — , , — - Clang. Clang / LLVM. , : C++ Clang'.



Clang — , Android LLVM — . , Clang warning', GCC, . , Clang' , Clang Static Analyzer, , , ++, .



LLVM , : "", - OpenMP ( ), lld (- ), libc++ ( C++). LLVM — GCC , . , LLVM — , .



Clang GCC, . — . , , C C++ " " — GCC Clang -.



, . , ?



    #include <stdio.h>

    static void die() {
      while(1)
        ;
    }

    int main() {
      printf("begin\n");
      die();
      printf("unreachable\n");
    }


"gcc -O2" "clang -O2" — . " " C ( ? — ). "", , — " "! ( C ). , Clang GCC . , ( ?) , .



"gcc" "clang" ( "g++" "clang++" C++) - . ? — ?



, , , ARM — , "" .



"" LLVM



LLVM C++. LLVM — , — . , LLVM "" . LLVM, LLVM , .



Clang Static Analyzer, , OpenMP, libc++ lld — , C++ . Rust LLVM — , Rust LLVM ! C++ Rust, LLVM ( , ) D, Fortran, Haskell, Julia, Kotlin, Lua, PHP, Python. -, LLVM IR, ! LLVM .



LLVM — , . ML — TensorFlow Google PyTorch Facebook — LLVM .



LLVM , . ML ( , ), - , LLVM.



LLVM — "core" LLVM ! LLVM Developers' Meeting " " IT. , , Huawei, — , LLVM .



, , LLVM . LLVM- ?



LLVM ( Intel, NXP Huawei), . ! — , : LLVM . ? — ? :)




All Articles