Linguagem Programação C
SunRicardo Liyushiro ChikasawaRafael Stoffalette João
C
Linguagem C – LP 2011 2
• 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
Tópicos
Linguagem C – LP 2011 3
• Binding
• Compilador
• Processo de Compilação
• Ligação com Bibliotecas
• Registro de Ativação
• Otimização
• Bibliografia
Tópicos
Linguagem C – LP 2011 4
• 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.
Contexto Histórico
Linguagem C – LP 2011 5
Contexto Histórico
Linguagem C – LP 2011 6
Contexto Histórico
Linguagem C – LP 2011 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áquinas
Linguagem C – LP 2011 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 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 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 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 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;x = 10;
}void func2(void){
int x;x = -199;
}
Variável local
Variável local (não tem Relação com anterior)
Linguagem C – LP 2011 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 globalvoid func1(void);
void main (void) {cont = 100;func1();
}
Linguagem C – LP 2011 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
int x, y;char ch; main (void) {:}
func1() { x = 123; }
// Arquivo 2
extern int x, y;extern char ch;
func22(void) { x = y/10;}
Func23() { y = 10;}
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 16
Operadores
• Operador Lógico
• Operador Aritmético
Linguagem C – LP 2011 17
Tipos de Dados
Linguagem C – LP 2011 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 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 forifim: mov %ebp, %esp /* resultado ja' esta' na pilha! */ pop %ebp ret
Linguagem C – LP 2011 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 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 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 23
Representação de Array
Linguagem C – LP 2011 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 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 26
Alocação de array na Pilha
Linguagem C – LP 2011 27
Structs
Linguagem C – LP 2011 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 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 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 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 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 33
Escopo Estático
• Definição do subprograma
• Tempo de compilação
• Texto do programa
x x x
y
z
w
y
w
x
z
Bloco Monolítico Bloco Não Aninhados Bloco Aninhados
Linguagem C – LP 2011 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 35
Escopo Dinâmico
• Chamada do subprograma
• Tempo de execução
• Fluxo de controle do programa
sub() {
int x=1; sub1() {
escreva(x); } sub2() {
int x=3;sub1();
} sub2(); sub1();
}
•Baixa eficiência•Baixa legibilidade•Problemas Acesso•Menor Confiabilidade
Linguagem C – LP 2011 36
Compilador a = b + c * 3
Análise Léxica
Id1 = id2 + id3 * number
# id info1 a2 b3 c
Tabela de Símbolos
Análise Sintática =
id1 +
Id2 *
id3 Number
teste1.c
Linguagem C – LP 2011 37
Compilador
Análise Semântica
=
id1 +
Id2 *
id3 Number
=
id1 +
Id2 *
id3 Intoreal(3)
Linguagem C – LP 2011 38
Compilador
5/23/11 38
=
id1 +
Id2 *
id3 Intoreal(3)
Geração de CódigoIntermediário
temp1 = intoreal(3)temp2 = id3 * temp1temp3 = id2 + temp2id1 = temp3
Otimização CódigoIntermediário
temp1 = id3 * 3.0id1 = id2 + temp1
Geração Código Alvo
MOV id3, R2MUL #3.0, R2MOV id2, R1ADD R2, R1MOV R1, id1
gcc -fdump-tree-gimple <arquivo.c>
gcc -fdump-tree-optimized <arquivo.c>
Linguagem C – LP 2011 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 40
Código Otimizado
temp1 = id3 * 3.0
id1 = id2 + temp1
gcc -fdump-tree-optimized <arquivo.c>
Linguagem C – LP 2011 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 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 43
Processo de Compilação
pre-processador
Compilador
Assembler
Linker
Programa fonte
Programa fonte“expandido”
Programa Assembly
Objeto
hello.c
hello.i
hello.s
hello.o
Linguagem C – LP 2011 44
pre-processador
Compilador
Assembler
Linker
Programa fonte
Programa fonte“expandido”
Programa Assembly
Objeto
hello.c
hello.i
hello.s
teste.o
Linguagem C – LP 2011 45
pre-processador
Compilador
Assembler
Linker
Programa fonte
Programa fonte“expandido”
Programa Assembly
Objeto
hello.c
hello.i
hello.s
teste.o
Linguagem C – LP 2011 46
pre-processador
Compilador
Assembler
Linker
Programa fonte
Programa fonte“expandido”
Programa Assembly
Objeto
hello.c
hello.i
hello.s
hello.o'
Arquivo .o em LinguagemDe máquina
Visualizar o objeto
Linguagem C – LP 2011 47
pre-processador
Compilador
Assembler
Linker
Programa fonte
Programa fonte“expandido”
Programa Assembly
Objeto
hello.c
hello.i
hello.s
hello.o
Arquivo .o em LinguagemDe máquina
Executável
Linguagem C – LP 2011 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 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 50
Processo de Compilação
• Pré-processador• Macro pode ser também utilizadas passando valor
• -DVAR=VALOR
Linguagem C – LP 2011 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 52
Ligação com Bibliotecas
(cc1,as) (cc1,as)
hello.c bye.c
hello.o bye.o
Linker (id)
p2 libc.so
Loder/Dynamic Linker
libc.so
Executável totalmenteLigado na memória
Informaçõesde relocaçãoe tabela de
símbolo
Executável parcialmenteLigado (em disco)
Linguagem C – LP 2011 53
Ligação com Bibliotecas
(cc1,as) (cc1,as)
hello.c bye.c
hello.o bye.o
Linker (id)
p2 libhello.so
Loder/Dynamic Linker
Executável totalmenteLigado na memória
Informaçõesde relocaçãoe tabela de
símbolo
Executável parcialmenteLigado (em disco)
Linguagem C – LP 2011 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 55
Registro de Ativação
Linguagem C – LP 2011 56
Acesso ao Registro de Ativação
Linguagem C – LP 2011 57
Exemplo de variável local
Linguagem C – LP 2011 58
Outro Exemplo
Linguagem C – LP 2011 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.
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 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 62
Exemplo de Otimização
• -O0 (GCC)
• -O1 (GCC)
• -O2 (GCC)
Linguagem C – LP 2011 63
Exemplo de Otimização
• -O3 (GCC)
• -funroll-loops (GCC)
• -Os (GCC)
Linguagem C – LP 2011 64
Exemplo de Otimização
• -O0 (Intel)
• -O1 (Intel)
• -O2 (Intel)
Linguagem C – LP 2011 65
Exemplo de Otimização
• -O3 (Intel)
• -Os (Intel)
Linguagem C – LP 2011 66
Conclusão do Exemplo
O0 O1 O2 O3 Os0
0,5
1
1,5
2
2,5
3
3,5
4
INTELGCC
Linguagem C – LP 2011 67
Open MP
• Programação Paralela
• Suporta Multi-Plataforma
• Memória Compartilhada
Linguagem C – LP 2011 68
Bibliografia
• http://www.ibm.com/developerworks/br/library/l-gcc4/
• http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
• http://www.redhat.com/magazine/002dec04/features/gcc/#internal-org-gcc
• http://gcc.gnu.org/wiki/HomePage
http://blog.ksplice.com/tag/objdump/
• http://www.inf.pucminas.br/professores/marciocampos/clp/
• http://www.inf.puc-rio.br/~inf1018/2010.2/
• http://www.cse.iitb.ac.in/~uday/courses/cs324-05/gccProjects/node4.html
• http://homepages.dcc.ufmg.br/~fpereira/classes/dcc024/ementa/#lesson13
• http://marcelino.com.sapo.pt/CMan/Chap5.htm
• http://www.inf.pucrs.br/~pinho/PRGSWB/Ponteiros/ponteiros.html
• http://intranet.deei.fct.ualg.pt/PI_flobo/teorica22.html
• http://ces33.wikidot.com/gerenciamento-de-memoria
• www.ceng.metu.edu.tr/courses/ceng242/documents/slides/binding.pdf
• http://en.wikipedia.org/wiki/C_%28programming_language%29
• http://www.cic.unb.br/~pedro/trabs/buffer_overflow.htm
Linguagem C – LP 2011 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
Top Related