Perbedaan antara CC, gcc dan g ++?

104

Apa perbedaan antara 3 compiler CC, gcc, g ++ saat mengompilasi kode C dan C ++ dalam hal pembuatan kode assembly, library yang tersedia, fitur bahasa, dll.?

kendaraan
sumber
1
Seperti yang ditunjukkan dalam jawaban saya - jawaban atas pertanyaan Anda tergantung pada platformnya, tetapi platformnya tidak ditentukan.
Jonathan Leffler
3
Pertanyaan terkait: stackoverflow.com/questions/172587/…
Martin York

Jawaban:

122

Jawabannya adalah untuk platform tertentu; apa yang terjadi di Linux berbeda dengan apa yang terjadi di Solaris, misalnya.

Bagian yang mudah (karena tidak spesifik untuk platform) adalah pemisahan 'gcc' dan 'g ++':

  • gcc adalah Kompilator GNU C dari GCC (Koleksi Kompilator GNU).
  • g ++ adalah Kompiler GNU C ++ dari GCC.

Bagian tersulit, karena spesifik platform, adalah arti dari 'CC' (dan 'cc').

  • Di Solaris, CC biasanya adalah nama kompiler Sun C ++.
  • Di Solaris, cc biasanya merupakan nama kompiler Sun C.
  • Di Linux, jika ada, CC mungkin adalah tautan ke g ++.
  • Di Linux, cc adalah tautan ke gcc.

Namun, bahkan di Solaris, bisa jadi cc adalah compiler C berbasis BSD yang lama /usr/ucb. Dalam praktiknya, itu biasanya tidak diinstal dan hanya ada sebuah rintisan yang gagal, mendatangkan malapetaka bagi mereka yang mencoba mengompilasi dan menginstal perangkat lunak konfigurasi sendiri.

Di HP-UX, 'cc' default masih merupakan kompiler C khusus K & R yang diinstal untuk mengizinkan penautan ulang kernel bila diperlukan, dan tidak dapat digunakan untuk pekerjaan perangkat lunak modern karena tidak mendukung C standar. Anda harus menggunakan nama kompilator alternatif ('acc' IIRC). Demikian pula, di AIX, kompilator sistem C menggunakan nama seperti 'xlc' atau 'xlc32'.

Secara klasik, kompilator sistem default disebut 'cc' dan perangkat lunak yang mengonfigurasi sendiri menggunakan nama itu ketika tidak tahu apa lagi yang harus digunakan.

POSIX berusaha untuk mengatur jalannya dengan mewajibkan program c89 (aslinya) dan kemudian c99 ada; ini adalah kompiler yang kompatibel dengan standar ISO / IEC 9899: 1989 dan 9899: 1999 C. Diragukan bahwa POSIX berhasil.


Pertanyaannya menanyakan tentang perbedaan dalam hal fitur dan pustaka. Seperti sebelumnya, jawabannya adalah untuk platform tertentu, dan sebagian generik.

Perbedaan besar adalah antara kompiler C dan kompiler C ++. Kompiler C ++ akan menerima program C ++ dan tidak akan mengkompilasi program C sembarangan. (Meskipun dimungkinkan untuk menulis C dalam subset yang juga dipahami oleh C ++, banyak program C bukan program C ++ yang valid). Demikian pula, kompiler C akan menerima program C dan akan menolak sebagian besar program C ++ (karena sebagian besar program C ++ menggunakan konstruksi yang tidak tersedia di C).

Kumpulan pustaka yang tersedia untuk digunakan bergantung pada bahasanya. Program C ++ biasanya dapat menggunakan pustaka C pada platform tertentu; Program C biasanya tidak dapat menggunakan pustaka C ++. Jadi, C ++ memiliki kumpulan pustaka yang lebih besar yang tersedia.

Perhatikan bahwa jika Anda menggunakan Solaris, kode objek yang dihasilkan oleh CC tidak kompatibel dengan kode objek yang dihasilkan oleh g ++ - mereka adalah dua kompiler terpisah dengan konvensi terpisah untuk hal-hal seperti penanganan pengecualian dan nama mangling (dan nama mangling sengaja digunakan. berbeda untuk memastikan bahwa file objek yang tidak kompatibel tidak ditautkan bersama!). Ini berarti jika Anda ingin menggunakan pustaka yang dikompilasi dengan CC, Anda harus mengkompilasi seluruh program Anda dengan CC. Ini juga berarti bahwa jika Anda ingin menggunakan satu pustaka yang dikompilasi dengan CC dan pustaka lain yang dikompilasi dengan g ++, Anda kurang beruntung. Anda harus mengkompilasi ulang salah satu perpustakaan setidaknya.

Dalam hal kualitas assembler yang dihasilkan, GCC (GNU Compiler Collection) melakukan pekerjaan yang sangat baik. Tetapi terkadang kompiler asli bekerja sedikit lebih baik. Kompiler Intel memiliki pengoptimalan yang lebih ekstensif yang belum direplikasi di GCC, saya yakin. Tetapi pontifikasi seperti itu berbahaya sementara kami tidak tahu platform apa yang Anda pedulikan.

Dalam hal fitur bahasa, semua kompiler umumnya mendekati standar saat ini (C ++ 98, C ++ 2003, C99), tetapi biasanya terdapat perbedaan kecil antara bahasa standar dan bahasa yang didukung oleh kompilator. Dukungan standar C89 yang lebih lama pada dasarnya sama (dan lengkap) untuk semua kompiler C. Ada perbedaan di sudut-sudut bahasa yang lebih gelap. Anda perlu memahami 'perilaku yang tidak ditentukan', 'perilaku yang ditentukan sistem' dan 'perilaku yang tidak ditentukan'; jika Anda menerapkan perilaku tidak terdefinisi, Anda akan mendapatkan hasil yang berbeda pada waktu yang berbeda. Ada juga banyak opsi (terutama dengan GCC) untuk mengubah perilaku kompilator. GCC memiliki berbagai ekstensi yang membuat hidup lebih sederhana jika Anda tahu bahwa Anda hanya menargetkan keluarga compiler itu.

Jonathan Leffler
sumber
1
Dan di OSX (setidaknya Sierra 10.2), ini adalah symlink untuk dentang.
Josh Kodroff
26

CCadalah variabel lingkungan yang mengacu pada compiler C sistem. Apa yang ditunjukkannya (perpustakaan dapat diakses, dll) bergantung pada platform. Seringkali ini akan menunjuk ke /usr/bin/cc, c complier (driver) yang sebenarnya. Pada platform linux, CChampir selalu menunjuk ke /usr/bin/gcc.

gccadalah biner driver untuk koleksi kompilator GNU. Ia dapat mengkompilasi C, C ++, dan mungkin bahasa lain; itu menentukan bahasa dengan ekstensi file.

g++adalah driver biner gcc, tetapi dengan beberapa opsi khusus yang ditetapkan untuk kompilasi C ++. Khususnya (menurut pengalaman saya), g++akan menautkan libstdc ++ secara default, sementara gcctidak.

Managu
sumber
1
Bisakah Anda menjelaskan apa yang Anda maksud dengan "driver biner"?
Edan Maor
5
Kebanyakan kompiler C, tetapi khususnya GCC, memiliki sejumlah program yang melakukan pekerjaan kompilasi. Ada program tingkat atas, disebut 'gcc', yaitu driver kompilator; itu mem-parsing berbagai opsi baris perintah dan mengatur fase lain dari compiler - parser / analyzer, pengoptimal, assembler dan linker, biasanya (preprocessor biasanya bukan fase terpisah saat ini, kecuali Anda hanya meminta preprocessing). Itu (driver kompiler) adalah program yang cukup kompleks, meskipun tidak pernah menyentuh file sumber C itu sendiri.
Jonathan Leffler
3
CC juga merupakan compiler Sun C ++ - dan bukan variabel lingkungan.
Jonathan Leffler
1
Compiler C ++ SGI juga CC.
alex tingle
Yah, saya kira Managu berpikir bahwa ./configure+ makedapat mengambil variabel lingkungan yang diberi nama CCuntuk mempengaruhi kompiler C yang digunakan, tetapi sebaliknya umumnya tidak ada variabel lingkungan dengan nama itu.
singkat pada
5

Saya hanya ingin menambahkan satu informasi tentang cc di Linux. Ini terkait dengan gcc. Untuk memeriksanya. masukkan deskripsi gambar di sini

Begitu pula dengan 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++
Uddhav Gautam
sumber