Apa itu LLVM?

464

Saya terus mendengar tentang LLVM sepanjang waktu. Ada di Perl, lalu di Haskell, lalu ada yang menggunakannya dalam bahasa lain? Apa itu?

bodacydo
sumber
45
Ada bab bagus dalam buku yang menjelaskan semuanya dengan baik di sini: www.aosabook.org/en/llvm.html
David d C e Freitas

Jawaban:

369

LLVM adalah perpustakaan yang digunakan untuk membangun, mengoptimalkan dan menghasilkan kode mesin menengah dan / atau biner.

LLVM dapat digunakan sebagai kerangka kerja kompiler, di mana Anda memberikan "ujung depan" (parser dan lexer) dan "ujung belakang" (kode yang mengubah representasi LLVM menjadi kode mesin yang sebenarnya).

LLVM juga dapat bertindak sebagai kompiler JIT - ia memiliki dukungan untuk generasi perakitan x86 / x86_64 dan PPC / PPC64 dengan optimasi kode cepat yang ditujukan untuk kecepatan kompilasi.

Jika Anda tertarik, Anda dapat bermain dengan kode mesin LLVM yang dihasilkan dari kode C atau C ++ di halaman demo mereka , tetapi halaman demo saat ini dinonaktifkan sejak tahun 2013.

LiraNuna
sumber
39
Jika Anda ingin bermain dengannya, lihat artikel yang luar biasa ini: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna
29
Tautan yang disediakan dalam jawaban mengatakan "Halaman demo LLVM saat ini dinonaktifkan."
EngrStudent
5
ellcc.org/demo/index.cgi adalah cara lain untuk bermain dengan mengkompilasi C / C ++ melalui LLVM ke berbagai target, termasuk kode perantara
Tom Goodfellow
1
dapatkah Anda memberikan contoh aktual tentang artinya?
Migrate2Lazarus melihat profil saya
112

Ringkasan yang baik dari LLVM adalah ini:

masukkan deskripsi gambar di sini

Di frontend Anda memiliki Perl, dan banyak bahasa tingkat tinggi lainnya. Di backend, Anda memiliki kode asli yang berjalan langsung di mesin.

Di tengah adalah representasi kode perantara Anda. Jika setiap bahasa tingkat tinggi dapat direpresentasikan dalam format IR LLVM ini, maka alat analisis berdasarkan IR ini dapat dengan mudah digunakan kembali - itu adalah alasan dasar.

Peter Teoh
sumber
39
gambar bernilai seribu kata 👍
ipatch
3
Jadi sepertinya LLVM berguna untuk desainer kompiler. Haruskah seorang programmer peduli jika ia mengkompilasi dengan kompiler standar atau yang didasarkan pada LLVM, selain menganalisis kode yang dihasilkan secara independen dari kode sumber?
jinawee
4
jika Anda dapat mengkompilasi dengan LLVM ke IR-nya, maka banyak alat dapat dibuka untuk Anda untuk menganalisis IR. Tetapi jika alat Anda hanya mampu menganalisis binari asli (misalnya x86), maka apakah itu binari yang dihasilkan LLVM atau binari yang dihasilkan gcc, atau yang dihasilkan kompilator Intel, tidak ada perbedaan.
Peter Teoh
73

LLVM (dulu berarti "Mesin Virtual Tingkat Rendah" tetapi sekarang tidak lagi) adalah infrastruktur penyusun, ditulis dalam C ++, yang dirancang untuk pengoptimalan waktu kompilasi, waktu tautan, waktu berjalan, dan "waktu idle" dari program yang ditulis dalam bahasa pemrograman yang sewenang-wenang. Awalnya diimplementasikan untuk C / C ++, desain bahasa-independen (dan keberhasilan) LLVM sejak itu telah melahirkan berbagai macam ujung depan, termasuk Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , dan lain-lain.

Baca ini untuk penjelasan lebih lanjut. Lihat
juga Unladen Swallow

N 1.1
sumber
13
... jadi apa yang coba dikatakan oleh dokter; sementara LLVM adalah akronim untuk Mesin Virtual Tingkat Rendah , proyek ini hanya bernama LLVM , bukan kata-kata yang dieja sepenuhnya.
Jochem Kuijpers
2
Sebelumnya itu singkatan di atas tetapi kemudian dihapus en.wikipedia.org/wiki/LLVM
VVB
2
Untuk meringkas komentar. "Mesin Virtual Tingkat Rendah (LLVM)" haruslah sesuatu seperti "LLVM (yang berarti" Mesin Virtual Tingkat Rendah "sebelumnya dalam masa proyek)"
ssokolow
52

Menurut buku 'Memulai Dengan LLVM Core Libraries' (c):

Bahkan, nama LLVM mungkin merujuk pada salah satu dari yang berikut:

  • Proyek / infrastruktur LLVM: Ini adalah payung untuk beberapa proyek yang, bersama-sama, membentuk kompiler lengkap: frontends, backends, optimizer, assembler, linker, libc ++, compiler-rt, dan engine JIT. Kata "LLVM" memiliki arti ini, misalnya, dalam kalimat berikut: "LLVM terdiri dari beberapa proyek".

  • Kompiler berbasis LLVM: Ini adalah kompiler yang dibangun sebagian atau seluruhnya dengan infrastruktur LLVM. Sebagai contoh, kompiler mungkin menggunakan LLVM untuk frontend dan backend tetapi menggunakan pustaka sistem GCC dan GNU untuk melakukan tautan terakhir. LLVM memiliki makna ini dalam kalimat berikut, misalnya: "Saya menggunakan LLVM untuk mengkompilasi program C ke platform MIPS".

  • Perpustakaan LLVM: Ini adalah bagian kode yang dapat digunakan kembali dari infrastruktur LLVM. Misalnya, LLVM memiliki makna ini dalam kalimat: "Proyek saya menggunakan LLVM untuk menghasilkan kode melalui kerangka kompilasi Just-in-Time-nya".

  • Inti LLVM: Optimalisasi yang terjadi pada tingkat bahasa menengah dan algoritma backend membentuk inti LLVM di mana proyek dimulai. LLVM memiliki makna ini dalam kalimat berikut: "LLVM dan Dentang adalah dua proyek yang berbeda".

  • LLVM IR: Ini adalah representasi perantara kompilator LLVM. LLVM memiliki makna ini ketika digunakan dalam kalimat seperti "Saya membangun sebuah frontend yang menerjemahkan bahasa saya sendiri ke LLVM".

Ittrin
sumber
35

LLVM pada dasarnya adalah perpustakaan yang digunakan untuk membangun kompiler dan / atau perangkat lunak yang berorientasi bahasa. Inti dasarnya adalah walaupun Anda memiliki gcc yang mungkin merupakan kumpulan paling umum dari kompiler, ia tidak dibangun untuk dapat digunakan kembali yaitu. sulit untuk mengambil komponen dari gcc dan menggunakannya untuk membangun aplikasi Anda sendiri. LLVM menangani masalah ini dengan baik dengan membangun satu set "teknologi kompiler dan toolchain modular dan dapat digunakan kembali" yang dapat digunakan siapa pun untuk membangun kompiler dan perangkat lunak yang berorientasi bahasa.

redbandit
sumber
6
Jadi LLVM adalah perpustakaan, dan Clang adalah kompiler?
Abdul
11
Dentang adalah kompiler frontend C / C ++ dari LLVM. Itu mengkonversi kode C ke LLVM bitcode, yang diterjemahkan ke dalam beberapa bahasa Majelis oleh kompiler backend.
Boris Mulder
6

Infrastruktur Kompiler LLVM sangat berguna untuk melakukan optimasi dan transformasi pada kode. Ini juga terdiri dari sejumlah alat yang melayani penggunaan berbeda. llvm-prof adalah alat profil yang memungkinkan Anda melakukan profiling eksekusi untuk mengidentifikasi hotspot program. Opt adalah alat optimisasi yang menawarkan berbagai lintasan optimisasi (misalnya, penghapusan kode mati)

LLVM yang penting memberi Anda perpustakaan, untuk menulis Passes Anda sendiri. Misalnya, jika Anda perlu menambahkan rentang pemeriksaan pada argumen tertentu yang diteruskan ke fungsi tertentu dari Program, menulis Pass LLVM sederhana sudah cukup.

Untuk informasi lebih lanjut tentang cara menulis Pass Anda sendiri, periksa http://llvm.org/docs/WritingAnLLVMPass.html ini

Hashim Sharif
sumber