Este documento fornece um resumo da linguagem de programação C. Apresenta seu contexto histórico, características, tipos de dados, estruturas de controle de fluxo e outras construções importantes da linguagem.
Linguagem C - História, Características e Conceitos Básicos
1. C
Linguagem Programação C
Sun
Ricardo Liyushiro Chikasawa
Rafael Stoffalette João
2. Tópicos
• Contexto Histórico
• Critérios de Avaliação
• Características
• Estruturas de um Programa
• Identificadores
• Variáveis
• Operadores
• Tipos de Dados
• Estrutura de Controle de Fluxo
Linguagem C – LP 2011 2
3. Tópicos
• Binding
• Compilador
• Processo de Compilação
• Ligação com Bibliotecas
• Registro de Ativação
• Otimização
• Bibliografia
Linguagem C – LP 2011 3
4. Contexto Histórico
• 3ª Geração : Desenvolvida no início dos
anos 1970
• Derivada BCPL (Linguagem de
Programação Básica Combinada).Anos
depois foi utilizada por Ken Thompson
para desenvolver a B, que se tornaria a
base para a C.
• O sistema operacional UNIX foi
desenvolvido quase inteiramente em C
(tornando-o fácil de portar para diferentes
máquinas). C é “baixo nível”, execução
eficiente e leve.
Linguagem C – LP 2011 4
7. Características
• Desenvolvimento em Unix : em ambientes unix
o uso de C é bastante vantajoso, pois C é o
linguagem oficial em unix, possuindo ferramentas
de desenvolvimento e depuração difíceis de se
encontrar para outras linguagens
• Flexibilidade: C não apresenta limitações
inerentes que impeçam seu uso em quase
qualquer área de aplicação, com quase qualquer
técnica de programação
• Eficiente: a Semântica de C é em muitos
aspectos próximos ao “abaixo nível”, ou seja,
muitas de sua contruções espelham diretamente
aspectos de computadores tradicionais,
permitindo facilmente um uso eficiente dos
recursos da máquinasLP 2011
Linguagem C – 7
8. Características
• Disponibilidade: é provalvemente a linguagem
mais difundida ao mundo , sendo provável que se
encontre pelo menos um compilador C razoável
(que suporte pelo menos a versão padrão da
linguagem e de suas bibliotecas), para qualquer
máquina desejada.
• Portabilidade: programa C são bastante
dependentes da bibliotecas utilizadas e o porte de
um programa C de uma plataforma para outra não
é automático nem necessariamente fácil. Porém é
possível, com mínimo de disciplina e organização
, a escrita de programas facilmente portáveis.
Linguagem C – LP 2011 8
9. Estrutura de um Programa
• Um cabeçalho contendo as diretivas de
compiladores onde se definem o valor de
constantes simbólicas, declaração de variáveis
globais, inclusão de bibliotecas, declaração de
rotinas, etc;
• Um bloco de instruções principal e outros blocos
de rotinas;
• Documentação do programa: comentários
Linguagem C – LP 2011 9
10. Identificadores
• Um identificador deve iniciar por uma letra ou por
um “_” (underscore);
• A partir do segundo caracter pode conter letras,
números e underscore;
• C é uma linguagem case-sensitive (nomes com
letras maiúsculas diferentes de nomes com letras
Minúsculas)
• Palavras reservadas:
Linguagem C – LP 2011 10
11. Variáveis
• Uma variável é uma posição de memória que
pode ser indentificada através de um nome, e é
usada para guardar um valor. O conteúdo de uma
variável pode ser alterado através de um
comando de atribuição.
• Todas as variáveis devem ser declaradas antes
de ser usadas
• Variáveis podem consistir em um ou mais nomes
de identificadores separados por vírgula.
• A declaração de variáveis pode ser feitas dentro
de funções (variáveis locais), na definição de
parâmetros das funções (parâmetros formais) e
fora de todas as funções (variáveis globais)
Linguagem C – LP 2011 11
12. Variáveis
• Escopo de Variáveis
• Variáveis locais:
• são aquelas declaração dentro da função
• Podem ser referênciadas por comandos que estão dentro
do bloco no qual as variáveis foram declaradas.
void func1(void)
{
int x; Variável local
x = 10;
}
void func2(void)
{
int x;
x = -199; Variável local (não tem
}
Relação com anterior)
Linguagem C – LP 2011 12
13. Variáveis
• Escopo de Variáveis
• Globais
• são aquelas reconhecidas pelo programa inteiro.
• Pode ser usado por qualquer pedaço de código e guardam
seus valores durante toda a execução do programa.
#include <stdio.h>
int cont; // Variável global
void func1(void);
void main (void) {
cont = 100;
func1();
}
Linguagem C – LP 2011 13
14. Variáveis
• Classes de Variáveis
• extern
• Especificador extern nas declarações de variáveis diz ao
compilador que os tipos e nomes de variável que o
seguem foram declarados em outro arquivo.
• Deixa o compilador saber o tipo e o nome das variáveis
globais sem realmente criar armazenamento para ela
novamente. Quando o linker unir os módulos, todas as
referências a variáveis externas são resolvidas.
// Arquivo 1 // Arquivo 2
int x, y; extern int x, y;
char ch; extern char ch;
main (void) {
: func22(void) {
} x = y/10;
}
func1() {
x = 123; Func23() {
} y = 10;
} 14
Linguagem C – LP 2011
15. Variáveis
• Classes de Variáveis
• register
• Caracter e inteiros são armazenados nos Registradores da
CPU ao invés da memória, onde as variáveis normais são
armazenados
• Só pode ser aplicado a variáveis locais.
int_pwr(register int m, register int e) // "m" e "e" declaradas como register
porque são usadas num laço
{
register int temp;
temp = 1;
for (; e; e--)
temp = temp * m;
return temp;
}
Linguagem C – LP 2011 15
18. Tamanho de Tipos
• A linguagem C define uma variedade de tipos que
representam inteiros em diferentes intervalos
• O número de bytes alocados depende do tamanho da
palavra da máquina e do compilador
• sizeof (T) retorna o número de bytes usado pelo tipo T
Linguagem C – LP 2011 18
19. Ponto Flutuante
double dot (double a[], double b[], int tam) {
int i;
double res = 0.0;
for (i=tam;i>0;i--)
res += a[i]*b[i];
return res;
}
poderia ser escrita em assembly como: dot: push %ebp
mov %esp, %ebp
mov 8(%ebp), %eax /* endereco de a[0] */
mov 12(%ebp), %edx /* endereco de b[0] */
fldz /* res = 0.0 */
mov 16(%ebp), %ecx /* i = tam */
fori: cmp $0, %ecx
jle fim
fldl (%eax) /* a[i] */
fldl (%edx) /* b[i] */
fmulp /* a[i]*b[i] */
faddp /* res += a[i]*b[i] */
add $8, %eax /* atualiza endereco de a[i] */
add $8, %edx /* atualiza endereco de b[i] */
dec %ecx /* atualiza i */
jmp fori
fim: mov %ebp, %esp /* resultado ja' esta' na pilha! */
pop %ebp
ret
Linguagem C – LP 2011 19
20. Caracteres
• Caracteres (letras e símbolos) são representados
usando-se uma codificação
• Codificação mais comum é a ASCII
• Codificação 8 bits
• Tabela mais completa em : http//www.asciitable.com
Linguagem C – LP 2011 20
21. Tipo Char
• Em C, o tipo char ocupa apenas 1 bytes
• Pode-se manipular um char com um valor
inteiro(int)
char c;
int val;
...
if (c > ‘0’)
...
...
val = c - ‘0’;
...
val = c - ‘a’ + 10;
...
Linguagem C – LP 2011 21
22. Representação de Array
• C usa implementação bastante simples de arrays
• Alocação contínua na memória
• Para um tipo T e uma constante N, a declaração
T a[N] aloca uma região contínua de memória
com NxL bytes, onde L é o tamanho em bytes do
tipo T (sizeof(T))
• sizeof(a) = sizeof (T) * N
• Primeiro elemento (a[0]) corresponde ao menor
endereço de memória
Linguagem C – LP 2011 22
24. Array Multi - dimensionais
• Mesma forma de alocação e acesso ao elementos
• int a[3][2] → a é um array de três elementos
• Cada elementos de a é um array (2 elementos)
• a é um array de array → e a é um ponteiro para um array
• a[i] é um array → e é um ponteiro para inteiros
• Cálculo do endereço de elemento a [i] [j]
Linguagem C – LP 2011 24
25. Alocação de Array Aninhado
• Declaração T A[R][C]
• R linhas, C colunas
• Elemento do tipo T ocupa K bytes
• Tamanho do Array
• R * C * K bytes
• Ordenação por linha
Linguagem C – LP 2011 25
28. Alocação Dinâmica de Memória
int *ptr_a;
ptr_a = malloc(sizeof(int));
ptr_a = 90;
free(ptr_a);
Linguagem C – LP 2011 28
29. Estrutura de Controle de Fluxo
• Comando de Seleção
• Forma do comando if:
• if(<condição>) <comando>
• if(<condição>) <comando> else <comando>
Linguagem C – LP 2011 29
30. Estrutura de Controle de Fluxo
• Comando de Seleção
• Forma do comando switch
• switch( <condição> ) <comando>
• Forma do operador ternário:
• <expressão1> ? <expressão2> : <expressão3>
• Comando de Repetição
• while(<expressão_de_controle>) {<comando>}
• do{<comando>} while {<expressão_de_controle>}
• for(<comad_inic>;<comand_controle>;<comand_passo>)
{<comand>}
Linguagem C – LP 2011 30
31. Estrutura de Controle de Fluxo
• Comando de Desvio
• Linguagem C tem quatro comandos que realizam um
desvio incondicional : return , goto, break.
• return<expressão>
• goto<rótulo>
.
.
<rótulo>
• break:tem duas utilizações, a primeira para terminar um
case em comando switch, ou para forçar o término
imediato de um laço, evitando o teste condicional normal
do laço
• continue: em vez de formar o término, continue força que
a próxima interação do laço, pulando qualquer código
intermediário.
Linguagem C – LP 2011 31
32. Ambiente Binding
• A interpretação de comandos e expressões , tais
como a =5 ou g(a+1), dependem do que denotam
os identificadores utilizados nesses comandos e
expressões.
• Um ambiente é um conjunto de Binding
• Cada binding tem um determinado escopo, isto é ,
a região do programa onde a entidade é visivel.
int a =13;
void f()
{
int b =a;
int a = 2;
b =b+a;
}
Linguagem C – LP 2011 32
33. Escopo Estático
• Definição do subprograma
• Tempo de compilação
• Texto do programa
x x x
y y
w
z
z
w
x
Bloco Monolítico Bloco Não Aninhados Bloco Aninhados
Linguagem C – LP 2011 33
34. Escopo Estático
• Ocultamento de Entidade em Blocos Alinhados
void main()
{
int i=0;
int x=10;
while(i++<100)
{
float x=3.231;
printf(“x=%f n”, x*i);
}
}
Linguagem C – LP 2011 34
35. Escopo Dinâmico
• Chamada do subprograma
• Tempo de execução
• Fluxo de controle do programa
sub()
{
int x=1; •Baixa eficiência
sub1() •Baixa legibilidade
{ •Problemas Acesso
escreva(x); •Menor Confiabilidade
}
sub2()
{
int x=3;
sub1();
}
sub2();
sub1();
} Linguagem C – LP 2011 35
36. Compilador
a=b+c*3
Tabela de Símbolos
Análise Léxica # id info
1 a teste1.c
2 b
Id1 = id2 + id3 * number 3 c
=
Análise Sintática
id1 +
Id2 *
id3 Number
Linguagem C – LP 2011 36
39. Geração de Código Intermediário
• Cada posição de memória é tratada como um
registrador sequências de instruções possuem no
máximo três operandos
• Possui assim um único operador além da
atribuição precedência é resolvida através da
ordem de execução
• Posições temporárias são geradas e usadas para
armazenar valores intermediários.
Linguagem C – LP 2011 39
41. Otimização de Código
• Procurar melhorar o código intermediário gerado
em termos:
• Velocidade de execução
• Quantidade de armazenamento utilizado
• É uma tarefa relativamente complexa que
usualmente toma tempo significativo da
compilação, entretanto algumas otimizações
simples podem memorar muito o tempo de
execução sem retardar demais a compilação.
Linguagem C – LP 2011 41
42. Geração de Código
• Fase final da compilação que produz código
relocável ou assembly
• Posições de memórias são selecionadas para
cada um das variáveis usadas pelo programa
• Um importante aspecto é a atribuição de variáveis
para registradores do processador
• Instruções do código intermediário são traduzidas
em sequências específicas de instruções de
máquinas.
• Alguns compiladores procuram otimizar
novamente o código final gerado
Linguagem C – LP 2011 42
43. Processo de Compilação
hello.c
Programa fonte
hello.i
pre-processador
Programa fonte
“expandido”
hello.s
Compilador
Programa
Assembly
hello.o
Assembler
Objeto
Linker
Linguagem C – LP 2011 43
44. hello.c
Programa fonte
hello.i
pre-processador
Programa fonte
“expandido”
hello.s
Compilador
Programa
Assembly
teste.o
Assembler
Objeto
Linker
Linguagem C – LP 2011 44
45. hello.c
Programa fonte
hello.i
pre-processador
Programa fonte
“expandido”
hello.s
Compilador
Programa
Assembly
teste.o
Assembler
Objeto
Linker
Linguagem C – LP 2011 45
46. hello.c
Programa fonte
hello.i Arquivo .o em
pre-processador
Programa fonte
Linguagem
“expandido” De máquina
hello.s
Compilador
Programa
Assembly
hello.o'
Assembler
Objeto
Linker
Visualizar o objeto
Linguagem C – LP 2011 46
47. hello.c
Arquivo .o em
Programa fonte Linguagem
De máquina
hello.i
pre-processador
Programa fonte
“expandido”
Executável
hello.s
Compilador
Programa
Assembly
hello.o
Assembler
Objeto
Linker
Linguagem C – LP 2011 47
48. Processo de Compilação
• Pré-processador
• No Primeiro Passo, o pré-processador mapea instruções
escritas numa linguagem de alto nível estendida, para
instruções da linguagem de programação original.
• Expande macros em arquivos fontes antes deles serem
compilados
• Quando um macro é definida, o pré-processador insere o
código correspondente até comando #endif
Linguagem C – LP 2011 48
49. Processo de Compilação
• Pré-processador
• Macro pode ser também definidas com o #define no
arquivo fonte ou nos arquivos de cabeçalho
Linguagem C – LP 2011 49
50. Processo de Compilação
• Pré-processador
• Macro pode ser também utilizadas passando valor
• -DVAR=VALOR
Linguagem C – LP 2011 50
51. Processo de Compilação
• Compilador
• Pega código fonte pré-processado e o traduz em
instruções de linguagem de máquina, linguagem que o
computador entende. Estas são guardadas num ficheiro
á parte, chamando arquivo objeto e tem a extesão “.o” .
• Linker
• O arquivo objeto tem as instruções em linguagem
máquina, o computador ainda não pode correr como um
programa. Para isso precisa a combinação do arquivo
objeto com as partes da biblioteca run-time fazendo
finalmente a criação de um ficheiro executável .
Linguagem C – LP 2011 51
52. Ligação com Bibliotecas
hello.c bye.c
(cc1,as) (cc1,as)
libc.so
hello.o bye.o
Informações
de relocação
Linker (id) e tabela de
símbolo
Executável parcialmente
p2 libc.so
Ligado (em disco)
Loder/Dynamic Linker
Executável totalmente
Ligado na memória
Linguagem C – LP 2011 52
53. Ligação com Bibliotecas
hello.c bye.c
(cc1,as) (cc1,as)
hello.o bye.o
Informações
Linker (id) de relocação
e tabela de
símbolo
Executável parcialmente
p2 libhello.so
Ligado (em disco)
Loder/Dynamic Linker
Executável totalmente
Ligado na memória
Linguagem C – LP 2011 53
54. Ligação com Bibliotecas
• Dependências de bibliotecas compartilhadas: ldd
• Verifica quais são e se a bibliotecas compartilhadas
necessárias já foram encontradas
• Caso afirmativo, o caminho da biblioteca é apresentado
– ldd <arquivo_executável>
• Criar as bibliotecas compartilhadas
• -shared
– gcc -shared -o <biblioteca.so> <lista_arq_objetos>
Linguagem C – LP 2011 54
59. Níveis de Otimização
• Oferecidos pelo Gcc e Compilador Intel para lidar
com:
• Tempo de compilação
• Uso de memória
• Compromisso entre velocidade e tamanho do
executável.
• Escolhidos uma opção de linha de comando
• Formato: -ONÍVEL (Nível pode variar de 0 até 3)
• -O0: não realiza otimização
• -O1: realiza as formas mais comuns de otimizações que
não requerem compromisso entre velocidade e tamanho
• -O2: adiciona otimizações em relação ao O1 que incluem
agendamento de instruções
• -O3: adiciona otimizações em relação O2 que incluem
inserção de funções e procedimento que aumentam
velocidade mas aumentam o tamanho do código. 59
Linguagem C – LP 2011
60. Níveis de Otimização
• Escolhidos uma opção de linha de comando
• -funroll-loops: Idependente das anteriores, habilita a
desenrolamento de laços
• -Os: seleciona apenas otimizações que reduzem o
tamanho de executável para plataforma com restrições
de recursos
Linguagem C – LP 2011 60
61. Exemplo de Otimização
O código ao lado será testado
pelo compilador GCC e Intel e o
resultados serão obtidos.
Onde:
User: tempo de execução do
processador em CPU
Total: tempo total para execução do
programa incluindo tempo de espera
por CPU
Sys: tempo esperando chamadas
de sistema
Linguagem C – LP 2011 61
69. Bibliografia
• SEBESTA, Linguagem de Programação, Bookman 5d
• LOUDEN. Compiladores, Princíos e Práticas, Thomson
• GARCIA,R,E. Linguagem de Programação, Apresentação em Sala, Unesp-FCT
• CAMOLESI, Compiladores, Apresentações em Sala, Unesp-FCT
Linguagem C – LP 2011 69