LLVM คืออะไร


464

ฉันคอยฟัง LLVM อยู่ตลอดเวลา มันเป็น Perl แล้วก็อยู่ใน Haskell แล้วมีคนใช้มันในภาษาอื่นบ้างไหม? มันคืออะไร?


45
มีบทที่ดีในหนังสือที่อธิบายทุกอย่างไว้ที่นี่: www.aosabook.org/en/llvm.html
David d C e Freitas

คำตอบ:


369

LLVM เป็นห้องสมุดที่ใช้ในการสร้างปรับให้เหมาะสมและสร้างรหัสเครื่องระดับกลางและ / หรือไบนารี

LLVM สามารถใช้เป็นเฟรมเวิร์กคอมไพเลอร์ซึ่งคุณจัดเตรียม "front end" (parser และ lexer) และ "back end" (รหัสที่แปลงการแสดงของ LLVM เป็นรหัสเครื่องจริง)

LLVM ยังสามารถทำหน้าที่เป็นคอมไพเลอร์ JIT - มันรองรับ x86 / x86_64 และแอสเซมบลีการสร้าง PPC / PPC64 ด้วยการเพิ่มประสิทธิภาพรหัสที่รวดเร็วสำหรับการรวบรวมความเร็ว

หากคุณสนใจคุณสามารถเล่นกับรหัสเครื่องของ LLVM ที่สร้างขึ้นจากรหัส C หรือ C ++ ในหน้าตัวอย่างของพวกเขาแต่หน้าสาธิตจะปิดใช้งานตั้งแต่ปี 2013


39
หากคุณต้องการที่จะเล่นกับมันดูบทความที่น่าตื่นตาตื่นใจนี้: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna

29
ลิงก์ที่ให้ไว้ในคำตอบบอกว่า "หน้าสาธิต LLVM ปิดใช้งานอยู่ในขณะนี้"
EngrStudent

5
ellcc.org/demo/index.cgiเป็นอีกวิธีในการเล่นด้วยการรวบรวม C / C ++ ผ่าน LLVM ไปยังเป้าหมายต่าง ๆ รวมถึงรหัสกลาง
Tom Goodfellow

1
คุณสามารถยกตัวอย่างจริงของความหมายได้อย่างไร
Migrate2Lazarus ดูโปรไฟล์ของฉัน

112

บทสรุปที่ดีของ LLVM คือ:

ป้อนคำอธิบายรูปภาพที่นี่

ที่ส่วนหน้าคุณมี Perl และภาษาระดับสูงอื่น ๆ อีกมากมาย ที่ส่วนหลังคุณมีรหัสดั้งเดิมที่เรียกใช้บนเครื่องโดยตรง

ที่ศูนย์คือการแสดงรหัสกลางของคุณ หากทุกภาษาระดับสูงสามารถแสดงในรูปแบบ LLVM IR นี้ได้เครื่องมือการวิเคราะห์ที่ใช้ IR นี้สามารถนำกลับมาใช้ใหม่ได้อย่างง่ายดายซึ่งเป็นเหตุผลพื้นฐาน


39
รูปภาพมีค่าหนึ่งพันคำ👍
ipatch

3
ดังนั้นดูเหมือนว่า LLVM จะเป็นประโยชน์สำหรับนักออกแบบคอมไพเลอร์ โปรแกรมเมอร์ควรจะดูแลถ้าเขารวบรวมกับคอมไพเลอร์มาตรฐานหรืออย่างใดอย่างหนึ่งตาม LLVM นอกจากการวิเคราะห์รหัสที่สร้างขึ้นเป็นอิสระจากรหัสที่มา?
jinawee

4
หากคุณสามารถคอมไพล์ด้วย LLVM ไปยัง IR ของมันแล้วเครื่องมือจำนวนมากอาจเปิดให้คุณสำหรับการวิเคราะห์ IR แต่หากเครื่องมือของคุณมีความสามารถในการวิเคราะห์ไบนารีเนทีฟ (ตัวอย่างเช่น x86) ไม่ว่าจะเป็น LLVM ที่สร้างไบนารีหรือไบนารีที่สร้างโดย gcc หรือ Intel-compiler ที่สร้างขึ้นจะไม่มีความแตกต่าง
Peter Teoh

73

LLVM (ใช้เพื่อหมายถึง "เครื่องเสมือนระดับต่ำ" แต่ไม่ใช่อีกต่อไป) เป็นโครงสร้างพื้นฐานคอมไพเลอร์ซึ่งเขียนใน C ++ ซึ่งออกแบบมาสำหรับการรวบรวมเวลาลิงก์เวลารันไทม์และการเพิ่มประสิทธิภาพ "เวลาว่าง" ของโปรแกรมที่เขียน ในภาษาการเขียนโปรแกรมโดยพลการ เริ่มแรกใช้สำหรับ C / C ++ การออกแบบที่ไม่ขึ้นกับภาษา (และความสำเร็จ) ของ LLVM ได้เริ่มต้นตั้งแต่ปลายด้านหน้าที่หลากหลายรวมถึง Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , และคนอื่น ๆ.

อ่านสิ่งนี้สำหรับคำอธิบายเพิ่มเติม
โปรดดูUnladen Swallow


13
.. ดังนั้นสิ่งที่เอกสารพยายามจะพูด; ในขณะที่LLVMเป็นตัวย่อของเครื่องเสมือนระดับต่ำโครงการนี้มีชื่อว่าLLVMไม่ใช่คำที่สะกดสมบูรณ์
Jochem Kuijpers

2
ก่อนหน้านี้มีตัวย่ออยู่ด้านบน แต่ภายหลังได้ลบen.wikipedia.org/wiki/LLVM
VVB

2
เพื่อสรุปความคิดเห็น "เครื่องเสมือนระดับต่ำ (LLVM)" ควรเป็นเช่น "LLVM (ซึ่งหมายถึง" เครื่องเสมือนระดับต่ำ "ก่อนหน้านี้ในช่วงอายุโครงการ)"
ssokolow

52

ตามหนังสือ'เริ่มต้นใช้งาน LLVM Core Libraries' (c):

อันที่จริงชื่อ LLVM อาจอ้างถึงสิ่งต่อไปนี้:

  • โครงการ / โครงสร้างพื้นฐาน LLVM:นี่คือร่มสำหรับหลายโครงการที่รวมกันเป็นคอมไพเลอร์ที่สมบูรณ์: frontends, backends, optimizers, assembler, linkers, libc ++, compiler-rt, และ JIT engine คำว่า "LLVM" มีความหมายเช่นในประโยคต่อไปนี้: "LLVM ประกอบด้วยหลายโครงการ"

  • คอมไพเลอร์ที่ใช้ LLVM:นี่คือคอมไพเลอร์ที่สร้างขึ้นบางส่วนหรือทั้งหมดด้วยโครงสร้างพื้นฐาน LLVM ตัวอย่างเช่นคอมไพเลอร์อาจใช้ LLVM สำหรับส่วนหน้าและส่วนหลัง แต่ใช้ไลบรารีระบบ GCC และ GNU เพื่อดำเนินการลิงก์สุดท้าย LLVM มีความหมายนี้ในประโยคต่อไปนี้: "ฉันใช้ LLVM เพื่อรวบรวมโปรแกรม C กับแพลตฟอร์ม MIPS"

  • ไลบรารี LLVM:นี่คือส่วนรหัสที่ใช้ซ้ำได้ของโครงสร้างพื้นฐาน LLVM ตัวอย่างเช่น LLVM มีความหมายนี้ในประโยค: "โครงการของฉันใช้ LLVM เพื่อสร้างรหัสผ่านกรอบการรวบรวม Just-in-Time"

  • LLVM core:การเพิ่มประสิทธิภาพที่เกิดขึ้นในระดับภาษากลางและอัลกอริทึมแบ็กเอนด์ในรูปแบบ LLVM core ที่เริ่มโครงการ LLVM มีความหมายนี้ในประโยคต่อไปนี้: "LLVM และ Clang เป็นสองโครงการที่แตกต่างกัน"

  • LLVM IR:นี่คือการนำเสนอ LLVM ของคอมไพเลอร์ระดับกลาง LLVM มีความหมายนี้เมื่อใช้ในประโยคเช่น "ฉันสร้างส่วนหน้าซึ่งแปลภาษาของตัวเองเป็น LLVM"


35

LLVM นั้นเป็นห้องสมุดที่ใช้สร้างคอมไพเลอร์และ / หรือซอฟต์แวร์ที่เน้นภาษา ส่วนสำคัญพื้นฐานคือแม้ว่าคุณจะมี gcc ซึ่งอาจเป็นชุดคอมไพเลอร์ที่พบได้บ่อยที่สุด แต่ก็ไม่ได้สร้างขึ้นเพื่อให้สามารถใช้งานได้อีกครั้ง เป็นการยากที่จะนำส่วนประกอบจาก gcc มาใช้เพื่อสร้างแอปพลิเคชันของคุณเอง LLVM แก้ปัญหานี้ได้ดีโดยการสร้างชุดของ "โมดุลและคอมไพเลอร์และเทคโนโลยีเครื่องมือเครือข่าย" ซึ่งทุกคนสามารถใช้เพื่อสร้างคอมไพเลอร์และซอฟต์แวร์เชิงภาษา


6
ดังนั้น LLVM ก็คือห้องสมุดและ Clang เป็นคอมไพเลอร์?
Abdul

11
Clang เป็นคอมไพเลอร์ส่วนหน้า C / C ++ ของ LLVM มันจะแปลงรหัส C เป็น LLVM bitcode ซึ่งแปลเป็นภาษา Assembly โดยคอมไพเลอร์ส่วนหลัง
Boris Mulder

6

โครงสร้างพื้นฐาน LLVM คอมไพเลอร์มีประโยชน์อย่างยิ่งสำหรับการดำเนินการปรับให้เหมาะสมและการแปลงรหัส นอกจากนี้ยังประกอบด้วยเครื่องมือจำนวนหนึ่งที่ให้บริการประเพณีที่แตกต่างกัน llvm-prof เป็นเครื่องมือการทำโปรไฟล์ที่อนุญาตให้คุณทำการทำโปรไฟล์การดำเนินการเพื่อระบุฮอตสปอตของโปรแกรม การเลือกใช้เป็นเครื่องมือเพิ่มประสิทธิภาพที่ให้การเพิ่มประสิทธิภาพที่หลากหลาย (เช่นการกำจัดโค้ดที่ไม่ทำงาน)

ที่สำคัญ LLVM ให้ห้องสมุดแก่คุณเพื่อเขียน Passes ของคุณเอง ตัวอย่างเช่นหากคุณต้องการเพิ่มการตรวจสอบช่วงในอาร์กิวเมนต์บางอย่างที่ส่งผ่านไปยังฟังก์ชั่นบางอย่างของโปรแกรมการเขียน LLVM Pass แบบธรรมดาก็เพียงพอแล้ว

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเขียน Pass ของคุณเองโปรดตรวจสอบhttp://llvm.org/docs/WritingAnLLVMPass.htmlนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.