O que é LLVM e por que ele é necessário?

Olá! Eu acho que muitas pessoas imediatamente tiveram outra pergunta - por que precisamos de outro artigo sobre LLVM afinal, porque há mais de uma centena deles no Habré ? Minha tarefa era escrever uma "introdução ao tópico" para o resto de nós - desenvolvedores profissionais que não planejam criar compiladores e não estão nem um pouco interessados ​​nas peculiaridades do dispositivo LLVM IR. Pelo que eu sei, isso ainda não aconteceu.



O principal que interessa a quase todos - e sobre o que pretendo falar - está no título do artigo. Por que você precisa do LLVM quando tem GCC e Visual C ++? Se você não é um programador C ++, deve se preocupar? E, em geral, é LLVM Clang? Ou não? E o que essas quatro letras realmente significam?



O que há em um nome?



Vamos começar com a última pergunta. O que está por trás das letras LLVM? Era uma vez uma sigla para "Low Level Virtual Machine", mas hoje em dia eles significam ... absolutamente nada.



O LLVM nasceu como um projeto de pesquisa de Chris Latner (então aluno de mestrado na Universidade de Illinois em Urbana-Champaign) e Vikram Adwe(então e até hoje professores da mesma universidade). O objetivo do projeto era criar programas de representação intermediária (RI) que permitissem "otimização agressiva ao longo da vida do aplicativo" - algo como bytecode Java, só que mais legal. A ideia principal é fazer uma representação que seja igualmente adequada para compilação estática (quando o compilador recebe um programa escrito em uma linguagem de alto nível, por exemplo C ++, como entrada, traduz em IR LLVM, otimiza e obtém código de máquina rápido como uma saída) e dinâmico (quando o sistema de tempo de execução recebe o código de máquina como entrada junto com LLVM IR armazenado no arquivo de objeto durante a compilação estática,otimiza-o - levando em consideração o perfil dinâmico coletado até o momento - e obtém um código de máquina ainda mais rápido na saída, para o qual você pode continuar a coletar o perfil, otimizar e assim por diante 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