Quais são as diferenças entre os 3 compiladores CC, gcc, g ++ ao compilar o código C e C ++ em termos de geração de código assembly, bibliotecas disponíveis, recursos de linguagem, etc.?
Quais são as diferenças entre os 3 compiladores CC, gcc, g ++ ao compilar o código C e C ++ em termos de geração de código assembly, bibliotecas disponíveis, recursos de linguagem, etc.?
Respostas:
A resposta para isso é específica da plataforma; o que acontece no Linux é diferente do que acontece no Solaris, por exemplo.
A parte fácil (porque não é específica da plataforma) é a separação de 'gcc' e 'g ++':
A parte difícil, porque é específico da plataforma, é o significado de 'CC' (e 'cc').
No entanto, mesmo no Solaris, pode ser que cc seja o antigo compilador C baseado em BSD /usr/ucb
. Na prática, isso geralmente não é instalado e há apenas um esboço que falha, causando estragos em quem tenta compilar e instalar software autoconfigurável.
No HP-UX, o padrão 'cc' ainda é um compilador C K & R-only instalado para permitir a reconexão do kernel quando necessário, e inutilizável para o trabalho de software moderno porque não suporta o padrão C. Você deve usar nomes de compilador alternativos ('acc' IIRC). Da mesma forma, no AIX, o compilador C do sistema atende por nomes como 'xlc' ou 'xlc32'.
Classicamente, o compilador de sistema padrão era chamado de 'cc' e o software de autoconfiguração volta a usar esse nome quando não sabe mais o que usar.
POSIX tentou legislar sobre isso exigindo que os programas c89 (originalmente) e mais tarde c99 existissem; esses são os compiladores compatíveis com os padrões C ISO / IEC 9899: 1989 e 9899: 1999. É duvidoso que POSIX tenha tido sucesso.
A pergunta é sobre as diferenças em termos de recursos e bibliotecas. Como antes, a resposta é específica da plataforma em parte e genérica em parte.
A grande divisão é entre os compiladores C e os compiladores C ++. Os compiladores C ++ aceitarão programas C ++ e não compilarão programas C arbitrários. (Embora seja possível escrever C em um subconjunto que também é compreendido por C ++, muitos programas C não são programas C ++ válidos). Da mesma forma, os compiladores C aceitarão programas C e rejeitarão a maioria dos programas C ++ (porque a maioria dos programas C ++ usa construções não disponíveis em C).
O conjunto de bibliotecas disponíveis para uso depende do idioma. Os programas C ++ geralmente podem usar bibliotecas C em uma determinada plataforma; Os programas C geralmente não podem usar bibliotecas C ++. Portanto, C ++ tem um conjunto maior de bibliotecas disponíveis.
Observe que se você estiver no Solaris, o código-objeto produzido por CC não é compatível com o código-objeto produzido por g ++ - eles são dois compiladores separados com convenções separadas para coisas como manipulação de exceção e mutilação de nome (e a mutação de nome é deliberadamente diferente para garantir que arquivos de objeto incompatíveis não sejam vinculados!). Isso significa que se você quiser usar uma biblioteca compilada com CC, deve compilar todo o seu programa com CC. Isso também significa que se você deseja usar uma biblioteca compilada com CC e outra compilada com g ++, você está sem sorte. Você deve recompilar pelo menos uma das bibliotecas.
Em termos de qualidade do assembler gerado, o GCC (GNU Compiler Collection) faz um trabalho muito bom. Mas às vezes os compiladores nativos funcionam um pouco melhor. Os compiladores da Intel têm otimizações mais extensas que ainda não foram replicadas no GCC, acredito. Mas tais pontificações são perigosas enquanto não sabemos com qual plataforma você está preocupado.
Em termos de recursos de linguagem, todos os compiladores geralmente funcionam bem perto dos padrões atuais (C ++ 98, C ++ 2003, C99), mas geralmente existem pequenas diferenças entre a linguagem padrão e a linguagem suportada pelo compilador. O suporte ao padrão C89 mais antigo é essencialmente o mesmo (e completo) para todos os compiladores C. Existem diferenças nos cantos mais escuros do idioma. Você precisa entender 'comportamento indefinido', 'comportamento definido pelo sistema' e 'comportamento não especificado'; se você invocar um comportamento indefinido, obterá resultados diferentes em momentos diferentes. Existem também muitas opções (especialmente com o GCC) para ajustar o comportamento do compilador. O GCC tem uma variedade de extensões que tornam a vida mais simples se você sabe que está direcionando apenas para essa família de compiladores.
CC
é uma variável de ambiente que se refere ao compilador C do sistema. O que ele aponta (bibliotecas acessíveis, etc) dependem da plataforma. Freqüentemente, ele apontará para /usr/bin/cc
o compilador c (driver) real. Em plataformas Linux, CC
quase sempre aponta para /usr/bin/gcc
.
gcc
é o binário do driver para a coleção de compiladores GNU. Ele pode compilar C, C ++ e possivelmente outras linguagens; ele determina o idioma pela extensão do arquivo.
g++
é um driver semelhante a um binário gcc
, mas com algumas opções especiais definidas para compilar C ++. Notavelmente (em minha experiência), g++
vinculará libstdc ++ por padrão, enquanto gcc
não o fará.
./configure
+ make
pode tomar uma variável de ambiente nomeada CC
para afetar o compilador C usado, mas caso contrário, geralmente não há uma variável de ambiente com esse nome.
Eu quero adicionar apenas uma informação que cc no Linux. Ele está vinculado ao gcc. Para verificar.
Da mesma forma, a mesma coisa com 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++