Академический Документы
Профессиональный Документы
Культура Документы
programao modular
Especificao
Objetivo dessa aula
Mostrar como implementar em C os conceitos de interface
nica, preservando o controle de tipos dos elementos
declarados nas interfaces entre mdulos
2 / 34
Sumrio
Declarao e definio
Pilha de execuo, registro de ativao
Classes de memria
Ligao
Pr-processamento
Padro de programao C para a interface de mdulos
3 / 34
4 / 34
5 / 34
6 / 34
Pilha de execuo
Topo da
pilha de
execuo
Y
X
ret
ant
Funo F
Y
X
ret
ant
Funo F
Funo G
ret
ant
7 / 34
extern int Z ;
somente declara Z como global externo ao mdulo
int G( float X) ;
somente declara a funo do tipo: ( float ) : int
9 / 34
Esttica encapsulada
contm todos os espaos de dados globais encapsulados
(declarados static), e todas as constantes literais definidas no
interior de mdulos
Esttica visvel
contm todos os espaos de dados globais externados
Automtica
contm a pilha de execuo do programa
Dinmica
contm espaos de dados alocados pelo usurio (malloc, new)
10 / 34
bases de dados
segmentos de memria virtual
11 / 34
Ligao
A ligao combina m >= 1 mdulos objeto e mdulos
contidos em uma ou mais bibliotecas, produzindo o
programa carregvel (.EXE, .COM)
No mdulo objeto todos os endereos gerados so
deslocamentos (offsets) relativos a zero dentro da
respectiva classe de memria
O ligador (linker) justape (concatena) os espaos de cada
uma das classes de memria (segmentos: executvel e
esttica) definidos nos mdulos objeto, formando um nico
grande espao para cada classe de memria
O estes dois grandes segmentos constituem o programa
carregvel
12 / 34
M1.OBJ
Dados
estticos
Cdigo
Tab Reloc
Tab Simb
14 / 34
Composio de um executvel
p.exe
cdigo
0
dados estticos
0
m1
10
30
m1
m2
int a
int b
m3
int c
300
m2
b
c
530
Passos
1. concatenar os mdulos objeto
cdigo e dados estticos
2. relocar os endereos do
mdulo de modo que estejam
em conformidade com a
origem na concatenao
3. resolver os nomes externos ao
mdulo definidos em outro
mdulo
m3
15 / 34
Relocao
O ligador ajusta os endereos dos elementos contidos em
cada segmento de modo que passem a ser deslocamentos
relativos origem dos correspondentes segmentos do
programa
A relocao ocorre com relao aos segmentos
cdigo
esttico local e externo
Ao terminar o processamento
para cada smbolo no definido contido na tabela do ligador, emitido
um erro de smbolo no definido
17 / 34
Ligao dinmica
Bibliotecas dinmicas (.dll) so carregadas medida que
forem acessadas durante o processamento
ao encontrar um smbolo externo ainda no resolvido
utiliza a .dll, se j carregada, ou ento carrega ela
substitui a referncia ao smbolo para a referncia funo
Vantagens
uma biblioteca dinmica carregada uma nica vez
considerando todos os programas em execuo simultnea
pode-se trocar uma biblioteca sem precisar recompilar ou
religar todo o programa
19 / 34
Ligao dinmica
Problemas
precisa-se projetar com muito cuidado as bibliotecas
dinmicas, visando explicitamente a possibilidade do seu reso
em diversos programas
as bibliotecas so conhecidas pelo nome, portanto pode ocorrer
coliso de nomes
bibliotecas diferentes com o mesmo nome
20 / 34
Carga de um programa
Para poderem ser executados programas precisam estar em
memria real
fragmentos de um programa executvel podem estar em
qualquer um dos segmentos: executvel, pilha (automtico),
esttico, e dinmico. A origem estar no segmento executvel.
Pr-processamento
Um pr-processador
um processador de linguagem
recebe um arquivo contendo texto fonte e diretivas de prprocessamento
produz um outro arquivo de texto fonte na mesma linguagem
22 / 34
Pr-processamento em C / C++
#include <nome-arquivo>
procura o arquivo no domnio do compilador e o inclui
#include "nome-arquivo"
procura o arquivo no domnio do usurio e o inclui
#undef NomeElem
retira o nome NomeElem da tabela do pr-processador
#pragma
permite informar coisas especficas ao compilador
23 / 34
Pr-processamento em C / C++
#if Expresso
TextoTrue compilado se expresso != 0
#else
TextoFalse compilado se expresso == 0
#endif
#ifdef Nome
ou ao contrrio #ifndef Nome
TextoTrue compilado se Nome estiver definido
#else
TextoFalse compilado se Nome no estiver definido
#endif
Operador de pr-processamento: defined( nome )
Outros: #nome converte nome para string
Pr-processamento em C / C++
#ifdef __linux__
//linux
#elif _WIN32
// windows
#else
//
outro
#endif
25 / 34
Padro de programao C
Ao desenvolver programas em C ou C++ siga o
recomendado no apndice 1 Padro de Composio de
Mdulos C e C++.
Todos os mdulos que podem ser includos devem conter
um controle de compilao nica
mdulo de definio
tabelas de definio
tabelas de dados
#if !defined( Nome-arquivo_MOD )
#define
Nome-arquivo_MOD
/* Comentrio cabealho do arquivo */
Corpo do arquivo
#endif
/* Comentrio fim de arquivo*/
26 / 34
27 / 34
29 / 34
declarao-variavel
#ifdef Nome-arquivo-modulo_OWN
= Inicializao ;
#else
;
#endif
30 / 34
Nome-Arquivo-Modulo_OWN
Exemplo
/* Incluses do compilador /
#include <stdio.h>
/* Incluso do prprio mdulo de definio /
#define
EXEMP_OWN
#include "EXEMP.H"
#undef
EXEMP_OWN
/* Incluso de mdulos de definio de servidores */
#include "Modulo1.H"
#include "Modulo2.H"
#include "Tabela.INC"
. . .
32 / 34
Alternativa ao padro
Embora fora do nosso padro, a seguinte organizao
funciona tambm:
Mdulo de definio (.h ou .hpp)
extern int XX_VarInt ;
33 / 34
34 / 34