Slackjeff Wiki

Juntando bits aprendemos juntos

Ferramentas do usuário

Ferramentas do site


prog:guia-de-estudo-c

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anteriorRevisão anterior
Próxima revisão
Revisão anterior
prog:guia-de-estudo-c [2026/02/28 04:41] – [Ferramentas de análise dinâmica] informação estava imprecisa hrcerqprog:guia-de-estudo-c [2026/03/02 01:49] (atual) – [Compiladores] palavra repetida removida hrcerq
Linha 193: Linha 193:
   - [[prog:guia-de-estudo-c#montagem|Montagem]]   - [[prog:guia-de-estudo-c#montagem|Montagem]]
   - [[prog:guia-de-estudo-c#ligacao|Ligação]]   - [[prog:guia-de-estudo-c#ligacao|Ligação]]
 +
 +Portanto, o mínimo necessário para compilar programas C são um
 +pré-processador, um compilador, um montador e um ligador, além
 +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 (compiladores mais conhecidos, como GCC e +agrupadas em uma mesma coleção. Duas coleções particularmente 
-Clang, por exemplo, fazem esse agrupamento de funções).+notórias são: 
 + 
 +  * [[https://gcc.gnu.org/|GCC]] + [[https://www.gnu.org/software/binutils/|Binutils]] (do projeto GNU) 
 +  * [[https://clang.llvm.org/|Clang]] + [[https://llvm.org/|LLVM]] 
 + 
 +Outra um pouco menos conhecida é a do //Tiny C Compiler// (TCC): 
 + 
 +  * [[https://bellard.org/tcc/|TCC]] 
 + 
 +E ainda outra é a do //Simple C Compiler// (SCC): 
 + 
 +  * [[https://www.simple-cc.org/|SCC]]
  
 === Pré-processamento === === Pré-processamento ===
Linha 225: Linha 240:
  
   * [[https://pt.wikipedia.org/wiki/Pr%C3%A9-processador|Pré-processador]]   * [[https://pt.wikipedia.org/wiki/Pr%C3%A9-processador|Pré-processador]]
 +  * [[https://wiki.inf.ufpr.br/maziero/doku.php?id=c:o_preprocessador_c|O preprocessador C]]
   * [[https://dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node150.html|O pré-processador C]]   * [[https://dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node150.html|O pré-processador C]]
 +  * [[https://www.ime.usp.br/~pf/algoritmos/apend/preprocessor.html|Pré-processamento]]
   * //[[https://en.wikipedia.org/wiki/C_preprocessor|C preprocessor]]// (inglês)   * //[[https://en.wikipedia.org/wiki/C_preprocessor|C preprocessor]]// (inglês)
  
Linha 238: Linha 255:
   * [[http://mcpp.sourceforge.net|mcpp]]   * [[http://mcpp.sourceforge.net|mcpp]]
   * [[https://github.com/lpsantil/ucpp|ucpp]]   * [[https://github.com/lpsantil/ucpp|ucpp]]
 +  * [[https://www.simple-cc.org/|SCC]] (pré-processador [[https://git.simple-cc.org/scc/file/src/cmd/scc-cc/cc1/cpp.c.html|embutido]] no compilador ''scc-cc'')
  
 === Compilação === === Compilação ===
Linha 335: Linha 353:
  
   * [[https://sr.ht/~mcf/cproc/|cproc]]   * [[https://sr.ht/~mcf/cproc/|cproc]]
-  * [[https://www.simple-cc.org/|SCC]]+  * [[https://www.simple-cc.org/|SCC]] (''scc-cc'')
  
 Por fim, existem compiladores que não utilizam uma representação Por fim, existem compiladores que não utilizam uma representação
-intermediária. Um exemplo interessante é o TinyC Compiler (TCC):+intermediária. Um exemplo interessante é o Tiny C Compiler (TCC):
  
   * [[https://bellard.org/tcc/|TCC]]   * [[https://bellard.org/tcc/|TCC]]
Linha 347: Linha 365:
  
 === Montagem === === Montagem ===
 +
 +Diferentemente de um processo de compilação, que dá ênfase à
 +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 (//assembly//) é mais
 +diretamente equivalente ao resultado (binário).
 +
 +Embora a estrutura geral da linguagem //assembly// possua semelhanças
 +entre diferentes arquiteturas de processamento, existem diferenças
 +suficientes para que se possa considerar como código não portável.
 +O código //assembly// escrito para uma máquina terá de ser reescrito
 +para outra, se esta utilizar uma arquitetura diferente.
 +
 +Para compreender melhor como ocorre esse processo, você pode ler os
 +seguintes documentos:
 +
 +  * [[https://pt.wikipedia.org/wiki/Assembly|Linguagem assembly]]
 +  * [[https://dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node79.html|Montadores]]
 +  * [[https://pt.wikipedia.org/wiki/Linguagem_de_montagem_x86|Linguagem de montagem x86]]
 +  * [[https://dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node107.html|Assembly do 68000]]
 +
 +Ao compreender o processo de montagem, você já deve ter percebido
 +as principais vantagens em programar em C no lugar de programar
 +diretamente em //Assembly//:
 +
 +  * Por ser uma linguagem de alto nível (ao menos comparado a //Assembly//), C permite maior evidenciação sobre o que o programa deve fazer, isto é, é uma linguagem mais expressiva e intuitiva;
 +  * Por ser uma linguagem portável, não será necessário reescrever o programa para cada arquitetura alvo.
 +
 +Para cada arquitetura de processamento, existem diferentes montadores.
 +Você pode conferir uma lista (não exaustiva) no documento a seguir:
 +
 +  * //[[https://en.wikipedia.org/wiki/List_of_assemblers|Comparison of assemblers]]// (em inglês)
  
 === Ligação === === Ligação ===
Linha 728: Linha 785:
  
   * ''gprof'' (existem diferentes implementações)   * ''gprof'' (existem diferentes implementações)
-    * [[https://www.unix.com/man-page/FreeBSD/1/gprof/|BSD]] (originário do 4.2 BSD, presente em sistemas BSDs no geral) +    * [[https://www.unix.com/man-page/FreeBSD/1/gprof/|BSD]] (originário do 4.2BSD, presente em sistemas BSDs no geral) 
-    * [[https://sourceware.org/binutils/docs-2.42/gprof/index.html|GNU]] (uma reimplementação no projeto GNU)+    * [[https://sourceware.org/binutils/docs-2.42/gprof/index.html|GNU]] (uma reimplementação no projeto [[https://www.gnu.org/software/binutils/|GNU Binutils]])
   * [[https://perf.wiki.kernel.org/index.php/Main_Page|Linux Perf]] (''perf'')   * [[https://perf.wiki.kernel.org/index.php/Main_Page|Linux Perf]] (''perf'')
   * [[https://valgrind.org/|Valgrind]]   * [[https://valgrind.org/|Valgrind]]
   * [[https://oprofile.sourceforge.io/news/|OProfile]]   * [[https://oprofile.sourceforge.io/news/|OProfile]]
  
prog/guia-de-estudo-c.1772253675.txt.gz · Última modificação: por hrcerq