Professional Documents
Culture Documents
Qualquer programa precisa ser convertido para linguagem de mquina para ser executado; Tradutor descreve como uma entrada em cdigo-fonte ser traduzido em cdigo de mquina; Basicamente trs mtodos: Compilao Interpretao pura Hbrido
Mtodos de Implementao
Compilao (Cobol, C, Pascal) Transformao de programas de alto nvel em cdigo de mquina; Requer apenas o executvel para execuo; Execuo de programa muito rpida;
Boa parte das verificaes de erro j pode ser feita durante a traduo; Nada precisa ser traduzido
Compilao
Interpretao Pura No existe transformao, os programas so interpretados Execuo de 10 a 100 vezes mais lenta que programas compilados Ocupa mais espao de memria: tabela de smbolos tem que ser carregada na interpretao; Ex.: .BAT
Interpretao Hbrida Meio termo entre compilados e interpretados Traduo de programas em linguagem de alto nvel em linguagem intermediria Visa combinar execuo eficiente com portabilidade Custo de transformao baixo Tempo de execuo razovel Ex.: JAVA
Interpretao Hbrida
Um Modelo de Implementao
Semntica Interpretador Hardware
Pragmtica
Cdigo fonte
Atribuies de uma LP
Reconhecer programas legais e ilegais Gerar cdigo correto Gerenciar armazenamento de cdigo e variveis Informar o usurio sobre problemas com o cdigo
Representao Final RF
Gerao de cdigo
Translao ou parsing
String, sentena, ou palavra uma seqncia de zero ou mais smbolos de um vocabulrio. Ex. 00001001011 uma sentena do vocabulrio 1
Front end
Desta forma o front end de uma LP normalmente composto de dois mdulos. Cdigo fonte scanner ou analisador lxico tokens parser RI
Erros
Analisador Lxico
Cdigo fonte scanner ou analisador lxico tokens parser RI
Erros
A expresso x = x + y; torna-se,
<id,x> = <id,x> + <id,y>;
token
Tokens so a unidade bsica da sintaxe. Exemplos tpicos de tokens so: literal-nmero, identificador, +, -, /,
do, end
Analisador Lxico
L = {w, w = a*b*}
<if> <beginExpr> <id 23> <opLessThan> <literal 0> <endExpr> <then> <beginBlock> <beginStmt> <id 23> <attrb> <id 23> <opPlus> <literal 1> <endStmt> <endBlock>
Parser
Cdigo fonte scanner ou analisador lxico tokens parser RI
Erros
Funo do Parser
Reconhecer a sintaxe livre de contexto formada pelos tokens produzidos pelo analisador lxico para construir as representaes intermedirias para gerao de cdigo objeto. Produzir mensagens de erros teis ao usurio e quando possvel corrigir estes erros. Geradores de parsers podem automatizar boa parte deste trabalho. => YACC, Cup, JavaCC
Gramticas Generativas
Sintaxe livre de contexto so interpretadas por gramticas generativas que determinam as palavras legais de uma linguagem atravs de regras de produo, por exemplo Gramticas BNF (Backus Naur Form)
G = <, N, P, S>, onde: = {a,b}, alfabeto N = {b}, conjunto de smbolos no terminais P = {b ::= ab, b ::= bb, b ::= }, conjunto de regras de produo S = b, smbolo de partida
L(G) a linguagem gerada a partir de G
Exemplo de BNF
Expresses simples sobre nmeros e identificadores:
smbolo de partida <meta> ::= <expr> <expr> ::= <expr><op><expr> | num | id <op> ::= + ||* |/ no terminais
terminais
regra 1: <meta> regra 2: <expr> regra 4: <expr> <op> <expr> regra 6: <expr> <op> <id,y> regra 1: <expr> - <id,y> regra 3: <expr> <op> <expr> - <id,y> regra 5: <expr> <op> <num,2> - <id,y> regra 4: <expr> + <num,2> - <id,y> final: <id, x> + <num,2> - <id,y>
rvore de Parsing
meta
expr
expr
op
expr
expr op expr
<id,y>
<id,x>
<num,2>
Problema da Precedncia
meta
expr
expr
op
expr
op
expr
<id,y>
<id,x>
<num,2>
Uma avaliao desta rvore produzir (x+2)*y. Isto est errado. Nossa gramtica no tem a noo de precedncia na avaliao das regras de produo. A precedncia deve ser embutida na prpria gramtica. Considere esta outra gramtica ...
Solucionando o Problema
1) <meta> ::= <expr> 2) <expr> ::= <expr><op><expr> 3) | num 4) | id 5) <op> ::= + 6) |7) |* 8) |/ 1) <meta> 2) <expr> 3) 4) 5) <termo> 6) 7) 8) <fator> 9) ::= ::= | | ::= | | ::= | <expr> <expr> + <termo> <expr> - <termo> <termo> <termo> * <fator> <termo> / <fator> <fator> num id
A gramtica fora a precedncia pois termos derivados de expresses multiplicativas so sempre derivados de expresses de soma e subtrao.
Problema da Ambigidade
Quando uma gramtica tem mais de uma derivao para uma forma sentencial h um problema de ambigidade. Considere o clssico problema do if:
(A) <stmt> ::= if <expr> then <stmt> (B) | if <expr> then <stmt> else <stmt> (C) | outras declaraes
Considere a forma setencial if E1 then if E2 then S1 else S2. Esta FS tem duas derivaes: (A)(B) e (B)(A). A correta seria a primeira pois normalmente o else casa com o then mais prximo.
Solucionando o Problema
Como no caso da precedncia, a ambigidade deve ser resolvida pela prpria gramtica.
A) <stmt> B) C) <casado> D) E) <solto> F) ::= <casado> | <solto> ::= if <expr> then <casado> else <casado> | outras declaraes ::= if <expr> then <stmt> | if <expr> then <casado> else <solto>
Esta gramtica gera a mesma linguagem da anterior mas sempre "casa" cada else com o then mais prximo.
gramtica
parser
RI
Exemplo YACC
file : program | module ; program : program_heading semicolon block DOT ; program_heading : PROGRAM identifier | PROGRAM identifier LPAREN identifier_list RPAREN ; identifier_list : identifier_list comma identifier | identifier ; block : label_declaration_part constant_definition_part type_definition_part variable_declaration_part procedure_and_function_declaration_part statement_part ;
Exemplo de trecho de um arquivo YACC para a linguagem Pascal. Arquivo completo est no FTP do curso.
void IfStatement(): /* * The disambiguating algorithm of JavaCC * else's to the innermost if statement. * is to tell JavaCC that we know what we */ {} { "if" "(" Expression() ")" Statement() [ ] }
Exemplo JavaCC
automatically binds dangling The LOOKAHEAD specification are doing.
void WhileStatement(): {} { "while" "(" Expression() ")" Statement() } void DoStatement(): {} { "do" Statement() "while" "(" Expression() ")" ";" }
Tipos de Parsers
Top-down (de cima para baixo):
comea na raiz da rvore de derivao pega uma produo e tenta encaixar ela a entrada (tokens) pode requerer backtracking
Discusso de tcnicas de Parsing esto fora o escopo deste curso. Este um assunto extenso e algo complexo.
Descrio destas tcnicas podem ser encontradas em qualquer bom livro de compiladores.
Pragmtica
Cdigo fonte
O identificador X est associado com uma varivel escalar, um arranjo, ou uma funo? X declarado antes de ser usado? Esta referncia se refere a qual declarao de X? Aonde X pode ser armazenado? Esta expresso tem tipo consistente? A referncia de um arranjo est dentro das dimenses?
Solues
Existem vrias solues para anlises semnticas: Simplificar a linguagem para evitar problemas Usar rvores abstratas de sintaxe com avaliadores automticos e especificao de computao no local.
Usar uma tabela de smbolos como armazenador central de fatos e para checar o cdigo de forma expressa.
Ns vamos nos concentrar em discutir a ltima opo ...
Tabelas de Smbolos
Tabelas de smbolos associam nomes lxicos com os seus atributos. Dentre os itens entrados em uma tabela de smbolos esto: variveis, constantes, procedimentos, funes, strings, labels, variveis temporrias geradas durante a compilao.
Introduo
As linguagens de programao imperativas so baseadas na arquitetura de Von Neumann:
As abstraes para as clulas de memria so as variveis. Os espaos de memria que so usados pelas variveis so diferentes, de acordo com a especificao do tipo da varivel, que representa a propriedade mais importante da varivel.
Variveis
Abstrao de uma clula ou conjunto de clulas de memria do computador Para os programadores, variveis so nomes para posies de memria Uma varivel um objeto que contm um valor que pode ser inspecionado e atualizado Podem ser caracterizadas com seis atributos:
nome, endereo, valor, tipo, tempo de vida e escopo
Variveis
Duas classes de variveis:
transientes: Varivel Transiente
abstrao de uma clula ou conjunto de clulas de memria n ? var n:integer; atualizadas atravs de atribuio begin persistentes: arquivos e bancos n 0 n:=0;
de dados
n 1
n:=n+1; ...
Variveis Compostas
Uma varivel de um tipo composto uma varivel constituda de outras variveis mais simples, chamadas de componentes As componentes de uma varivel composta podem ser inspecionadas e atualizadas seletivamente
type data = record
? ?
dia mes
data
Palavra reservada
independente de contexto e no pode ser usada como um nome
Valor-l:
o primeiro n denota a clula de memria. Em termos de implementao, o valor-l um endereo de memria
Valor-r:
o segundo n denota o contedo da clula
Tipo:
Determina a faixa de valores que ela pode ter e o conjunto de operaes definidas para os valores do tipo
O Conceito de Vinculao
Uma vinculao (amarrao ou binding) uma associao entre entidades de programao
Varivel e valor Identificador e tipo
Uma declarao produz um vnculo, uma associao entre um identificador e a entidade que ele ir denotar
Dinmica:
Ocorre durante a execuo ou modificada durante a execuo do programa.
Vinculao de Tipos
Restringem o grau de liberdade dos programadores. Por que so necessrios os tipos?
Previnem que os programas faam operaes que no tm sentido (Checagem de Tipos) Programas mais confiveis e eficientes Tipos documentam os programas
Vinculao de Tipos
Caracterizado por assegurar que operandos de um operador sejam tipos compatveis. Um tipo compatvel o mesmo do operador ou com permisso da linguagem, para ser convertido em tipo compatvel. Essa converso automtica a coero Um erro de tipo a aplicao de um operador a um tipo no compatvel.
Vinculao de Tipos
Se as vinculaes de variveis de uma linguagem forem estticas, a verificao de tipos poder ser esttica. A vinculao dinmica de tipos requer a verificao de tipo em tempo de execuo.
Vinculao de Tipos
Linguagens estaticamente tipadas
Predominam as checagem estticas Toda varivel e parmetro tem tipo fixo, escolhido pelo programador Os tipos das expresses podem ser deduzidos, e portanto checados, na compilao Programas mais eficientes Erros so descobertos mais cedo Flexibilidade reduzida para o programador
Vinculao de Tipos
Linguagens dinamicamente tipadas
Somente os valores tm tipo fixo Variveis podem ter tipos diferentes em tempos diferentes e portanto no se sabe o tipo de uma expresso no momento da compilao Maior flexibilidade Programas menos eficientes Suscetvel a erros (programas menos confiveis) Geralmente, linguagens interpretadas
Tipificao Forte
Uma linguagem fortemente tipificada se erros de tipo sempre forem detectados. Cada nome em um programa tem um nico tipo associado a ele; e conhecido na compilao Coero: enfraquece o valor da checagem de tipos Linguagens fortemente tipificadas:
ML e Java
Vinculao de Tipos
Antes que uma varivel possa ser referenciada, ela deve ser vinculada a um tipo de dados. Esta vinculao (esttica) pode ser atravs de:
Declarao explcita:
Especificado os nomes da variveis e os seus tipos.
Declarao Implcita:
No especificado o tipo da varivel, ele atribudo atravs de convenes pr-estabelecidas pela LP. Exemplo: se nome iniciar com i,j,k,l,m,n ser implicitamente declarado como integer, caso contrrio ser tipo real FORTRAN
Desvantagens:
Capacidade de deteco de erros pelo compilador diminuda; Custo elevado para implementao;
Compatibilidade de Tipos
Quando duas variveis so de tipos compatveis, qualquer uma delas pode ter seu valor atribudo outra. Existem dois mtodos diferentes de compatibilidade de tipos:
Compatibilidade de Nome Compatibilidade de Estrutura
Compatibilidade de Tipos
Compatibilidade de Nome:
Variveis tm tipos compatveis somente se estiverem na mesma declarao ou em declaraes que usam mesmo nome de tipo
Compatibilidade de Nome
Exemplo:
type lista = 1..20; var count : integer; index : lista; aux : integer; ... ... count := index; (no so compatveis por nome) count := aux; (so compatveis por nome)
Compatibilidade de Tipos
Compatibilidade de Estrutura:
Variveis tm tipos compatveis se os seus tipos tiverem estruturas idnticas
Caractersticas:
mais flexvel mais difcil de implementar
Desalocao
Processo desvincular e devolver a clula de memria ao pool de memria disponvel
Varivel local: declarada dentro de um bloco para ser usada somente dentro dele
Vinculaes de armazenamento criadas na instruo de declarao, mas cujos tipos so estaticamente vinculados.
Ex.: C, C++ (padro de variveis).
Variveis Stack-Dinmicas
program P; var x : ...; procedure R; var z : ...; begin ... end; procedure Q; var y : ...; begin ... R ... end; begin ... Q ... R ... end.
incio Q
incio R
incio R
incio P
fim Q
fim R
fim R z
fim P
Flexibilidade para construir estruturas de dados dinmicas (listas, rvores, grafos, etc) Insegurana (confiabilidade) - ponteiros so suscetveis a falhas e podem produzir efeitos obscuros
Ponteiros pendentes Vazamento de memria Compartilhamento
Escopo
O escopo de uma varivel, representa a qual rea do programa ela visvel. Uma varivel visvel em uma instruo, se ela puder ser referenciada nessa instruo. Um bloco uma frase de programa que delimita o escopo das declaraes que ele contm Em Pascal
s inclui blocos baseados em procedimentos e funes funes e procedimentos podem ser aninhados
Escopo
Em C, C++ e Java
blocos no so baseados em procedimentos e funes
Estruturas de Bloco
Estrutura Monoltica (Cobol antigo) declarao de x
declarao de x
declarao de y
Estrutura Plana (Fortran) declarao de z
declarao de x declarao de y
Escopo e Visibilidade
O que acontece se um identificador declarado em dois blocos aninhados?
a declarao do bloco mais interno esconde a declarao do bloco mais externo
Escopo Esttico
O escopo de uma varivel pode ser determinado estaticamente (antes da execuo) Quando uma referncia a uma varivel encontrada pelo compilador de uma linguagem de escopo esttico, os atributos da varivel so determinados localizando-se as instrues nas quais ela declarada.
begin
x := 10;
end;
procedure sub2; var x: integer;
begin
x := 35;
end;
A referncia varivel em sub1 ao x declarado no procedimento big. A referncia varivel em sub2 ao x declarado no procedimento sub2.
Escopo Dinmico
O escopo dinmico baseia-se na seqncia de chamadas de subprogramas e pode ser determinado somente em tempo de execuo. LISP e SMALLTALK
Diferentes seqncias de chamada: big chama sub2 que chama sub1: a referncia a x em sub1 ao x declarado em sub2. big chama sub1: a referncia a x em sub1 ao x declarado em big.
begin end;
x := 10;
begin end;
sub1();
Ambientes de Referenciamento
O ambiente de referenciamento de uma instruo o conjunto de todos os nomes visveis na instruo. No escopo esttico, o ambiente de referenciamento constitudo de todas as variveis declaradas em seu escopo local mais o conjunto de todas as variveis de seus escopos ancestrais visveis.
Ambientes de Referenciamento
No exemplo ao lado, os ambientes de referenciamento em cada ponto do programa: (1): x e y de sub1 e a e b de exemplo + sub1 e sub2. (2): x de sub3 e a e b de exemplo + sub3, sub1 e sub2. (3): x de sub2 e a e b de exemplo + sub3, sub1 e sub2. (4): a e b de exemplo + sub1 e sub2
program exemplo; var a,b: integer; procedure sub1; var x,y: integer begin (1) end; procedure sub2; var x: integer procedure sub3; var x: integer begin (2) end; begin (3) end; begin (4) end;
Constantes Nomeadas
Uma constante nomeada uma varivel vinculada a um valor somente no momento em que ela vinculada a um armazenamento. Seu valor no pode ser mudado. Ajudam na legibilidade e confiabilidade do programa.
Inicializao de Variveis
A vinculao de uma varivel a um valor no momento em que ela vinculada ao armazenamento chamada inicializao. Exemplos:
Fortran:
REAL PI INTEGER SOMA DATA SOMA /0/, PI /3,14159/
Ada:
SOMA: INTEGER : = 0;
Pascal no oferece meios de se inicializar variveis, exceto durante a execuo das instrues de atribuio.
String esttica
Tamanho
Endereo
Tamanho mximo
Tamanho atual Endereo
Alocao
Estticas e dinmicas limitadas no exigem alocao dinmica de memria Dinmicas limitadas
Alocao de memria suficiente para o tamanho mximo no momento da vinculao Tamanho mximo determinado em tempo de compilao
Dinmicas
Tamanho cresce e reduz dinamicamente
Tipos Ordinais
Faixa de valores possveis pode ser facilmente associado com o conjunto de inteiros positivos Usurio pode definir de dois tipos Enumeraes e Subfaixas Tipos Enumerados (Pascal, C)
Usurio enumera valores possveis Ex: type DIAS is (Seg, Ter, Qua, Qui, Sex, Sab, Dom) Auxiliam a legibilidade e a confiabilidade
Tipos Ordinais
Tipos Subfaixa
Uma (sub)seqncia ordenada e contgua de um tipo ordinal Pascal: type pos = 0..MAXINT Auxiliam a legibilidade Confiabilidade aumentada
Produto Cartesiano
Tipo Composto: criado a partir de tipos mais simples Combinao de tipos diferentes em tuplas
Registros do Pascal, Ada e Cobol. Estruturas de C
Questes de Projeto
Registros
Qual a forma das referncias? Quais operadores unitrios so definidos? COBOL usa nmero de nveis, outras usam simplesmente declaraes aninhadas Cobol: OF Notao com ponto (.) With do Pascal
Sintaxe de Definio
Referncia a campos:
Registros
Operaes em Registros
Arranjos
Agregado homogneo de elementos, cada um identificado pela posio relativa ao primeiro Questes de Projeto
Quais tipos so legais para ndices? As expresses nos ndices de uma faixa de elementos so verificadas? Em que momento os ndices sofrem binding? Quando a alocao se d? Qual o nmero mximo de ndices? Um objeto array pode ser inicializado? O fatiamento de um array permitido?
Arranjos
Indexao um mapeamento de ndices em elementos
mapeia(array_name, index_value) elemento
Sintaxe:
Maioria das LPs usa colchetes
Tipos de ndice:
C: somente int Pascal: qualquer tipo ordinal (int, char, etc) Java: somente integer
Arranjos
Categorias de Arranjos
Esttico
faixa de ndices e armazenamento so estticos Vantagem: eficincia na execuo
Stack-Dinmico Fixo
faixa de ndice sofre binding esttico, mas armazenamento sofre binding em tempo de execuo Vantagem: eficincia de espao
Stack-Dinmico
binding de faixa de ndice e de armazenamento dinmicos, mas fixos a partir de l pelo tempo de vida da varivel
Arranjos
Categorias de Arranjos Em Ada, stack-dinmicos:
GET(List_Len); declare List : array (1..List_Len) of INTEGER; begin ... end;
Arranjos
Categorias de Arranjos
Heap-Dinmico
Bindings de faixa de ndices e de armazenamento so dinmicos e no fixados Podem crescer e reduzir durante a execuo.
Arranjos
Nmero de ndices:
C, C++ e java: permitem somente um, mas elementos podem tambm ser Arranjos
Inicializao de Arranjos
Usualmente s uma lista de valores que so colocados no array na ordem na qual os elementos do array esto armazenados Algumas linguagens no permitem inicializao
Arranjos
Operaes com Arranjos
aquela onde o array opera como uma unidade
Ponteiros
Surgiu da necessidade de se alocar memria de acordo com as demandas dinmicas do programa A faixa de valores consiste de endereos de memria e um valor especial: null (nil) Uso:
Flexiblidade no endereamento Gerenciamento do armazenamento dinmico(heap)
Ponteiros
Problemas com Ponteiros
Ponteiros soltos (perigoso)
Um ponteiro aponta para uma varivel heap-dinmica que foi desalocada Criando um ponteiro Alocar uma varivel heap-dinmica e setar um ponteiro apontando para ela Setando um segundo ponteiro para valor do primeiro Desalocando a varivel heap-dynamic variable, usando o primeiro ponteiro
Ponteiros
Problemas com Ponteiros
Variveis heap-dinmicas perdidas (desperdcio)
Uma varivel heap-dinmica que no a mais referenciado por qualquer ponteiro Criando uma: O ponteiro p1 setado para uma varivel heap-dinmica recm criada p1 , posteriormente, levado a apontar para outra varivel heapdinmica recm criada O processo de perder variveis heap-dinmicas chamado de vazamento de memria
Ponteiros
Ponteiros no Pascal
Usado apenas para gerenciamento do armazenamento dinmico Dereferncia explcita (new x dispose) Objetos soltos so tambm possveis
Ponteiros
C e C++
Usados para gerenciamento de armazenamento dinmico e endereamento Tipo de domnio no necessita ser fixado (void *) Aritmtica e ponteiros em C - Exemplo
float stuff[100]; float *p; p = stuff; *(p+5) equivalente a stuff[5] *(p+i) equivalente a stuff[i]
Ponteiros
Java
Sem aritmtica de ponteiros Pode somente apontar a objetos (todos heap) Sem desalocador explcito (GC usado)
Ponteiros
Avaliao
Ponteiros e objetos soltos so um problema, como tambm gerenciamento do heap Baixa legibilidade: ponteiros so conhecidos como o GOTO das estruturas de dados
Sub-rotinas
Subprogramas so blocos de construo fundamentais e esto entre os conceitos principais no projeto de uma linguagem de programao. Geralmente os subprogramas tm as seguintes caractersticas: Tem um nico ponto de entrada. A unidade de programa chamadora suspensa para execuo do subprograma. O controle de execuo de programa volta a unidade chamadora aps a execuo do subprograma chamado.
Sub-rotinas
unidade chamadora
sub-rotina
ponto de entrada
Ponto de sada y
Parmetros
Existem duas maneiras pelas quais uma sub-rotina pode ganhar acesso aos dados que ela deve processar: acesso direto a variveis no locais (veja discusso de escopos de nomes nas prximas sees). pela passagem de parmetros.
Reduz encapsulamento
Parmetro real
return
Exemplo de Valor-Resultado
procedure troca2(a:integer, b:integer) is temp:integer; begin temp := a; a := b; b := temp; end troca2;
A rotina em Ada acima usa passagem de parmetro por valorresultado. A chamada abaixo alcana o resultado desejado pois os valores das variveis "m" e "n" so passados para a rotina acima e os valores de "a" e "b" so copiados de volta para "m" e "n" ao final de sua execuo.
troca2(m,n);
call sub(a)
procedure sub(&a)
return
A rotina em Pascal acima usa passagem de parmetro por referncia. A chamada abaixo alcana o resultado desejado pois as operaes feitas nas variveis "a" e "b" esto na realidade ocorrendo sobre as variveis "m" e "n". troca3(m,n);
Exemplo Interessante
Considere a rotina abaixo escrita em um estilo similar a C:
int i = 3; /* varivel global */ void fun(int a, int b) { a = a + 1; i = b + i;
}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);
A B
3 4 5
}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);
I 3 8
L[3]
A B
}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);
I 3 4 9
L[3]
//
A B
3 4 5
}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);
I 3 8 4
L[3]
/ /
Registros de Ativao
Registros de ativao ou frames so estrutura de dados alocadas em tempo de execuo para armamento dos recursos de memria requeridos por uma instncia de uma sub-rotina (classe) de um programa. Eles armazenam variveis locais e endereos necessrios durante a execuo da sub-rotina. Apesar dos RAs serem criados em tempo de execuo, o cdigo para gerao do RA so criados em tempo de compilao.
Procedimentos e Escopos
procedimento P
prlogo
procedimento Q
prlogo
Abstrao de um Procedimento
Na entrada, deve-se estabelecer o ambiente de P numa chamada, a Q temos que preservar o ambiente de P na sada, temos que destruir o ambiente de P durante, temos que manter a endereabilidade e tempos de vida prprios de cada nome em P
procedimento P prlogo procedimento Q prlogo
frame atual
O registro de ativao uma estrutura de dados usada para organizar dados locais e parmetros numa chamada de um programa.
argumentos de sada
stack pointer
Exemplo de RA em Pascal
Program Frio Procedure calc() var c,f; begin f := 9/5 * c + 32; end; begin calc(); end;
CP FP
load reg, (cp)+1 mul reg,9 div reg,5 add reg,32 store reg, (cp)+2
endereo de retorno
c f
Exemplo
Program test var x; procedure bar1 begin var x; x := 2; bar2(); end; procedure bar2 begin writeln(x); end begin x:= 1; bar1() end;
Implementao de Escopos
Os escopos so implementados atravs de ponteiros no registro de ativao. Estes ponteiros indicam em que lugar da pilha de execuo est o Registro de Ativao que contm a rea de memria associada com o nome que queremos acessar.
Apontadores Estticos
Program P Procedure Q Procedure R
P Q R
Displays
P Q
A
Q R
indefinido AA=S0;AI=6
AA=S0;AI=12
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;1
A
Q R
indefinido AA=S0;AI=6
AA=S0;AI=12
O apontador de ambiente (AA) indica qual o escopo lxico de uma rotina. Est informao usada para criar o link esttico no RA da rotina quando ela for chamada. O apontador de instruo (AI) indica qual a posio de memria que contm a primeira instruo executvel da rotina.
Entendendo Atribuies
Variveis so definidas por uma dupla: (nvel lxico,offset) Por exemplo na linha 6: B := A transformado em: (2,3) := (1,3)
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
importantssimo notar que a dupla que define a varivel definida em tempo de compilao pois depende somente da sintaxe. Ainda assim ela usada para definir o endereamento da varivel em tempo de execuo.
Valor de A atualizado
A
Q R
1 AA=S0;AI=6
AA=S0;AI=12
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;16
(1 ; 3) := 1
offset na pilha
elaborador=S0;16
Para achar a posio de A na pilha: (1) carrega-se o apontador de ambiente do elaborador para obter o apontador do RA atual (no nosso caso S0); (2) segue-se um nmero X de links estticos a partir deste RA; (3) usa-se o offset sobre o RA final para acessar a varivel. X calculado como: nvel lxico da declarao atual (no nosso caso linha 16 que est no nvel 1) menos nvel lxico da varivel (nosso caso nvel 1).
No nosso caso temos: (1) S0 como RA atual; (2) Zero pulos de links estticos; e (3) 3 de offset. Isto resulta na posio S0 + 3 para a varivel A.
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 18
Cria parte do RA de Q
Endereo de retorno
Link esttico
S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;17
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Cria resto do 18 RA de Q
Link esttico
B
S0
indefinido
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Atribui valor 18 de A B
1
Link esttico
B
S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S6;6
(2 ; 3) := (1 ; 3)
elaborador=S6;6
Posio de A na pilha: (1) RA atual = S6; (2) siga X links estticos a partir deste RA; (3) use o offset 3 no RA final para acessar a varivel.
X calculado como: nvel lxico da declarao atual (nvel 2) menos nvel lxico da varivel (nvel 1). Desta forma: X = 1 para a varivel A
No nosso caso temos, S6 com 1 pulo de links estticos mais 3 de offset. Isto resulta na posio S0 + 3 para a varivel A. Para B temos, S6 com 0 (2-2) pulos de links estticos mais 3 de offset. Isto resulta na posio S6 + 3 para a varivel B.
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Imprime 18 valor de B
1
Link esttico
B
S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S6;7
A
Q R Link dinmico
1 desaloca o AA=S0;AI=6
AA=S0;AI=12 S0 18
retorno e
RA de Q
Endereo de retorno
Link esttico
B
S0
1
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
Exemplo acabou Q
pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil
Valor de A atualizado
A
Q R
1 AA=S0;AI=6
AA=S0;AI=12
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;18
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Cria parte do RA de R
Endereo de retorno
Link esttico
S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;18
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Cria resto do 19 RA de R
Link esttico
A
S0
indefinido
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Atribui valor 19 A
2
Link esttico
A
S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S6;12
(2 ; 3) := 2
elaborador=S6;12
Posio de A na pilha: (1) RA atual = S6; (2) siga X links estticos a partir deste RA; (3) use o offset 3 no RA final para acessar a varivel.
X calculado como: nvel lxico da declarao atual (nvel 2) menos nvel lxico da varivel (nvel 2). Desta forma: X = 0 para a varivel A
Neste caso temos, S6 com 0 pulos de links estticos mais 3 de offset. Isto resulta na posio S6 + 3 para a varivel A.
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0
Endereo de retorno
Cria parte do 19 RA de Q
Link esttico
A Link dinmico Endereo de retorno Link esttico
S0
2 S6 14 S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S6;13
Entendendo a referncia a Q
Como dissemos, Q representado por (note tal declarao definida em tempo de compilao para ser vlida em tempo de execuo ):
elaborador=S6;13
nvel lxico
(1 ; 4)
offset na pilha
Posio dos dados de Q na pilha: (1) RA atual = S6; (2) siga X links estticos a partir deste RA; (3) use o offset 4 no RA final para acessar Q.
X calculado como: nvel lxico da declarao atual (nvel 2) menos nvel lxico da declarao de Q (nvel 1). Desta forma: X = 1 para Q
Neste caso temos, S6 com 1 pulo de link esttico mais 4 de offset. Isto resulta na posio S0 + 4 para a descrio de Q. Note que o procedimento igual para qualquer identificador (varivel ou procedimento). Nas chamadas anteriores a Q e a R isto tambm ocorreu. Eu decidi no descrever estas chamadas antes por questes didticas.
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Endereo de retorno
Link esttico
A Link dinmico Endereo de retorno Link esttico
S0
2 S6 Cria resto do 14 RA de Q S0
indefinido
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Endereo de retorno
Link esttico
A Link dinmico Endereo de retorno Link esttico
S0
2 S6 Atribui valor 14 de A B, S0 mas qual
? deles ?
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S10;6
(2 ; 3) := (1 ; 3)
elaborador=S10;6
Posio de A na pilha: (1) RA atual = S10; (2) siga X links estticos; (3) use o offset 3 no RA final para acessar a varivel. X calculado como: nvel lxico da declarao atual (nvel 2) menos nvel lxico da varivel (nvel 1). Desta forma: X = 1 para a varivel A No nosso caso temos, S10 com 1 pulo de link esttico mais 3 de offset. Isto resulta na posio S0 + 3 para a varivel A. Para B temos, S10 com 0 pulos de links estticos mais 3 de offset. Isto resulta na posio S10 + 3 para a varivel B. Assim B recebe o valor da varivel A de main e no A de R.
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Endereo de retorno
Link esttico
A Link dinmico Endereo de retorno Link esttico
S0
2 S6 Imprime 14 valor de B S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S10;7
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Endereo de retorno
Link esttico
A Link dinmico Endereo de retorno Link esttico
S0
2 S6 14 S0
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S6;14
A
Q R Link dinmico
1 AA=S0;AI=6
AA=S0;AI=12 S0 19
Endereo de retorno
Link esttico
A
S0
2
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
A
Q R
1 AA=S0;AI=6
AA=S0;AI=12
1- program main() 2var A: integer; 3procedure Q 4var B: integer; 5begin 6B := A; 7writeln(B); 8end 9procedure R 10var A: integer; 11begin 12A := 2; 13Q(); 14end 15begin 16A := 1; 17Q(); 18R(); 19end;
elaborador=S0;19
PROGRAM MAIN() VAR A: INTEGER; VAR B: INTEGER; VAR C: INTEGER; PROCEDURE Q VAR B: INTEGER; BEGIN {Q} C:= 2*A; B:= 3*C; R(); END {Q} PROCEDURE R VAR A; PROCEDURE S VAR B: INTEGER BEGIN {S} A := 500; B := 1000; T(); END {S} PROCEDURE T BEGIN {T} WRITELN(A,B,C); END {T} BEGIN {R} S(); END {R} BEGIN {MAIN} C:= 70; B:= 20; A:= 45; Q(); END {MAIN}
Acessando Variveis no RA
Program Frio Procedure calc() var c,f; begin f := 9/5 * c + 32; end; begin calc(); end;
CP FP
load reg, (cp)+3 mul reg,9 div reg,5 add reg,32 store reg, (cp)+4
c f
CP FP
load reg, (cp)+1 load reg, (reg)+3 mul reg,9 div reg,5 add reg,32 store reg, (cp)+3
c
endereo de retorno link esttico link dinmico
CP
FP
c
endereo de retorno link esttico link dinmico
load regA, (regA)+3 mul regA,9 div regA,5 add regA,32 load regB, (cp) +1 store regA, (regB)+3
Blocos Bsicos
Blocos bsicos so seqncias lineares de cdigo. Nela se uma linha executa todos as linhas executam. Eles so produzidos entre dois pontos das estruturas de controle da linguagem de programao.
Estruturas de Controle
Estruturas de controle estabelecem o fluxo de controle do programa. Elas ligam os blocos bsicos. loops while for loops condicionais case etc ...
Loops While
while c do s; 1. avalie c 2. se falso pule para a prxima instruo depois do loop 3. se verdadeiro, entre no corpo do loop 4. pule para o comeo do loop
test: IF NOT(c) JUMP done s JUMP test done:
Loops For
for i := e1 to e2 do s;
1. avalie e1 e atribua valor a i 2. avalie e1 e coloque numa varivel limit l 3. se i l pule para a prxima instruo depois do loop 4. entre no corpo do codigo 5. incremente i 6. pule para o comeo do loop T1 e1 T2 e2 IF NOT(T1 T2) JUMP done s T1 T1 + 1 IF NOT(T1 T2) JUMP body
body:
done:
Condicionais If
if c then s1 else s2; 1. avalie c 2. se falso pule para a o segundo bloco de declarao 3. se verdadeiro, continue para o primeiro bloco 4. pule para depois do seguindo bloco de declarao
IF NOT(c) JUMP bloco2 s1 JUMP continua bloco2: s2 continua:
Parte 3 Eplogo
Computadores Virtuais
Compilador Ada Compilador Pascal Compilador FORTRAN Compilador C Interpretador LISP
Sistema operacional
Interpretador de macro-instrues
ncleo da mquina
O Processo de Compilao
Cdigo fonte
Linguagem de mquina
Gerador de cdigo
Cdigo intermedirio
Otimizao (opcional)
Pragmtica
Cdigo fonte