LLVM เทียบกับเสียงดังบน OS X


136

ฉันมีคำถามเกี่ยวกับ llvm, clang และ gcc บน OS X

ความแตกต่างระหว่าง llvm-gcc 4.2, llvm 2.0 และ clang คืออะไร? ฉันรู้ว่าพวกเขาทั้งหมดสร้างขึ้นจาก llvm แต่มันแตกต่างกันอย่างไร?

นอกจากคอมไพล์ได้เร็วขึ้นแล้ว llvm มีข้อดีกว่า gcc อย่างไร?


9
llvm เป็นเพียงแบ็กเอนด์ไม่มีคอมไพเลอร์ llvm แบบสแตนด์อโลน ... มีเฉพาะส่วนหน้าที่แตกต่างกันเช่น gcc และ clang
smerlin

5
@smerlin: "llvm compiler" เป็นชื่อทางการค้าของ Apple สำหรับ clang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon

รายละเอียดอื่น ๆ ที่นี่: stackoverflow.com/a/26724886/1938163
Marco A.

คำตอบ:


206

เดิม 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 มากกว่าที่จะใช้งานได้ในเสียงดังแม้ว่าจะมีการปรับปรุงอยู่ตลอดเวลา


13
เพื่อเพิ่มคำตอบที่ยอดเยี่ยมนี้: clang ยังเป็นชุดของไลบรารี (เรียกว่า libclang) ที่คุณสามารถใช้สำหรับสิ่งต่างๆเช่นการวิเคราะห์โค้ดการเติมข้อความอัตโนมัติการเน้นไวยากรณ์ ฯลฯ ... สิ่งนี้มีประโยชน์มากสำหรับ IDE

5
เมื่อสร้าง MacOS X หรือ iOS ให้พิจารณาว่า Clang เป็นซอฟต์แวร์ที่ Apple ใช้สร้างซอฟต์แวร์ MacOS X และ iOS ทั้งหมดรวมถึงระบบปฏิบัติการและ Clang คือสิ่งที่คุณจะได้รับโดยอัตโนมัติโดยไม่ต้องใช้ความพยายามและเป็นสิ่งที่ทุกคนเคย ขอความช่วยเหลือกำลังใช้ Apple ไม่เคยรองรับ gcc ที่ผ่านมา gcc 4.2 และไม่ได้จัดส่ง gcc เวอร์ชันใด ๆ อีกต่อไป
gnasher729

1
@ gnasher729 ใช่คำตอบนี้เขียนขึ้นเมื่อ 3 ปีก่อนตอนที่ Apple ยังคงจัดส่งทั้ง llvm-gcc และ Clang โดยมี llvm-gcc เป็นคอมไพเลอร์เริ่มต้น เวลามีการเปลี่ยนแปลงตั้งแต่นั้นมา
Brian Campbell

56

มี 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 กำลังปิดช่องว่าง


5

llvm-gcc-4.2 ใช้ส่วนหน้าของ GCC เพื่อแยกวิเคราะห์รหัสของคุณจากนั้นสร้างเอาต์พุตที่คอมไพล์โดยใช้ LLVM

"llvm compiler 2.0" ใช้ฟรอนต์เอนด์เสียงดังเพื่อแยกวิเคราะห์โค้ดของคุณและสร้างเอาต์พุตที่คอมไพล์โดยใช้ LLVM "เสียงดัง" เป็นเพียงชื่อของส่วนหน้าเท่านั้น แต่มักใช้เป็นชื่อสำหรับคอมไพเลอร์โดยรวม

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