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 [2024/05/15 00:41] – [Inspiração] inclusão do suckless e do signify hrcerq | prog:guia-de-estudo-c [2024/12/28 01:05] (atual) – [História] correção ortográfica hrcerq | ||
---|---|---|---|
Linha 67: | Linha 67: | ||
O [[https:// | O [[https:// | ||
- | também é útil para obter uma visão geral sobreo | + | 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: |
- | - Compilação propriamente | + | - [[prog: |
- | - Montagem | + | - [[prog: |
- | - Ligação | + | - [[prog: |
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:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * // | ||
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 (''#'' | ||
+ | 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 " | ||
+ | |||
+ | Por exemplo, as diretivas de inclusão (''# | ||
+ | de um outro arquivo-fonte C (por convenção, | ||
+ | extensão '' | ||
+ | definição (''# | ||
+ | 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 // | ||
+ | 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:// | ||
+ | * // | ||
+ | |||
+ | Existem diferentes pré-processadores, | ||
+ | fazem parte de uma coleção de ferramentas para compilação, | ||
+ | GCC, Clang, TCC e outros, porém também existem pré-processadores | ||
+ | avulsos. Alguns exemplos: | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | === Compilação === | ||
+ | |||
+ | === Montagem === | ||
+ | |||
+ | === Ligação === | ||
==== Biblioteca C ==== | ==== Biblioteca C ==== | ||
Linha 262: | Linha 309: | ||
* // | * // | ||
+ | ===== Mais bibliotecas ===== | ||
+ | |||
+ | A biblioteca C é conhecida por ser pequena. Diferente de outros ambientes de desenvolvimento, | ||
+ | |||
+ | 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:// | ||
+ | |||
+ | 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, // | ||
+ | |||
+ | * [[https:// | ||
+ | * // | ||
+ | * // | ||
+ | |||
+ | Não por acaso, algumas bibliotecas C voltadas para esses sistemas (vide [[prog: | ||
===== Gerenciadores / Construtores ===== | ===== Gerenciadores / Construtores ===== | ||
Linha 289: | Linha 355: | ||
* [[http:// | * [[http:// | ||
+ | É desejável, sempre que possível, criar arquivos '' | ||
+ | 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 '' | ||
+ | Ao criar scripts '' | ||
+ | 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. | ||
+ | |||
+ | * // | ||
===== Estilos de programação ===== | ===== Estilos de programação ===== | ||
Linha 373: | Linha 455: | ||
* [[http:// | * [[http:// | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | ===== 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:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | Para bibliotecas, | ||
+ | será um ponto de partida para o uso delas. A biblioteca do SQLite, por | ||
+ | exemplo possui uma excelente documentação, | ||
+ | código-fonte, | ||
+ | |||
+ | * // | ||
+ | * // | ||
+ | |||
+ | E possui ainda uma descrição em alto nível da sua | ||
+ | [[https:// | ||
+ | |||
+ | A biblioteca Lua, por sua vez, além de ser reconhecida pelo rigor com a | ||
+ | portabilidade, | ||
+ | [[https:// | ||
+ | //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:// | ||
+ | (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:// | ||
+ | |||
+ | 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, | ||
+ | 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. | ||
+ | |||
+ | * // | ||
+ | |||
+ | 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:// | ||
+ | |||
+ | 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:// | ||
+ | |||
+ | Ainda outro projeto interessante é o // | ||
+ | |||
+ | * // | ||
+ | |||
+ | Possui uma base de código bem pequena, e o cerne da funcionalidade está no arquivo [[http:// | ||
===== 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:// | * [[https:// | ||
- | * [[https://valgrind.org/|Valgrind]] | + | * [[http://simonkagstrom.github.io/kcov/ |
- | ===== Inspiração ===== | + | Perfiladores: |
- | Parte do estudo de C envolve ler código C já produzido, de programas | + | |
- | reais, pois assim você consegue visualizar a aplicação desse | + | * [[https://perf.wiki.kernel.org/index.php/Main_Page|Linux 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:// | + | |
- | * [[https://repo.or.cz/ | + | |
- | * [[https:// | + | |
- | * [[http:// | + | |
- | * [[http://cvsweb.openbsd.org/cgi-bin/ | + | |
- | + | ||
- | Para bibliotecas, | + | |
- | será um ponto de partida para o uso delas. A biblioteca do SQLite, por | + | |
- | exemplo possui uma excelente documentação, | + | |
- | código-fonte, | + | |
- | + | ||
- | * //[[https://sqlite.org/ | + | |
- | * // | + | |
- | E possui ainda uma descrição em alto nível da sua | ||
- | [[https:// | ||
- | |||
- | A biblioteca Lua, por sua vez, além de ser reconhecida pelo rigor com a | ||
- | portabilidade, | ||
- | [[https:// | ||
- | //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:// | ||
- | (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:// | ||
- | |||
- | 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, | ||
- | 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. | ||
- | |||
- | * // | ||
- | |||
- | 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:// | ||
- | |||
- | 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:// | ||
- | |||
- | Ainda outro projeto interessante é o // | ||
- | |||
- | * // | ||
- | |||
- | Possui uma base de código bem pequena, e o cerne da funcionalidade está no arquivo [[http:// |
prog/guia-de-estudo-c.1715744487.txt.gz · Última modificação: 2024/05/15 00:41 por hrcerq