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:16] – [Compiladores] detalhamento de compiladores na seção respectiva 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. Duas coleções particularmente |
| - | Clang, por exemplo, fazem esse agrupamento de funções). | + | notórias são: |
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Outra um pouco menos conhecida é a do //Tiny C Compiler// (TCC): | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | E ainda outra é a do //Simple C Compiler// (SCC): | ||
| + | |||
| + | * [[https:// | ||
| === Pré-processamento === | === Pré-processamento === | ||
| Linha 225: | Linha 240: | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * // | * // | ||
| Linha 238: | Linha 255: | ||
| * [[http:// | * [[http:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| === Compilação === | === Compilação === | ||
| Linha 265: | Linha 283: | ||
| * // | * // | ||
| + | |||
| + | * //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. | ||
| Linha 289: | Linha 309: | ||
| * // | * // | ||
| - | Dois compiladores de grande destaque são o [[https:// | + | Dois compiladores de grande destaque são: |
| - | do projeto GNU, e o [[https:// | + | |
| - | infraestrutura de compilação [[https:// | + | * [[https:// |
| + | * [[https:// | ||
| Conhecer ao menos esses dois já será suficiente para compreender as | Conhecer ao menos esses dois já será suficiente para compreender as | ||
| funções centrais desse tipo de ferramenta. | funções centrais desse tipo de ferramenta. | ||
| Linha 315: | Linha 337: | ||
| No caso do compilador Clang, é a máquina virtual LLVM que se encarrega | No caso do compilador Clang, é a máquina virtual LLVM que se encarrega | ||
| de ler a representação intermediária, | de ler a representação intermediária, | ||
| - | o código de montagem. | + | 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 698: | Linha 784: | ||
| Perfiladores: | Perfiladores: | ||
| - | * [[https:// | + | |
| + | * [[https:// | ||
| + | | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
prog/guia-de-estudo-c.1772252188.txt.gz · Última modificação: por hrcerq