prog:guia-de-estudo-c
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
| prog:guia-de-estudo-c [2026/02/28 04:01] – [Compiladores] texto mais conciso hrcerq | prog:guia-de-estudo-c [2026/03/02 01:49] (atual) – [Compiladores] palavra repetida removida hrcerq | ||
|---|---|---|---|
| Linha 193: | Linha 193: | ||
| - [[prog: | - [[prog: | ||
| - [[prog: | - [[prog: | ||
| + | |||
| + | Portanto, o mínimo necessário para compilar programas C são um | ||
| + | pré-processador, | ||
| + | da biblioteca C (que será explicada mais adiante). | ||
| As ferramentas que desempenham essas funções podem ou não estar | As ferramentas que desempenham essas funções podem ou não estar | ||
| - | agrupadas em uma mesma coleção | + | agrupadas em uma mesma coleção. |
| - | Clang, por exemplo, fazem esse agrupamento de funções). | + | notórias são: |
| - | Os artigos a seguir explicam por alto como funciona o processo de | + | * [[https:// |
| - | compilação: | + | * [[https:// |
| - | * [[https://pt.wikipedia.org/ | + | Outra um pouco menos conhecida é a do //Tiny C Compiler// (TCC): |
| - | * [[https:// | + | |
| - | * [[https:// | + | |
| - | * // | + | |
| - | Existem vários compiladores C, alguns mais conhecidos e populares, | + | * [[https://bellard.org/tcc/|TCC]] |
| - | outros menos. Você não precisa conhecer todos eles agora (e aliás, | + | |
| - | dificilmente em algum momento vai precisar conhecer | + | |
| - | importante compreender ao menos um pouco essa variedade e quais são os | + | |
| - | pontos fortes e fracos de ao menos alguns deles. | + | |
| - | A seguir você encontra uma lista contemplando e categorizando alguns | + | E ainda outra é a do // |
| - | compiladores | + | |
| - | * //[[https://en.wikipedia.org/wiki/ | + | * [[https://www.simple-cc.org/|SCC]] |
| - | + | ||
| - | Dois compiladores de grande destaque são o [[https:// | + | |
| - | do projeto GNU, e o [[https:// | + | |
| - | infraestrutura de compilação [[https:// | + | |
| - | Conhecer ao menos esses dois já será suficiente para compreender as | + | |
| - | funções centrais desse tipo de ferramenta. | + | |
| === Pré-processamento === | === Pré-processamento === | ||
| Linha 250: | Linha 240: | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * // | * // | ||
| Linha 263: | Linha 255: | ||
| * [[http:// | * [[http:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| === Compilação === | === Compilação === | ||
| Linha 291: | Linha 284: | ||
| * // | * // | ||
| + | * //Geração de código de montagem//: emitir o código // | ||
| Enfim, depois de todo esse processo, temos o código Assembly gerado. | Enfim, depois de todo esse processo, temos o código Assembly gerado. | ||
| Agora é possível converter esse código para o binário que a máquina | Agora é possível converter esse código para o binário que a máquina | ||
| será capaz de processar. | será capaz de processar. | ||
| + | |||
| + | Os artigos a seguir falam um pouco mais sobre como funciona esse | ||
| + | processo de compilação: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * // | ||
| + | |||
| + | Existem vários compiladores C, alguns mais conhecidos e populares, | ||
| + | outros menos. Você não precisa conhecer todos eles agora (e aliás, | ||
| + | dificilmente em algum momento vai precisar conhecer //todos//), mas é | ||
| + | importante compreender ao menos um pouco essa variedade e quais são os | ||
| + | pontos fortes e fracos de ao menos alguns deles. | ||
| + | |||
| + | A seguir você encontra uma lista contemplando e categorizando alguns | ||
| + | compiladores C: | ||
| + | |||
| + | * // | ||
| + | |||
| + | Dois compiladores de grande destaque são: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Conhecer ao menos esses dois já será suficiente para compreender as | ||
| + | funções centrais desse tipo de ferramenta. | ||
| + | |||
| + | A propósito, estes dois exemplos (GCC e Clang) usam uma representação | ||
| + | intermediária para, por um lado, ampliar as linguagens suportadas | ||
| + | (já que diferentes linguagens, além de C podem ter seu código convertido | ||
| + | para a representação intermediária) como também ampliar as arquiteturas | ||
| + | suportadas (isto é, converter essa representação para diferentes | ||
| + | linguagens de montagem, de arquiteturas alvo). | ||
| + | |||
| + | Além do ganho na portabilidade, | ||
| + | possibilidades de otimização para ganho de desempenho, por análises | ||
| + | heurísticas que não seriam possíveis lendo apenas a árvore semântica. | ||
| + | |||
| + | É comum separar esse tipo de arquitetura em camadas: frontal | ||
| + | (// | ||
| + | Enquanto a parte frontal é responsável por converter o código-fonte | ||
| + | (C neste caso) em uma representação intermediária, | ||
| + | identifica oportunidades de otimizações e as aplica. Por fim, a | ||
| + | retaguarda cuida da conversão do resultado em linguagem de montagem. | ||
| + | |||
| + | No caso do compilador Clang, é a máquina virtual LLVM que se encarrega | ||
| + | de ler a representação intermediária, | ||
| + | o código de montagem. O GCC já possui internamente seu próprio | ||
| + | // | ||
| + | |||
| + | Uma outra opção de infraestrutura de compilação (entenda-se o | ||
| + | // | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | Diferente do GCC e do LLVM, sua prioridade é a simplicidade | ||
| + | e capacidade de inspecionar e estudar o processo de compilação, | ||
| + | ainda que sob pena de realizar menos otimizações sobre o código. | ||
| + | |||
| + | Alguns compiladores (mais especificamente, | ||
| + | visam gerar código intermediário para o QBE são: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Por fim, existem compiladores que não utilizam uma representação | ||
| + | intermediária. Um exemplo interessante é o Tiny C Compiler (TCC): | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | Sua principal vantagem é uma compilação mais rápida, ainda que | ||
| + | o programa resultante não tenha o mesmo desempenho que o | ||
| + | equivalente gerado por GCC e Clang, geralmente. | ||
| === Montagem === | === Montagem === | ||
| + | |||
| + | Diferentemente de um processo de compilação, | ||
| + | intenção do programador quanto //ao quê// deve ser feito pelo programa, | ||
| + | a montagem é um processo mais linear, que enfatiza //como// deve ser | ||
| + | feito. Portanto, a montagem é uma tradução mais literal de expressões | ||
| + | mnemônicas para equivalentes binários que podem ser compreendidos pelo | ||
| + | processador alvo. | ||
| + | |||
| + | Um código-fonte C pode passar por várias transformações e ainda assim | ||
| + | manter seu sentido original, não importanto para o programador quais | ||
| + | otimizações precisaram ser aplicadas, desde que o comportamento se | ||
| + | mantenha consistente. Já o código de montagem (// | ||
| + | diretamente equivalente ao resultado (binário). | ||
| + | |||
| + | Embora a estrutura geral da linguagem // | ||
| + | entre diferentes arquiteturas de processamento, | ||
| + | suficientes para que se possa considerar como código não portável. | ||
| + | O código // | ||
| + | para outra, se esta utilizar uma arquitetura diferente. | ||
| + | |||
| + | Para compreender melhor como ocorre esse processo, você pode ler os | ||
| + | seguintes documentos: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Ao compreender o processo de montagem, você já deve ter percebido | ||
| + | as principais vantagens em programar em C no lugar de programar | ||
| + | diretamente em // | ||
| + | |||
| + | * Por ser uma linguagem de alto nível (ao menos comparado a // | ||
| + | * Por ser uma linguagem portável, não será necessário reescrever o programa para cada arquitetura alvo. | ||
| + | |||
| + | Para cada arquitetura de processamento, | ||
| + | Você pode conferir uma lista (não exaustiva) no documento a seguir: | ||
| + | |||
| + | * // | ||
| === Ligação === | === Ligação === | ||
| Linha 677: | Linha 784: | ||
| Perfiladores: | Perfiladores: | ||
| - | * [[https:// | + | |
| + | * [[https:// | ||
| + | | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
prog/guia-de-estudo-c.1772251277.txt.gz · Última modificação: por hrcerq