You are on page 1of 34

AnliseSintticaIIAscendente

Asconfiguraestambmserodaforma(,y),emque ocontedodapilhaey
orestodaentrada.Entretanto,aconvenosobreotopodapilhainvertida:otopo
fica direita, ou seja, o ltimo smbolo de o smbolo do topo. As mudanas de
configuraoso:
(1)reduo pela regra A : permite passar da configurao (, y) para a
configurao(A,y).
(2)empilhamentooudeslocamentodeumterminals:permitepassardaconfigurao
(,sy)paraaconfigurao(s,y).
Observequeesteltimotipodetransiooquepermitetrazerosterminaisparaa
pilhaafimdequepossamparticipardasredues.
A configurao inicial para a entrada x (, x), com a pilha vazia, e ao final temos a
configurao(S,),indicandoquetodaaentradaxfoilidaereduzidaparaS.

Exemplo:Na tabela abaixo, possvel observar as configuraes sucessivas de um


analisador ascendente, para a cadeia x. A terceira coluna apresenta os passos
correspondentesdaderivaodireitadex.
Pilha
(topoesquerda)

a
F
T
E
E+
E+a
E+F
E+T
E+T*
E+T*a
E+T*F
E+T
E

(restanteda)
Entrada
a+a*a
+a*a
+a*a
+a*a
+a*a
a*a
*a
*a
*a
a

Derivaodireita
(invertida)
a+a*a

F+a*a
T+a*a
E+a*a

E+F*a
E+T*a

E+T*F
E+T
E

AnliseSintticasLR(1)
H um mtodo de anlise sinttica ascendente que chamado sLR(1). As letras que
geramasiglaquelhednomeindicam:

S:avariantemaissimplesdosmtodosLR(1).

L:acadeiadeentradalidadaesquerdaparaadireita(lefttoright).
R:omtodoconstriumaderivaodireita(rightmost)invertida.
1:apenasumsmbolodorestodaentradaexaminado.

Como o smbolo inicial pode ocorrer em diferentes partes da rvore de derivao,


devemos distinguir sua ocorrncia relativa raiz da rvore das demais. Assim, para
simplificar a identificao do trmino do processo de anlise, acrescentamos
gramtica uma nova regra inicialS'S, sendoSo smbolo inicial original, e S' um
smbolonovo,quepassaaserosmboloinicialdagramticaaumentada.Assim,uma
reduo por esta regra indica o fim da anlise, j queS' nunca aparece direita nas
regras da gramtica. A gramtica aumentada usada na construo do analisador
sLR(1)dagramticaoriginal.
Aconstruodesteanalisadorsebaseianaformulaodeumautmatodepilhaque
permitir a identificao do momento adequado para realizarmos a reduo dos
smbolos da pilha segundo a regra apropriada. A construo deste autmato se d
atravs da descoberta dos estados, a partir da anlise das regras da gramtica
aumentadaedacaracterizaotemporalrealizadapeloparser.
Uma maneira conveniente para isto a caracterizao das regras na forma deitens.
UmitemAindicaapossibilidadedeque,nopontoatualemqueseencontraa
anlise:

aregraAsejausadanaderivaodacadeiadeentrada;
ossmbolosterminaisderivadosapartirdejsejamtodosencontrados,faltando
encontrarossmbolosterminaisderivadosde.

Assim, o marcadorindica o progresso da anlise. Desta maneira, um


itemAindica o incio da busca por (uma cadeia derivada de) um,
enquantoA indicaofimdabuscapelossmbolosgerados,ouseja,omomento
emqueareduodeparaApodeserrealizada.
Observe ainda que, num dado momento, vrias possibilidades precisam ser
consideradas.Representamosumestadodoprocessodeanlise(estadodoautmato)
por umconjunto de itens. O estado inicial do processo de anlise dado pelo
itemS'Sprovenientedaregrainicialepodeserentendidocomosfaltaencontrar
(umacadeiaderivadade)umS.
De acordo com as regras da gramtica, quando um estado contm um
itemAB, necessrio acrescentar a cada estado as possibilidades
correspondentes, ou seja, os itens correspondentes s regras deBpara que seja
possvel dirigir a busca porB. Esses so os itens da formaB, para todas as
regrasB. Esse processo repetido enquanto for necessrio, sendo denominado
defechamentodoestado.
Oestadoinicialdadopelofechamentode{S'S}.

Exemplo:
Considereagramticaaseguir:
1. EE+T
2. ET
3. TT*F
4. TF
5. F(E)
6. Fa

Agramticaaumentadapassaaser:
0.SE
1. EE+T
2. ET
3. TT*F
4. TF
5. F(E)
6. Fa
Ositenspossveisparaagramticaaumentadasofinitose,nestecaso,compreendem
ototalde20:
S'E,S'E,EE+T,EE+T,EE+T,EE+T,...,Fa,
Fa
Oestadoinicialofechamentode{SE}.ComohumpontoantesdeE,devemos
acrescentar os itensEE+TeET. Por causa do ponto antes deT,
acrescentamosTT*FeTF.Por
causa
do
ponto
antes
deF,
acrescentamosF(E)eFa.
Oestadoinicial(estado0)ser,ento,compostopelositens:
S'E,EE+T,ET,TT*F,TF,F(E),Fa.
medidaqueaanliseprossegue,opontodevecaminharparaadireitanosdiversos
itens do estado. Encontrado um smboloX, passamos de um item AXpara um
itemAX. Note que os smbolos terminais sero encontrados na entrada,
enquantoossmbolosnoterminaisseroencontradoscomoresultadoderedues.
Se o autmato de reconhecimento estiver num estado p que tem itens com a
marcao (ponto) antes de um smboloX, uma transio rotulada com este
smboloXnos levar a outro estado q que ter um item com a marcao depois da
ocorrnciadeXparacadaitemnoestadopcomopontoantesdeX.Osoutrositensdo
estadoqseroobtidosapartirdofechamentodoestado.
Parageraratabeladetransiesutilizadaspeloanalisador,geramostodososestados
e transies possveis a partir do estado inicial e de outros estados gerados a partir
dele.Onmerodeestadosdesteautmatosempreserfinito,umavezqueonmero
deitensfinito.
Assim, a coleo completa de estados para a gramtica dada como exemplo a
seguinte:
0.S'E
EE+T
ET
TT*F
TF

4.F(E)
EE+T
ET
TT*F
TF

7.TT*F
F(E)
Fa

8.F(E)

F(E)
Fa

1.S'E

F(E)
Fa

5.Fa

EE+T

9.EE+T
TT*F

EE+T

2.ET
TT*F

3.TF

6.EE+T
TT*F
TF
F(E)
Fa

10.TT*F

11.F(E)

Astransiesentreosestadosestoespecificadasnatabelaabaixo:

0
1
2
3
4
5
6
7
8
9
10
11

E
1

T
2

F
3

3
10

(
4

4
4

a
5

5
5

11

Notequeatabelaincluialgunsestadosapartirdosquaisnohtransies.
O analisador sLR(1) um analisador ascendente. Em vez de smbolos, entretanto, a
pilha do analisador contm os estados correspondentes aos smbolos. Primeiro,
observamos que, a cada estado q, com exceo do estado inicial, corresponde
exatamente um smboloX, que o nico smbolo que ocorre depois do ponto, nos
itens do estado q. Todas as transies para q so feitas com o smboloX, podendo
ocorrer,entretanto,quedoisoumaisestadossejamacessveispelomesmosmboloX.
Nestecaso,osestadossedistinguemporconterinformaoadicionalsobreaposio
emqueosmboloX ocorrenacadeiadeentrada.
As duas aes possveis em analisadores ascendentes se aplicam aqui. Um
empilhamento (shift) pode ocorrer quando existe uma transio com um terminal a
partir do estado corrente (o estado do topo da pilha). Quando existe um item
completoB,noestadocorrente,podeserfeitaumareduopelaregraB.Em
umanalisadorsLR(1),aregra:
ReduzapelaregraB seosmbolodaentradapertenceraoFollow(B).

Oprimeirosmbolopertencenteaorestantedaentradaconhecidocomoosmbolo
delookaheadecombaseneleenoestadocorrentequesedeterminamasaesdo
parser.
AtabelaparaoanalisadorsLR(1)podeconterasseguintesaes,dadasemfunodo
estadoq(dotopodapilha)edosmbolosdelookahead(dadopelaentrada):

Empilhamentooestadop(querepresentas)deveserempilhado,eoanalisador
lxicodeveseracionadoparaobteroutrosmbolodaentrada.
ReduoseT[q,s]=reduceB,os||estadoscorrespondentesa devemser
retiradosdapilha,eoestado(q,B)deveserempilhado,representandoB.
AceitaoseT[q,s]=reduceS'S,oprocessoseencerracomsucesso.

Nos exemplos, uma ao de empilhamento (shift)q ser representada apenas pelo


nmerodoestadoq,eumaaodereduo(reduce)Bserrepresentadaporri,
emqueionmerodaregraB.Assim,aaodeparadaserindicadacomor0.
Atabeladeaesaseguinte:

0
1
2
3
4
5
6
7
8
9
10
11

E
1

T
2

F
3

3
10

(
4

4
4

a
5

5
5

6
r2
r4

r6

6
r1
r3
r5

7
r4

r6

7
r3
r5

r2
r4

r6

11
r1
r3
r5

r0
r2
r4

r6

r1
r3
r5

Vejamos como se d a anlise da cadeiax=(a+a)*a. Na configurao inicial, a pilha


contm apenas o estado inicial 0 e a entrada contm a cadeiax. medida que
transcorreaanlise,acrescentamospilhaosestadoscorrespondentesstransies
grafadasnatabela.
Neste exemplo, alm dos estados, inserimos na pilha ainda os smbolos
correspondentesstransies,quedevemserentendidosapenascomocomentrios.
Ospassosparaoprocessamentodacadeiaso:
Pilha
0
0(4
0(4a5
0(4F3

Entrada
(a+a)*a
a+a)*a
+a)*a
+a)*a

Ao
empilhar:4
empilhar:5
reduzir:6
reduzir:4

0(4T2
0(4E8
0(4E8+6
0(4E8+6a5
0(4E8+6F3
0(4E8+6T9
0(4E8
0(4E8)11
0F3
0T2
0T2*7
0T2*7a5
0T2*7F10
0T2
0E1

+a)*a
+a)*a
a)*a
)*a
)*a
)*a
)*a
*a
*a
*a
a

reduzir:2
empilhar:6
empilhar:5
reduzir:6
reduzir:4
reduzir:1
empilhar:11
reduzir:5
reduzir:4
empilhar:7
empilhar:5
reduzir:6
reduzir:3
reduzir:2
reduzir:0(aceitar)

Asequnciadasreduesfoi642641546320,comoeraesperado,e
correspondentederivao
direitaS'ETT*FT*aF*a(E)*a(E+T)*a(E+F
)*a(E+a)*a(T+a)*a(F+a)*a(a+a)*a

Leiturarecomendada:
Captulo4,seo4.5dolivroCompiladores:princpios,tcnicaseferramentas(Livrodo
Drago)
Captulo 3, sees 3.3 e 3.4 do livro Implementao de linguagens de programao:
compiladores.

Exercciosresolvidos:

AnliseSemntica
Visogeral
Astcnicasdeanlisesintticavistasatomomentodescrevem,basicamente,
elementosreconhecedores.Ouseja,mquinasquedeterminamseumacadeia
(programafonte)pertenceounolinguagemreconhecida.
Observeque,nocasodeaceitao,ainformaosobreaformadederivaodexdeve
serusadanageraodocdigoparax;e,nocasodenoaceitao,ainformao
disponveldeveserusadaparatratamentodeerros(sinalizandoosparaqueo
programadorpossacorrigilo)erecuperao(paraqueoparserpossacontinuara
anlise).
Almdainformaosintticasobreaformadederivaodaentrada,deveficar
disponveltambmainformaolxica,compostaessencialmentepelascadeias
correspondentesaoschamadostokensvariveis(identificadores,literaisinteiros,reais,
cadeiasetc.).Estainformaodeveserprocessadanasfasesseguintesdocompilador.
Umatcnicageraldetratamentodasinformaesobtidasduranteasfasesdeanlise
lxicaesintticaabaseadaemgramticasdeatributos.Utilizandoessetipode
gramtica,possvelespecificarqualquerformadetraduodirigidapelasintaxe,
associandovaloresosatributosaossmbolosterminaisenoterminaisdeuma
gramticalivredecontexto.

GramticasdeAtributos
Umagramticadeatributoscompostadeduaspartes:

umagramticalivredecontexto,quedescreveumalinguagem;e
regrasdeclculo,quepermitemcalcularvaloresqueestoassociadosaos
smbolosterminaisenoterminaisdagramtica.

Vejamos,porexemplo,umagramticadeatributosquepermitecalcularovalorem
decimaldeumnmerobinriocompartefracionria:
G=({N,B,I},{0,1},P,N)
P:
(1) NI1.I2
N.v:=I1.v+I2.v

I1.p:=0

I2.p:=I2.l

(2) NI
N.v:=I.v

I.p:=0

(3) I0I1B
I0.v:=I1.v+B.v

I0.l:=I1.l+1

I1.p:=I0.p+1

B.p:=I0.p


(4)

(5)

(6)

IB

B0

B1

I.v:=B.v
I.l:=1
B.p:=I.p

B.v:=0

B.v:=2B.p

Notequealgumasocorrnciasdesmbolosnagramticaestodiferenciadaspor
ndicessuperiores(sobrescritos).IstonospermitefazerrefernciaaoprimeiroIeao
segundoIdaprimeiraregra,porexemplo.Anumeraodasregras(regrassintticas)
tambmserveapenasparafacilidadedereferncia.
Asregrasdeclculopermitemcalcularosatributosv(valor),p(posio)el
(comprimento).Noteque,emN,shrefernciasaovalor(N.v);emB,aovalore
posio(B.veB.p),masemIexistemrefernciasaostrsatributos(I.v,I.p,I.l).
Paracadaregrasinttica,hregrassemnticasquepermitemoclculodealguns
atributos,algumasvezesdadosemfunodeoutrosatributos.Porexemplo,paraa
regra1,temos(entreoutras)aregrasemntica:
N.v:=I1.v+I2.v
ElaindicaqueovalordeNobtidosomandoosvaloresdoprimeiroIedosegundoI.
Essasregrassocriadasporumprocessodeprogramao,pormesteprocessono
especificaasequnciaemqueasregrassemnticasdevemseraplicadas.Omomento
paracalcularN.vnoespecificado,eaaplicaopodeserfeitaqualquermomento,
desdequeI1.veI2.vtenhamsidocalculadosantes.DizemosqueN.vdependedeI1.ve
I2.v.Fundamentalmente,asregraspodemseraplicadasemqualquerordem,desde
queosvaloresusadosnasregrastenhamsidocalculadosantes,ouseja,obedecendoa
relaesdedependnciaentreatributos.
Supondoqueestejamosprocessandoacadeia101.011combasenagramticado
exemplo,construmosarvoresintticaparaacadeiautilizandoumanalisador
ascendente,queresultariaem:

CategoriadosAtributos
Podemosclassificarosatributosemherdadosesintetizados,deacordocomosmbolo
dagramticaaqueestassociado.Estaclassificaosebaseianaposiodosmbolo
naregraeatendeaosseguintescritrios:

Setivermosumaregrar:AX1X2...Xm,eumaregrasemnticaassociadaregrar
permitecalcularumatributoxdeA(A.x:=...),entodizemosqueoatributoxdeA
sintetizado.
Poroutrolado,senaregrar:AX1X2...Xmpodemoscalcularumatributoyde
qualquerumdossmbolosXi,(Xi.y:=...),oatributoydeXiditoherdado.

Destamaneira,aordemdeclculonoarbitrria.Comooladoesquerdodaregra
apareceemcimanarvoredederivao,emgeralosatributossintetizadosso
calculadosemfunodeoutrosatributoscorrespondentesansinferioresnarvore
e,portanto,valoressucessivosdoatributopodemsercalculadossubindoarvore.De
maneiraanloga,osvaloressucessivosdeatributosherdadossoobtidosdos
elementossuperioresepodemsercalculadosdescendoarvore.
Paramaiorclareza,faamosalgumasrestries:

Cadaatributodeveterapenasumaclassificao,sendosintetizadoouherdado.
Isto,umatributoadeumsmboloXnopodesercalculadoumavezquandoo
smboloXseencontraaoladoesquerdodeumaregra,eoutravezquandoXse
encontraaoladodireitodeoutraregra.(Observequeosatributossoassociados
aossmboloseassimpodemosterumatributoherdadoX.a,eoutroatributoY.a
sintetizado).

Todasasregrasdevemapresentarregrassemnticasparacalculartodosos
atributosassociadosaumsmbolo.Isto,numaregraAX1X2...Xmdevemestar
presentesregrassemnticasparaclculodetodososatributossintetizadosdeAe
detodososatributosherdadosdetodososXi.

Umagramticaquesatisfazessasduasrestrieschamadaumagramticanormal.
Retomandonossoexemplo,analisamosqueosatributosN.v,I.v,I.l,B.vso
sintetizadoseosatributosI.peB.psoherdados.Observeque,atravsdaregra(3),
estocalculadososatributossintetizadosdeI0(I0.veI0.l),osatributosherdadosde
I1(I1.p)edeB(B.p).
Assim,aordemdeclculoqueutilizaremosparaatabelaserdadaemtrsetapas:

l(sintetizado)sercalculadoprimeiro,subindoarvore;
p(herdado)sercalculadologodepois,descendoarvore;e
v(sintetizado)sercalculadoporltimo,subindoarvore.

Aordeml,p,vusadaporquenenhumvalordeldependedealgumvalordeoutro
atributo,masvaloresdeppodemdependerdosvaloresdel(naregra1,temosl2.p:=
l2.l)evaloresdevpodemdependerdosvaloresdep(naregra6,temosB.v:=2B.p).

Atabelaabaixoapresentaospassosparaoclculodecadaumdosatributosparao
exemplodado:
N/
atrib.
5/l
11/l
3/l

N/
regra
5/4
11/4
3/3

Nsenvolvidos

Clculo

5(I),7(B)
11(I),13(B)
3(I0),5(I1),6(B)

I.l:=1
I.l:=1
I0.l:=I1.l+1=2

9/l
2/l
8/l
2/p
8/p
3/p
4/p
9/p
10/p
5/p
6/p
11/p
12/p
7/p
13/p
7/v
13/v
5/v
6/v
11/v
12/v
3/v

9/3
2/3
8/3
1/1
1/1
2/3
2/3
8/3
8/3
3/3
3/3
9/3
9/3
5/4
11/4
7/6
13/5
5/4
6/5
11/4
12/6
3/3

9(I0),11(I1),12(B)
2(I0),3(I1),4(B)
8(I0),9(I1),10(B)
1(N),2(I1),8(I2)
1(N),2(I1),8(I2)
2(I0),3(I1),4(B)
2(I0),3(I1),4(B)
8(I0),9(I1),10(B)
8(I0),9(I1),10(B)
3(I0),5(I1),6(B)
3(I0),5(I1),6(B)
9(I0),11(I1),12(B)
9(I0),11(I1),12(B)
5(I),7(B)
11(I),13(B)
7(B)
13(B)
5(I),7(B)
6(B)
11(I),13(B)
12(B)
3(I0),5(I1),6(B)

4/v
9/v

4/6
9/3

4(B)
9(I0),11(I1),12(B)

10/v
2/v

10/6
2/3

6(B)
2(I0),3(I1),4(B)

8/v

8/3

8(I0),9(I1),10(B)

1/v

1/1

1(N),2(I1),8(I2)

Representandograficamente,teramos:

I0.l:=I1.l+1=2
I0.l:=I1.l+1=3
I0.l:=I1.l+1=3
I1.p:=0
I2.p:=I2.l=3
I1.p:=I0.p+1=1
B.p:=I0.p=0
I1.p:=I0.p+1=2
B.p:=I0.p=3
I1.p:=I0.p+1=2
B.p:=I0.p=1
I1.p:=I0.p+1=1
B.p:=I0.p=2
B.p:=I.p=2
B.p:=I.p=1
B.v:=2B.p=4
B.v:=0
I.v:=B.v=4
B.v:=0
I.v:=B.v=0
B.v:=2B.p=
I2.v:=I1.v+B.v=
4
B.v:=2B.p=1
I2.v:=I1.v+B.v=

B.v:=2B.p=1/8
I2.v:=I1.v+B.v=
5
I2.v:=I1.v+B.v=
3/8
N.v:=I1.v+I2.v=
5,3/8

GramticasSAtribudas:Umadefiniodirigidapelasintaxesomentecomatributos
sintetizadoschamadadedefinioSatribuda.Natraduodirigidapelasintaxe,
assumesequeosterminaistenhamsomenteatributossintetizadosnamedidaemque
asdefiniesnoprovidenciemquaisquerregrassemnticas.
Exemplodeumagramticadestetipodadoaseguir:
(1)E0E1+TE.val:=E1.val+T.val
(2)ETE.val:=T.val
(3)T0T1*FT.val:=T1.val*F.val
(4)TFT.val:=F.val
(5)F(E)F.val:=E.val
(6)FidF.val:=id.lexval

GramticasLAtribudas:Atributossintetizadossobastanteusadosnaprtica,
entretantoousodeatributosherdadosconvenienteparaexpressarconstruesde

LingagemdeProgramaoemrelaoaocontextoemqueaparecemassim,costuma
seraplicadaaverificaodetiposouaindaparacontrolarseumidentificador
apareceaoladoesquerdo(endereo)oudireito(valor)deumaatribuio.
Exemplodeumagramticadestetipodadoaseguir:
(1)DTLL.in:=T.tipo
(2)TintT.tipo:=inteiro
(3)TfloatT.tipo:=real
(4)LL1,idL1.in:=L.in
incluir_tipo(id.token,L.in)
(5)Lidincluir_tipo(id.token,L.in)

Leiturarecomendada:
Captulo 5, seo 5.1, 5.2, 5.3 e 5.4 do livro Compiladores: princpios, tcnicas e
ferramentas(LivrodoDrago).
Captulo4,sees4.1,4.2e4.3dolivroImplementaodelinguagensdeprogramao:
compiladores.

Exerccios resolvidos:
1. Apesar de a maioria das linguagens de programao de alto nvel exibir diversos tipos de
dependncias de contexto, elas (as linguagens) normalmente so representadas,
sintaticamente, atravs de gramticas livres de contexto. Justifique:
a) O motivo de se usar essa estratgia;
Resp.: Formalismos para representar dependncias de contexto so geralmente mais
complexos e trabalhosos de se usar do que aqueles usados para representar linguagens livres
de contexto.
b) Quais as consequncias prticas na especificao da linguagem-fonte?
Resp.: A linguagem especificada atravs de uma gramtica livre de contexto mais ampla do
que a linguagem desejada.
c) Quais as consequncias prticas no desenvolvimento do compilador para a linguagem?
Resp.: c) Torna-se necessrio introduzir uma fase de anlise de contexto, posterior anlise
livre de contexto, para detectar eventuais erros de contexto contidos no programa-fonte.

2. Responda:

a) Em que consiste a subfase de identificao durante a fase de anlise de contexto?


Resp.: Consiste na vinculao entre todas as referncias e todas as declaraes de nomes.
Essa vinculao feita com base nas regras de escopo da linguagem.
b) Qual a importncia da tabela de smbolos durante essa subfase?
Resp.: A tabela de smbolos (ou de identificao) uma estrutura de dados fundamental para
permitir que a identificao ocorra em um nico passo (no mximo dois, para linguagens que
permitem referncias para a frente). Ela serve para armazenar todos os nomes declarados e
seus respectivos atributos. A busca sempre feita na tabela.
c) Quais as operaes bsicas que devem ser previstas pela tabela de smbolos para suportar
a identificao de linguagens com estrutura de blocos aninhados?
Resp.: Insero de nomes (enter), busca de nomes (retrieve), incio de escopo (open) e fim de
escopo (close).
d) Que tipos de erros so reportados durante a subfase de identificao?
Resp.: Nomes no declarados e nomes declarados mais de uma vez no mesmo bloco.
e) Em que consiste a subfase de verificao de tipos durante a fase de anlise de contexto?
Resp.: Consiste na verificao da adequao dos tipos de operandos aos tipos requeridos
pelos operadores utilizados.
f) De que maneira esto relacionadas as subfases de identificao e de verificao de tipos?
Resp.: A subfase de verificao de tipos depende da subfase de identificao, pois atravs
da vinculao do nome com a respectiva declarao que se obtm o tipo do operando e se
pode efetuar a verificao da assinatura da operao.
g) Que tipos de erros so reportados durante a subfase de verificao de tipos?
Resp.: Tipos incompatveis para a operao em questo.

GeraodeCdigo
Segundoomodelodeanliseesntese,podemosconsiderarqueosmdulosiniciais
docompilador(frontendmodules)traduzemumprogramafonteparauma
representaointermediria,enquantoseusmdulosfinais(backendmodules)geram
ocdigoobjetofinal.

Emboraumprogramafontepossasertraduzidodiretamenteparaalinguagemobjeto,
ousodeumarepresentaointermediriaindependentedemquinatemasseguintes
vantagens:
1)Permitiroreaproveitamentodecdigo,facilitandoaportabilidadedeum
compiladorparadiversasplataformas,umavezqueapenasosmdulosfinaisprecisam
serrefeitosacadanovaplataformadehardware.
2)Autilizaodeumotimizadordecdigoqueanaliseaspectosindependentemente
demquinaemelhoreocdigointermedirioantesdeumatraduodefinitiva.
Existemvriasformasderepresentaodecdigointermedirio;asduasmaiscomuns
so:rvoresdesintaxeetriplasdecdigointermedirio(ouinstruesde3
endereos).

rvoresdeSintaxe
Umarvoredesintaxemostraaestruturahierrquicadeumprogramafonte.
Porexemplo,aatribuio:a=b*c+b*d
poderiarepresentadagraficamentepor:

Que,porsuavez,poderiateraseguinteimplementao:

TriplasdeCdigoIntermedirio
Triplasdecdigointermediriososequnciasdecomandosdaforma:x:=yopz
Nesteformato,oselementosx,yezpodemservariveisouconstantes
definidaspeloprogramador,ouaindavariveistemporriasgeradaspelocompilador;
oelementoopdefineooperador,isto,caracterizaaoperaoaserrealizada
(aritmtico,relacionaletc.),enquantoo:=defineatribuio.
Assim,retomandooexemploanterior(comandodeatribuio),teramosasseguintes
triplas:
#tripla
1
2
3
4
5

operando
1
t1
t2
t3
t4
a

operador
*
U
*
+
:=

operando
2
B
D
B
t1
t4

operando
3
c

t2
t3

TiposdeTriplas
Bastantesemelhantessinstruesemlinguagemdemontagem,podemostertriplas
comrtulossimblicosetriplasparacontroledefluxo.Vejaalgunsexemplosbastante
comuns:
Naturezada
operao
Atribuies:

Exemplodecdigo
x:=yopz

Equivalenteemtriplas
1.

gotoL

1.

t1opyz
x:=t1
t1Uy
x:=t1
t1:=y
x:=t1
Ljmp

ifxoprelythen
gotoL
sub(x1,x2,...,
xn)

1.

Loprelxy

1.

parmx1
parmx2
...
parmxn
callsubn
t1addressy
x:=t1
t1lindy

2.

x:=y

1.

x:=y

2.
1.
2.

Desvio
incondicional
Desviocondicional
Chamadaasub
rotina

2.
...
n.
n+1.

Ponteirose
Endereos

x:=&y

1.
2.

x:=*y

1.

2.

*x:=y

1.
2.

ndicesemarrays

x:=y[i]

1.
...
m.
...
...
...
n.
p.

x[i]:=y

p+1.
1.
...
m.
...
...
...
n.
p.

x:=t1
t1:=y
xsindt1.
/*
*avaliandicedey
*/
/*
*calculaendereode
*ynaposioi
*/
tplindtn
x:=tp
/*
*avaliandicedex
*/
/*
*calculaendereode
*xnaposioi
*/
tnsindy

Oselementoslindesindrepresentam,respectivamente,asoperaesdeload
indirect(quecarregaocontedodeposiodememriadadaporesseendereo)
estoreindirect(quearmazenanaposiodememriadadaporesseendereo).

AGeraodeCdigo
Umaformasimplesdegeraodecdigointermediriopodeserconstrudaapartirdo
mesmomecanismoutilizadoparaaverificaodetipos.Ouseja,umagramticade
atributospodeapresentartambmregrasquepermitamageraodecdigo
intermediriosimultaneamenteaaessemnticasdeverificaodetipo.
Supondoumalinguagemhipotticaqualquer,cujagramticaabaixodefinisseasintaxe
paraexpressesaritmticasecomandosdeatribuio:
Aid:=E
ETE'
E'+TE'|
TFT'
T'*FT'|
Fid|num_inteiro|num_real|(E)

Podemosacrescentaraesparaageraodecdigo,taiscomo:

QuandooanalisadorsintticoaplicarasregrasFidouFnum_intou
Fnro_real,podemossimplesmenteempilharnumapilhadecontrolede
operandos(PcO)oidentificador,nmerointeiroounmerorealcorrespondente
(ouindicadordeondeseencontraesseoperando).
QuandooanalisadorsintticoaplicarasregrasE'+TE'ouT'*FT',sabemos
quesetratadeumaoperaodeadiooumultiplicao.Assim,senohouver
problemasdecompatibilidadeentreostipos,podemosgerarumcdigo
intermedirioutilizandoosdoisoperandosqueestiveremnotopodaPcOe
armazenandooresultadoemumavariveltemporria,quedeverserdeixadana
PcOparaoperaesfuturas.

Reescrevendoasregrasparaintroduziraesdegeraodecdigonecessrias,
teramos:
Aid<G1>:=E
<G2>

E'+TE'<G3>

T'*FT'<G4>

Fid<G5>

<G1>

/*lembrarqualoelementodoladoesquerdodeuma
atribuioeiniciarocontadordevariveistemporrias
em1*/
lado_esquerdo<smbolo;
prox_temp=1;
<G2> /*gerarefetivamenteocdigoreferenteaocomando
deatribuio*/
oper_1<pop(PcO);
emitir(lado_esquerdo,':=',oper_1);

<G3> /*geraodocdigoparaumaadio*/
oper_2=pop(PcO);
oper_1=pop(PcO);
result=make_temp();
emitir(result,'+',oper_1,oper_2);

<G4> /*geraodocdigoparaumamultiplicao*/
oper_2=pop(PcO);
open_1=pop(PcO);
resul=make_temp();
emitir(resul,'*',oper_1,oper_2);

<G5> /*encontrouumidentificadorcomooperador.Ento,
seoescopoforglobal,colocarseunomenaPcO;sefor
local,colocararefernciarelativapilhadoprograma
(p.ex.[base_da_pilha+endereo_relativo])*/
pesquisa_tab_smbolo(smbolo);
sesmbolo.escopo=global
push(PcO,smbolo);
seno
push(PcO,[base_da_pilha+endereo_relativo]);

Fnum_int<G6>

<G6>

Fnum_real<G7>

<G7>

/*encontrouumnmerointeirocomooperador;
colocarnaPcO*/
push(PcO,smbolo);

/*encontrouumnmerorealcomooperador;colocar
naPcO*/
push(PcO,smbolo);

Leiturarecomendada:
Captulo 6, sees6.1 a 6.9do livro Compiladores: princpios, tcnicas e ferramentas
(LivrodoDrago).
Captulo 5, sees 5.1 a5.4do livro Implementao de linguagens de programao:
compiladores.

Exerccios resolvidos:
1. Com base na gramtica dada como exemplo, determine a pilha de anlise e o
conjunto de triplas geradas para o comando: x=a+b*c
Resp.: Procedemos anlise sinttica da cadeia de entrada normalmente, ou seja,
simulando a construo da rvore de derivao atravs de uma estrutura do tipo pilha,
por meio das operaes de Expanso pela Regra X e Verificao do Smbolo S.
Adicionalmente, sempre que encontrarmos na pilha uma instruo para a gerao de
cdigo, grafada por <Gn>, realizamos as tarefas especificadas naquela regra.
Pilha
$A
$<G2>E:=<G1>id
$<G2>E:=<G1>

Entrada
x:=a+b*c$

:=a+b*c$

PcO

$<G2>E:=
$<G2>E
$<G2>E'T
$<G2>E'T'F
$<G2>E'T'<G5>id
$<G2>E'T'<G5>
$<G2>E'T'
$<G2>E'
$<G2><G3>E'T+
$<G2><G3>E'T
$<G2><G3>E'T'F
$<G2><G3>E'T'<G5>id
$<G2><G3>E'T'<G5>
$<G2><G3>E'T'
$<G2><G3>E'<G4>T'F*
$<G2><G3>E'<G4>T'F

a+b*c$

+b*c$

b*c$

*c$

c$

ab

Obs.
ExpandirregraAid:=E
Verifica(id):Ok
lado_esquer=x;
prox_temp=1;
Verifica(:=):Ok
ExpandirregraETE
ExpandirregraTFT
ExpandirregraFid
Verifica(id):Ok
push(PcO,a)
ExpandirregraT
ExpandirregraE+TE
Verifica(+):Ok
ExpandirregraTFT
ExpandirregraFid
Verifica(id):Ok
push(PcO,b)
ExpandirregraT*FT
Verifica(*):Ok
ExpandirregraFid

$<G2><G3>E'<G4>T'<G5>id
$<G2><G3>E'<G4>T'<G5>
$<G2><G3>E'<G4>T'
$<G2><G3>E'<G4>
$<G2><G3>E'
$<G2><G3>
$<G2>
$

abc

at1

t2

Verifica(id):Ok
push(PcO,c)
ExpandirregraT
t1:=b*c
ExpandirregraE
t2:=a+t1
x:=t2
Verifica($):Ok

Assim, a sequncia de triplas (cdigo intermedirio) para a instruo seria:


t1 := b * c
t2 := a + t1
x := t2
2. Compare os modelos de mquina de pilha e mquina de registradores com relao s
vantagens e desvantagens que cada um oferece quando se trata de gerar cdigo para
avaliao de expresses.
Resp.:Ageraodecdigoparamquinasderegistradoresgeralmenteproduzumcdigomais
rpido e compacto do que a gerao de cdigo para mquina de pilha. No entanto, ela
demandaumgerenciamentorigorososobreaalocaoeousodecadaregistradordurantea
compilao do programafonte, o que torna essa fase mais complexa do ponto de vista da
implementao. O uso de registradores, no entanto, facilita a otimizao de cdigo
dependente de mquina por exemplo, o reaproveitamento do contedo previamente
carregadonosregistradores.Ageraodecdigoparamquinadepilhamaissimples,mas
produzumcdigodequalidadeinferior.

Assemblers,LinkeditoreseCarregadores
Viso geral
Tanto os compiladores quanto os montadores produzem um arquivo de binrio contendo o cdigo-objeto
associado ao arquivo-fonte de entrada. Observe que o arquivo com o cdigo-objeto contm parte da
informao necessria sua execuo, mas para que ocorra a execuo preciso que esse cdigo seja
transferido para a memria principal. Caso o cdigo ainda faa referncias a elementos (dados ou rotinas)
definidos externamente ao mdulo, ser preciso integrar essas referncias ao cdigo executvel. Assim,
as etapas envolvidas desde a traduo de um programa at a execuo de um computador passa por
uma srie de mdulos, que so:

Compilador: responsvel pela traduo de um programa descrito em linguagem de alto nvel para
uma linguagem-alvo, de baixo nvel e prxima da linguagem de mquina (quando no a prpria).
Montadores (assembler): encarregados da traduo do programa escrito em linguagem Assembly,
resultando em um programa em linguagem de mquina.
Ligadores (linker / link-editor): responsveis por unir diferentes partes de um programa e construir um
nico executvel. Sua existncia fundamental para permitir a modularizao de um programa e o
uso de bibliotecas estticas.
Carregadores (loader): usualmente parte do Sistema Operacional, este elemento que realiza a
transferncia de um programa do disco para a memria principal.

Vale ressaltar que o projeto de um compilador pode adotar diferentes arquiteturas, combinando e
integrando numa nica ferramenta as funcionalidades de mais de um desses mdulos. Por exemplo:
Montador e carregador integrados;
Montador e carregador independentes;
Montador, ligador e carregador independentes.

Assemblers (Montadores)

de responsabilidade do montador a traduo dos programas escritos em linguagem de montagem


(Assembly) para linguagem de mquina, isto , no conjunto de instrues da arquitetura.
A sintaxe tpica de programas de montagem segue a forma:
[rtulo] [operao] [operando1] [, operando2] ; comentrio
Em que:

Rtulo um marcador empregado para definir um endereo da rea de cdigo.


Operao pode ser tanto um opcode simblico (mnemnico que representa uma instruo) quanto
uma pseudoinstruo, que determina uma orientao para a atuao do montador.
Operandos so os elementos envolvidos na operao, usualmente registradores, constantes ou
endereos de memria.

As funes bsicas de um montador compreendem:

A substituio dos opcodes mnemnicos pelas instrues com os opcodes numricos do conjunto
ISA (Instruction Set of Architecture), seguindo uma tabela de associaes que relaciona o
mnemnico com a instruo-alvo.
A substituio dos endereos simblicos que representam destinos de saltos e constantes por
endereos numricos; ou seja, determinar de maneira absoluta ou relativa em termos do valor do
registrador PC (Program Counter) o endereo de destino dos rtulos.
Reservar espao para dados de acordo com o tipo associado a cada varivel declarada no programa.
Gerar constantes em memria para variveis e constantes, determinando o valor associado ao modo
de endereamento do operando.

Para um melhor entendimento, suponhamos um processador hipottico baseado na arquitetura de VonNeumann e que apresente o seguinte conjunto de instrues:

Opcode

Opcode
Simb
lico

Num
rico

ADD
SUB
MUL
DIV
JMP
JMPN
JMPP
JMPZ
COPY
LOAD
STORE
INPUT
OUTPUT
STOP

01
02
03
04
05
06
07
08
09
10
11
12
13
14

Tama
nho
(em
bytes)

Nmero
de
Operandos

Ao

2
2
2
2
2
2
2
2
3
2
2
2
2
1

1
1
1
1
1
1
1
1
2
1
1
1
1
0

ACCACC+mem(operando)
ACCACCmem(operando)
ACCACC*mem(operando)
ACCACC/mem(operando)
PCoperando
SeACC<0entoPCoperando
SeACC>0entoPCoperando
SeACC=0entoPCoperando
mem(operando2)mem(operando1)
ACCmem(operando)
mem(operando)ACC
mem(operando)entrada
sadamem(operando)
Encerraaexecuo

Assim, o programa escrito em linguagem de alto nvel (dado abaixo, na coluna da esquerda) ser
traduzido pelo compilador para seu equivalente em linguagem de montagem (dado na coluna ao centro),
enquanto o montador far a traduo definitiva do cdigo, resolvendo os endereos e traduzindo os
demais elementos.

Programaem
LinguagemdeAlto
Nvel

ProgramaemLinguagem
deMontagem
(Assembly)

Programaem
LinguagemdeMquina


inta,b,c;
read(a)
read(b)
c=a+b;
write(c);

Rtulo

Mnemnico

Operando

N1:
N2:
N3:

INPUT
INPUT
LOAD
ADD
STORE
OUTPUT
STOP
SPACE
SPACE
SPACE

N1
N2
N1
N2
N3
N3

Endereo

Opcode

Operando

00
02
04
06
08
10
12
13
14
15

12
12
10
01
11
13
14
??
??
??

13
14
13
14
15
15

Os montadores podem realizar duas passagens no arquivo-fonte: a primeira com o objetivo de reconhecer
os smbolos definidos pelo programador (identificadores) e construindo a tabela de smbolos com seus
respectivos valores, enquanto na segunda passagem que efetivamente a gerao do cdigo-objeto
realizada.

Formato do arquivo-objeto
Tipicamente, um arquivo-objeto contm as seguintes informaes:

Cabealho: contm a identificao do tipo de arquivo e dados sobre o tamanho do cdigo e,


eventualmente, o arquivo que deu origem ao arquivo-objeto;
Cdigo gerado: contm as instrues e dados em formato binrio, apropriado ao carregamento;
Relocao: contm as posies no cdigo onde devero ocorrer mudanas de contedo quando for
definida a posio de carregamento; ou seja, a determinao dos endereos que sero utilizados no
programa dados em funo do endereo base de carregamento.
Tabela de smbolos: contm os smbolos globais definidos no mdulo e smbolos cujas definies
viro a partir de outros mdulos;
Depurao: contm referncias para o cdigo-fonte, tais como o nmero de linha, nomes originais
dos smbolos locais e estruturas de dados definidas.

Carregador (Loader)
Se a arquitetura adotada define que a montagem e o carregamento so realizados por mdulos
separados, o montador produzir um arquivo contendo o cdigo de mquina, juntamente com as
informaes necessrias a fim de que o carregador (loader) possa carregar o cdigo de mquina para a
memria e transferir a execuo para o programa carregado.
Uma destas formas carga o chamado carregamento absoluto, em que os endereos so fixos e o
programa carregado sempre na mesma posio. Esse tipo de esquema bastante limitado, porm
permite uma compreenso de detalhes importantes da operao de carregadores e montadores.
A forma mais elementar para a execuo do cdigo de mquina gerado pelo montador ocorre atravs do
esquema assemble and go, no qual um nico programa combina as tarefas associadas ao montador e
ao carregador. Essa estratgia combina as etapas de montagem e carregamento num nico programa e,
portanto, no gera um arquivo com o mdulo-objeto.
Assim que o cdigo de mquina gerado pelo montador, ento colocado diretamente na posio de
memria indicada pelo contador de localizao. Ao trmino da montagem, o programa executvel j
estar na memria e o montador precisa simplesmente transferir o controle de execuo para a primeira
instruo do cdigo gerado.
O mdulo de carregamento para o carregador absoluto composto por dois tipos de registro:

Registro do tipo texto (ou tipo 0): contm informao que deve ser transferida para a memria na
posio indicada.

Registro do tipo fim (ou tipo 1): informao do endereo para incio da execuo do programa, deve
ter apenas uma ocorrncia no fim do mdulo de carregamento.

Suponha que um montador tenha gerado o cdigo relativo ao contedo de dois seguimentos, sendo o
primeiro equivalente a uma rea de dados (variveis do programa), e o segundo correspondendo rea
de instrues, que contm o cdigo de mquina associado a cada instruo do programa. A organizao
do mdulo de carregamento, segundo esse esquema, seria composto por trs registros:
000006000400000000
000004000E30380000600031C0000060024E75
100004000
Os quatro campos do registro significam, respectivamente: tipo, endereo, tamanho (em bytes) e o
contedo do registro. Assim, a interpretao de cada registro dever:
- Como o campo tipo contm valor 0, isso indica que o registro do tipo texto e, portanto, o seu contedo
(dado no quarto campo), cujo tamanho equivale a quatro bytes (informado no terceiro campo), dever ser
transferido memria a partir da posio $ 6000 (de acordo com o endereo que dado no segundo
campo).
De modo anlogo, o segundo registro indica a transferncia, a partir da posio $ 4000 de memria, dos
14 bytes cujo contedo dado armazenado no quarto campo.
Por fim, o ltimo registro est presente para a finalizao do processo de carga, indicando que o controle
de execuo dever ser transferido para a posio indicada no segundo campo (isto , o endereo
$ 4000).
Assim, um algoritmo simples como o que dado a seguir poderia ser utilizado como carregador:

CarregadorAbsoluto(mdulo)
1 arqOpenFile(mdulo)
2 whilenotEndOfFile(arq)
3 doregistroReadLine(arq)
4 tipogetTipoDoRegistro(registro)
5 enderecogetEnderecoDoRegistro(registro)
6 iftipo==0
7 thentamanhogetTamanhoDoRegistro(registro)
8 cdigogetConteudoDoRegistro(registro,tamanh
o)
9 MoveParaMemoria(endereo,cdigo,tamanho)
1 elseGoTo(endereo)
0
Ligadores (Linker)
Tm por principal objetivo juntar diferentes arquivos-objeto, gerando um nico arquivo executvel. Em
outras palavras, o linker recebe como entrada os diversos mdulos que devem ser conectados, gerando
como sada um nico mdulo de carga. Na sequncia, o programa carregador recebe o mdulo de carga
(executvel) como entrada e transfere seu cdigo para a memria, ficando sob sua responsabilidade
apenas os ajustes de relocao de acordo com o endereo base de memria.
possvel adotar estratgias combinadas, porm, ao isolar os procedimentos de ligao e de
carregamento atravs de programas separados, possvel uma economia na quantidade de memria
alocada, haja vista que o carregador compartilha a memria com o programa que est sendo executado.
Um linker deve ser capaz de resolver referncias cruzadas, provenientes de mdulos montados de forma
independente, bibliotecas de funes, fazendo uso de funes cujo cdigo no conhecido em todos os
momentos do processo. Uma referncia cruzada no resolvida resultante de smbolos desconhecidos
dentro de um mdulo e que normalmente so definidos em outros mdulos.

Durante o processo de montagem, o montador deve informar a existncia de referncias cruzadas e criar
uma tabela de uso, inserindo-a juntamente no cdigo-objeto gerado. A tabela de uso tem por objetivo
indicar quais smbolos externos foram utilizados pelo mdulo e onde cada um deles foi referenciado.
Note que, embora uma referncia no resolvida possa ser entendida como um erro do ponto de vista do
montador, na verdade ela pode no ser, uma vez que sua definio pode ter sido feita em outro mdulo
interdependente. Uma forma comum para tratar essa questo a incluso de diretivas de montagem (por
exemplo, a diretiva EXTERN na linguagem C). A desvantagem que um erro de montagem desta
natureza somente detectado durante o processo de ligao, quando todos os mdulos so reunidos e
h ainda alguma referncia no resolvida.

Relocao e Ligao
O esquema de montagem e carregamento absoluto apresenta uma forte limitao: o fato de que o
programador deve ter acesso direto a posies de memria, especificando exatamente em que regio da
memria o programa e seus dados sero carregados.
A memria um recurso controlado pelo sistema operacional e o programador no deve estar preso
necessidade de conhecer posies da memria fsica para que o seu programa funcione corretamente.
Por sua vez, desenvolver um programa completamente independente de sua localizao uma atividade
complexa e, embora possvel, caber ao sistema resolver os problemas relacionados com
posicionamento do cdigo atravs do processo chamado de relocao.
Outro aspecto que tambm requer a colaborao do montador e do carregador para seu funcionamento
a combinao de mdulos interdependentes, mas que tenham sido montados individualmente. Neste
contexto, comum que um mdulo faa referncia a smbolos definidos em outros mdulos e, assim, o
montador recebe a informao de que um smbolo est definido em outro mdulo ou de que um smbolo
estar sendo referenciado por outro mdulo. Esta informao ento registrada junto ao mdulo-objeto
para que seja utilizada pelo carregador, responsvel pela resoluo destes smbolos entre os mdulos
envolvidos.
Os dois tipos de ajustes que podem ocorrer no contedo do mdulo-objeto so:

relocao: ajuste interno ao segmento;


ligao: ajuste entre segmentos distintos.

A atividade de relocao realizada conjuntamente por montadores e carregadores. Os montadores so


encarregados de marcar as posies no cdigo-objeto passveis de alterao, enquanto os carregadores
devem reservar espao suficiente na memria para receber o cdigo de mquina e atualizar suas
posies a partir da localizao base do programa na memria. Assim, o mdulo objeto deve conter
tambm as informaes adicionais que permitam realizar tais ajustes.
Outro tipo de informao que tambm dever estar presente no mdulo-objeto so aquelas acerca das
referncias aos smbolos externos. Neste caso, h duas situaes que podem ser tratadas, e ambas
devem estar presentes no mdulo-objeto:
A primeira situao ocorre quanto um smbolo referenciado no segmento, mas, definido, ocorre em
outro segmento, e usualmente descrito como uma referncia externa (ER).
A segunda aquela em que um smbolo definido neste segmento e poder ser referenciado em outro
segmento, sendo descrito como uma definio local (LD) de um smbolo externamente referencivel.
Num esquema que emprega carregadores de ligao direta, o montador dever incluir no mdulo-objeto
algumas estruturas de dados adicionais que incluam as informaes descritas no pargrafo anterior:

o Dicionrio de Smbolos Externos (ESD), que contm todos os smbolos que esto envolvidos no
processo de resoluo de referncias entre segmentos: smbolos associados a referncias externas
(ER), a definies locais (LD) ou a definies de segmentos (SD);
o Diretrio de Relocao e Ligao (RLD) que, para cada segmento, indica quais posies devero
ter seus contedos atualizados, de acordo com o posicionamento em memria deste e de outros
segmentos.

A partir destas estruturas, o carregador de ligao direta capaz de definir os valores para todos os
smbolos com referncias entre segmentos e reajustar o contedo das posies afetadas pela relocao.

No exemplo que tratamos anteriormente, o montador oferecia como resultado um mdulo objeto com dois
tipos de registros: registro com cdigo de mquina (tipo 0) e um registro de fim (tipo 1). Para o esquema
de ligao direta, este montador deveria ser modificado para fornecer outros dois tipos adicionais: um tipo
para ESD e outro para RLD.
Os registros do tipo ESD contero:

todos os smbolos definidos no segmento que podem ser referenciados por outros segmentos
(lembrando ainda que podem ser de dois tipos: definio do segmento ou definio local); e
os smbolos que so referenciados, mas no definidos no segmento.

Assim, um registro deste tipo apresentar a seguinte estrutura:

Campo
1.
2.
3.
4.
5.

Significado
Tipodoregistro(0),
Smbolo
Tipodedefinio(SDsegmento,ouLD
local)
Endereorelativonosegmento
Campodedimenso,comocomprimentoem
bytes

Neste exemplo, as definies do tipo ER no recebero tratamento diferenciado, e o campo de dimenso


pode indicar tanto o espao ocupado pelos dados de um smbolo (no caso de LD) como a dimenso total
do segmento (no caso de SD).
Os registros do tipo TXT contm o cdigo de mquina e a informao do endereo relativo incorporada.
Assim, o formato deste registro :

Campo
1.
2.
3.
4.

Significado
Tipodoregistro(1)
Endereorelativo
Comprimentoembytes
Cdigodemquina

Registros do tipo RLD indicam quais posies no segmento devero ter contedo alterado de acordo com
os endereos alocados aos segmentos e indicam tambm a partir de que smbolo o contedo dever ser
corrigido. Esses registros tero o seguinte formato:

Campo
1.
2.
3.
4.

Significado
Tipoderegistro(2)
Posiorelativa
Comprimentoembytes
Smbolo(basedeajuste)

Por fim, um registro do tipo END especificar o endereo de incio de execuo para o segmento que
contm a rotina principal, sendo dado na seguinte forma:

Campo Significado
1.
Tipoderegistro(3)
2.
Endereodeexecuo

Imagine que tenhamos um programa composto por dois mdulos: o main e um pgm. O
programa main obtm um valor inteiro entre 0 e 15 de uma varivel chamada DIGIT e coloca na varivel
CHAR a representao equivalente em ASCII (isto , um valor entre 0 e F):

1
2
3
4

MAIN

5
6
7
8
9

ADD_0

CHAR

MOVE.BDIGIT,D0
CMPI.B#10,D0
BLTADD_0
ADDQ.B#(A0
10),D0
ADDI.B#0,D0
MOVE.BD0,CHAR
RTS
DS.W1
ENDMAIN

Observe que o cdigo faz referncia a um smbolo DIGIT que ser definido externamente, pois a rea de
dados do programa define apenas a varivel CHAR (linha 8).
No segmento onde DIGIT efetivamente definido, torna-se necessrio indicar que ele poder ser
referenciado externamente. Neste exemplo, utilizamos a pseudoinstruo GLOB com este objetivo. O
cdigo referente ao programa pgm dado por:

1
2
3
4
5
6
7

PGM

VALUE
DIGIT

GLOBDIGIT
MOVE.WVALUE,D0
MOVE.WD0,DIGIT
RTS
DS.W1
DS.W1
END

A pseudoinstruo GLOB obrigar a criao de um registro do tipo ESD com tipo de definio LD e,
assim, quando a posio relativa deste smbolo for determinada na tabela de smbolos locais, a
informao do registro dever ser complementada.
O montador dever gerar os mdulos-objeto para cada uma das partes e o linker as combinar
produzindo um nico mdulo. Como estamos tratando de um carregamento de ligao direta, o mdulo
nico ser colocado diretamente na memria, sem que seja criado em disco.
Aps a montagem, suponha que o mdulo objeto obtido para o segmento main seja:
0.MAIN.SD.00.1C
1.00.6.103900000000
1.06.4.0C00000A
1.0A.2.6D02
1.0C.2.5E00
1.0E.4.06000030
1.12.6.13C00000001A
1.18.2.4E75
1.1A.2.0000
2.02.4.DIGIT
2.14.4.MAIN
3.00
Observando mais detalhadamente o mdulo, encontramos:

o diretrio de smbolos externos ESD (registros do tipo 0);


o cdigo de mquina gerado TXT (registros do tipo 1);
o diretrio de relocao e ligao RLD (registros do tipo 2); e

o registro de fim de segmento END (registros do tipo 3), que deve especificar a posio relativa de
execuo, que a posio 00.

De modo similar, o segmento pgm poderia ter o seguinte mdulo:


0.PGM.SD.00.12
0.DIGIT.LD.10.2
1.00.6.30390000000E
1.06.6.33C000000010
1.0C.2.4E75
1.0E.2.0000
1.10.2.0000
2.02.4.PGM
2.08.4.PGM
3.
Apresentamos, a seguir, uma implementao possvel para carregador de ligao direta, feita em trs
passos. A primeira etapa, dado pelo algoritmo a seguir, responsvel por alocar espao contguo de
memria suficiente para todos os segmentos.
Para saber quanto espao necessrio, a informao sobre o comprimento de cada segmento
presente em registros tipo ESD, com tipo de definio SD obtida. Os demais tipos de registro no
so processados neste passo. O resultado final deste algoritmo a definio do endereo inicial do
espao de memria, indicado pela varivel ipla, que ir receber todos os segmentos.

CarregadorLigadorDireto_etapa1(listaDeMdulos)
1 total0
2 foreachmduloinlistaDeMdulos
3 doarqOpenFile(mdulo)
4 encontradofalse
5 repeat
6 registroReadLine(arq)
7 tipogetTipoDoRegistro(registro)
8 iftipo=="ESD"
9 thendeftipogetCampoDeDefinio(registro)
10 ifdeftipo=="SD"
11 thentamanhogetTamanhoDoCampo(registro)
12 totaltotal+1
13 encontradotrue
14 untilencontrado
15 CloseFile(arq)
16 iplaAlocaMemoria(total)
Uma vez determinado qual o endereo inicial de carregamento, IPLA (Initial Program Load Address), o
carregador inicia a criao de uma Tabela de Smbolos Externos Globais GEST. Para realizar esta
tarefa, apenas as informaes presentes em registros do tipo ESD (com tipos de definio SD e LD) so
utilizadas. Assim, o segundo passo poderia ser implementado da seguinte forma:

CarregadorLigadorDireto_etapa2(listaDeMdulos,ipla)
1 GESTCriarTabela()
2 tamSeg0
3 iniSegipla
4 foreachmduloinlistaDeMdulos
5 doarqOpenFile(mdulo)
6 whilenotEndOfFile(arq)

7
8
9
10
11
12
13
14
15
16
17
18
19

doregistroReadLine(arq)
tipogetTipoDoRegistro(registro)
iftipo=="ESD"
thendeftipogetCampoDefinio(registro)
ifdeftipo=="SD"
thenvaloriniSeg
tamSeggetCampoTamanho(registro)
elsevaloriniSeg+
getCampoPosicao(registro)
smbologetCampoSimbolo(registro)
InsereNaTabela(GEST,smbolo,valor)
elseiftipo=="END"
theniniSeginiSeg+tamSeg
CloseFile(arq)

Na fase de definio da GEST, um possvel erro que poderia ser detectado a duplicidade na definio
de alguns dos smbolos da tabela, refletindo situaes em que um mesmo smbolo redefinido em
segmentos distintos.
No ltimo passo do processo, o carregador ir realizar a transferncia do cdigo de mquina para a
memria e transferir o controle da execuo do programa para o endereo inicial do programa recmcarregado. O carregador voltar a tomar como endereo inicial de carregamento o valor ipla, lendo
novamente cada mdulo-objeto na sua sequncia original.
A varivel pontoDeIncio registrar a posio de incio de execuo para o segmento que definir um
registro do tipo END com argumento.
Quando um registro ESD for lido, o nico processamento necessrio ser a obteno do comprimento do
segmento, permitindo a atualizao correta da varivel que indica a posio inicial de carga de cada
segmento, iniSeg. Esta informao est no registro ESD com tipo de definio igual a SD (Segment
Definition).
Os registros do tipo TXT devero ter seu contedo transferido para a memria principal. Os contedos de
cada campo do registro (posio relativa ao incio do segmento, tamanho e contedo) so obtidos e o
endereo de destino resolvido tomando por base o valor de iniSeg. Ao final da transferncia, as
posies indicadas em registros do tipo RLD devero ter seu contedo ajustado a partir da informao
registrada na GEST.
Os registros do tipo RLD devem ter suas indicaes de posio relativa corrigida, sendo que o endereo
de memria cujo contedo ser alterado, endereo, obtido a partir da combinao desta informao e
do endereo de incio do segmento, iniSeg. O novo valor especificado pelo campo de smbolo presente
neste registro (o smbolo lido do registro e seu valor obtido a partir de uma busca na GEST). Neste
ponto, possvel detectar erros associados a smbolo que tenham sido referenciados mas no tenham
sido definidos em nenhum mdulo.
Assim, a terceira etapa do carregamento direto poderia ser dada pelo seguinte algoritmo:

CarregadorLigadorDireto_etapa3(listaDeMdulos,ipla,GEST)
1 pontoDeIncioipla
2 iniSegipla
3 tamSeg0
4 foreachmduloinlistaDeMdulos
5 doarqOpenFile(mdulo)
6 whilenotEndOfFile(arq)
7 doregistroReadLine(arq)
8 tipogetTipoDoRegistro(registro)

9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3

switchtipo
case"ESD":
deftipogetCampoDefinio(registro)
ifdeftipo=="SD"
thentamSeggetCampoTamanho(registro)
case"TXT":
endereoiniSeg+
getCampoPosicao(registro)
tamanhogetCampoTamanho(registro)
cdigogetCampoConteudo(registro)
MoveParaMemoria(endereo,cdigo,tamanho)
case"RDL":
endereoiniSeg+
getCampoPosicao(registro)
tamanhogetCampoTamanho(registro)
smbologetCampoSimbolo(registro)
baseBuscaNaTabela(GEST,smbolo)
MoveParaMemoria(endereo,valorAntigo,tamanh
o)
novoValorvalorAntigo+base
MoveParaMemoria(endereo,novoValor,tamanho
)
case"END":
endereogetCampoPosicao(registro)
ifendereonulo
thenpontoDeIncioiniSeg+tamSeg
iniSeginiSeg+tamSeg
CloseFile(arq)
GoTo(pontoDeIncio)

Leitura recomendada:
Captulo 7 do livro Compiladores: princpios, tcnicas e ferramentas (Livro do Drago).
Captulos 7 e 8 do livro Implementao de linguagens de programao: compiladores.

Exerccios resolvidos:
1. Descreva a estrutura de um frame tpico utilizado no ambiente de execuo de uma linguagem de
programao estruturada em blocos. Explique o que e para que serve cada um de seus campos.
Resp.: O frame comporta as variveis locais de cada bloco (acessadas atravs de offsets positivos em
relao ao LB) e tambm as seguintes informaes:

Link dinmico: serve para armazenar o LB do frame anterior;


Link esttico: serve para armazenar o LB do frame mais recentemente ativado e que envolve,
estaticamente, o bloco correspondente ao frame corrente. Serve para acessar variveis no locais.
Endereo de retorno: serve para armazenar o endereo da instruo que deve ser executada no
retorno no bloco correspondente ao frame corrente.
Caso o bloco corrente seja um procedimento ou funo parametrizada, os parmetros so acessados
atravs de offset negativo em relao ao LB.

A base do frame referenciada por um ponteiro fixo durante toda a execuo do bloco, denominado LB.
O topo do frame apontado por um registrador denominado SB, que flutua durante a avaliao de
expresses.

2. Suponha que um endereo ocupe dois bytes, um integer tambm dois bytes, o tipo boolean igual a um
byte e o tipo real, a quatro bytes. Considere ainda a seguinte estrutura de um programa Pascal:

programP;
varA,B:integer;
functionQ(N:boolean):real;
varE,F,G:boolean;
begin
...
end;
procedureR(M:real);
varC,D:real;
procedureS():
varE:real;
begin
...
end;
begin
...
end;
begin
...
end.

a) Considere o fluxo de execuo P R S e determine o endereo de cada uma das variveis e


parmetros visveis (deslocamento + registrador) nessa situao;
Resp.: Os endereos so dados em relao base do frame, indicado pelo ponteiro LB. Assim, teramos
E: 6[LB], C: 6[L1], D: 10[L1], M: -4[L1], A: 0[SB], B: 2[SB]
b) Considere o fluxo de execuo P R S e determine a configurao da pilha de execuo nessa
situao.

Resp.:

Posio
Endereobase:

Topo:

Contedo
A(2)
B(2)
**FrameR**
M(4)
LD(vazioouSB)
LE(vazioouSB)
ER
C(4)
D(4)
**FrameS**
LD(R)
LE(R)
ER
E(4)

c) Considere o fluxo de execuo P R S S Q e determine o endereo de cada uma das


variveis e parmetros visveis (deslocamento + registrador) nessa situao;
Resp.: Neste caso, teramos E: 6[LB], F: 7[LB], G: 8[LB], N: -1[LB], A: 0[SB] e B: 2[SB]
d) Considere o fluxo de execuo P R S S Q e determine a configurao da pilha de execuo
nessa situao.

Resp.:

Posio
Endereobase:

Contedo
A(2)
B(2)
**FrameR**M(4)
LD(vazioouSB)
LE(vazioouSB)
ER
C(4)
D(4)
**FrameS1**
LD(R)
LE(R)
ER
E(4)
**Frame(S2)**
LD(S1)
LE(R)
ER

Topo:

E(4)
**Frame(Q)**
N(1)
LD(S2)
LE(vazioouSB)
ER
E(1)
F(1)
G(1)

You might also like