Was ist LLVM und warum wird es benötigt?

Hallo! Ich denke, viele Leute hatten sofort eine andere Frage - warum brauchen wir ĂŒberhaupt einen anderen Artikel ĂŒber LLVM, weil es mehr als hundert von ihnen auf HabrĂ© gibt ? Meine Aufgabe war es, eine "EinfĂŒhrung in das Thema" fĂŒr den Rest von uns zu schreiben - professionelle Entwickler, die keine Compiler erstellen wollen und sich ĂŒberhaupt nicht fĂŒr die Besonderheiten des LLVM-IR-GerĂ€ts interessieren. Soweit ich weiß, ist dies noch nicht geschehen.



Die Hauptsache, die fast jeden interessiert - und worĂŒber ich sprechen möchte - ist der Titel des Artikels. Warum benötigen Sie LLVM, wenn Sie ĂŒber GCC und Visual C ++ verfĂŒgen? Wenn Sie kein C ++ - Programmierer sind, sollten Sie sich Sorgen machen? Und im Allgemeinen ist LLVM Clang? Oder nicht? Und was bedeuten diese vier Buchstaben eigentlich?



Was ist in einem Namen?



Beginnen wir mit der letzten Frage. Was steckt hinter den Buchstaben LLVM? FrĂŒher waren sie ein Akronym fĂŒr "Low Level Virtual Machine", aber heute bedeuten sie ... absolut nichts.



LLVM wurde als Forschungsprojekt von Chris Latner (damals Masterstudent an der UniversitĂ€t von Illinois in Urbana-Champaign) und Vikram Adwe geboren(damals und bis heute Professoren an derselben UniversitĂ€t). Ziel des Projekts war es, IR-Programme (Intermediate Representation) zu erstellen, die eine "aggressive Optimierung wĂ€hrend der gesamten Lebensdauer der Anwendung" ermöglichen - so etwas wie Java-Bytecode, nur cooler. Die Hauptidee besteht darin, eine Darstellung zu erstellen, die fĂŒr die statische Kompilierung gleichermaßen gut geeignet ist (wenn der Compiler ein in einer höheren Sprache geschriebenes Programm, beispielsweise C ++, als Eingabe empfĂ€ngt, es in LLVM-IR ĂŒbersetzt, optimiert und schnellen Maschinencode als Ausgabe erhĂ€lt) und dynamisch (Wenn das Laufzeitsystem Maschinencode als Eingabe zusammen mit LLVM-IR empfĂ€ngt, das wĂ€hrend der statischen Kompilierung in der Objektdatei gespeichert ist,optimiert es - unter BerĂŒcksichtigung des zu diesem Zeitpunkt erfassten dynamischen Profils - und erhĂ€lt am Ausgang noch schnelleren Maschinencode, fĂŒr den Sie das Profil weiterhin ad infinitum erfassen, optimieren usw. können.



? ? .



, " ":





, , 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