ความแตกต่างระหว่าง CC, gcc และ g ++?


106

อะไรคือความแตกต่างระหว่าง 3 คอมไพเลอร์ CC, gcc, g ++ เมื่อคอมไพล์โค้ด C และ C ++ ในแง่ของการสร้างโค้ดแอสเซมบลีไลบรารีที่พร้อมใช้งานคุณสมบัติภาษา ฯลฯ


1
ตามที่ระบุไว้ในคำตอบของฉัน - คำตอบสำหรับคำถามของคุณขึ้นอยู่กับแพลตฟอร์ม แต่ไม่ได้ระบุแพลตฟอร์ม
Jonathan Leffler

3
คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/172587/…
Martin York

คำตอบ:


125

คำตอบสำหรับเรื่องนี้คือเฉพาะแพลตฟอร์ม สิ่งที่เกิดขึ้นบน Linux นั้นแตกต่างจากสิ่งที่เกิดขึ้นบน Solaris เช่น

ส่วนที่ง่าย (เนื่องจากไม่ใช่เฉพาะแพลตฟอร์ม) คือการแยก 'gcc' และ 'g ++':

  • gcc คือ GNU C Compiler จาก GCC (GNU Compiler Collection)
  • g ++ คือคอมไพเลอร์ GNU C ++ จาก GCC

ส่วนที่ยากเนื่องจากเป็นแพลตฟอร์มเฉพาะคือความหมายของ 'CC' (และ 'cc')

  • บน Solaris โดยปกติ CC เป็นชื่อของคอมไพเลอร์ Sun C ++
  • บน Solaris โดยปกติ cc เป็นชื่อของคอมไพเลอร์ Sun C
  • ใน Linux ถ้ามี CC น่าจะเป็นลิงค์ไปยัง g ++
  • บน Linux cc คือลิงก์ไปยัง gcc

อย่างไรก็ตามแม้ใน Solaris อาจเป็นไปได้ว่า cc เป็นคอมไพเลอร์ C ที่ใช้ BSD รุ่นเก่าจาก/usr/ucb. ในทางปฏิบัติโดยปกติจะไม่ได้ติดตั้งและมีเพียงต้นขั้วที่ล้มเหลวสร้างความหายนะให้กับผู้ที่พยายามรวบรวมและติดตั้งซอฟต์แวร์กำหนดค่าด้วยตนเอง

บน HP-UX ค่าเริ่มต้น 'cc' ยังคงเป็นคอมไพเลอร์ C แบบ K & R-only ที่ติดตั้งเพื่ออนุญาตให้เชื่อมโยงเคอร์เนลใหม่เมื่อจำเป็นและใช้ไม่ได้กับซอฟต์แวร์สมัยใหม่เนื่องจากไม่รองรับมาตรฐาน C คุณต้องใช้ชื่อคอมไพเลอร์อื่น ('acc' IIRC) ในทำนองเดียวกันบน AIX คอมไพเลอร์ระบบ C จะใช้ชื่อเช่น 'xlc' หรือ 'xlc32'

โดยทั่วไปแล้วคอมไพลเลอร์ระบบเริ่มต้นเรียกว่า 'cc' และซอฟต์แวร์ที่กำหนดค่าเองจะกลับมาใช้ชื่อนั้นเมื่อไม่รู้ว่าจะใช้อะไรอีก

POSIX พยายามออกกฎหมายในลักษณะนี้โดยกำหนดให้มีโปรแกรม c89 (เดิม) และ c99 ในภายหลัง นี่คือคอมไพเลอร์ที่เข้ากันได้กับมาตรฐาน ISO / IEC 9899: 1989 และ 9899: 1999 C เป็นที่น่าสงสัยว่า POSIX ประสบความสำเร็จ


คำถามถามเกี่ยวกับความแตกต่างในแง่ของคุณสมบัติและไลบรารี ก่อนหน้านี้คำตอบคือแพลตฟอร์มเฉพาะบางส่วนและทั่วไปในบางส่วน

การแบ่งส่วนใหญ่อยู่ระหว่างคอมไพเลอร์ C และคอมไพเลอร์ C ++ คอมไพเลอร์ C ++ จะยอมรับโปรแกรม C ++ และจะไม่รวบรวมโปรแกรม C โดยพลการ (แม้ว่าจะสามารถเขียน C ในชุดย่อยที่ C ++ เข้าใจได้เช่นกัน แต่โปรแกรม C จำนวนมากไม่ใช่โปรแกรม C ++ ที่ถูกต้อง) ในทำนองเดียวกันคอมไพเลอร์ C จะยอมรับโปรแกรม C และจะปฏิเสธโปรแกรม C ++ ส่วนใหญ่ (เนื่องจากโปรแกรม C ++ ส่วนใหญ่ใช้โครงสร้างที่ไม่มีใน C)

ชุดของไลบรารีที่พร้อมใช้งานขึ้นอยู่กับภาษา โดยปกติโปรแกรม C ++ สามารถใช้ไลบรารี C บนแพลตฟอร์มที่กำหนด โดยปกติโปรแกรม C ไม่สามารถใช้ไลบรารี C ++ ได้ ดังนั้น C ++ จึงมีไลบรารีชุดใหญ่ขึ้น

โปรดทราบว่าหากคุณใช้ Solaris รหัสออบเจ็กต์ที่สร้างโดย CC จะไม่เข้ากันได้กับรหัสออบเจ็กต์ที่ผลิตโดย g ++ ซึ่งเป็นคอมไพเลอร์สองตัวที่แยกจากกันโดยมีข้อตกลงที่แยกจากกันสำหรับสิ่งต่างๆเช่นการจัดการข้อยกเว้นและการแยกชื่อ (และการโกงชื่อนั้นมีเจตนา แตกต่างกันเพื่อให้แน่ใจว่าไฟล์อ็อบเจ็กต์ที่เข้ากันไม่ได้จะไม่ถูกเชื่อมโยงเข้าด้วยกัน!) ซึ่งหมายความว่าหากคุณต้องการใช้ไลบรารีที่คอมไพล์ด้วย CC คุณต้องคอมไพล์โปรแกรมทั้งหมดของคุณด้วย CC นอกจากนี้ยังหมายความว่าหากคุณต้องการใช้ไลบรารีหนึ่งที่คอมไพล์ด้วย CC และอีกอันที่คอมไพล์ด้วย g ++ คุณจะโชคไม่ดี คุณต้องคอมไพล์ไลบรารีใหม่อย่างน้อยหนึ่งรายการ

ในแง่ของคุณภาพของแอสเซมเบลอร์ที่สร้างขึ้น GCC (GNU Compiler Collection) ทำงานได้ดีมาก แต่บางครั้งคอมไพเลอร์เนทีฟก็ทำงานได้ดีกว่าเล็กน้อย ฉันเชื่อว่าคอมไพเลอร์ของ Intel มีการเพิ่มประสิทธิภาพที่ครอบคลุมมากขึ้นซึ่งยังไม่ได้จำลองแบบใน GCC แต่การปลอมแปลงดังกล่าวเป็นอันตรายในขณะที่เราไม่ทราบว่าคุณเกี่ยวข้องกับแพลตฟอร์มใด

ในแง่ของคุณสมบัติภาษาคอมไพเลอร์โดยทั่วไปจะค่อนข้างใกล้เคียงกับมาตรฐานปัจจุบัน (C ++ 98, C ++ 2003, C99) แต่โดยปกติจะมีความแตกต่างเล็กน้อยระหว่างภาษามาตรฐานและภาษาที่คอมไพเลอร์รองรับ การสนับสนุนมาตรฐาน C89 รุ่นเก่านั้นเหมือนกัน (และสมบูรณ์) สำหรับคอมไพเลอร์ C ทั้งหมด มีความแตกต่างในมุมมืดของภาษา คุณต้องเข้าใจ 'พฤติกรรมที่ไม่ได้กำหนด', 'พฤติกรรมที่กำหนดโดยระบบ' และ 'พฤติกรรมที่ไม่ระบุ'; หากคุณเรียกใช้พฤติกรรมที่ไม่ได้กำหนดคุณจะได้ผลลัพธ์ที่แตกต่างกันในเวลาที่ต่างกัน นอกจากนี้ยังมีตัวเลือกมากมาย (โดยเฉพาะกับ GCC) เพื่อปรับแต่งพฤติกรรมของคอมไพเลอร์ GCC มีส่วนขยายมากมายที่ทำให้ชีวิตง่ายขึ้นถ้าคุณรู้ว่าคุณกำหนดเป้าหมายเฉพาะตระกูลคอมไพเลอร์นั้น


1
และบน OSX (อย่างน้อย Sierra 10.2) ก็เป็น symlink เพื่อส่งเสียงดัง
Josh Kodroff

27

CCเป็นตัวแปรสภาพแวดล้อมที่อ้างถึงคอมไพเลอร์ C ของระบบ สิ่งที่ชี้ไป (เข้าถึงไลบรารี ฯลฯ ) ขึ้นอยู่กับแพลตฟอร์ม บ่อยครั้งที่มันจะชี้ไปที่/usr/bin/ccผู้ปฏิบัติตามจริง (ไดรเวอร์) บนแพลตฟอร์มลินุกซ์มักจะชี้ไปที่CC/usr/bin/gcc

gccเป็นไบนารีไดรเวอร์สำหรับคอลเลกชันคอมไพเลอร์ GNU สามารถคอมไพล์ C, C ++ และภาษาอื่น ๆ ได้ กำหนดภาษาตามนามสกุลไฟล์

g++เป็นไบนารีของไดรเวอร์gccแต่มีตัวเลือกพิเศษบางอย่างที่กำหนดไว้สำหรับการรวบรวม C ++ โดยเฉพาะอย่างยิ่ง (จากประสบการณ์ของฉัน) g++จะเชื่อมโยง libstdc ++ ตามค่าเริ่มต้นในขณะที่gccจะไม่


1
คุณช่วยอธิบายความหมายของ "ไบนารีไดรเวอร์" ได้ไหม
Edan Maor

5
คอมไพเลอร์ C ส่วนใหญ่ แต่โดยเฉพาะ GCC มีโปรแกรมจำนวนมากที่ทำงานคอมไพเลอร์ มีโปรแกรมระดับบนสุดที่เรียกว่า 'gcc' นั่นคือโปรแกรมควบคุมคอมไพเลอร์ มันแยกวิเคราะห์ตัวเลือกบรรทัดคำสั่งมากมายและจัดระเบียบขั้นตอนอื่น ๆ ของคอมไพเลอร์ - ตัววิเคราะห์ / ตัววิเคราะห์, ตัวเพิ่มประสิทธิภาพ, แอสเซมเบลอร์และตัวเชื่อมโยง (โดยทั่วไปแล้วตัวประมวลผลล่วงหน้าจะไม่ใช่เฟสแยกกันในทุกวันนี้เว้นแต่คุณจะร้องขอเพียงการประมวลผลล่วงหน้าเท่านั้น) (ไดรเวอร์คอมไพเลอร์) เป็นโปรแกรมที่ค่อนข้างซับซ้อนแม้ว่าจะไม่เคยสัมผัสกับไฟล์ต้นฉบับ C เลยก็ตาม
Jonathan Leffler

3
CC ยังเป็นคอมไพเลอร์ Sun C ++ - ไม่ใช่ตัวแปรสภาพแวดล้อม
Jonathan Leffler

1
คอมไพเลอร์ C ++ ของ SGI ยังเป็น CC
alex tingle

ฉันคิดว่า Managu กำลังคิดว่า./configure+ makeสามารถใช้ตัวแปรสภาพแวดล้อมที่ตั้งชื่อCCเพื่อส่งผลต่อคอมไพเลอร์ C ที่ใช้ แต่โดยทั่วไปแล้วจะไม่มีตัวแปรสภาพแวดล้อมตามชื่อนั้น
ephemient

6

ฉันต้องการเพิ่มข้อมูลเพียงอย่างเดียวว่า cc ใน Linux มันเชื่อมโยงกับ gcc เพื่อตรวจสอบ ใส่คำอธิบายภาพที่นี่

ในทำนองเดียวกันสิ่งเดียวกันกับ c ++

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.