#+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]]

** Resumo do vídeo...

- 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/.

** 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.

** 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=)

*** 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=.

** 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

