Diferença entre CC, gcc e g ++?

104

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.?

Vehomzzz
fonte
1
Conforme indicado na minha resposta - a resposta à sua pergunta depende da plataforma, mas a plataforma não foi especificada.
Jonathan Leffler,
3
Pergunta relacionada: stackoverflow.com/questions/172587/…
Martin York

Respostas:

122

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 ++':

  • gcc é o GNU C Compiler do GCC (GNU Compiler Collection).
  • g ++ é o compilador GNU C ++ do GCC.

A parte difícil, porque é específico da plataforma, é o significado de 'CC' (e 'cc').

  • No Solaris, CC é normalmente o nome do compilador Sun C ++.
  • No Solaris, cc normalmente é o nome do compilador Sun C.
  • No Linux, se existir, CC provavelmente é um link para g ++.
  • No Linux, cc é um link para gcc.

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.

Jonathan Leffler
fonte
1
E no OSX (Sierra 10.2 pelo menos), é um link simbólico para clang.
Josh Kodroff,
26

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/cco compilador c (driver) real. Em plataformas Linux, CCquase 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 gccnão o fará.

Managu
fonte
1
Você pode explicar o que você quer dizer com "binário de driver"?
Edan Maor,
5
A maioria dos compiladores C, mas especificamente o GCC, tem vários programas que fazem o trabalho de compilação. Existe um programa de nível superior, chamado 'gcc', que é o driver do compilador; ele analisa uma miríade de opções de linha de comando e orquestra as outras fases do compilador - o analisador / analisador, o otimizador, o montador e o vinculador, normalmente (o pré-processador geralmente não é uma fase separada atualmente, a menos que você solicite apenas o pré-processamento). Ele (o driver do compilador) é um programa bastante complexo, embora nunca toque em um arquivo de origem C em si.
Jonathan Leffler,
3
CC também é o compilador Sun C ++ - e não uma variável de ambiente.
Jonathan Leffler,
1
O compilador C ++ da SGI também é CC.
alex tingle
Bem, suponho que Managu está pensando que ./configure+ makepode tomar uma variável de ambiente nomeada CCpara afetar o compilador C usado, mas caso contrário, geralmente não há uma variável de ambiente com esse nome.
efêmero
5

Eu quero adicionar apenas uma informação que cc no Linux. Ele está vinculado ao gcc. Para verificar. insira a descrição da imagem aqui

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++
Uddhav Gautam
fonte