programação orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · programação orientada...

19
1 Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista http://www.gta.ufrj.br/~miguel POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Conceitos Básicos de programação PARTE 1 POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista O que é um Programa Computacional? POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista O que é um Programa Computacional? É um algoritmo expresso em uma linguagem de programação formal onde se conhece... A maneira como representá-lo na linguagem de programação A estrutura de representação dos dados Os tipos e as operações suportados pelo computador POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Como um Programa é Executado? Linguagens de programação São projetadas em função da facilidade na construção do código e da confiabilidade dos programas Quanto mais próximo a linguagem de programação estiver da forma de raciocínio humano, mais intuitivo se torna o programa e mais simples é a programação #include <stdio.h> main() { ENQUANTO condição satisfeita FAÇA execute ação 1; FIM DO ENQUANTO imprimir “Acabou”; } Como um Programa é Executado? Entretanto, computadores não entendem a linguagem humana... Computadores entendem sequências de 0’s e 1’s Chamada de linguagem de máquina POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista 1 0 1 1 0 0 0 1 1 0 ... 0 1 0 1 0 0 1 0 0 1 #include <stdio.h> main() { ENQUANTO condição satisfeita FAÇA execute ação 1; FIM DO ENQUANTO imprimir “Acabou”; } ?

Upload: truongdien

Post on 09-Dec-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

1

Programação Orientada a Objetos para Redes de

Computadores

Prof. Miguel Elias Mitre Campista

http://www.gta.ufrj.br/~miguel

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Conceitos Básicos de programação

PARTE 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

O que é um Programa Computacional?

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

O que é um Programa Computacional?

• É um algoritmo expresso em uma linguagem de programação formal onde se conhece...

– A maneira como representá-lo na linguagem de programação

– A estrutura de representação dos dados

– Os tipos e as operações suportados pelo computador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Como um Programa é Executado?

• Linguagens de programação – São projetadas em função da facilidade na construção

do código e da confiabilidade dos programas

• Quanto mais próximo a linguagem de programação estiver da forma de raciocínio humano, mais intuitivo se torna o programa e mais simples é a programação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

#include <stdio.h>

main() {

ENQUANTO condição satisfeita FAÇA

execute ação 1;

FIM DO ENQUANTO

imprimir “Acabou”;

}

Como um Programa é Executado?

• Entretanto, computadores não entendem a linguagem humana... – Computadores entendem sequências de 0’s e 1’s

• Chamada de linguagem de máquina

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

1 0 1 1 0

0 0 1 1 0

...

0 1 0 1 0

0 1 0 0 1

#include <stdio.h>

main() {

ENQUANTO condição satisfeita FAÇA

execute ação 1;

FIM DO ENQUANTO

imprimir “Acabou”;

}

?

Page 2: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

2

Arquitetura de Computadores em Multiníveis

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Linguagens declarativas

Linguagens de alto nível

Linguagens de montagem (Assembly)

Linguagens de máquina

Nível de abstração

Arquitetura de Computadores em Multiníveis

• Linguagens declarativas – Linguagens expressivas como a linguagem oral

• Expressam o que fazer ao invés de como fazer

• Linguagens de nível alto – Abstraem do programador detalhes da arquitetura do

computador para facilitar a leitura e a compreensão • Processador, memória, dispositivos de entrada e saída etc.

– Possuem características de portabilidade já que podem ser transferidas de uma máquina para outra

– São as linguagens típicas de programação • Exemplos: C++, C, Java, Fortran etc.

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquitetura de Computadores em Multiníveis

• Linguagens de montagem e linguagens de máquina – Linguagens que dependem da arquitetura da máquina

• Linguagem de montagem é uma representação simbólica da linguagem de máquina associada

• Linguagem de máquina – Linguagem de nível baixo

• Depende da arquitetura do processador – Cada processador define uma arquitetura de conjunto de

instruções (Instruction Set Architecture - ISA)

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquitetura de Computadores em Multiníveis

• Existem duas maneiras para decodificar programas – Programa em linguagem de nível alto para programa em

linguagem de nível baixo

• Interpretação

• Tradução

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Interpretação

• Na interpretação cada comando em linguagem de programação de alto nível é decodificado e executado – Processo realizado durante a execução do programa

• Um comando por vez

• Para isso, – Há um programa interpretador sendo executado

• Um interpretador para cada arquitetura de processador

– Cada comando do código é visto por esse interpretador como um dado de entrada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Interpretação

• O computador executa programas auxiliares escritos em linguagem de máquina para interpretar cada comando do programa – Os programas auxiliares são invocados em uma ordem

apropriada de acordo com a ordem de execução do programa

• Etapas da interpretação – Obter o próximo comando

– Examinar e decodificar o comando

– Executar as ações

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 3: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

3

Interpretação

• O computador executa programas auxiliares escritos em linguagem de máquina para interpretar cada comando do programa – Os programas auxiliares são invocados em uma ordem

apropriada de acordo com a ordem de execução do programa

• Etapas da interpretação – Obter o próximo comando

– Examinar e decodificar o comando

– Executar as ações

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ciclo de execução de um programa

Interpretação

• O ciclo de execução de um programa é usado durante o processamento – Operação realizada para processar linguagem de nível

baixo • Ciclo denominado “busca-decodificação-execução”

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Processador busca próxima instrução

Processador

Memória (Instruções + Dados)

Interpretação

• O ciclo de execução de um programa é usado durante o processamento – Operação realizada para processar linguagem de nível

baixo • Ciclo denominado “busca-decodificação-execução”

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Processador decodifica a instrução

Processador

Memória (Instruções + Dados)

Interpretação

• O ciclo de execução de um programa é usado durante o processamento – Operação realizada para processar linguagem de nível

baixo • Ciclo denominado “busca-decodificação-execução”

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Processador

Memória (Instruções + Dados)

Processador busca dados e executa a instrução

Interpretação

• Qual é a relação do ciclo de execução com a interpretação? – O ciclo de execução é realizado em um nível mais baixo

• Com instruções em formato que o processador consegue decodificar

– A interpretação utiliza o mesmo processo de “busca-decodificação-execução” em um nível mais alto

– Portanto, o processo de interpretação é uma abstração em nível alto de um processo de nível baixo

• Considera que a linguagem de alto nível é a própria linguagem de baixo nível

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Tradução

• Programa em linguagem de programação em nível alto é totalmente decodificado em um programa em linguagem de nível baixo – Processo realizado antes da execução do programa

• Processo gera um novo programa • Programa gerado em nível baixo é equivalente ao programa

original em nível alto

• Para isso, – Programa é decodificado em um processo chamado de

compilação • Programa que realiza a compilação é chamado de

compilador • Um compilador para cada arquitetura de processador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 4: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

4

Tradução

• A tradução pode ser dividida em duas grandes partes: – Análise do programa fonte

• Dados de entrada

– Síntese do programa objeto executável

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

#include <stdio.h>

main() {

int n = 3;

IF (n > 5) {

imprimir “n > 5”;

}

IF (n <= 5) {

imprimir “n

<= 5”;

}

}

Compilação

Programa objeto (*.o)

Tradução

• A saída de um processo de compilação consiste em: – Programas objetos (*.o)

• Programas “quase” executáveis • Podem fazer referências a dados externos ou outros

programas

• Ligação – Realizada por um programa ligador – Une diversos programas objetos em um único programa

executável • Um programa em alto nível pode ser composto de diversos

subprogramas ou pode fazer referência a programas externos ou ainda pode utilizar funções definidas em bibliotecas externas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Tradução

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compilação Programa objeto (*.o)

n <= 5

Execução

Programa objeto (*.o)

Programa objeto (*.o)

Programa objeto (*.o)

Programa executável (*.exe)

Ligação

#include <stdio.h>

main() {

int n = 3;

IF (n > 5) {

imprimir “n > 5”;

}

IF (n <= 5) {

imprimir “n

<= 5”;

}

}

#include <stdio.h>

main() {

int n = 3;

IF (n > 5) {

imprimir “n > 5”;

}

IF (n <= 5) {

imprimir “n

<= 5”;

}

}

#include <stdio.h>

main() {

int n = 3;

IF (n > 5) {

imprimir “n > 5”;

}

IF (n <= 5) {

imprimir “n

<= 5”;

}

}

#include <stdio.h>

main() {

int n = 3;

IF (n > 5) {

imprimir “n > 5”;

}

IF (n <= 5) {

imprimir “n

<= 5”;

}

}

Interpretação X Tradução

• Compiladores e interpretadores dependem da arquitetura do processador (ISA) – Intel x86, SPARC, AMD64 etc.

• Os programas interpretados são sempre reinterpretados durante a execução – Independente da arquitetura do processador

• Em compensação, o desempenho pode ser mais baixo pois todos os comandos são interpretados antes de executar

• Os programas compilados não precisam ser sempre recompilados – Torna a execução mais rápida

• Porém, dependente da arquitetura do processador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

• Envolve sempre dois aspectos – Semântica

• Significado

– Sintaxe • Forma

• Utiliza estruturas básicas de controle – Formas naturais de pensar e adequadas à construção de

algoritmos inteligíveis

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Como Escolher uma Linguagem de Programação

Como Escolher uma Linguagem de Programação?

• Envolve sempre dois aspectos – Semântica

• Significado

– Sintaxe • Forma

• Utiliza estruturas básicas de controle – Formas naturais de pensar e adequadas à construção de

algoritmos inteligíveis

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

SE condição satisfeita ENTÃO

execute ação 1

SENÃO

execute ação 2

-Semântica: Condição e desvio

-Sintaxe: Maneira como se representa a condição e o desvio

Page 5: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

5

Como Escolher uma Linguagem de Programação?

• Tipo de problema – Algumas linguagens são mais adaptadas a determinados

tipos de problema do que outras • Entretanto, a evolução de uma linguagem a torna mais

abrangente

• Fatores fora de controle – Super importantes!

• A linguagem escolhida é a mesma do software a ser utilizado ou a mesma que o programador se sente mais à vontade

– Ex.: O NS-3 (Network Simulator 3) é escrito em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Paradigmas de Programação em Alto Nível

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Programação Imperativa

Programação Não-estruturada Programação Estruturada

Programação Procedural Programação Orientada a Objetos

Programação Orientada a Objetos

• Programação imperativa e estruturada, porém... – Enquanto a programação procedural é estruturada em...

• Procedimentos – Estruturas de dados e algoritmos

– A programação orientada a objetos é estruturada em... • Classes e objetos

– Objetos encapsulam estruturas de dados e procedimentos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Programação Orientada a Objetos

• Programação imperativa e estruturada, porém... – Enquanto a programação procedural é estruturada em...

• Procedimentos – Estruturas de dados e algoritmos

– A programação orientada a objetos é estruturada em... • Classes e objetos

– Objetos encapsulam estruturas de dados e procedimentos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

main() {

define_carro();

entra_carro();

sair_carro();

}

main() {

Carro carro;

carro.entrar();

carro.sair();

}

Procedural Orientada a objetos

Por que a Linguagem C?

• Permite o desenvolvimento de programas menores e mais rápidos – Programador possui controle maior sobre o código

• Programador deve: – Definir onde armazenar as variáveis na memória

– Alocar e liberar a memória

– Trabalhar com endereços de memória

– Em compensação, a programação é mais detalhada • Detalhes que não são “preocupações” em linguagens de

mais alto nível como: Linguagens de scripts, Java e C++

• Possui sintaxe simples – Não possui muitas funções embutidas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Por que a Linguagem C++?

• Aumento de exigências de mercado – Reuso de software

• Modularidade, facilidade de modificação

– Rapidez, correção e economia

• Programação em mais alto nível

• Programação orientada a objetos – Objetos: componentes reutilizáveis de software

• Modelam itens do mundo real

– Programas orientados a objetos • Mais fáceis de compreender, corrigir e modificar

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 6: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

6

Estudo de Caso: Linguagem de Programação Java

• Para evitar que todos os programas sejam recompilados para cada arquitetura de processadores – O Java utiliza uma máquina virtual (Java Virtual

Machine - JVM) – Assim, os programas são sempre compilados para a

mesma arquitetura, a arquitetura da JVM • Essa característica torna os programas multiplataformas

– Funcionam para qualquer arquitetura sem precisar de recompilação

• Programa compilado chamado de bytecode – Entretanto, para essa característica ser possível

• Deve existir uma JVM para cada arquitetura – É melhor instalar uma JVM específica e executar qualquer

programa do que ter que recompilar cada um dos programas para cada arquitetura

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Estudo de Caso: Linguagem de Programação Java

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Hardware

JVM

Programa em Java

Compilação

• Processo de conversão de um programa em código fonte textual em código de máquina – Código em C/C++ Sequência de 1’s e 0’s

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compilação: gcc -Wall hello.c –o h

Compilação: g++ -Wall hello.cpp –o h

Programa em C: hello.c

Programa em C++: hello.cpp

Compilação

• Opção: –Wall (Warning all) – Representa uma importante ajuda para detecção de

problemas em C/C++

– Deve ser sempre usada

• Formato das mensagens: – arquivo:número_da_linha:mensagem

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Erro de execução!!!

Compilação de Múltiplos Arquivos

• Programas podem ser divididos em múltiplos arquivos – Simplifica a edição e a compreensão

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc-hello-ex2.c

gcc-hello-ex2.h gcc-ex2.c

Compilação de Múltiplos Arquivos

• Compilação dos arquivos de maneira independente – Opção: -c (Compila arquivo em arquivo objeto)

• Por padrão, nome do arquivo objeto é o mesmo do arquivo fonte, com extensão diferente

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquivos objetos possuem referências a funções externas, mas não possuem ainda o endereço de memória

correspondente que permanece indefinido

Page 7: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

7

Compilação de Múltiplos Arquivos

• Criação de arquivos executáveis – Arquivos objetos são ligados (linked)

• GCC usa o programa ligador ld

– Não há necessidade de usar o –Wall • Opção já deve ter sido usada para compilar os arquivos

fonte e nada mais é alertado

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Processo de ligação preenche os endereços para as funções externas que estavam indefinidos

Compilação de Múltiplos Arquivos

• Recompilação de arquivos fonte – Apenas o arquivo fonte alterado precisa ser

recompilado e o programa deve ser religado • Simplifica a recompilação em casos de programas muito

grandes e com muitos arquivos

• Dispensa a necessidade dos usuários terem todos os arquivos fonte de um mesmo programa

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Makefile

• Especifica um conjunto de regras de compilação – Alvos (executáveis) e suas dependências (arquivos

objeto e arquivos fonte)

• Programa make lê a descrição de um projeto no Makefile – Para cada alvo, o make verifica quando as dependências

foram modificadas pela última vez para determinar se o alvo precisa ser reconstruído

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

alvo: dependências

[TAB] comando

Makefile

• Identação da linha de comando é feita com um TAB • Começa sempre com o primeiro alvo

– Chamado de objetivo padrão (default goal) • Regras implícitas

– Regras definidas por padrão • Exs.: Arquivos “.o” são obtidos de arquivos “.c” através da

compilação Arquivos executáveis são obtidos pela ligação de

arquivos “.o”

– Definidas em termos de variáveis do make • Exs.: CC (compilador C) CFLAGS (opções de compilação em programas em C)

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Atribuição é do tipo VARIÁVEL=VALOR

Makefile

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Se fosse C++, bastaria substituir as variáveis CC para CPP e CFLAGS para

CPPFLAGS

Makefile

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Com dependências

Page 8: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

8

Makefile

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Com alvo “all”

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Com macros

Makefile

Makefile

• Macros especiais – $@

• Nome completo do alvo atual

– $? • Lista de arquivos desatualizados para dependência atual

– $< • Arquivo fonte da única dependência atual

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Makefile

Com macros especiais

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Bibliotecas Externas

• Conjuntos de arquivos objetos pré-compilados – Podem ser ligados aos programas

• Provêem funções ao sistema – Ex.: Função sqrt da biblioteca matemática do C

• Armazenadas em arquivos especiais com extensão “.a” – Referenciados como bibliotecas estáticas – Criados de arquivos objetos com uma ferramenta

chamada GNU archiver, o ar – Encontrados em /usr/lib e /lib

• Ex.: Biblioteca matemática: /usr/lib/libm.a Biblioteca padrão C: /usr/lib/libc.a, contém funções

como o printf e é ligada a todos os programas por padrão

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Bibliotecas Externas

• Arquivo math.h

– Contém os protótipos das funções da biblioteca matemática em /usr/lib/libm.a

• No diretório padrão /usr/include/

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

-lNOME é um atalho para /usr/lib/libNOME.a

Page 9: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

9

Bibliotecas Externas

• Definição das funções deve aparecer primeiro que as funções propriamente ditas – Logo, as bibliotecas devem aparecer depois dos arquivos

fontes ou arquivos objetos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc –Wall –lm gcc-ex3.c –o gcc-ex3

gcc –Wall gcc-ex3.c –lm –o gcc-ex3

X

Opções de Compilação

• Diretórios padrão de arquivos de cabeçalho – /usr/local/include

– /usr/include

• Diretórios padrão de bibliotecas – /usr/local/lib

– /usr/lib

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ordem de busca (precedência)

Ordem de busca (precedência)

Se um arquivo de cabeçalho for encontrado em /usr/local/include, o compilador não busca mais em /usr/include. O mesmo acontece para as bibliotecas.

Opções de Compilação

• Opção –I: – Adiciona novo diretório para o início do caminho de

busca por arquivos de cabeçalho

• Opção –L: – Adiciona novo diretório para o início do caminho de

busca por bibliotecas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Assumindo que o programa utilize um sistema de banco de dados (GNU Database Management - GDBM): gcc –Wall –I/opt/gdbm-1.8.3/include –L/opt/gdbm-1.8.3/lib

gcc-ex4.c -lgdbm

Variáveis de Ambiente

• Ao invés de sempre adicionar os diretórios, pode-se definir variáveis de ambiente – Variáveis podem ser definidas em arquivos do shell

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquivos de cabeçalho: C_INCLUDE_PATH=/opt/gdbm-1.8.3/include

export C_INCLUDE_PATH

Se fosse C++... CPLUS_INCLUDE_PATH=/opt/gdbm-1.8.3/include

export CPLUS_INCLUDE_PATH

Bibliotecas: LIBRARY_PATH=/opt/gdbm-1.8.3/lib

export LIBRARY_PATH

Assim... gcc –Wall gcc-ex4.c –lgbdm –o gcc-ex4

Variáveis de Ambiente

• Para inserir múltiplos diretórios...

• Através das variáveis de ambiente...

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc –Wall –I. –I/opt/gdbm-1.3.8/include –I/net/include –L. –

L/opt/gdbm-1.3.8/lib –L/net/lib gcc-ex4.c –lgdbm –lnet –o

gcc-ex4

C_INCLUDE_PATH=.:/opt/gdbm-1.3.8/include:/net/include

LIBRARY_PATH=.:/opt/gdbm-1.3.8/lib:/net/lib

gcc –Wall gcc-ex4.c –lgbdm -lnet –o gcc-ex4

Bibliotecas Estáticas e Compartilhadas

• Bibliotecas estáticas (arquivos “.a”) – Copia da biblioteca o código de máquina das funções

externas usadas pelo programa • Copia no executável final durante a ligação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 10: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

10

Bibliotecas Estáticas e Compartilhadas

• Bibliotecas compartilhadas (arquivos “.so”) – Arquivo executável final contém apenas uma tabela das

funções que necessita, ao invés de todo código de máquina

• Menor arquivo executável final

– Antes do arquivo executável começar a rodar, o código de máquina das funções externas é copiado para a memória pelo Sistema Operacional

• Transferido do arquivo da biblioteca compartilhada que está em disco

– Processo chamado de ligação dinâmica (dynamic linking)

– No Windows as bibliotecas *.so são as *.dll

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Bibliotecas Estáticas e Compartilhadas

• Bibliotecas compartilhadas (arquivos “.so”) – Uma vez carregadas em memória...

• Podem ser compartilhadas por todos os programas em execução que utilizam a mesma biblioteca

– Por padrão, o gcc busca primeiro a biblioteca compartilhada libNOME.so para depois buscar a libNOME.a

• Ocorre sempre que o a biblioteca –lNOME é adicionada pelo gcc

– Variável de ambiente para bibliotecas compartilhadas são carregadas na LD_LIBRARY_PATH: • LD_LIBRARY_PATH=/opt/gdbm-1.3.8/lib

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Bibliotecas Estáticas e Compartilhadas

• Opção –static: – Força o uso das bibliotecas estáticas

• Pode ser vantajoso para evitar a definição de LD_LIBRARY_PATH

• Outra maneira de forçar o uso de uma determinada biblioteca é colocando o caminho completo...

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc –Wall –static –I/opt/gdbm-1.3.8/include -L/opt/gdbm-

1.3.8/lib gcc-ex4.c –lgdbm –o gcc-ex4

gcc –Wall –I/opt/gdbm-1.3.8/include gcc-ex4.c /opt/gdbm-

1.3.8/lib/libgdbm.a –o gcc-ex4

Compilação em Modo de Depuração

• Arquivo executável – Não contém referências ao código fonte do programa

original • Exs.: nomes de variáveis, número de linhas etc.

– É simplesmente uma sequência de instruções em código de máquina criado pelo compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Como então seria possível fazer depuração se não há como encontrar, de maneira simples, possíveis fontes de erro no

código fonte?

Compilação em Modo de Depuração

• Opção: -g – Opção para depuração

• Armazena informação adicional de depuração em arquivos executáveis e em arquivos objetos

• Depuradores conseguem rastrear erros baseados em informações contidas nos arquivos compilados

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compilação em Modo de Depuração

• Opção: -g – Opção para depuração

• Informações de nomes e linhas de código são armazenadas em tabelas de símbolos contidas nos arquivos compilados

• Quando programa pára de maneira anormal, o compilador gera um arquivo chamado core que combinado com informações do modo de depuração auxiliam na busca da causa do erro

• Informações da linha que provocou o erro e do valor das variáveis

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 11: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

11

Compilação em Modo de Depuração

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Qual é o erro no código ao lado?

Compilação em Modo de Depuração

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compilação em Modo de Depuração

• ulimit -c

– Exibe o tamanho permitido para arquivos do tipo core

• ulimit -c unlimited

– Permite tamanho ilimitado para arquivos do tipo core

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Depurador

• Programa gdb (GNU Debugger) – gdb <arquivo_executável> <arquivo_core>

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

• print <variável>

– Imprime o valor da variável no momento da parada do programa

• trace

– Imprime as chamadas de funções e os valores das variáveis até a parada do programa • Procedimento chamado de backtrace

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 12: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

12

Comandos gdb

• Inserção de breakpoint – Execução do programa pára e retorna o controle para

o depurador • break <função, linha ou posição de memória>

• Execução do programa – Programa começa a execução até encontrar o

breakpoint • run

• Para continuar a execução usar o step ou next

• Comando step mostra a execução de qualquer função chamada na linha (maior nível de detalhes)

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

• Valores de variáveis podem ser corrigidas – set variable <variável> = <valor>

• Após isso o programa executará normalmente mesmo após utilizar o comando step

• finish

– Continua a execução da função até o final, exibindo o valor de retorno encontrado

• continue

– Continua a execução do programa até o final ou até o próximo breakpoint

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

• Programas com loop infinito podem ser também depurados

– Primeiro executa o programa

– Depois inicia o gdb para o programa em execução • attach <pid>: Anexa um determinado programa em

execução ao gdb – Comando “ps x” obtém identificador do processo

• kill: Mata o programa em execução

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Comandos gdb

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

pid do processo

Page 13: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

13

Otimizações

• O GCC é um compilador para fazer otimizações – Possui opções para aumentar a velocidade e reduzir o

tamanho dos executáveis gerados

• Processo de otimização é complexo – Código em alto nível pode ser traduzido em diferentes

combinações de instruções para atingir o mesmo resultado

– Código gerado depende do processador • Ex.: há processadores que oferecem um número maior de

registradores que outros

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Otimização no Código

• Não requer conhecimento da arquitetura do processador – Dois tipos comuns:

• Eliminação de expressão comum (common subexpression elimination)

• Inserção de funções (function inlining)

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Eliminação de Expressão Comum

• Consiste em calcular uma expressão no código fonte com menos instruções – Reusa resultados já calculados

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

x = cos(v)*(1 + sen(u/2)) + sen(w)*(1 - sen(u/2))

Pode ser reescrito, da seguinte maneira... t = sen(u/2)

x = cos(v)*(1 + t) + sen(w)*(1 - t)

Inserção de Funções

• Sempre que uma função é chamada... – CPU armazena os argumentos da função em

registradores e/ou posições de memória apropriados

– Há um pulo para o início da função trazendo as páginas na memória virtual para a memória física ou cache

– Início da execução do código da função

– Retorno ao ponto original de execução após o término da função

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Todo esse procedimento é chamado de sobrecarga de chamada de função que consome tempo de processamento!

Inserção de Funções

• Elimina a sobrecarga de chamada de função – Substitui a chamada pelo próprio código da função

– É mais significativa caso a função chamada seja pequena • Código inserido no programa possui um número menor de

instruções que o necessário para realizar a chamada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo de código cuja sobrecarga da chamada seria comparável ao tempo de execução necessário para realizar uma única multiplicação

double sq (double x) {

return x*x;

}

Inserção de Funções

• Elimina a sobrecarga de chamada de função – Substitui a chamada pelo próprio código da função

– É mais significativa caso a função chamada seja pequena • Código inserido no programa possui um número menor de

instruções que o necessário para realizar a chamada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

E se a função fosse usada dessa maneira???

for (i = 0; i < 10000000; i++) {

sum += sq (i + 0.5);

}

Page 14: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

14

Inserção de Funções

• Elimina a sobrecarga de chamada de função – Substitui a chamada pelo próprio código da função

– É mais significativa caso a função chamada seja pequena • Código inserido no programa possui um número menor de

instruções que o necessário para realizar a chamada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

O procedimento de inserção (inlining) da função resulta no seguinte código otimizado:

for (i = 0; i < 10000000; i++) {

double t = (i + 0.5); //Variável temporária

sum += t*t;

}

Inserção de Funções

• O GCC seleciona funções para serem inseridas – Baseado no tamanho das funções

• Funções também podem ser solicitadas para serem inseridas explicitamente pelo programador – Uso da palavra-chave inline

• Entretanto, compilador verifica se há a possibilidade

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compromisso entre Velocidade e Tamanho

• Algumas opções de otimização podem tornar o código:

– Mais rápido, mas...

– Maior em tamanho

Equivalentemente

– Menor em tamanho, mas...

– Mais lento

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ex.: desenrolamento de laços (loop unrolling)

Desenrolamento de Laços

• Aumenta a velocidade de execução do programa – Elimina a verificação da condição de término do laço em

cada iteração

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

for (i = 0; i < 8; i++) {

y[i] = i;

}

y[0] = 0;

y[1] = 1;

y[2] = 2;

y[3] = 3;

y[4] = 4;

y[5] = 5;

y[6] = 6;

y[7] = 7;

Otimização

Processo de otimização elimina a necessidade de checagem da condição de contorno e ainda permite paralelização das sentenças de atribuição. Entretanto, aumenta o tamanho do arquivo se o número de atribuições

for maior que o tamanho do laço.

Agendamento

• Nível mais baixo de otimização – Compilador determina a melhor ordem das instruções

individuais • Ordem deve ser tal que todas as instruções possuam os

dados necessários antes da execução

• Não aumenta o tamanho do executável – Mas demora mais tempo para compilar devido a maior

complexidade do procedimento

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Níveis de Otimização

• Oferecidos pelo GCC para lidar com: – Tempo de compilação

– Uso de memória

– Compromisso entre velocidade e tamanho do executável

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 15: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

15

Níveis de Otimização

• Escolhidos com uma opção de linha de comando – Formato: -ONÍVEL (Nível pode variar de 0 até 3)

• -O0: GCC não realiza otimizações

• -O1: GCC realiza as formas mais comuns de otimizações que não requerem compromisso entre velocidade e tamanho

• -O2: GCC adiciona otimizações em relação ao 01 que incluem agendamento de instruções

• -O3: GCC adiciona otimizações em relação ao 02 que incluem inserção de funções e procedimentos que aumentam a velocidade mas aumentam o tamanho do código. Por esse motivo, normalmente o O2 se torna a melhor opção

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Níveis de Otimização

• Escolhidos com uma opção de linha de comando – Formato: -ONÍVEL (Nível pode variar de 0 até 3)

• funroll-loops: Independente das anteriores, habilita o desenrolamento de laços

• -Os: GCC seleciona apenas otimizações que reduzem o tamanho do executável para plataformas com restrições de recursos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Níveis de Otimização

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Níveis de Otimização

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

user: tempo de execução do processo em CPU

total: tempo total para a execução do programa incluindo tempo de espera

por CPU sys: tempo esperando chamadas de sistema

Níveis de Otimização

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Os diferentes níveis de otimização permitiram uma queda de tempo de execução de quase 50% (-O0: 8,977s para –O3 – funroll-loops:

4,700s) Em compensação, o tamanho do arquivo executável passou de 6,5k

para 6,8k

Compilação de Programas em C++

• GCC compila códigos fonte em C++ diretamente em código de máquina – Outros compiladores convertem o código primeiro para

C para depois compilar

• Procedimento é o mesmo para compilação em C – Uso do comando g++ ao invés do gcc

• É parte do GNU Compiler Collection, assim como o gcc

• Inclui bibliotecas típicas de C++ – Ex.: iostream ao invés de stdio.h para E/S de dados

• Possui mensagens de warning específicas – -Wall avisa sobre métodos e funções virtuais

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Page 16: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

16

Ferramentas Relacionadas ao Compilador

• Criação de bibliotecas estáticas: ar (GNU archiver)

– Combina uma coleção de arquivos objeto em um único arquivo de biblioteca (arquivo archive)

• Uma biblioteca é uma maneira conveniente de distribuir um número grande de arquivos objetos relacionados em um único arquivo

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

ar <nome_da_biblioteca> <lista_de_arquivos_objeto>

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquivo: gcc-hello-ex2.h

Arquivo: gcc-hello-ex2.c

Arquivo: gcc-bye-ex2.c

Arquivo: gcc-ex2.c

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Opções do ar: cr: create and replace t: table of contents

Ferramentas Relacionadas ao Compilador

• Dependências de bibliotecas compartilhadas: ldd (LD Dependencies) – Verifica quais são e se as bibliotecas compartilhadas

necessárias já foram encontradas • Caso tenham sido, o caminho da biblioteca é apresentado

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

ldd <arquivo_executável>

Ferramentas Relacionadas ao Compilador

• Como criar as bibliotecas compartilhadas (dinâmicas) – Opção –shared

– Outra alternativa: • Opção –Wl: lista opções ao programa ligador separadas

por vírgulas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc –shared –o <biblioteca.so> <lista_arquivos_objetos>

gcc –shared –Wl,-soname,<biblioteca.so.versão> –o

<biblioteca.so.versão_completa> <lista_arquivos_objetos>

Opções do ligador (ld):

-soname: quando um executável é ligado a uma biblioteca compartilhada, o ligador dinâmico tenta ligar o executável com a biblioteca de nome passado com a opção soname e não com a biblioteca com o nome dado com o –o. Isso permite a existência de bibliotecas com nomes e versões diferentes da criada.

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Arquivo: gcc-hello-ex2.h

Arquivo: gcc-hello-ex2.c

Arquivo: gcc-bye-ex2.c

Arquivo: gcc-ex2.c

Page 17: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

17

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ferramentas Relacionadas ao Compilador

• Diferenças entra o uso de bibliotecas dinâmicas e estáticas...

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Tamanho do executável é bem maior ao utilizar bibliotecas estáticas!

Ferramentas Relacionadas ao Compilador

• Medida de desempenho: valgrind

– Conjunto de programas para depurar e avaliar o desempenho do programa

• A ferramenta mais utilizada é a Memcheck para avaliar erros comuns de memória

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

gcc –Wall –g <arquivo.c> -o <arquivo.o>

Programa deve ser compilado em modo de depuração

valgrind --leak-check=yes <arquivo_executável>

A ferramenta Memcheck é usada por padrão. A opção leak-check liga o detector de vazamento de memória

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quais são os problemas desse programa?

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quais são os problemas desse programa?

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ferramentas Relacionadas ao Compilador

Page 18: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

18

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ferramentas Relacionadas ao Compilador

Erro de alocação detectado!

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ferramentas Relacionadas ao Compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ferramentas Relacionadas ao Compilador

Erro de vazamento detectado! O “definitely lost” significa que o programa está realmente vazando memória, se ele tivesse dúvida, colocaria “probably lost”

Processo de Compilação

• Processo com múltiplos estágios – Envolve diferentes ferramentas

• Próprio compilador (gcc ou g++)

• Montador (as)

• Ligador (ld)

– O processo completo ao se invocar o compilador é: • Pré-processamento compilação montagem ligação

– Processo completo pode ser visto com a opção –v

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Processo de Compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Pré-processamento: cpp <arquivo.c> > <arquivo.i>

Processo de Compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Compilação: gcc –Wall –S <arquivo.i>

Page 19: Programação Orientada a - gta.ufrj.brmiguel/docs/progredes/aula1f.pdf · Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista ... •Envolve

19

Processo de Compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Montagem: as <arquivo.s> -o <arquivo.o>

Arquivo .o em linguagem de

máquina

Processo de Compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Ligação: gcc <arquivo.o>

Arquivo .o Executável

Leitura Recomendada

• Capítulo 1 dos livros – Deitel, “C++ How to Program”, 5th edition, Editora Prentice Hall,

2005

– Waldemar Celes, Renato Cerqueira e José Lucas Rangel, "Introdução a Estrutura de Dados com Técnica de Programação em C", Editora Campus-Elsevier, 2004

• Brian Gough, “An Introduction to GCC”, 2nd edition, Network Theory Ltd, 2005

• “GNU `make’”, disponível em http://www.gnu.org/software/make/manual/make.html

• “Static, Shared Dynamic and Loadable Linux Libraries”, disponível em http://www.yolinux.com/TUTORIALS/LibraryArchives-

StaticAndDynamic.html

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista