2025-03-10 08:23:02 -03:00
|
|
|
#+title: Curso Básico da Linguagem C
|
|
|
|
#+subtitle: Aula 1: História
|
|
|
|
#+author: Blau Araujo
|
|
|
|
#+startup: show2levels
|
|
|
|
#+options: toc:3
|
|
|
|
|
|
|
|
* Aula 1: História
|
|
|
|
|
|
|
|
[[https://youtu.be/wqJQL5W9FIw][Vídeo desta aula]]
|
|
|
|
|
2025-03-13 08:49:06 -03:00
|
|
|
** Resumo do vídeo...
|
2025-03-10 08:23:02 -03:00
|
|
|
|
|
|
|
- Ken Thompson cria a linguagem B (1969) para ter uma linguagem de alto nível
|
|
|
|
para reescrever o UNIX.
|
|
|
|
|
|
|
|
- Dennis Ritchie continua aprimorando a linguagem B.
|
|
|
|
|
|
|
|
- Em 1972, a linguagem B está tão diferente que recebe o nome de linguagem C.
|
|
|
|
|
|
|
|
- Em 1978, Brian Kernighan e Dennis Ritchie lançam o livro: /The C Programming
|
|
|
|
Language/, que acaba se tornando a primeira especificação da linguagem.
|
|
|
|
|
|
|
|
- Entre 1983 e 1989, são escritas as primeiras especificações ANSI (ISO/IEC)
|
|
|
|
para a linguagem.
|
|
|
|
|
|
|
|
- Os racunhos de 1987 (C87) são utilizados para escrever a segunda edição do
|
|
|
|
livro, com o nome de /The ANSI C Programming Language/.
|
|
|
|
|
2025-03-13 08:49:06 -03:00
|
|
|
** Conceitos abordados na aula...
|
|
|
|
|
|
|
|
*** O que é um programa de computador?
|
|
|
|
|
|
|
|
Um programa pode ser entendido como uma forma de manipular dados através de
|
|
|
|
instruções para a realização de alguma tarefa.
|
|
|
|
|
|
|
|
*** O que é linguagem de máquina?
|
|
|
|
|
|
|
|
A linguagem de máquina (ou /código de máquina/) é o conjunto de códigos numéricos
|
|
|
|
binários (numeração de base 2) que, transformados em sinais elétricos, irão
|
|
|
|
acionar as operações implementadas na CPU do computador (/OpCodes/).
|
|
|
|
|
|
|
|
*** O que é uma linguagem de programação?
|
|
|
|
|
|
|
|
Uma linguagem de programação é um conjunto de especificações e regras que
|
|
|
|
definem uma forma de escrever programas sem recorrer à escrita direta em /código
|
|
|
|
de máquina/.
|
|
|
|
|
|
|
|
*** O que são linguagens de baixo e alto nível?
|
|
|
|
|
|
|
|
Toda linguagem de programação oferece algum grau de /abstração/ (redução de
|
|
|
|
complexidades) em relação à escrita do /código de máquina/ (que é a única
|
|
|
|
linguagem que a CPU do computador é capaz de interpretar).
|
|
|
|
|
|
|
|
A linguagem Assembly, uma linguagem de baixo nível, oferece basicamente um
|
|
|
|
conjunto de /mnemônicos/ para facilitar a escrita de instruções da CPU (/OpCodes/) e
|
|
|
|
algumas macros e pseudo-instruções para orientar a /montagem/ do arquivo binário
|
|
|
|
do programa.
|
|
|
|
|
|
|
|
Exemplo de programa em Assembly (NASM x86_64) que não faz nada e sai com estado
|
|
|
|
de término =42=.
|
|
|
|
|
|
|
|
#+begin_src asm
|
|
|
|
section .text
|
|
|
|
global _start ; Ponto de entrada do programa
|
|
|
|
|
|
|
|
_start:
|
|
|
|
; Convenção da chamada de sistema 'exit'
|
|
|
|
mov rax, 60 ; Passar o número da chamada de sistema (60 = exit) para RAX.
|
|
|
|
mov rdi, 42 ; Passar o valor do estado de término (42) para RDI
|
|
|
|
syscall ; Chamar o kernel
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
A linguagem C, por sua vez, abstrai procedimentos completos (rotinas) na forma
|
|
|
|
de palavras-chave, funções da biblioteca padrão, estruturas e construções de
|
|
|
|
linguagem, o que faz dela uma linguagem de alto nível.
|
|
|
|
|
|
|
|
Exemplo de programa em C que não faz nada e sai com estado de término =42=.
|
|
|
|
|
|
|
|
#+begin_src c
|
|
|
|
// Ponto de entrada do programa (função 'main')...
|
|
|
|
int main(void) {
|
|
|
|
return 42; // Terminar a função retornando o valor 42...
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** O que é compilação?
|
|
|
|
|
|
|
|
Compilação é o processo de traduzir um código escrito em uma linguagem de alto
|
|
|
|
nível (por exemplo, C) para uma linguagem de montagem (por exemplo, Assembly).
|
|
|
|
|
|
|
|
*** O que são implementações?
|
|
|
|
|
|
|
|
Toda linguagem de programação precisa ser implementada conforme suas
|
|
|
|
especificações.
|
|
|
|
|
|
|
|
Linguagens compiladas, por exemplo, são implementadas através dos seus
|
|
|
|
/compiladores/, enquanto as linguagens interpretadas são implementadas nos seus
|
|
|
|
/interpretadores/.
|
|
|
|
|
|
|
|
No caso da linguagem C, as especificações são implementadas na forma de um
|
|
|
|
/compilador/ (=cc=, nos Unix, e =gcc=, no Projeto GNU) e de uma /biblioteca padrão/
|
|
|
|
(=libc=, nos Unix, e =glibc=, no Projeto GNU).
|
|
|
|
|
|
|
|
*** O que são arquiteturas orientadas a palavras?
|
|
|
|
|
|
|
|
São sistemas computacionais que utilizam quantidades arbitrárias de bits como
|
|
|
|
unidade de tamanho de dados. Exemplo: o PDP-7 utilizava palavras de 18 bits.
|
|
|
|
|
|
|
|
*** O que são arquiteturas orientadas a bytes?
|
|
|
|
|
|
|
|
São sistemas computacionais que utilizam múltiplos de bytes (8 bits) para
|
|
|
|
definir tamanhos de dados. Exemplo: a arquitetura x86_64 utiliza palavras de
|
|
|
|
2 bytes, o que corresponde ao tipo =short int= na linguagem C.
|
|
|
|
|
2025-03-10 08:23:02 -03:00
|
|
|
** Características da linguagem C...
|
|
|
|
|
|
|
|
- Linguagem compilada
|
|
|
|
- De alto nível
|
|
|
|
- De uso geral
|
|
|
|
- Imperativa
|
|
|
|
- Procedural
|
|
|
|
- Estruturada
|
|
|
|
|
|
|
|
** Implementação GNU/Linux...
|
|
|
|
|
|
|
|
*** Compilador:
|
|
|
|
|
|
|
|
- /GNU Compiler Collection/ (=gcc=)
|
|
|
|
|
|
|
|
*** Biblioteca C Padrão:
|
|
|
|
|
|
|
|
- GNU Libc (=glibc=)
|
|
|
|
|
2025-03-10 10:52:59 -03:00
|
|
|
*** Obter a especificação padrão do gcc...
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
:~$ gcc -E -dM -x c /dev/null | grep '__STDC_VERSION__'
|
|
|
|
#define __STDC_VERSION__ 201710L
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
- =-E=: Para a compilação após gerar o código pré-processado.
|
|
|
|
- =-dM=: Filtra todas as diretivas que definem macros.
|
|
|
|
- =-x c=: Especifica a linguagem (no caso, =c=).
|
|
|
|
- =/dev/null=: Compilar o arquivo vazio =/dev/null=.
|
|
|
|
|
2025-03-10 08:23:02 -03:00
|
|
|
** Compilação...
|
|
|
|
|
|
|
|
Transformação do código-fonte em texto do programa para um código binário em
|
|
|
|
linguagem de máquina.
|
|
|
|
|
|
|
|
*** Etapas:
|
|
|
|
|
|
|
|
1 - Pré-processamento:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
gcc -E arquivo.c → Saída padrão
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
2 - Compilação:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
gcc -S arquivo.c → arquivo.s (fonte em assembly)
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
3 - Montagem:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
gcc -c arquivo.c → arquivo.o (objeto binário)
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
4 - Link-edição:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
gcc arquivo.c → a.out (arquivo binário executável)
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
** Exemplo de um programa em C...
|
|
|
|
|
|
|
|
Programa =salve.c=:
|
|
|
|
|
|
|
|
#+begin_src c
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
int main(void) {
|
|
|
|
|
|
|
|
puts("Salve, simpatia!");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
*** Compilação:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
:~/git/cblc/aulas/01-historia$ gcc -o salve salve.c
|
|
|
|
#+end_example
|
|
|
|
|
|
|
|
*** Execução:
|
|
|
|
|
|
|
|
#+begin_example
|
|
|
|
:~/git/cblc/aulas/01-historia$ ./salve
|
|
|
|
Salve, simpatia!
|
|
|
|
#+end_example
|
|
|
|
|