¿Qué es LLVM y por qué es necesario?

¡Hola! Creo que mucha gente inmediatamente tuvo otra pregunta: ¿por qué necesitamos otro artículo sobre LLVM, porque hay más de un centenar de ellos en Habré ? Mi tarea era escribir una "introducción al tema" para el resto de nosotros, desarrolladores profesionales que no planean crear compiladores y no están interesados ​​en absoluto en las peculiaridades del dispositivo LLVM IR. Hasta donde yo sé, esto aún no ha sucedido.



Lo principal que interesa a casi todos, y de lo que planeo hablar, está en el título del artículo. ¿Por qué necesita LLVM cuando tiene GCC y Visual C ++? Si no es un programador de C ++, ¿debería preocuparse? ¿LLVM Clang es de todos modos? ¿O no? ¿Y qué significan realmente estas cuatro letras?



¿Lo que hay en un nombre?



Comencemos con la última pregunta. ¿Qué hay detrás de las letras LLVM? Érase una vez las siglas de "Low Level Virtual Machine", pero hoy en día significan ... absolutamente nada.



LLVM nació como un proyecto de investigación de Chris Latner (entonces estudiante de maestría en la Universidad de Illinois en Urbana-Champaign) y Vikram Adwe(entonces y hasta el día de hoy profesores de la misma universidad). El objetivo del proyecto era crear programas de representación intermedia (IR) que permitan una "optimización agresiva a lo largo de la vida de la aplicación", algo así como el código de bytes de Java, solo que más fresco. La idea principal es hacer una representación que sea igualmente adecuada para la compilación estática (cuando el compilador recibe un programa escrito en un lenguaje de alto nivel, por ejemplo C ++, como entrada, lo traduce a LLVM IR, optimiza y obtiene código máquina rápido como salida) y dinámico (cuando el sistema de tiempo de ejecución recibe el código de la máquina como entrada junto con LLVM IR almacenado en el archivo de objeto durante la compilación estática,lo optimiza, teniendo en cuenta el perfil dinámico recopilado en ese momento, y obtiene un código de máquina aún más rápido en la salida, para lo cual puede continuar recopilando el perfil, optimizarlo, etc., ad infinitum).



? ? .



, " ":





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