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/18 14:39] – Familiarização com outros projetos é anterior a práticas de depuração 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 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 =====
  
prog/guia-de-estudo-c.1716053945.txt.gz · Última modificação: 2024/05/18 14:39 por hrcerq