ข้อดีและข้อเสียของ GCC vs clang / LLVM คืออะไร
ข้อดีและข้อเสียของ GCC vs clang / LLVM คืออะไร
คำตอบ:
gcc เป็นผู้ใหญ่มากติดตั้งง่าย (อย่างน้อยสำหรับระบบส่วนใหญ่) และเป็นคอมไพเลอร์เริ่มต้นสำหรับระบบจำนวนมากดังนั้นในหลาย ๆ กรณีผู้คนติดตั้งมันเกือบจะโดยที่ไม่รู้ตัว มันถูกส่งไปยังสถาปัตยกรรม zillion ดังนั้นจึงมีแนวโน้มที่จะทำงานนอกกรอบหากคุณต้องกำหนดเป้าหมายฮาร์ดแวร์ที่คลุมเครือ
เสียงดังกราวนั้นใหม่กว่ามาก มันมักสร้างข้อความแสดงข้อผิดพลาดที่ดีกว่ามากโดยเฉพาะอย่างยิ่งสำหรับแม่แบบ C ++ ในหลายกรณีมันทำงานเร็วกว่ามาก มันถูกสร้างขึ้นเป็นหลักเป็นชุดของไลบรารีดังนั้นจึงมีโครงการอื่นอีกไม่กี่อย่าง (เช่นตัววิเคราะห์รหัส) ที่ใช้ front-end เดียวกันเข้าใจอินพุตเดียวกันและอื่น ๆ การใช้ llvm เนื่องจากแบ็คเอนด์นั้นให้ความยืดหยุ่นเป็นพิเศษใน คุณสร้างรหัสได้อย่างไร
เสียงดังกราวมีการรายงานข้อผิดพลาดที่ดีกว่ามาก เช่นถ้าคุณพิมพ์ผิดในชื่อฟังก์ชั่นที่คุณโทรเสียงดังกราวจะรายงานว่านี่น่าจะเป็นตัวพิมพ์ผิด (และแนะนำชื่อที่ถูกต้อง) ในขณะที่ GCC จะบ่นเกี่ยวกับชื่อฟังก์ชั่นที่ไม่รู้จัก
โดยทั่วไปแล้ว GCC จะสร้างรหัสได้เร็วขึ้นหากคุณกำหนดเป้าหมายเป็น x86 / x86-64 สำหรับ ARM สถานการณ์นั้นคลุมเครือบ่อยครั้งที่เสียงดังกราวจะปรับให้เหมาะสมที่สุด นอกจากนี้ AFAIK Clang ไม่สนับสนุนการปรับให้เหมาะสมสำหรับขนาดโค้ด
GCC ใช้การวิเคราะห์พฤติกรรมจำนวนมาก สิ่งนี้เป็นสิ่งที่ดีสำหรับประสิทธิภาพ (ในกรณีทั่วไป) แต่น่ากลัวถ้าคุณต้องการเพิ่มประสิทธิภาพระดับซอร์ส (เช่นการวนลูป) แม้แต่การเปลี่ยนแปลงซอร์สโค้ดขนาดเล็กก็สามารถทำให้ GCC สร้างผลลัพธ์ที่แตกต่างอย่างสิ้นเชิง เสียงดังกราวสามารถคาดเดาได้มากขึ้นและมักจะสร้างรหัสที่คุณคาดหวัง
ซึ่งแตกต่างจาก Jerry Coffin ฉันพบว่าการสร้าง GCC จากแหล่งที่มายากกว่า Clang มาก ขั้นตอนจากหน้าเริ่มต้นของ Clangใช้ได้สำหรับฉันเสมอ คู่มือที่คล้ายกันสำหรับ GCCไม่เคยทำงานในครั้งแรก GCC มีการพึ่งพารุ่นเฉพาะของ GMP, MPFR, MPC, Parma Polyhedra Library และ CLooG และฉันต้องการการวนซ้ำหลายครั้งเพื่อค้นหารุ่นที่จะใช้งานได้กับ GCC รุ่นเฉพาะ (ใช่โดยใช้รุ่นล่าสุดของไลบรารีเหล่านั้นไม่ทำงาน )
ฉันมีความรู้สึกว่าเสียงดังกราวทดสอบได้ดีกว่า GCC แม้ว่าฉันจะใช้ GCC รุ่นเป็นทางการ แต่บางครั้งมันก็สร้างรหัสที่ผิดพลาด สำหรับ Clang ฉันมักจะใช้รุ่นลำตัว (อีกครั้งเพราะมันง่ายต่อการสร้าง) แต่ฉันไม่เคยเห็นว่ามันสร้างเอาต์พุตผิด
GCC เกือบเป็นมาตรฐานในโลกของ Linux และเพิ่มคุณสมบัติที่ไม่ได้มาตรฐานจำนวนมากซึ่งใช้กันอย่างแพร่หลายในซอฟต์แวร์ Linux เสียงดังกังวานพยายามที่จะเข้ากันได้กับ GCC แต่บางครั้งมันก็ไม่สนใจพวกเขา สิ่งสำคัญที่สุดคือเสียงดังกราวไม่สนับสนุน OpenMP อย่างไรก็ตามมีส่วนขยายที่ไม่ได้รับการสนับสนุนจาก GCC แต่อาจมีประโยชน์ (เช่นฟังก์ชั่นที่เพิ่มเข้ามาด้วย __buildin_addc)
หากคุณต้องการทำการวิจัยคอมไพเลอร์หรืออยากรู้ว่ามันทำงานอย่างไรคุณจะพบว่าซอร์สโค้ด Clang / LLVM สามารถเข้าถึงได้ง่ายขึ้น รหัส Clang / LLVM สามารถอ่านได้โดยมนุษย์
(มีการปฏิเสธโดย AINAL) ใบอนุญาต Clang / LLVM ช่วยให้คุณมีอิสระมากขึ้นเกี่ยวกับสิ่งที่คุณสามารถทำได้กับรหัสเช่นใช้ในเชิงพาณิชย์หรือผลิตภัณฑ์ที่มาปิด ใบอนุญาตสำหรับไลบรารีรันไทม์ของ GCC เพิ่มข้อ จำกัด อีกชั้นหนึ่งขณะที่ Clang compiler runtime (compiler-rt ไลบรารี่) อยู่ภายใต้ใบอนุญาตของ MIT
สรุป: รวบรวมกับ Clang เมื่อคุณพัฒนาโปรแกรมและกับ GCC สำหรับการสร้างขั้นสุดท้าย (แต่ต้องแน่ใจว่ามันเร็วขึ้นและไม่แตก) ติดกับ Clang / LLVM ถ้าคุณทำการวิจัยคอมไพเลอร์
__builtin_add
__buildin_addc
อย่างไรก็ตามเสียงดังกราวเป็นพอสมาร์ทเพื่อสร้างaddc
เมื่อมันพบกว้างเพิ่มการเปรียบเทียบการใช้เป็นกระเป๋าถือ
__builtin_addc
ไม่__buildin_addc
หากคุณมีสถาปัตยกรรม CPU ใหม่หรือการเพิ่มประสิทธิภาพใหม่และต้องการเปิดแหล่งที่มาภายใต้ GPL คุณสามารถมีส่วนร่วมกับ gcc อย่างไรก็ตาม gcc นั้นเป็นมอดุลาร์น้อยกว่าดังนั้นสิ่งนี้อาจเกี่ยวข้องกับการทำงานเพิ่มเติมเพื่อเพิ่มการดัดแปลง / เพิ่มเติม หากคุณต้องการมีส่วนร่วมกับสถาปัตยกรรมใหม่หรือการเพิ่มประสิทธิภาพให้กับโครงการโอเพนซอร์ซ แต่ภายใต้ใบอนุญาตที่ไม่ใช่ GPL คุณสามารถมีส่วนร่วมกับ LLVM / เสียงดังกราว มี บริษัท ที่มีอยู่ซึ่งแผนกกฎหมายอนุญาตให้หลัง
วันนี้ (8/11/2554) GCC สนับสนุนฟีเจอร์ C ++ 0x มากกว่าที่ Clang ทำ หากคุณต้องการคุณสมบัติเหล่านั้นมันเป็นเกมง่ายๆ GCC เป็นตัวเลือกของคุณ