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.?
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.?
Jawaban:
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 ++':
Bagian tersulit, karena spesifik platform, adalah arti dari 'CC' (dan 'cc').
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.
CC
adalah 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, CC
hampir selalu menunjuk ke /usr/bin/gcc
.
gcc
adalah 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 gcc
tidak.
./configure
+ make
dapat mengambil variabel lingkungan yang diberi nama CC
untuk mempengaruhi kompiler C yang digunakan, tetapi sebaliknya umumnya tidak ada variabel lingkungan dengan nama itu.
Saya hanya ingin menambahkan satu informasi tentang cc di Linux. Ini terkait dengan gcc. Untuk memeriksanya.
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++