อะไรคือความแตกต่างระหว่าง 3 คอมไพเลอร์ CC, gcc, g ++ เมื่อคอมไพล์โค้ด C และ C ++ ในแง่ของการสร้างโค้ดแอสเซมบลีไลบรารีที่พร้อมใช้งานคุณสมบัติภาษา ฯลฯ
อะไรคือความแตกต่างระหว่าง 3 คอมไพเลอร์ CC, gcc, g ++ เมื่อคอมไพล์โค้ด C และ C ++ ในแง่ของการสร้างโค้ดแอสเซมบลีไลบรารีที่พร้อมใช้งานคุณสมบัติภาษา ฯลฯ
คำตอบ:
คำตอบสำหรับเรื่องนี้คือเฉพาะแพลตฟอร์ม สิ่งที่เกิดขึ้นบน Linux นั้นแตกต่างจากสิ่งที่เกิดขึ้นบน Solaris เช่น
ส่วนที่ง่าย (เนื่องจากไม่ใช่เฉพาะแพลตฟอร์ม) คือการแยก 'gcc' และ 'g ++':
ส่วนที่ยากเนื่องจากเป็นแพลตฟอร์มเฉพาะคือความหมายของ 'CC' (และ 'cc')
อย่างไรก็ตามแม้ใน 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 มีส่วนขยายมากมายที่ทำให้ชีวิตง่ายขึ้นถ้าคุณรู้ว่าคุณกำหนดเป้าหมายเฉพาะตระกูลคอมไพเลอร์นั้น
CC
เป็นตัวแปรสภาพแวดล้อมที่อ้างถึงคอมไพเลอร์ C ของระบบ สิ่งที่ชี้ไป (เข้าถึงไลบรารี ฯลฯ ) ขึ้นอยู่กับแพลตฟอร์ม บ่อยครั้งที่มันจะชี้ไปที่/usr/bin/cc
ผู้ปฏิบัติตามจริง (ไดรเวอร์) บนแพลตฟอร์มลินุกซ์มักจะชี้ไปที่CC
/usr/bin/gcc
gcc
เป็นไบนารีไดรเวอร์สำหรับคอลเลกชันคอมไพเลอร์ GNU สามารถคอมไพล์ C, C ++ และภาษาอื่น ๆ ได้ กำหนดภาษาตามนามสกุลไฟล์
g++
เป็นไบนารีของไดรเวอร์gcc
แต่มีตัวเลือกพิเศษบางอย่างที่กำหนดไว้สำหรับการรวบรวม C ++ โดยเฉพาะอย่างยิ่ง (จากประสบการณ์ของฉัน) g++
จะเชื่อมโยง libstdc ++ ตามค่าเริ่มต้นในขณะที่gcc
จะไม่
./configure
+ make
สามารถใช้ตัวแปรสภาพแวดล้อมที่ตั้งชื่อCC
เพื่อส่งผลต่อคอมไพเลอร์ C ที่ใช้ แต่โดยทั่วไปแล้วจะไม่มีตัวแปรสภาพแวดล้อมตามชื่อนั้น
ฉันต้องการเพิ่มข้อมูลเพียงอย่างเดียวว่า 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++