ฉันมีคำถามเกี่ยวกับ llvm, clang และ gcc บน OS X
ความแตกต่างระหว่าง llvm-gcc 4.2, llvm 2.0 และ clang คืออะไร? ฉันรู้ว่าพวกเขาทั้งหมดสร้างขึ้นจาก llvm แต่มันแตกต่างกันอย่างไร?
นอกจากคอมไพล์ได้เร็วขึ้นแล้ว llvm มีข้อดีกว่า gcc อย่างไร?
ฉันมีคำถามเกี่ยวกับ llvm, clang และ gcc บน OS X
ความแตกต่างระหว่าง llvm-gcc 4.2, llvm 2.0 และ clang คืออะไร? ฉันรู้ว่าพวกเขาทั้งหมดสร้างขึ้นจาก llvm แต่มันแตกต่างกันอย่างไร?
นอกจากคอมไพล์ได้เร็วขึ้นแล้ว llvm มีข้อดีกว่า gcc อย่างไร?
คำตอบ:
เดิม LLVM ย่อมาจากคำว่า "virtual machine ระดับต่ำ" แม้ว่าตอนนี้จะเป็นเพียงตัวมันเองเพราะมันกลายเป็นสิ่งอื่นที่ไม่ใช่เครื่องเสมือนแบบดั้งเดิม เป็นชุดของไลบรารีและเครื่องมือตลอดจนการแทนค่ากลางที่เป็นมาตรฐานซึ่งสามารถใช้เพื่อช่วยสร้างคอมไพเลอร์และคอมไพเลอร์แบบทันเวลา ไม่สามารถรวบรวมสิ่งอื่นใดนอกจากการแสดงระดับกลางของตัวมันเอง จำเป็นต้องมีส่วนหน้าเฉพาะภาษาจึงจะทำได้ หากผู้คนอ้างถึง LLVM พวกเขาอาจหมายถึงแค่ไลบรารีและเครื่องมือระดับต่ำ บางคนอาจเรียก Clang หรือ llvm-gcc ไม่ถูกต้องว่า "LLVM" ซึ่งอาจทำให้เกิดความสับสน
llvm-gcc เป็นเวอร์ชันแก้ไขของ GCC ซึ่งใช้ LLVM เป็นแบ็กเอนด์แทนที่จะเป็นของ GCC ตอนนี้เลิกใช้แล้วเพื่อสนับสนุน DragonEgg ซึ่งใช้ระบบปลั๊กอินใหม่ของ GCC เพื่อทำสิ่งเดียวกันโดยไม่ต้องใช้ GCC
Clang เป็นคอมไพเลอร์ C / C ++ / Objective-C ใหม่ทั้งหมดซึ่งใช้ส่วนหน้าของตัวเองและ LLVM เป็นแบ็กเอนด์ ข้อดีที่มีให้คือข้อความแสดงข้อผิดพลาดที่ดีขึ้นเวลาคอมไพล์เร็วขึ้นและวิธีที่ง่ายกว่าสำหรับเครื่องมืออื่น ๆ ในการเชื่อมต่อในกระบวนการคอมไพล์ (เช่นตัวดีบักเกอร์ LLDBและตัววิเคราะห์แบบคงที่ของ Clang ) นอกจากนี้ยังเป็นโมดูลาร์ที่สมเหตุสมผลและสามารถใช้เป็นไลบรารีสำหรับซอฟต์แวร์อื่น ๆ ที่ต้องการวิเคราะห์รหัส C, C ++ หรือ Objective-C
แต่ละแนวทางเหล่านี้ (GCC ธรรมดา, GCC + LLVM และ Clang) มีข้อดีและข้อเสีย เกณฑ์มาตรฐานสองสามชุดสุดท้ายที่ฉันเคยเห็นแสดงให้เห็นว่า GCC สามารถสร้างโค้ดได้เร็วขึ้นเล็กน้อยในกรณีทดสอบส่วนใหญ่ (แม้ว่า LLVM จะมีขอบเล็กน้อยในบางกรณี) ในขณะที่ LLVM และ Clang ให้เวลาในการรวบรวมที่ดีกว่า GCC และคอมโบ GCC / LLVM มีข้อได้เปรียบที่มีการทดสอบโค้ดมากขึ้นและใช้งานได้กับรสชาติ GCC ของ C; มีส่วนขยายเฉพาะของคอมไพเลอร์บางตัวที่มีเฉพาะ GCC และบางแห่งที่มาตรฐานอนุญาตให้ใช้งานแตกต่างกันไป แต่โค้ดขึ้นอยู่กับการนำไปใช้งานเฉพาะ มีโอกาสมากขึ้นหากคุณได้รับรหัส C ดั้งเดิมจำนวนมากซึ่งจะใช้งานได้ใน GCC มากกว่าที่จะใช้งานได้ในเสียงดังแม้ว่าจะมีการปรับปรุงอยู่ตลอดเวลา
มี 2 สิ่งที่แตกต่างกันที่นี่
LLVM เป็นคอมไพเลอร์แบ็กเอนด์ที่มีไว้เพื่อสร้างคอมไพเลอร์ที่ด้านบน เกี่ยวข้องกับการเพิ่มประสิทธิภาพและการผลิตโค้ดที่ปรับให้เข้ากับสถาปัตยกรรมเป้าหมาย
CLang เป็นส่วนหน้าซึ่งแยกวิเคราะห์โค้ด C, C ++ และ Objective C และแปลเป็นตัวแทนที่เหมาะสมกับ LLVM
llvm gcc เป็นเวอร์ชันเริ่มต้นของคอมไพเลอร์ C ++ ที่ใช้ llvm ที่ใช้ gcc 4.2 ซึ่งตอนนี้เลิกใช้แล้วเนื่องจาก CLang สามารถแยกวิเคราะห์ทุกอย่างที่สามารถแยกวิเคราะห์ได้และอื่น ๆ
สุดท้ายความแตกต่างหลักระหว่าง CLang และ gcc ไม่ได้อยู่ในรหัสที่ผลิต แต่อยู่ในแนวทาง ในขณะที่ gcc เป็นเสาหิน CLang ถูกสร้างขึ้นเป็นชุดของไลบรารี การออกแบบโมดูลาร์นี้ช่วยให้สามารถนำไปใช้ซ้ำได้อย่างมากสำหรับ IDE หรือเครื่องมือการทำให้สมบูรณ์
ในขณะนี้รหัสที่สร้างโดย gcc 4.6 โดยทั่วไปจะเร็วกว่าเล็กน้อย แต่ CLang กำลังปิดช่องว่าง
llvm-gcc-4.2 ใช้ส่วนหน้าของ GCC เพื่อแยกวิเคราะห์รหัสของคุณจากนั้นสร้างเอาต์พุตที่คอมไพล์โดยใช้ LLVM
"llvm compiler 2.0" ใช้ฟรอนต์เอนด์เสียงดังเพื่อแยกวิเคราะห์โค้ดของคุณและสร้างเอาต์พุตที่คอมไพล์โดยใช้ LLVM "เสียงดัง" เป็นเพียงชื่อของส่วนหน้าเท่านั้น แต่มักใช้เป็นชื่อสำหรับคอมไพเลอร์โดยรวม