You are on page 1of 215

Mtodos de Implementao

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

Transformao lenta; Falta de portabilidade

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

Semntica Sintaxe rvore de parse e tabela de smbolos Cdigo objeto intermedirio


Gerao de cdigo Ligao ou linking

Pragmtica

Cdigo fonte

Cdigo objeto binrio


Translao ou parsing

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

Viso deste Aula


Representao Intermediria

RI Back end (semntica e pragmtica)


rvore de parsing e tabela de smbolos

Representao Final RF

Front end (sintaxe)


Cdigo fonte

Gerao de cdigo

Cdigo objeto intermedirio

Translao ou parsing

Parte 1 - Front end e Sintaxe

Definies Bsicas em Sintaxe (1)


Alfabeto ou vocabulrio um conjunto de smbolos usados em uma linguagem. Representado pela letra grega
1 = {0,1} 2= {a..z, A..Z, 0..9}

String, sentena, ou palavra uma seqncia de zero ou mais smbolos de um vocabulrio. Ex. 00001001011 uma sentena do vocabulrio 1

Definies Bsicas em Sintaxe (2)


Dicionrio o conjunto de todas as sentenas que eu posso formar sobre um vocabulrio. Representado por *
Linguagem L definida sobre qualquer subconjunto de *

Definindo uma linguagem sobre um alfabeto


Existem muitos meios para se definir uma linguagem sobre um alfabeto. O mais bsico enumerar todas as sentenas possveis de uma linguagem. Por exemplo = {0,1}, L = {, 0, 1, 01, 10, 111}

Definindo a Sintaxe de uma Linguagem de Programao


Evidentemente o mtodo de enumerao de sentenas no vivel para uma linguagem de programao. Normalmente combina-se dois mtodos para definir o que aceitvel numa LP. Um mtodo usado para analisar lexicamente a seqncia de caracteres o cdigo fonte e identificar quais so os bastes (tokens) existentes naquele cdigo. Ex.: palavras chaves, operadores, variveis, etc.
Outro mtodo usado para checar se os bastes formam uma gramtica aceitvel na LP, isto chamado de parsing.

Processamento Sinttico em LPs


Desta forma, compiladores e interpretadores usam uma combinao de processadores de linguagem regulares e processadores de gramticas para produzir uma tabela de smbolos e uma rvore de parsing. Estas duas estruturas sero ento usadas para se produzir cdigo intermedirio interpretvel (como em Java) ou linkvel em cdigo objeto (como em C).

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

Funes do Front End


Reconhecer se o cdigo fonte legal Reportar erros de sintaxe Produzir RI (representao intermediria) Criar mapeamento preliminar de armazenamento Arrumar o cdigo para o back end

Parte 1.1 - Anlise Lxica

Analisador Lxico
Cdigo fonte scanner ou analisador lxico tokens parser RI

Erros

Funo do Analisador Lxico


Mapear caracteres em tokens eliminando caracteres inteis tais como tabs, blanks, comentrios, etc. Por exemplo:

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

Tokens seguem para o parser

Mtodos para Definio de Analisadores Lxicos


Analisadores lxicos (scanners) normalmente usam mtodos que enumeram os padres de caracteres aceitveis pela LP. Entre estes mtodos esto as expresses regulares.

Expresses Regulares (1)


Mtodo de definio de uma linguagem que enumera todos os padres legais aceitos na linguagem, exemplo:
Concatenao de x com y: xy Potncia xxx ... x , n vezes: xn Sentena vazia, : x0 Fechamento de Kleene: x* = {x0, x1, x2, x3, ...} x+ = {x1, x2, x3, x4, ...}, fechamento positivo

Expresses Regulares (2)


Exemplo 1 Representando a linguagem L de todas as sentenas em {a,b} onde todos os as sempre precedem os bs

L = {w, w = a*b*}

Expresses Regulares (3)


Continuao: Opo de x ou y: Seleo (no padronizada) : Intervalo de a at g: Qualquer caractere: Comeo de linha: Fim de linha: Caracteres de controle: x|y [xy] a-g . ^ esquerda $ direita \, escape ( ), agrupamento

Expresses Regulares (4)


Exemplo 2: Nomes vlidos de variveis em uma LP: {w, w = [a-zA-Z][a-zA-Z0-9]*} Exemplo 3: Conjunto de todas as sentenas no alfabeto {a, b, c} em que todos os as sempre precedem os bs e os cs vo em qualquer lugar: L = {w, w = (a|c)*(b|c)*}

Expresses Regulares (5)


Exemplo quase real de utilizao de expresses regulares: nmeros vlidos em uma LP:
digito inteiro decimal real [0-9] ( \+ | \- | )(0|[1-9]digito*) inteiro \. (digito*) (inteiro | decimal) E (\+ | \- | ) digito*

Uso de Linguagem Regulares


Scanners (analisadores lxicos) transformam linguagens regulares em mquinas de estados finitos que transformam o cdigo fonte em uma seqncia de tokens ou bastes. Por exemplo:
if (indice < 0) { indice := indice +1; }

<if> <beginExpr> <id 23> <opLessThan> <literal 0> <endExpr> <then> <beginBlock> <beginStmt> <id 23> <attrb> <id 23> <opPlus> <literal 1> <endStmt> <endBlock>

Alguns problemas de sintaxe (1)


PL/I no tem palavra reservada: if then then then = else; else else = then; FORTRAN e ALGOL ignoravam os blanks, e reconheciam caracteres ambguos: derrubou uma sonda espacial integerVA do 10 i = 1,25,2 do 10 i = 1.25,2

Alguns problemas de sintaxe (2)


FORTRAN66 e as primeiras verses de C tinham um fechamento transitivo limitado que limitava o nmero de caracteres em nomes de variveis a 6 caracteres. As linguagens de hoje ainda tm problemas para tratar caracteres especiais dentro de uma string. Por exemplo: newline, tab, quote, delimitadores de comentrios, etc.

Limites de linguagens regulares


Nem todas as linguagens so regulares. Neste caso, no se pode construir mquinas de estados finitos (DFA) para reconhecer este tipo de linguagem. Por exemplo: L = {pkqk}
DFAs no conseguem contar!

Parte 1.2 - Gramticas Livres de Contexto e Parsers

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:


um conjunto de smbolos terminais (o alfabeto) N um conjunto de smbolos no terminais P um conjunto de regras de produo S o smbolo de partida

Gramticas BNF (1)


Regras de produo so regras da forma A::= , onde A um smbolo no terminal e uma seqncia de smbolos terminais e no terminais.

Exemplo 1: regras de produo


<corpo> ::= BEGIN <declarao> END <declarao> ::= <palavra> ; <declarao> <declarao> ::= <palavra>

Gramticas BNF (2)


Exemplo 2: Linguagem com alfabeto {a,b} onde os as sempre precedem os bs .

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

Gramticas BNF (3)


Exemplo 2 (continuao): Para gerar a palavra aaabb na linguagem L(G) com alfabeto {a,b} podemos usar a seguinte derivao. S=b b ab aab aaab aaabb aaabbb aaabb aaabb Tambm escrito como: b * aaabb , ou seja, b deriva aaabb com zero ou mais operaes de
derivao

Gramticas BNF: Definies


Forma Sentencial (FS) uma seqncia vlida de smbolos terminais e no terminais que podem ser obtidos a partir das regras de produo de uma gramtica. Ex.: aab; aaabbb; e aaabb Operao de derivao (OD) ato de aplicar uma regra de produo a uma FS com smbolos no terminais para se obter uma outra FS vlida. Ex.: aaabb aaabbb
Derivao uma seqncia de ODs que leva do smbolo de partida b a uma palavra vlida (conjunto de smbolos terminais) na linguagem L(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

Anlise Lxica versus Parsing


Expresses regulares:
so usadas para reconhecer tokens, isto classificar identificadores, nmeros, palavras chaves, etc. so mais concisas e mais fceis de entender tornam fcil construir analisadores lxicos a partir de DFA

Gramticas livres de contextos:


so usadas para reconhecer a gramtica de LPs podem contar: (), begin ... end, e if ... then ... else, etc. so usadas para construir estruturas intermedirias (rvores de parsing e tabelas de smbolos)

A gramtica da linguagem C tem cerca de 200 regras de produo.

Exemplo de Derivao Direita


Expresso x + 2 - y
1) <meta> ::= <expr> 2) <expr> ::= <expr><op><expr> 3) | num 4) | id 5) <op> ::= + 6) |7) |* 8) |/ derivao direita (rightmost derivation)

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

Considere a seguinte expresso x + 2 * y, sua rvore de parsing ser:


expr

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.

Como os Parsers so Construdos


tokens

gramtica

gerador de parser (yacc, bison, javaCC)

parser

Curiosidade: yacc, bison e JavaCC funcionam como linguagens funcionais

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.

LOOKAHEAD(1) "else" Statement()

void WhileStatement(): {} { "while" "(" Expression() ")" Statement() } void DoStatement(): {} { "do" Statement() "while" "(" Expression() ")" ";" }

Exemplo de trecho de um arquivo JavaCC para a linguagem Java.

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

Bottom-up (de baixo para cima):


comea nas folhas da rvore de derivao comea num estado aceitvel de tokens de entrada medida que os tokens so consumidos muda de estado que codificam as novas possibilidades (reconhece prefixos vlidos) usa uma pilha para armazenar tanto o estado como a forma sentencial atual
O YACC usa um parser LALR de baixo para cima. O JavaCC usa um parser de cima para baixo.

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.

Parte 2 Semntica e Gerao de Cdigo

Componentes de uma Linguagem


Semntica Interpretador Hardware

Semntica Sintaxe rvore de parse e tabela de smbolos Cdigo objeto intermedirio


Gerao de cdigo Ligao ou linking

Pragmtica

Cdigo fonte

Cdigo objeto binrio


Translao ou parsing

Anlise Semntica Intermediria


usada para se responder questes que so dependente nos valores dos tokens e no de sua sintaxe. Exemplo:

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 ...

Parte 2.1 - Tabelas de Smbolos

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.

Informaes Contidas em uma Tabela de Smbolos


nome textual tipo se arranjo: dimenses se registro: apontador para tabela descritora de estrutura se parmetro: tipo de chamada (por referncia ou por valor) se funo ou procedimento: nmero e tipo dos argumentos procedimento em que foi declarado nvel lxico de declarao classe de armazenamento (endereo base) offset de armazenamento etc ...

Escopos dos Nomes


Quando procura-se um nome, ns queremos achar a declarao mais recente para este nome. Esta declarao pode estar no escopo atual ou em um escopo mais externo. Escopos internos sobrescrevem escopos externos.

Atributos dos Nomes


Nomes podem ter diferentes atributos dependendo do significado deles: variveis: tipo, nvel da procedimento (funo), frame offset tipos: descritor do tipo, tamanho do dado constantes: tipo, valor procedimento: assinatura, declaraes locais, tamanho do frame

Parte 2.2 Nomes e Tipos

Introduo
As linguagens de programao imperativas so baseadas na arquitetura de Von Neumann:

Memria: armazena instrues e dados; Processador: operaes para modificar a memria

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

Variveis podem estar indefinidas

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:1..31; mes:1..12 end;


var hoje:data; ... hoje.dia :=14; hoje.mes:=12;

? ?

dia mes

data

Atributos de uma Varivel - Nome


Um Nome um string usada para identificar alguma entidade de um
programa. Um dos mais relevantes atributos de uma varivel Tambm utilizados em rtulos, subprogramas e parmetros

Representam o mesmo conceito de identificadores


Principais questes de projetos para nomes/identificadores: Qual o tamanho mximo de um nome?
Caracteres de conexo podem ser usados em nomes? Nomes fazem distino entre maisculas e minsculas? Palavras especiais so palavras reservadas ou palavras-chave?

Atributos de uma Varivel - Nome


As primeiras LP usavam nomes com apenas 1 caractere, pois eram basicamente matemticas.
Exemplos:
FORTRAN I: mximo 6 COBOL: mximo 30 FORTRAN: 90 e ANSI C: mximo 31 Ada: no tem limite C++: no tem limite

Pode ou no existir distino entre maisculas e minsculas;

Atributos de uma Varivel - Nome


Palavras especiais so usadas para tornar programas mais legveis ao nomear aes Maioria das LP classificam como reservadas; em outras so apenas palavras-chave Palavra-chave
depende do contexto que est sendo utilizada

Palavra reservada
independente de contexto e no pode ser usada como um nome

Atributos de uma Varivel - Valor


Valor:
Contedo da clula de memria associada varivel. Considere n := n+1
As duas ocorrncias de n descrevem entidades diferentes

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

Atributos de uma Varivel


Endereo:
Referncia ao espao de memria qual est associada
Os Aliases existem quando duas ou mais variveis apontam para o mesmo endereo de memria

Tipo:
Determina a faixa de valores que ela pode ter e o conjunto de operaes definidas para os valores do tipo

Tempo de Vida e Escopo

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

Vinculao de Atributos a Variveis


De maneira geral, uma vinculao pode ser esttica ou dinmica:
Esttica:
Se ocorrer antes do tempo de execuo e permanecer inalterada durante a execuo do programa.

Dinmica:
Ocorre durante a execuo ou modificada durante a execuo do programa.

O momento que realizada a vinculao chamado tempo de vinculao.


Exemplo:
O smbolo * normalmente vinculado operao de multiplicao no tempo de projeto da linguagem. Que outros tempos de vinculao existem?

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

Na prtica, toda linguagem tipada

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

Pascal fortemente tipada?

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

Vinculao Dinmica de Tipos


O tipo no especificado por instruo de declarao, e sim quando atribudo um valor para a varivel.
Vantagem:
Flexibilidade de programao;

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

Caractersticas: altamente restritiva mais fcil de implementar

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

Vinculaes de Armazenamento e Tempo de Vida da Varivel


Alocao
Nome dado a vinculao da varivel a uma clula de memria disponvel (pool de memria)

Desalocao
Processo desvincular e devolver a clula de memria ao pool de memria disponvel

Tempo de vida de uma Varivel


Tempo no qual est vinculada a uma localizao de memria especfica

Tempo de Vida de uma Varivel


O tempo de vida de uma varivel o intervalo entre a sua criao (alocao) e a sua destruio (desalocao) De acordo com o tempo de vida, variveis classificam-se em:
estticas stack-dinmicas heap-dinmicas

Tempo de Vida de uma Varivel


Variveis Estticas:
Variveis vinculadas a clulas de memria antes do incio da execuo do programa e que subsistem enquanto o processo existir Eficientes: endereamento direto Fortran I, II e IV: todas as variveis eram estticas
a recurso impossvel

C e C++: usando o modificador static Pascal no tem

Tempo de Vida de uma Varivel


Variveis Stack-Dinmicas:
Variveis criadas durante a elaborao de declaraes
Elaborao de uma declarao: processo de alocao e vinculao com um endereo de memria resultado de uma declarao Ocorre em tempo de execuo

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).

Tempo de Vida de uma Varivel


Variveis Stack-Dinmicas:
Cada cpia ativa de um subprograma recursivo possui seus prprios valores para as variveis locais definidas
Ativao de um bloco: intervalo de tempo durante o qual um bloco est sendo executado

Varivel global: declarada no bloco mais externo de um programa


Em linguagens ao estilo Pascal, o tempo de vida de uma varivel stack-dinmica corresponde exatamente com a ativao do bloco que contm a sua declarao

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

x TEMPOS DE VIDA DAS VARIVEIS

fim P

Tempo de Vida da Varivel


Variveis Heap-Dinmicas Heap: conjunto de clulas de armazenamento desorganizada
devido a imprevisibilidade de seu uso Variveis annimas acessadas atravs de ponteiros ou referncias e que podem ser criadas e destrudas a qualquer tempo Uma varivel criada usando um operador de alocao (new em Pascal) O tempo de vida de uma varivel heap-dinmica estende-se desde a sua criao at ficar inacessvel

Tempo de Vida da Varivel


Destruio de uma varivel:
Em Pascal (dispose), Ada, C, C++: explicita usando comando de desalocao (PERIGOSO) Em Java: coleta de lixo automtica

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

Tempo de Vida da Varivel


Variveis Persistentes
Variveis cujo tempo de vida transcende a ativao de
qualquer programa. Exemplo:
arquivos, banco de dados e objetos distribudos

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

Em Ada, em qualquer lugar onde coloca-se um comando, pode-se definir um bloco


declare Temp: integer; begin temp:=1; .... end;

Estruturas de Bloco
Estrutura Monoltica (Cobol antigo) declarao de x

declarao de x

declarao de y
Estrutura Plana (Fortran) declarao de z

escopo da declarao x escopo da declarao y escopo da declarao z

Estruturas de Bloco (cont.)


Estrutura Aninhada (Pascal, Ada, Haskell, C++, Java, ....)

declarao de x declarao de y

escopo da declarao x escopo da declarao y

declarao de z escopo da declarao z

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.

Escopo Esttico - Exemplo


procedure big; var x: integer; procedure sub1;

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 Esttico - Avaliao


As variveis globais so visveis a todos os procedimentos. A maioria das linguagens imperativas utilizam escopo esttico: Pascal, C, Ada.

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

Escopo Dinmico - Exemplo


procedure big; var x: integer; procedure sub1;

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;

procedure sub2; var x: integer;

begin end;

sub1();

begin sub2(); end;


sub1();

Escopo Dinmico - Avaliao


Programas menos confiveis que os de escopos estticos Problemas com a legibilidade do programa. Execuo mais lenta Menos utilizado que o escopo esttico Linguagens que utilizam escopo dinmico: Smalltalk, APL, SNOBOL, LISP.

Escopo e Tempo de Vida


Escopo e tempo de vida no esto diretamente relacionados. No exemplo ao lado, o escopo da varivel sum no se estende para a funo printheader, mesmo ela sendo chamada dentro de compute. Porm, seu tempo de vida sim.
Exemplo: void printheader() { .. } void compute() { int sum; printheader(); }

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.

Parte 2.3 Tipos de Dados

Tipos String de Caracteres


Implementao
Tamanho esttico (COBOL, Pascal e ADA) :
Especificado na declarao So sempre cheias

Tamanho dinmico limitado (C e C++) :


Tamanho varivel at um mximo declarado e fixo estabelecido na definio da varivel pode necessitar uma descrio em tempo de execuo para tamanho

Tamanho dinmico (PERL):


Tamanho varivel sem nenhum mximo Overhead: Alocao e desalocao dinmica Maior flexibilidade

Tipos String de Caracteres


Implementao
Tamanho esttico
Descritor somente exigido durante a compilao Trs campos: Nome do tipo, nmero de caracteres e o endereo do primeiro caractere

String esttica
Tamanho

Endereo

Tipos String de Caracteres


Implementao
Tamanho dinmico limitado
Descritor em tempo de execuo Quatro campos: Nome do tipo, tamanho mximo, tamanho atual e o endereo do primeiro caractere String dinmica limitada

Tamanho mximo
Tamanho atual Endereo

Tipos String de Caracteres


Implementao
Tamanho dinmico
Somente o tamanho atual precisa ser armazenado

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

Implementao de Tipos Ordinais


Tipos enumerados implementados como inteiros Tipos subfaixa implementados da mesma maneira que o tipo pai, mas restringem atribuies s variveis

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

Agregado de elementos de dados, no qual os elementos so identificados por nomes

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

Atribuio Inicializao Comparao MOVE CORRESPONDING COBOL

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.

Alguns casos so os Arrays associativos de PERL e LUA implementados mediante hashing

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

Algumas linguagens no permitem Outras permitem adio, multiplicao, etc


APL

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)

Operaes sobre ponteiros


Atribuio de um endereo a um ponteiro Referncias (explcita x dereferncia implcita)

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

Parte 2.4 Sub-rotinas e Passagens de Parmetros

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

chamada prxima instruo Ponto de sada x

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 Formal e Parmetro Real


Parmetro formal aquele declarado no cabealho da sub-rotina a ser chamada.
Parmetro real (ou argumento) aquele so aqueles existentes na chamada sub-rotina.

Parmetro Formal x Parmetro Real


void troca1 (int a, int b) { int temp = a; a = b; Parmetro formal b = temp; }

{ int m,n; ... troca1(m,n); ... }

Parmetro real

Tipos de Passagem de Parmetros


por Valor: o valor do parmetro real usado para inicializar o valor parmetro formal correspondente. Mudanas no valor do parmetro formal na sub-rotina no afetam o parmetro real. por Valor-resultado: o valor do parmetro real usado para inicializar o valor parmetro formal correspondente. No retorno da rotina, o valor do parmetro formal copiado para o parmetro real. por Referncia: o endereo do parmetro real passado para a sub-rotina que o usa como parmetro formal. Toda alterao de valor feita no parmetro formal est de fato sendo feito no parmetro real. por Nome: parmetros do nome so reavaliados a cada referncia

Passagem por Valor


Na passagem de parmetro por valor, o valor do parmetro real usado para inicializar o valor parmetro formal correspondente, que ento age como uma varivel local. A manipulao local no afetar o valor do parmetro real.
Passagem por valor implementa assim uma semntica em modo entrada.
call sub(a) procedure sub(a)

Exemplo de Passagem por Valor


void troca1 (int a, int b) { int temp = a; a = b; b = temp; } A rotina em C acima usa passagem de parmetro por valor. A chamada abaixo no alcana o resultado desejado pois os valores das variveis "m" e "n" so apenas passados para a rotina acima. troca1(m,n);

Passagem por Valor-Resultado


Na passagem de parmetro por valor-resultado, o valor do parmetro real usado para inicializar o valor parmetro formal e copiado de volta do parmetro formal para o parmetro real ao final da rotina.
Passagem por valor-resultado implementa assim uma semntica em modo entrada-sada.
call sub(a) procedure sub(a)

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);

Passagem por Referncia


A passagem de parmetro por referncia um segundo modelo em modo entrada-sada em que toda alterao no parmetro formal est na realidade ocorrendo sobre o parmetro real.

call sub(a)

procedure sub(&a)

return

Exemplo de Passagem por Referncia


procedure troca3(var a,b:integer) var temp:integer; begin temp := a; a := b; b := temp; end;

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]);

Exemplo - se por valor


Considere que a passagem de parmetros feita por valor:
int i = 3; /* varivel global */ void fun(int a, int b) { a = a + 1; i = b + i;

A B

3 4 5

}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);

I 3 8
L[3]

} Neste caso, o valor final de "i" ser 8.

Exemplo se por referncia


Considere que a passagem de parmetros feita por referncia:
int i = 3; /* varivel global */ void fun(int a, int b) { a = a + 1; i = b + i;

A B

}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);

I 3 4 9
L[3]

//

} Neste caso, o valor final de "i" ser 9.

Exemplo se por valor-referncia


Considere que a passagem feita por valor-referncia:
int i = 3; /* varivel global */ void fun(int a, int b) { a = a + 1; i = b + i;

A B

3 4 5

}
void main() { int list[10]; list[i] = 5; fun(i, list[i]);

I 3 8 4
L[3]

/ /

Neste caso, o valor final de "i" ser 4.

Passagem por Nome

Parte 2.5 - Registros de Ativao

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

pr-chamada ps-chamada eplogo eplogo

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

chamada eplogo eplogo

Como Feito em Tempo de Execuo (1)


pr-chamada em P: aloca um registro de ativao de trabalho na pilha de execuo do programa, avalia e armazena parmetros neste RA, armazena endereo de retorno, pula para a sub-rotina.
prlogo em Q: salva estado de P (seus registradores), salva o link dinmico de registro de ativao (FP), seta novo FP, armazena link esttico, estende RA bsico com os dados locais, inicializa estes dados, comea a executar cdigo.

Como Feito em Tempo de Execuo (2)


eplogo de Q: guarda valor retornado, recupera estado de P, recria o RA bsico, recupera o FP de P, pula para o endereo de retorno. ps-chamada em P: copia valor retornado, libera RA bsico, recupera parmetros (se passagem de parmetro for por valorreferncia).

Frames ou Registros de Ativao


Cada ativao de um procedimento tem associada a ela um registro de ativao ou frame. Por exemplo:
frame pointer (FP)
frame anterior argumentos de entrada argumento n ... argumento 2 argumento 1 variveis locais endereo de retorno temporrios registros salvos

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

argumento m ... argumento 2 argumento 1 prximo frame

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

Tipos de Passagem de Parmetros


por Valor: copia o valor no registro de ativao na hora da chamada da sub-rotina por Valor-resultado: copia o valor da varivel para o RA na hora da chamada, e valor no RA para a varivel na sada por Referncia: copia endereo da varivel no RA por Nome: parmetros do nome so reavaliados a cada referncia

Referncias a Variveis no Locais


O projetista da linguagem deve decidir que tipo de associao de escopos ele vai usar na sua linguagem. Associaes de escopos podem ser estticos (lxicos) ou dinmicos: No escopo esttico a ligao ao nome feita declarao mais prxima no cdigo fonte No escopo dinmico a ligao feita a declarao mais prxima na pilha de execuo da linguagem.

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;

Escopo esttico imprime 1 Escopo dinmico imprime 2

Escopo esttico mais usado

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.

Parte 2.6 - Implementaes de Escopos Estticos

Implementaes de Escopos Estticos


Existem vrias formas de implementar escopos dinmicos e estticos.
Escopo esttico o mais difcil de se implementar quando se projeta uma LP mas, como visto, o mais intuitivo para o programador. Neste curso vamos ver apenas a implementao de escopos estticos.

Implementaes de Escopos Estticos


Apontadores estticos: cada RA aponta para o RA do escopo textual que o engloba e que foi mais recentemente alocado.
Displays: cada RA aponta para RA de todos escopos textuais que o engloba e que foi mais recentemente alocado.

Apontadores Estticos
Program P Procedure Q Procedure R
P Q R

Displays

Program P Procedure Q Procedure R

P Q

Display versus Apontadores Estticos


Apontadores estticos so caros para efetuar referncias no locais mas so baratos para construir a cada chamada de procedimento Display so caros para construir mais so baratos para executar referncias no locais.

Parte 2.7 - Exemplo Completo de RAs com Apontadores Estticos

Exemplo Completo de RA com Apontadores Estticos


Objetiva mostrar como um registro de ativao criado durante a execuo numa LP que usa apontadores estticos e tem escopo esttico de variveis.
Escopo esttico o mais difcil de se implementar quando se projeta uma LP, mas o mais intuitivo para o programador. Portanto o nosso exemplo no muito simples ...

Exemplo Completo de RA com Apontadores Estticos


RA link dinmico end. retorno link lxico
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;

Criando o RA do main (1)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

A
Q R

indefinido AA=S0;AI=6
AA=S0;AI=12

RA criado quando main chamado

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;

AA o apontador de ambiente; AI o apontador de instruo

elaborador=S0;1

Entendendo o RA do main (2)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

A
Q R

indefinido AA=S0;AI=6
AA=S0;AI=12

RA criado quando main chamado

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.

Exemplo - execuo de main (1)


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;

A:=1 representado por (1;3) := 1

elaborador=S0;16

Entendendo a atribuio A:=1


Como dissemos, A:=1 representado por (note tal declarao definida em tempo de compilao para ser vlida em tempo de execuo ):
nvel lxico

(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.

Exemplo - execuo de main (2)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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

Exemplo - 1 execuo de Q (1)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Exemplo - 1 execuo de Q (2)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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

Entendendo a atribuio B:=A


Como dissemos, B:=A representado por (note tal declarao definida em tempo de compilao para ser vlida em tempo de execuo ):

(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.

Exemplo - 1 execuo de Q (3)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Como antes B representado por (2;3) ou S6+3

elaborador=S6;7

Exemplo - 1 execuo de Q (4)


pilha
Link dinmico Endereo de retorno Link esttico nil nil endereo de 20 Obtm

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

Exemplo - execuo de main (3)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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

Exemplo - execuo de R (1)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Exemplo - execuo de R (2)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

A:=2 representado por (2;3) := 2

elaborador=S6;12

Entendendo a atribuio A:=2


Como dissemos, A:=2 representado por (note tal declarao definida em tempo de compilao para ser vlida em tempo de execuo ):

(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.

Exemplo - execuo de R (3)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Referncia a Q representada por (1;4)

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.

Exemplo - 2 execuo de Q (1)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Exemplo - 2 execuo de Q (2)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Como antes B := A representado por (2;3) = (1;3)

elaborador=S10;6

Entendendo a atribuio B:=A


Como antes, B:=A representado por (note tal declarao definida em tempo de compilao para ser vlida em tempo de execuo ):

(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.

Exemplo - 2 execuo de Q (3)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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;

Como antes B representado por (2;3) ou S10+3

elaborador=S10;7

Exemplo - 2 execuo de Q (4)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

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

Obtm endereo de retorno e desaloca o RA de Q

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

Exemplo - execuo de main (4)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

A
Q R Link dinmico

1 AA=S0;AI=6
AA=S0;AI=12 S0 19

Obtm endereo de retorno e desaloca o RA de Q

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;

Exemplo - execuo de main (5)


pilha
Link dinmico Endereo de retorno Link esttico nil 20 nil

A
Q R

1 AA=S0;AI=6
AA=S0;AI=12

Obtm endereo de retorno ao SO e desaloca o RA de main.

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

Exemplo - Fim de Execuo


pilha
Retorna todos os recursos usados pelo programa 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;

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}

Parte 8- Gerao de Cdigo e Estruturas de Controle

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

endereo de retorno link esttico link dinmico

c f

Acessando Variveis em Outro RA


Program Frio var c; Procedure calc() var f; begin f := 9/5 * c + 32; end; begin calc(); end;

CP FP

load reg, (cp)+1 load reg, (reg)+3 mul reg,9 div reg,5 add reg,32 store reg, (cp)+3

1 pulo de link esttico

endereo de retorno link esttico link dinmico

c
endereo de retorno link esttico link dinmico

Acessando Variveis em Outro RA


Program Frio var c; Procedure calc1() var f; Procedure calc2() begin f := 9/5 * c + 32; end; begin calc2(); end; begin load regA, (cp)+1 calc1(); end; load regA, (regA)+1

CP

FP

endereo de retorno link esttico link dinmico

2 pulos de link esttico

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

f 1 pulo de link esttico


endereo de retorno link esttico link dinmico

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

Analisador lxico (scanner)

Analisador sinttico (parser)

Gerador de cdigo intermedirio

Gerador de cdigo

Tabela de smbolos Unidades lxicas (tokens) rvore de anlise (parse tree)

Cdigo intermedirio

Otimizao (opcional)

Componentes de uma Linguagem


Semntica Interpretador Hardware

Semntica Sintaxe rvore de parse e tabela de smbolos Cdigo objeto intermedirio


Gerao de cdigo Ligao ou linking

Pragmtica

Cdigo fonte

Cdigo objeto binrio


Translao ou parsing

You might also like