Slackjeff Wiki

Bits que significam

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 [2024/05/15 00:41] – [Inspiração] inclusão do suckless e do signify hrcerqprog:guia-de-estudo-c [2024/12/28 01:05] (atual) – [História] correção ortográfica hrcerq
Linha 67: Linha 67:
  
 O [[https://pt.wikipedia.org/wiki/C_(linguagem_de_programa%C3%A7%C3%A3o)|artigo da Wikipédia]] O [[https://pt.wikipedia.org/wiki/C_(linguagem_de_programa%C3%A7%C3%A3o)|artigo da Wikipédia]]
-também é útil para obter uma visão geral sobreo tema.+também é útil para obter uma visão geral sobre o tema.
  
  
Linha 165: Linha 165:
  
 Agora repita consigo mesmo as seguintes palavras: Agora repita consigo mesmo as seguintes palavras:
-**"Eu não preciso de uma IDE!"**+**"Eu não preciso de IDE!"**
  
 Repita até entender. É importante frisar que um ambiente de Repita até entender. É importante frisar que um ambiente de
Linha 189: Linha 189:
 etapas, notadamente: etapas, notadamente:
  
-  - Pré-processamento +  - [[prog:guia-de-estudo-c#pre-processamento|Pré-processamento]] 
-  - Compilação propriamente +  - [[prog:guia-de-estudo-c#compilacao|Compilação]] propriamente 
-  - Montagem +  - [[prog:guia-de-estudo-c#montagem|Montagem]] 
-  - Ligação+  - [[prog:guia-de-estudo-c#ligacao|Ligação]]
  
 As ferramentas que desempenham essas funções podem ou não estar As ferramentas que desempenham essas funções podem ou não estar
Linha 204: Linha 204:
   * [[https://wiki.inf.ufpr.br/computacao/doku.php?id=c:compiladores|Compiladores]]   * [[https://wiki.inf.ufpr.br/computacao/doku.php?id=c:compiladores|Compiladores]]
   * [[https://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node37.html|Compiladores]]   * [[https://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node37.html|Compiladores]]
 +  * //[[https://www.cs.man.ac.uk/~pjj/farrell/compmain.html|Compiler Basics]]// (inglês)
  
 Existem vários compiladores C, alguns mais conhecidos e populares, Existem vários compiladores C, alguns mais conhecidos e populares,
Linha 221: Linha 222:
 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.
 +
 +=== Pré-processamento ===
 +
 +Ao ler arquivos-fonte C, você talvez tenha reparado que algumas
 +linhas iniciam pelo caractere de jogo-da-velha (''#'') e pensado
 +que essa notação também é parte da linguagem C. Ledo engano.
 +
 +Essas instruções são conhecidas como diretivas de pré-processamento,
 +e são usadas como um complemento da linguagem C para automatizar a
 +geração de partes do código C, antes que ele efetivamente seja
 +compilado (daí o nome "pré-processamento").
 +
 +Por exemplo, as diretivas de inclusão (''#include'') incluem o código
 +de um outro arquivo-fonte C (por convenção, os cabeçalhos, que possuem
 +extensão ''.h''), como se fosse parte do próprio arquivo. Diretivas de
 +definição (''#define'') definem constantes ou macro-processadores, que
 +serão substituídos pelo valor definido em cada ocorrência.
 +
 +Essas substituições são feitas pelo pré-processador. Além disso, ele
 +também substitui //trigrafos// (ignore se não sabe o que são) e
 +substitui comentários por espaços em branco.
 +Tudo isso é feito antes da compilação. O arquivo gerado pelo
 +pré-processamento terá código C, exclusivamente.
 +
 +Você pode saber mais sobre as funções do pré-processador a partir
 +dos documentos a seguir:
 +
 +  * [[https://pt.wikipedia.org/wiki/Pr%C3%A9-processador|Pré-processador]]
 +  * //[[https://en.wikipedia.org/wiki/C_preprocessor|C preprocessor]]// (inglês)
 +
 +Existem diferentes pré-processadores, alguns deles, como foi dito,
 +fazem parte de uma coleção de ferramentas para compilação, como
 +GCC, Clang, TCC e outros, porém também existem pré-processadores
 +avulsos. Alguns exemplos:
 +
 +  * [[https://gcc.gnu.org/onlinedocs/cpp/|GNU CPP]] (parte do GCC)
 +  * [[https://clang.llvm.org/|Clang]] (pré-processador [[https://clang.llvm.org/doxygen/classclang_1_1Preprocessor.html|embutido]])
 +  * [[https://bellard.org/tcc/|TCC]] (pré-processador [[https://repo.or.cz/tinycc.git/blob/HEAD:/tccpp.c|embutido]])
 +  * [[http://mcpp.sourceforge.net|mcpp]]
 +  * [[https://github.com/lpsantil/ucpp|ucpp]]
 +
 +=== Compilação ===
 +
 +=== Montagem ===
 +
 +=== Ligação ===
  
 ==== Biblioteca C ==== ==== Biblioteca C ====
Linha 262: Linha 309:
   * //[[https://www.etalabs.net/compare_libcs.html|Comparison of C/POSIX standard library implementations for Linux]]// (inglês)   * //[[https://www.etalabs.net/compare_libcs.html|Comparison of C/POSIX standard library implementations for Linux]]// (inglês)
  
 +===== Mais bibliotecas =====
 +
 +A biblioteca C é conhecida por ser pequena. Diferente de outros ambientes de desenvolvimento, C não fornece estruturas de dados sofisticadas ou abstrações de protocolos. Em C, partimos da premissa de que você que está programando é quem deve decidir qual implementação utilizar para necessidades mais especializadas.
 +
 +Em alguns casos você pode decidir implementar por conta própria (menos comum), e em outros, pode reutilizar alguma biblioteca existente. Se por um lado, essa característica de C pode parecer pouco prática para um iniciante, por outro lado, isso aumenta drasticamente a portabilidade da linguagem, pois amplia a quantidade de dispositivos capazes de aderir ao padrão da linguagem, além de facilitar a manutenção de implementações da bibliotecas C.
 +
 +Saber quando implementar algo e quando buscar uma implementação pronta, bem como escolher quais bibliotecas você deseja utilizar é uma arte. Não apenas podem existir impeditivos técnicos para usar uma biblioteca em um projeto, como também impeditivos legais, a depender das licenças usadas pelas bibliotecas.
 +
 +Como regra geral, uma grande quantidade de dependências (isto é, bibliotecas que um programa depende para funcionar) não é algo positivo. Quanto menos, melhor. Por outro lado, isso não significa que você deve então implementar do zero tudo o que quiser fazer, pois na prática o resultado pode ser muito pior, se você não souber o que está fazendo.
 +
 +É importante entender que a escolha de bibliotecas pode limitar os dispositivos ou sistemas operacionais compatíveis com o programa. No entanto, isso pode ser uma característica aceitável em muitos casos, dependendo do objetivo do programa. Por exemplo, programas voltados para sistemas aderentes ao padrão [[https://pubs.opengroup.org/onlinepubs/9699919799/mindex.html|POSIX]] podem fazer uso da biblioteca POSIX, pois é esperado que ela esteja presente nesses sistemas.
 +
 +Em relação a C, o padrão POSIX especifica uma biblioteca que inclui as funcionalidades básicas de C (isto é, da biblioteca padrão) e de extensões próprias (redes, interação com o sistema de arquivos, //threads//, etc.). Você pode saber mais sobre o padrão POSIX nos documentos a seguir:
 +
 +  * [[https://pt.wikipedia.org/wiki/POSIX|POSIX]]
 +  * //[[https://en.wikipedia.org/wiki/C_POSIX_library|C POSIX Library]]// (inglês)
 +  * //[[https://pubs.opengroup.org/onlinepubs/9699919799/idx/head.html|Headers]]// (ingês)
 +
 +Não por acaso, algumas bibliotecas C voltadas para esses sistemas (vide [[prog:guia-de-estudo-c#biblioteca_c|seção anterior]]) implementam também a biblioteca POSIX.
 ===== Gerenciadores / Construtores ===== ===== Gerenciadores / Construtores =====
  
Linha 289: Linha 355:
   * [[http://www.crufty.net/help/sjg/bmake.htm|bmake]] (inglês)   * [[http://www.crufty.net/help/sjg/bmake.htm|bmake]] (inglês)
  
 +É desejável, sempre que possível, criar arquivos ''Makefile''
 +portáveis, isto é, que funcionem em diferentes implementações.
 +Isto facilita significativamente a manutenção quando há
 +possibilidade de usar uma implementação diferente.
 +
 +Por exemplo, em distribuições GNU/Linux, é mais comum o uso do
 +GNU Make, muitas vezes já instalado por padrão no sistema. Nos
 +BSDs, o mais comum é a implementação conhecida como ''bmake''.
 +Ao criar scripts ''Makefile'' que podem ser usados em sistemas
 +diferentes, considere aderir totalmente ao padrão POSIX.
 +
 +Isso pode ser um pouco difícil se você já tiver se acostumado
 +a uma implementação específica. O artigo a seguir oferece
 +algumas dicas nesse sentido.
 +
 +  * //[[https://nullprogram.com/blog/2017/08/20/|A Tutorial on Portable Makefiles]]// (inglês)
 ===== Estilos de programação ===== ===== Estilos de programação =====
  
Linha 373: Linha 455:
   * [[http://astyle.sourceforge.net|Artistic Style]] (''astyle'')   * [[http://astyle.sourceforge.net|Artistic Style]] (''astyle'')
   * [[https://clang.llvm.org/docs/ClangFormat.html|ClangFormat]] (''clang-format'')   * [[https://clang.llvm.org/docs/ClangFormat.html|ClangFormat]] (''clang-format'')
 +
 +===== Inspiração =====
 +
 +Parte do estudo de C envolve ler código C já produzido, de programas
 +reais, pois assim você consegue visualizar a aplicação desse
 +conhecimento na prática. Alguns critérios que você pode considerar para
 +decidir quais programas quer estudar:
 +
 +  * Programas pequenos (menos conceitos para compreender e memorizar);
 +  * Programas que você já utiliza (familiaridade com as funções do programa);
 +  * Programas bem documentados;
 +  * Programas com um estilo de código que você se identifica;
 +  * Programas portáveis (para evitar vícios que comprometem a portabilidade).
 +
 +Alguns exemplos que considero particularmente inspiradores:
 +
 +  * [[https://www.sqlite.org/cgi/src/doc/trunk/README.md|SQLite]]
 +  * [[https://lua.org/source/5.2/|Lua (5.2)]]
 +  * [[https://repo.or.cz/w/tinycc.git|Tiny C Compiler (TCC)]]
 +  * [[https://git.musl-libc.org/cgit/musl|Biblioteca C Musl (musl libc)]]
 +  * [[http://git.suckless.org/|Ferramentas Suckless]]
 +  * [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/signify/#dirlist|Signify]]
 +
 +Para bibliotecas, você pode querer começar o estudo pela API, já que
 +será um ponto de partida para o uso delas. A biblioteca do SQLite, por
 +exemplo possui uma excelente documentação, não apenas no próprio
 +código-fonte, mas também alguns manuais de estudo.
 +
 +  * //[[https://sqlite.org/quickstart.html|SQLite in 5 Minutes Or Less]]// (inglês)
 +  * //[[https://sqlite.org/cintro.html|An Introduction To The SQLite C/C++ Interface]]// (inglês)
 +
 +E possui ainda uma descrição em alto nível da sua
 +[[https://sqlite.org/arch.html|arquitetura]] (em inglês).
 +
 +A biblioteca Lua, por sua vez, além de ser reconhecida pelo rigor com a
 +portabilidade, é também bastante enxuta e pequena. O livro
 +[[https://lua.org/pil/|Programming in Lua]] é uma referência
 +//de facto// para o estudo da linguagem e da API C.
 +
 +A primeira edição, embora antiga, permanece válida em muitos pontos
 +e está disponível online. Nela, você consegue uma descrição bem
 +didática de como funciona a [[https://lua.org/pil/24.html|API C]]
 +(em inglês). Detalhes sobre cada função também são apresentados na
 +documentação oficial. A versão 5.2, inclusive, possui uma tradução
 +para português.
 +
 +  * [[https://lua.org/manual/5.2/pt/|Manual de Referência de Lua 5.2]]
 +
 +Uma vez que tenha entendido a API de Lua, você pode em seguida querer
 +ler os arquivos que implementam a biblioteca padrão de Lua, que faz uso
 +dessa API, e é relativamente fácil de entender (especialmente, mas não
 +exclusivamente para quem já usou a linguagem Lua).
 +
 +Já o compilador TCC, embora não possua uma documentação tão detalhada, possui o essencial para compreender como o código está organizado, especialmente na seção 8.
 +
 +  * //[[https://bellard.org/tcc/tcc-doc.html|Tiny C Compiler Reference Documentation]]// (inglês)
 +
 +A biblioteca //musl libc// ainda não possui uma documentação completa, mas é interessante por ser uma biblioteca pequena e ainda assim com um bom custo-benefício. Sua documentação oficial ainda está em construção.
 +
 +  * [[http://musl.libc.org/doc/1.1.24/manual.html|musl]] (inglês)
 +
 +De qualquer modo, conhecendo a estrutura da biblioteca padrão de C (vide especificação de C, que mencionei antes), já é possível explorar o seu repositório com alguma confiança.
 +
 +As ferramentas suckless são conhecidas pelo minimalismo e código limpo. Apesar de não haver muita documentação sobre o código, isso acaba não sendo tão necessário assim, se você souber o que essas ferramentas fazem (o que não é difícil de descobrir, porque elas tendem a fazer apenas uma coisa e bem, seguindo a filosofia UNIX).
 +
 +Uma característica comum em ferramentas desse projeto, como [[http://git.suckless.org/dmenu/files.html|dmenu]] ou [[http://git.suckless.org/st/files.html|st]] é a presença do arquivo ''config.def.h'' que possui uma documentação das opções do programa na forma de comentários. Ao copiar esse arquivo e renomear para ''config.h'', e então editar essas opções, você pode compilar o programa com as opções desejadas.
 +
 +Ainda outro projeto interessante é o //signify//. Você pode saber mais sobre ele neste artigo, do próprio autor:
 +
 +  * //[[https://flak.tedunangst.com/post/signify|signify - sign and verify]]// (inglês).
 +
 +Possui uma base de código bem pequena, e o cerne da funcionalidade está no arquivo [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/usr.bin/signify/signify.c?content-type=text/plain|signify.c]].
  
 ===== Depuração ===== ===== Depuração =====
Linha 480: Linha 634:
 A seguir, você pode conferir algumas ferramentas de análise A seguir, você pode conferir algumas ferramentas de análise
 dinâmica: dinâmica:
 +
 +Teste de cobertura de código:
  
   * [[https://gcc.gnu.org/onlinedocs/gcc/Gcov.html|Gcov]]   * [[https://gcc.gnu.org/onlinedocs/gcc/Gcov.html|Gcov]]
-  * [[https://valgrind.org/|Valgrind]]+  * [[http://simonkagstrom.github.io/kcov/index.html|Kcov]]
  
-===== Inspiração =====+Perfiladores:
  
-Parte do estudo de C envolve ler código C já produzido, de programas +  * [[https://sourceware.org/binutils/docs-2.42/gprof/index.html|GNU Profiler]] (''gprof''
-reais, pois assim você consegue visualizar a aplicação desse +  * [[https://perf.wiki.kernel.org/index.php/Main_Page|Linux Perf]] (''perf'') 
-conhecimento na prática. Alguns critérios que você pode considerar para +  * [[https://valgrind.org/|Valgrind]] 
-decidir quais programas quer estudar: +  * [[https://oprofile.sourceforge.io/news/|OProfile]]
- +
-  * Programas pequenos (menos conceitos para compreender e memorizar); +
-  * Programas que você já utiliza (familiaridade com as funções do programa); +
-  * Programas bem documentados; +
-  * Programas com um estilo de código que você se identifica; +
-  * Programas portáveis (para evitar vícios que comprometem a portabilidade). +
- +
-Alguns exemplos que considero particularmente inspiradores: +
- +
-  * [[https://www.sqlite.org/cgi/src/doc/trunk/README.md|SQLite]] +
-  * [[https://lua.org/source/5.2/|Lua (5.2)]] +
-  * [[https://repo.or.cz/w/tinycc.git|Tiny C Compiler (TCC)]] +
-  * [[https://git.musl-libc.org/cgit/musl|Biblioteca C Musl (musl libc)]] +
-  * [[http://git.suckless.org/|Ferramentas Suckless]] +
-  * [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/signify/#dirlist|signify]] +
- +
-Para bibliotecas, você pode querer começar o estudo pela API, já que +
-será um ponto de partida para o uso delas. A biblioteca do SQLite, por +
-exemplo possui uma excelente documentação, não apenas no próprio +
-código-fonte, mas também alguns manuais de estudo. +
- +
-  * //[[https://sqlite.org/quickstart.html|SQLite in 5 Minutes Or Less]]// (inglês) +
-  * //[[https://sqlite.org/cintro.html|An Introduction To The SQLite C/C++ Interface]]// (inglês)+
  
-E possui ainda uma descrição em alto nível da sua 
-[[https://sqlite.org/arch.html|arquitetura]] (em inglês). 
- 
-A biblioteca Lua, por sua vez, além de ser reconhecida pelo rigor com a 
-portabilidade, é também bastante enxuta e pequena. O livro 
-[[https://lua.org/pil/|Programming in Lua]] é uma referência 
-//de facto// para o estudo da linguagem e da API C. 
- 
-A primeira edição, embora antiga, permanece válida em muitos pontos 
-e está disponível online. Nela, você consegue uma descrição bem 
-didática de como funciona a [[https://lua.org/pil/24.html|API C]] 
-(em inglês). Detalhes sobre cada função também são apresentados na 
-documentação oficial. A versão 5.2, inclusive, possui uma tradução 
-para português. 
- 
-  * [[https://lua.org/manual/5.2/pt/|Manual de Referência de Lua 5.2]] 
- 
-Uma vez que tenha entendido a API de Lua, você pode em seguida querer 
-ler os arquivos que implementam a biblioteca padrão de Lua, que faz uso 
-dessa API, e é relativamente fácil de entender (especialmente, mas não 
-exclusivamente para quem já usou a linguagem Lua). 
- 
-Já o compilador TCC, embora não possua uma documentação tão detalhada, possui o essencial para compreender como o código está organizado, especialmente na seção 8. 
- 
-  * //[[https://bellard.org/tcc/tcc-doc.html|Tiny C Compiler Reference Documentation]]// (inglês) 
- 
-A biblioteca //musl libc// ainda não possui uma documentação completa, mas é interessante por ser uma biblioteca pequena e ainda assim com um bom custo-benefício. Sua documentação oficial ainda está em construção. 
- 
-  * [[http://musl.libc.org/doc/1.1.24/manual.html|musl]] (inglês) 
- 
-De qualquer modo, conhecendo a estrutura da biblioteca padrão de C (vide especificação de C, que mencionei antes), já é possível explorar o seu repositório com alguma confiança. 
- 
-As ferramentas suckless são conhecidas pelo minimalismo e código limpo. Apesar de não haver muita documentação sobre o código, isso acaba não sendo tão necessário assim, se você souber o que essas ferramentas fazem (o que não é difícil de descobrir, porque elas tendem a fazer apenas uma coisa e bem, seguindo a filosofia UNIX). 
- 
-Uma característica comum em ferramentas desse projeto, como [[http://git.suckless.org/dmenu/files.html|dmenu]] ou [[http://git.suckless.org/st/files.html|st]] é a presença do arquivo ''config.def.h'' que possui uma documentação das opções do programa na forma de comentários. Ao copiar esse arquivo e renomear para ''config.h'', e então editar essas opções, você pode compilar o programa com as opções desejadas. 
- 
-Ainda outro projeto interessante é o //signify//. Você pode saber mais sobre ele neste artigo, do próprio autor: 
- 
-  * //[[https://flak.tedunangst.com/post/signify|signify - sign and verify]]// (inglês). 
- 
-Possui uma base de código bem pequena, e o cerne da funcionalidade está no arquivo [[http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/usr.bin/signify/signify.c?content-type=text/plain|signify.c]]. 
prog/guia-de-estudo-c.1715744487.txt.gz · Última modificação: 2024/05/15 00:41 por hrcerq