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 02:18] – [Gerenciadores / Construtores] menção ao tutorial do pmake hrcerq | prog:guia-de-estudo-c [2025/04/16 14:31] (atual) – edição externa 127.0.0.1 | ||
|---|---|---|---|
| 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 257: | Linha 304: | ||
| biblioteca C em si, mas também a biblioteca POSIX. | biblioteca C em si, mas também a biblioteca POSIX. | ||
| + | O comparativo a seguir também é interessante para compreender os recursos | ||
| + | implementados e características dessas bibliotecas. | ||
| + | |||
| + | * // | ||
| + | |||
| + | ===== 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 284: | 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 318: | Linha 405: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[http:// | ||
| Não se preocupe em decorar essas regras (ao menos não enquanto não | Não se preocupe em decorar essas regras (ao menos não enquanto não | ||
| Linha 367: | 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 474: | 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://lua.org/source/5.2/|Lua (5.2)]] | + | |
| - | * [[https://repo.or.cz/w/ | + | |
| - | * [[https://git.musl-libc.org/cgit/musl|Biblioteca C Musl (musl libc)]] | + | |
| - | 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. | ||
prog/guia-de-estudo-c.1715739495.txt.gz · Última modificação: (edição externa)