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/23 03:25] – [Compiladores] mais um link sobre pré-processadores 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 281: | Linha 274: | ||
| O compilador se encarregará das seguintes operações: | O compilador se encarregará das seguintes operações: | ||
| - | * Análise léxica | + | * //Análise léxica//: Fragmenta o código em símbolos, remove partes não essenciais para análises posteriores. |
| - | Separa o código em pequenos fragmentos que podem ser analisados | + | * //Análise sintática//: |
| - | idividulamente, | + | |
| - | para as etapas posteriores. | + | |
| - | * Análise | + | * //Análise |
| - | Verifica a correção do código | + | * //Geração de código |
| - | o respeito às regras formalmente estabelecidas para a escrita | + | |
| - | * Análise semântica | + | * // |
| - | Nessa etapa, o compilador verifica se o código | + | * //Geração de código de montagem//: emitir |
| - | se para além do respeito às regras formais, o significado está correto. | + | |
| - | Isto se aplica aos tipos usados, por exemplo, que podem fazer sentido | + | Enfim, depois |
| - | em alguns tipos de operação mas não em outros, assim como própria | + | Agora é possível converter esse código para o binário que a máquina |
| - | verificação pela existência das variáveis (isto é, se elas foram | + | será capaz de processar. |
| - | declaradas no escopo utilizado e se possuem valor no momento da | + | |
| - | utilização). | + | |
| - | * Geração | + | Os artigos a seguir falam um pouco mais sobre como funciona esse |
| + | processo | ||
| - | Alguns | + | * [[https:// |
| - | montagem. Outros geram uma representação intermediária, | + | * [[https:// |
| - | executada em uma máquina virtual, ou seja, uma representação composta | + | * [[https:// |
| - | por instruções aceitas por uma máquina virtual. | + | * // |
| - | Embora essa etapa não seja obrigatória, ela facilita não apenas a | + | Existem vários compiladores C, alguns mais conhecidos e populares, |
| - | implementação de otimizações para o código gerado, como também pode | + | outros menos. Você não precisa conhecer todos eles agora (e aliás, |
| - | reaproveitar as otimizações para diferentes linguagens de programação. | + | dificilmente em algum momento vai precisar conhecer //todos//), mas é |
| - | Ou seja, uma vez que a linguagem de origem for convertida para essa | + | importante compreender ao menos um pouco essa variedade e quais são os |
| - | representação intermediária, o programa poderá aproveitar todas as | + | pontos fortes e fracos de ao menos alguns deles. |
| - | otimizações que essa máquina virtual oferecer. | + | |
| - | * Otimização | + | A seguir você encontra uma lista contemplando e categorizando alguns |
| + | compiladores C: | ||
| - | O código original pode conter diversas ineficiências que a olho nu | + | * // |
| - | podem ser difíceis de detectar. Importante destacar que a conversão | + | |
| - | para a representação intermediárias não elimina essas ineficiências, | + | |
| - | apenas facilita a sua detecção e correção. | + | |
| - | Portanto, nesta etapa o compilador aplica uma série | + | Dois compiladores |
| - | para detectar trechos de código não alcançável ou redundantes, | + | |
| - | conversão de expressões equivalentes (porém mais eficientes), | + | |
| - | outras medidas que tornarão o código resultante mais eficiente. | + | |
| - | Ainda que não seja possível garantir uma eficiência total por meio | + | * [[https:// |
| - | dessas heurísticas, | + | * [[https:// |
| - | que o original. | + | |
| - | Quando não se usa uma representação intermediária, | + | Conhecer ao menos esses dois já será suficiente para compreender as |
| - | otimizações possíveis é bastante reduzida. | + | funções centrais desse tipo de ferramenta. |
| - | Enfim, depois | + | A propósito, estes dois exemplos (GCC e Clang) usam uma representação |
| - | Agora é possível converter esse código | + | intermediária para, por um lado, ampliar as linguagens suportadas |
| - | será capaz de processar. | + | (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 | ||
| + | (// | ||
| + | Enquanto a parte frontal é responsável por converter | ||
| + | (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, | ||
| + | de ler a representação intermediária, | ||
| + | o código | ||
| + | // | ||
| + | |||
| + | Uma outra opção de infraestrutura de compilação (entenda-se | ||
| + | // | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | Diferente do GCC e do LLVM, sua prioridade é a simplicidade | ||
| + | e capacidade | ||
| + | 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 721: | Linha 784: | ||
| Perfiladores: | Perfiladores: | ||
| - | * [[https:// | + | |
| + | * [[https:// | ||
| + | | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
prog/guia-de-estudo-c.1771817119.txt.gz · Última modificação: por hrcerq