Menelusuri perjalanan LLVM dari proyek riset Chris Lattner di UIUC tahun 2000 hingga menjadi fondasi Clang, Swift, Rust, dan Mojo, serta memahami arsitektur 3-fase (front-end, middle-end, back-end) yang memungkinkan N bahasa × M target dalam satu framework.

Setelah di episode 0 kita menyiapkan environment — LLVM/Clang toolchain terinstall, CMake + Ninja siap, dan "Hello World" berhasil dikompilasi — pada episode ini kita menarik napas sejenak dari hands-on dan memahami mengapa LLVM ada.
Sejarah sebuah infrastruktur mungkin terasa tidak penting, padahal justru di sanalah letak alasan mengapa desainnya modular. Memahami asal-usul LLVM akan menjelaskan keputusan-keputusan desainnya: mengapa ia memisahkan front-end dari back-end, mengapa ia berupa library daripada monolitik, dan mengapa puluhan bahasa pemrograman bisa berbagi satu framework kompilasi.
LLVM dimulai sebagai proyek riset oleh Chris Lattner di University of Illinois at Urbana-Champaign pada tahun 2000. Nama "LLVM" awalnya adalah akronim dari "Low Level Virtual Machine", tetapi seiring waktu proyek ini berkembang jauh melampaui konsep VM — dan pada tahun 2011 nama LLVM secara resmi tidak lagi dipandang sebagai akronim.
| Fakta | Detail |
|---|---|
| Pencipta | Chris Lattner |
| Asal | UIUC (University of Illinois) |
| Rilis pertama | 2003 (v1.0) |
| Asal nama | "Low Level Virtual Machine" (tidak lagi dipandang sebagai akronim) |
| Bahasa | C++ |
| Lisensi | Apache 2.0 with LLVM Exception |
Apple mengadopsi LLVM pada tahun 2005 dan Lattner bergabung dengan Apple pada tahun yang sama. Apple kemudian menjadi kontributor terbesar LLVM, menggunakannya sebagai fondasi toolchain Xcode, sistem build, dan bahkan bahasa Swift. Pada tahun 2012, LLVM menerima ACM Software System Award sebagai pengakuan atas dampaknya yang luar biasa terhadap industri perangkat lunak.
Keunggulan desain LLVM terletak pada pemisahan pipeline kompilasi menjadi tiga fase independen:
| Fase | Tanggung Jawab | Contoh di LLVM |
|---|---|---|
| Front-End | Parsing, semantic analysis, AST → LLVM IR | Clang (C/C++/ObjC), Flang (Fortran) |
| Middle-End | Optimasi level IR (analysis + transform passes) | opt (LLVM optimizer) |
| Back-End | Code generation untuk target spesifik | llc, target X86/AArch64/RISC-V/NVPTX |
Dengan desain ini, kalian bisa menulis N bahasa front-end dan M back-end target, dan setiap kombinasi otomatis tersedia. Clang menulis IR dari C/C++; Swift menulis IR dari Swift; Rust menulis IR dari Rust. Semua back-end X86, ARM, RISC-V, WASM, PTX langsung tersedia untuk ketiganya.
Inilah revolusi LLVM dibanding compiler tradisional:GCC harus menulis ulang seluruh pipeline untuk setiap pasangan bahasa+target. LLVM membuatnya sekali编写, selamanya tersedia.
LLVM bukan satu tool — ia adalah ekosistem proyek yang saling melengkapi:
| Proyek | Fungsi |
|---|---|
| Clang | Front-end C, C++, Objective-C, Objective-C++ |
| LLD | Linker cepat (pengganti GNU ld) |
| LLDB | Debugger modern (pengganti GDB untuk LLVM) |
| Polly | Loop optimizer berbasis polyhedral model |
| Flang | Front-end Fortran (menggunakan MLIR) |
| libc++ | Implementasi standard library C++ |
| compiler-rt | Runtime support: sanitizer, profiling, builtins |
| MLIR | Multi-Level IR untuk domain khusus dan accelerator |
| libunwind | Stack unwinding untuk exception handling |
Kita akan menyentuh sebagian besar proyek ini selama 28 episode. MLIR (episode 22) dan compiler-rt (episode 21) layak mendapat perhatian khusus karena merepresentasikan arah masa depan LLVM.
Peta ini menunjukkan betapa luasnya adopsi LLVM di ekosistem bahasa pemrograman modern:
| Bahasa | Aspek LLVM yang Digunakan |
|---|---|
| Swift | Front-end Swift → LLVM IR → back-end |
| Rust | rustc → LLVM IR (dengan pass kustom) |
| Zig | Zig backend → LLVM IR → native code |
| Julia | JIT compilation via LLVM |
| Mojo | Python-like syntax → MLIR → LLVM IR |
| Kotlin/Native | Kotlin → LLVM IR → native |
| D | DMD → LLVM IR (opsi backend) |
Swift dan Rust adalah dua contoh terkuat: keduanya memilih LLVM bukan karena tidak ada alternatif, melainkan karena LLVM menawarkan optimasi IR terbaik dan dukungan target paling luas di dunia open-source.
Note
Mojo (rilis 2023-2025) adalah bahasa baru dari Modular yang dibangun di atas MLIR dari awal, bukan LLVM IR langsung. Ini menunjukkan tren: MLIR menjadi titik masuk baru untuk domain-specific compilation, sementara LLVM IR tetap menjadi target codegen akhir.
Empat alasan utama LLVM menjadi pilihan dominan:
| Keunggulan | Arti Praktis |
|---|---|
| Modular & library-first | Setiap komponen bisa dipakai terpisah (clangd, sanitizer, JIT) |
| Optimasi IR kelas dunia | Pass optimizer LLVM menghasilkan kode native yang kompetitif dengan GCC |
| Ekosistem luas | Support untuk X86, ARM, RISC-V, WASM, NVPTX, AMDGPU, SPIR-V |
| Open-source & governance | Apache 2.0, kontribusi dari Apple, Google, AMD, Intel, Arm, NVIDIA |
Keunggulan pertama — modularitas — adalah yang paling transformatif: karena LLVM berupa library (bukan monolitik), IDE seperti VS Code bisa memanggil Clang API untuk autocompletion (via clangd), tool seperti clang-tidy bisa menganalisis kode tanpa mengompilasi, dan sanitizer bisa diinstrumentasikan tanpa mengubah source code.
| Tahun | Tonggak |
|---|---|
| 2000 | Chris Lattner memulai LLVM di UIUC |
| 2003 | LLVM 1.0 dirilis |
| 2005 | Apple mengadopsi LLVM; Lattner bergabung Apple |
| 2007 | Clang dimulai sebagai pengganti GCC di macOS |
| 2012 | ACM Software System Award untuk LLVM |
| 2015 | LLVM 3.6 — Clang menjadi default compiler di macOS |
| 2019 | LLVM 9 — support RISC-V, WebAssembly |
| 2023 | LLVM 17 — New Pass Manager default, MLIR mature |
| 2025 | LLVM 21 — DTLTO, BF16 SPIR-V, AMDGPU COV6 |
| 2026 | LLVM 22.1 (Feb 2026) — C2y Named Loops, libsycl runtime, Intel Nova Lake |
Pada episode 1 ini, kalian telah menelusuri perjalanan LLVM dari proyek riset 2000 hingga menjadi compiler infrastructure paling berpengaruh di dunia modern.
Inti yang harus dibawa pulang:
Di episode 2 selanjutnya, kita akan membedah anatomi pipeline kompilasi — tahapan dari lexing hingga binary, perbandingan GCC monolitik vs LLVM modular library-first, dan cara menelusuri satu file C dari source sampai binary dengan flag -### dan -save-temps. Sampai jumpa di episode 2!