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/22 22:27] – [Inspiração] link indisponível, usando snapshot do web archive 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:// | ||
| * // | * // | ||
| Linha 262: | Linha 255: | ||
| * [[http:// | * [[http:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| === Compilação === | === Compilação === | ||
| + | |||
| + | Bem, depois que o pré-processamento está concluído, temos apenas código | ||
| + | C, porém o objetivo final é ter código de máquina. Como chegar lá? A | ||
| + | tradução não é direta (de C para binário). Antes disso, o código C deve | ||
| + | ser convertido para a linguagem de montagem (Assembly) específica da | ||
| + | máquina alvo, ou seja, uma linguagem de montagem capaz de gerar código | ||
| + | binário compatível com a arquitetura de processamento utilizada. | ||
| + | |||
| + | Recapitulando, | ||
| + | de processamento utiliza sua própria linguagem de montagem, e isso é | ||
| + | um dos principais fatores que diferencia C de Assembly. Um programa em | ||
| + | C pode ser compilado para qualquer arquitetura de processamento, | ||
| + | que haja um compilador C para aquela arquitetura. | ||
| + | |||
| + | O compilador se encarregará das seguintes operações: | ||
| + | |||
| + | * //Análise léxica//: Fragmenta o código em símbolos, remove partes não essenciais para análises posteriores. | ||
| + | |||
| + | * //Análise sintática//: | ||
| + | |||
| + | * //Análise semântica//: | ||
| + | |||
| + | * //Geração de código intermediário//: | ||
| + | |||
| + | * // | ||
| + | |||
| + | * //Geração de código de montagem//: emitir o código // | ||
| + | |||
| + | 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 | ||
| + | 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 452: | Linha 590: | ||
| Isso dito, você pode se interessar por algumas das ferramentas a seguir: | Isso dito, você pode se interessar por algumas das ferramentas a seguir: | ||
| - | * [[https:// | + | |
| + | | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| * [[http:// | * [[http:// | ||
| * [[https:// | * [[https:// | ||
| Linha 642: | Linha 784: | ||
| Perfiladores: | Perfiladores: | ||
| - | * [[https:// | + | |
| + | * [[https:// | ||
| + | | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
prog/guia-de-estudo-c.1771799257.txt.gz · Última modificação: por hrcerq