什么是LLVM?为什么需要它?

你好!我认为许多人立即提出了另一个问题-为什么我们要再写一篇有关LLVM的文章,因为在Habré上有一百多篇文章我的任务是为我们其他人(不打算创建编译器并且对LLVM IR设备的特性完全不感兴趣的专业开发人员)写一个“主题简介”。据我所知,这还没有发生。



几乎每个人都感兴趣的主要内容以及我计划谈论的内容是文章的标题。当您拥有GCC和Visual C ++时,为什么需要LLVM?如果您不是C ++程序员,您应该担心吗?LLVM Clang是吗?或不?这四个字母实际上是什么意思?



名字叫什么?



让我们从最后一个问题开始。字母LLVM背后是什么?曾几何时,它们是“低级虚拟机”的首字母缩写,但如今,它们的意思是……绝对没有。



LLVM是由Chris Latner(当时是伊利诺伊大学香槟分校的硕士研究生)和Vikram Adwe作为研究项目诞生的(然后是今天同一所大学的教授)。该项目的目标是创建允许“在应用程序的整个生命周期内进行积极优化”的中间表示(IR)程序-类似于Java字节码,只是更酷。主要思想是制作一个同样适合静态编译的表示形式(当编译器接收以高级语言(例如C ++)编写的程序作为输入,将其转换为LLVM IR,优化并获取快速机器代码作为输出时)和动态表示(当运行时系统在静态编译期间接收到机器代码作为输入以及存储在目标文件中的LLVM IR时,对其进行优化(考虑到此时收集的动态配置文件),并在输出处获得更快的机器代码,您可以继续为其收集配置文件,进行优化等)。



? ? .



, " ":





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