Halo! Saya pikir banyak orang langsung memiliki pertanyaan lain - mengapa kita membutuhkan artikel lain tentang LLVM, karena ada lebih dari seratus di HabrΓ© ? Tugas saya adalah menulis "pengantar topik" untuk kita semua - pengembang profesional yang tidak berencana membuat kompiler dan sama sekali tidak tertarik dengan kekhasan perangkat LLVM IR. Sejauh yang saya tahu, ini belum terjadi.
Hal utama yang menarik minat hampir semua orang - dan yang ingin saya bicarakan - ada di judul artikel. Mengapa Anda membutuhkan LLVM ketika Anda memiliki GCC dan Visual C ++? Jika Anda bukan seorang programmer C ++, haruskah Anda khawatir? Apakah LLVM Clang sih? Atau tidak? Dan apa sebenarnya arti keempat huruf ini?
Apa arti sebuah nama?
Mari kita mulai dengan pertanyaan terakhir. Ada apa di balik huruf LLVM? Dahulu kala mereka adalah akronim untuk "Mesin Virtual Tingkat Rendah", tetapi saat ini mereka berarti ... sama sekali tidak ada.
LLVM lahir sebagai proyek penelitian oleh Chris Latner (saat itu mahasiswa master di University of Illinois di Urbana-Champaign) dan Vikram Adwe(dulu dan sekarang profesor di universitas yang sama). Tujuan dari proyek ini adalah untuk membuat program representasi menengah (IR) yang memungkinkan "optimasi agresif sepanjang masa aplikasi" - sesuatu seperti bytecode Java, hanya lebih keren. Ide utamanya adalah membuat tampilan yang sama-sama cocok untuk kompilasi statis (ketika kompilator menerima program yang ditulis dalam bahasa tingkat tinggi, misalnya C ++, sebagai masukan, menerjemahkannya ke dalam LLVM IR, mengoptimalkan, dan mendapatkan kode mesin cepat sebagai keluaran), dan dinamis (ketika sistem runtime menerima kode mesin sebagai input bersama dengan LLVM IR yang disimpan dalam file objek selama kompilasi statis,mengoptimalkannya - dengan mempertimbangkan profil dinamis yang dikumpulkan saat ini - dan mendapatkan kode mesin yang lebih cepat pada keluarannya, yang darinya Anda dapat terus mengumpulkan profil, mengoptimalkan, dan seterusnya 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 . ? β ? :)