GCC também compila código de C++ o.0 [RESOLVIDO]

1. GCC também compila código de C++ o.0 [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 06/05/2015 - 23:32h

Olá galera!

Hoje eu vi que o GCC 4.8 também compila código de C++, mas isso é bom ou ruim? Eu achava que seria algo como compiladores diferentes para linguagens diferentes, mas parece que me enganei.

Então, é bom esse recurso ?

T+


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/05/2015 - 11:28h

Thihup escreveu:

Olá galera!

Hoje eu vi que o GCC 4.8 também compila código de C++, mas isso é bom ou ruim? Eu achava que seria algo como compiladores diferentes para linguagens diferentes, mas parece que me enganei.


Os comandos gcc e g++ são pontos de entrada diferentes para um motor de compilação que compartilha a grande maioria dos componentes. Aliás, além de compilação propriamente dita, eles podem ser usados para outras operações, tais como preprocessamento, assembly e linking.

Essa flexibilidade se consegue, em parte, através da análise dos nomes dos arquivos passados como argumentos. Então, sufixos de nomes de arquivos como ".c" e ".h" são heuristicamente inferidos como sendo código fonte em C; ".C" (maiúsculo), ".cc", ".cpp", ".cxx" e ".c++", como programas em C++; ".s" ou ".asm" como programas em Assembly; ".f", ".for" ou ".f77" como código em Fortran, ".o", ".a", ".obj", ".lib" como código-objeto para o linker; etc.

A heurística geralmente funciona, mas tem algumas limitações. Por exemplo:

    - A distinção entre ".c" para C e ".C" para C++ pode ser difícil de se fazer em algumas plataformas que não forcem a distinção entre minúsculas e maiúsculas nos nomes dos arquivos (como no mundo Microsoft). Esse problema pode se estender também ao mundo UNIX, se forem copiados para uma máquina UNIX arquivos originalmente criados em plataforma DOS, Windows ou OS/2.

    - Existem pessoas que usam e/ou advogam o uso do sufixo ".c" (ou ".C") indistintamente para programas em C ou em C++ (menos frequente hoje em dia do que já foi no passado, ainda mais dados os caminhos de evolução divergentes que as duas linguagens vêm tomando).

    - Código legado que incorre num dos casos acima.

    - A heurística funciona tanto para o comando gcc quanto para o g++, mas alguns defaults são diferentes quando se chama com um nome ou com o outro.

    - Como caso particular do aspecto acima, os sufixos usados para inferir entre C e C++ afetam apenas para a etapa de compilação (produção do ".o" ou ".obj" de cada arquivo fonte), mas não a etapa de linking, necessária para gerar o executável final. Se você fizer a versão em C++ do clássico "Hello, World.", a saber

#include <iostream>

int main(){
std::cout << "Hello, World.\n";
}


, e tentar gerar o executável com gcc, em vez de g++, receberá vários erros na etapa de linking. Eles ocorrem porque o comando gcc invoca o linker com opções de bibliotecas para programas em C, mesmo quando o arquivo compilado está noutra linguagem. Se, por outro lado, você tentar gerar o executável com o comando g++, ele será gerado com sucesso, pois o linker será invocado com referências à biblioteca padrão do C++.

Então, é bom esse recurso ?


A questão passa por escolha pessoal.

Minha opinião particular é a de que, assim como sufixos distintos nos nomes do arquivo facilitam não apenas a heurística do compilador, mas também a minha própria organização, usar o ponto de entrada adequado a cada peça de código me ajuda a evitar surpresas. Se eu gosto do C e do C++ porque essas linguagens, em larga medida, assumem que o programador sabe o que está fazendo e não tentam interferir demais, então é bom mesmo que eu saiba o que estou fazendo.

3. Re: GCC também compila código de C++ o.0

Diego Silva
bleckout

(usa Ubuntu)

Enviado em 06/05/2015 - 23:49h

Thihup escreveu:

Olá galera!

Hoje eu vi que o GCC 4.8 também compila código de C++, mas isso é bom ou ruim? Eu achava que seria algo como compiladores diferentes para linguagens diferentes, mas parece que me enganei.

Então, é bom esse recurso ?

T+


Mas as outras versões do GCC também não compilavam?

Senão me engano, eu compilava normalmente usando o comando no terminal "gcc" os trabalhos em C++.

___________________________________________________________________
"Vivemos todos sob o mesmo céu, mas nem todos temos o mesmo horizonte." - Konrad Adenauer
Ubuntu 14.04 LTS amd64 - Core i7 3770K, 8GB RAM - NVIDIA GTX 760 Windforce



4. Re: GCC também compila código de C++ o.0 [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 07/05/2015 - 12:34h

Então é possível "viver" sem utilizar mais o G++ com o GCC?

Então que já pode "compilar" várias linguagens, eu pesquisei e vi o gcj que seria um compilador free do Java, que geraria em Bytecode e também código binário.

Pergunta:

Será que irão juntar os 2 em um só e futuramente o GCC poderá compilar Java, Python, Go, Swift e várias outras fora C e C++ por "padrão"?

Desculpa qualquer incoveniente

[]'s

T+


5. Re: GCC também compila código de C++ o.0

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/05/2015 - 15:14h

Thihup escreveu:

Então é possível "viver" sem utilizar mais o G++ com o GCC?


Sim. Só que eu acho que o preço a pagar é mais alto do que usar o ponto de entrada adequado.

Então que já pode "compilar" várias linguagens, eu pesquisei e vi o gcj que seria um compilador free do Java, que geraria em Bytecode e também código binário.


Se você parar para pensar, muitas linguagens de programação têm construções muito parecidas ou sintaticamente análogas. Em muitos casos, é possível construir autômatos que transformem código de uma linguagem em código de outra, com perfeição quase absoluta. Eu mesmo já usei em mais de uma oportunidade um p2c, para converter Pascal em C, e f2c, para converter Fortran em C, e consegui, com isso, rodar programas em Pascal e em Fortran numa máquina UNIX da faculdade em eu eu não era administrador e que, na época, não tinha nem compilador Pascal nem Fortran.

O que projetos como o GCC ou o LLVM fazem é, a grosso modo, análogo a isso: existe uma representação interna (RI) de código projetada de tal modo que é ao mesmo tempo relativamente fácil traduzir de uma linguagem de alto nível qualquer para essa RI (front end) e da RI para código nativo (back end). Adicionar ao GCC, por exemplo, suporte a uma nova linguagem, como D ou Go (que já existem) foi mera questão de gerar o front end para cada uma delas, sem impacto significativo no back end.

Pergunta:

Será que irão juntar os 2 em um só e futuramente o GCC poderá compilar Java, Python, Go, Swift e várias outras fora C e C++ por "padrão"?


De certa forma, isso já é feito (pelo menos para Java e Go): o back end já é comum para todas as linguagens suportadas.

Não sei se existe um compilador para Python oficialmente suportado. Procurando no Google, achei um chamado Nuitka, que converte de Python para C++, e compila o C++.

Ter um só front end para tudo não me parece muito desejável. Imagine, por exemplo, que você esteja criando uma linguagem nova, e que comece a mexer no “front end comum a todo mundo” ao mesmo tempo que desenvolvedores dos compiladores para outras linguagens já consolidadas. Os riscos de um quebrar o trabalho do outro ou torcer o nariz para as mudanças o que o outro fizer não são pequenas. Por outro lado, se você compartimentalizar tanto suas alterações de modo a não interferir em nada com o que já existe, estará, na prática, criando um front end diferente, ainda que ele atenda pelo mesmo nome de outros.

Ou, sei lá... Você pode fazer um “frontest” end, que verifica o tipo de arquivo e chama o front end adequado do GCC. Eu não vejo muito ganho nisso. Posso estar pensando com cabeça de velho, mas se você sabe a linguagem que usa na hora de programar, por que agir como se não soubesse na hora de compilar?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts