Dalam hal apa LLVM Tingkat Rendah?

12

Dalam hal apa LLVM (Mesin Virtual Tingkat Rendah ) Tingkat Rendah? (Pada saat penulisan, saya tidak menemukan perluasan singkatan "LLVM" di situs webnya, tetapi di Wikipedia .)

Apakah ini disebut "Tingkat Rendah" dalam apa ia dirancang untuk (infrastruktur kompiler) atau karena ia bekerja pada "tingkat yang lebih rendah" daripada alat lain?

Sebagai "ilustrasi" dari hal ini, apakah LLVM tingkat lebih rendah dari JVM dan CLR , atau hanya dirancang untuk penggunaan "tingkat bawah"?

Abbafei
sumber

Jawaban:

16

LLVM adalah level yang lebih rendah daripada VM biasa seperti JVM dan CLR. Misalnya, meskipun memiliki kait untuk pengumpul sampah, ia tidak menyediakan pengumpul sampah itu sendiri.

Demikian juga, JVM memiliki kompiler JIT built-in (kecuali dalam versi yang sangat kuno). LLVM memiliki beberapa kompiler JIT untuk LLVM IR, tetapi masih tergantung pengembang untuk menghubungkan semuanya dan sebenarnya JIT kode.

Ketika JVM menemukan eksternal yang tidak terselesaikan, ia keluar dan menemukan kelas yang tepat untuk memuaskannya, dan tahu bagaimana mencari file .class langsung di sistem file dan dalam file .jar file 1 . Kompiler JIT LLVM memiliki kait di mana Anda dapat memutuskan bagaimana hal-hal seperti itu ditangani. Seperti yang Anda harapkan, beberapa orang telah menulis beberapa versi default, sehingga dapat melakukan hal-hal secara kasar pada urutan yang sama seperti JVM - tetapi Anda juga bebas untuk mengabaikannya dan melakukan hal-hal yang berbeda jika Anda mau.

Sederhananya, jika Anda sedang mengembangkan kompiler (atau sesuatu pada urutan itu) ia memiliki banyak alat untuk membuat hidup Anda mudah. Alih-alih mengkhawatirkan optimasi, Anda dapat melakukan kira-kira terjemahan paling sederhana yang dapat Anda kelola dari kode sumber Anda ke LLVM IR, dan kemudian menggunakan perpustakaan LLVM untuk mengelola pengoptimalan, JITing, penautan, dll. Meskipun demikian, itu adalah perpustakaan - ia menyediakan perpustakaan - ia menyediakan perpustakaan beberapa fungsi yang sangat berguna sehingga Anda tidak harus berurusan dengan semua detail, tetapi masih berfungsi dan Anda masih menulis kode untuk memohonnya. Ini bukan produk jadi, hanya alat yang berguna untuk membangun produk yang relatif cepat dan mudah.


1 Secara teknis, tidak semua ini dibangun dalam JVM. Ini menentukan apa yang biasanya disebut loader kelas primordial sebagai bagian dari JVM yang tepat, dan kemudian ada pemuat kelas pengguna yang ditentukan dalam java.util.ClassLoader yang menangani hal-hal lain. Beberapa pemuat kelas disertakan secara default, dan jika Anda ingin cukup buruk, Anda dapat menambah mereka dengan mendefinisikan sendiri.

Jerry Coffin
sumber
12

Ini tingkat rendah karena dirancang sehingga mesin virtual yang ada atau masa depan (JVM) dapat menggunakannya sebagai inti dari implementasi mereka.

Lihat seperti ini: Mesin virtual Java dan Python sangat portabel karena ditulis dalam standar C, dan banyak bergantung pada perpustakaan mereka sendiri. Maksud dari LLVM adalah untuk menyediakan infrastruktur sehingga mudah untuk memporting mesin virtual apa pun ke platform yang sudah mendukung LLVM.

LLVM menawarkan dukungan untuk kompilasi statis, dan JIT, dan in dirancang sedemikian rupa sehingga dapat berjalan di ruang sistem operasi tepercaya. Itu berarti, secara teori, menjalankan mesin virtual di atas LLVM harus berarti lebih sedikit pekerjaan, dan menghasilkan sesuatu yang jauh lebih cepat dan efisien. Dalam teori.

Kemudian LLVM, karena levelnya lebih rendah, seharusnya lebih mudah untuk port ke berbagai OS dan arsitektur perangkat keras.

Ada penghematan besar yang bisa didapat jika pelaksana bahasa dapat menulis ke platform tingkat rendah tunggal yang mudah di-port. VM yang paling terkenal adalah di tengah-tengah antara bahasa yang mereka layani dan sistem operasi, dan mereka harus mengimplementasikan representasi perantara mereka sendiri, dan JITC.

Apalala
sumber
5

Bagian "level rendah" dari nama LLVM mengacu pada level set instruksi virtual yang digunakan. Bahasa perantara (IR) yang digunakan LLVM dekat dengan tingkat kode mesin meskipun arsitekturnya agnostik dan umum.

Bytecode JVM dan CLR di sisi lain adalah level yang cukup tinggi karena memiliki instruksi yang berada pada lapisan abstraksi yang lebih tinggi. Keduanya adalah bahasa rakitan berbasis tumpukan berorientasi objek. Misalnya JVM memiliki instruksi invokevirtual, yang merupakan instruksi yang harus tahu tentang model objek spesifik bahasa Jawa.

Zayenz
sumber
3

Tingkat ini jelas lebih rendah daripada VM khusus bahasa mana pun dan VM bersatu seperti JVM dan CLR. Desainnya dekat dengan representasi perantara tingkat rendah di GCC (GIMPLE) dan kompiler sejenis. Tidak ada GC default, tidak ada sistem tipe tingkat tinggi khusus yang ditegakkan, tidak ada keberpihakan diasumsikan (harus ditentukan secara eksplisit), tipe data integer dan floating point bersifat eksplisit (dan bergantung pada platform), dan level terendah dari semua - a pointer aritmatika yang layak tersedia.

Logika SK
sumber