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