Como construir um compilador utilizando ferramentas Java

Propaganda
Como construir um compilador utilizando
ferramentas Java
Aula extra – A Máquina Virtual Java
Prof. Márcio Delamaro
[email protected]
Como construir um compilador utilizando ferramentas Java – p. 1/2
Processo de Compilação Normal
Myfile1.c
Myfile1.obj
Myfile2.c
Myfile2.obj
Myfile.exe
Myfile3.c
Myfile3.obj
Myfile4.c
Myfile4.obj
~
Compilacao
,
~
linkedicao
,
Como construir um compilador utilizando ferramentas Java – p. 2/2
Processo de Execução Normal
c:> myfile
FFFF:FFFF
Myfile.exe
S.O. (Load)
11111111111111
00000000000000
00000000000000
11111111111111
00000000000000
11111111111111
00000000000000
11111111111111
00000000000000
11111111111111
00000000000000
11111111111111
Myfile
00000000000000
11111111111111
00000000000000
11111111111111
00000000000000
11111111111111
00000000000000
11111111111111
S.O.
0000:0000
Como construir um compilador utilizando ferramentas Java – p. 3/2
Processo de Compilação Java
Myfile1.java
Myfile1.class
Classe Myfile1
Myfile2.java
Myfile2.class
Classe Myfile2
Myfile3.java
Myfile3.class
Classe Myfile3
Myfile4.java
Myfile4.class
Class Myfile4
~
Compilacao
,
Como construir um compilador utilizando ferramentas Java – p. 4/2
Processo de Execução Java
c:> java Myfile1
FFFF:FFFF
java.exe
S.O. (Load)
1111111111111
0000000000000
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
JVM
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
S.O.
0000:0000
Como construir um compilador utilizando ferramentas Java – p. 5/2
Processo de Execução Java
c:> java Myfile1
FFFF:FFFF
Myfile1.class
java.exe
JVM Load
S.O. (Load)
1111111111111
0000000000000
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
JVM
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
S.O.
0000:0000
Como construir um compilador utilizando ferramentas Java – p. 5/2
Processo de Execução Java
c:> java Myfile1
FFFF:FFFF
Myfile2.class
Myfile1.class
java.exe
JVM Load
S.O. (Load)
1111111111111
0000000000000
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
JVM
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
S.O.
0000:0000
Como construir um compilador utilizando ferramentas Java – p. 5/2
Processo de Execução Java
c:> java Myfile1
FFFF:FFFF
Myfile4.class
Myfile3.class
Myfile2.class
Myfile1.class
java.exe
JVM Load
S.O. (Load)
1111111111111
0000000000000
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
JVM
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
0000000000000
1111111111111
S.O.
0000:0000
Como construir um compilador utilizando ferramentas Java – p. 5/2
Código nativo X bytecode
Programa C é transformado em código nativo que é
executado diretamente pelo hardware
MOV AX,[SI]
ADD AX, 23
MOV SI, 0FDC
MOV [SI], AX
Programa JVM também possui operações parecidas
com as de máquina mas estas são executadas pela JVM
ILOAD_3
ICONST_23
IADD
ISTORE_4
Como construir um compilador utilizando ferramentas Java – p. 6/2
O que temos numa classe
Descrição completa do que foi definido dentro da classe
Variáveis
Métodos
Superclasses
Interfaces
Classes referenciadas
Como construir um compilador utilizando ferramentas Java – p. 7/2
classvista
http://home.earthlink.net/~gregstp/ClassVista.html
Como construir um compilador utilizando ferramentas Java – p. 8/2
jclasslib
http://www.ejtechnologies.com/products/jclasslib/overview.html
Como construir um compilador utilizando ferramentas Java – p. 9/2
A JVM
Veremos a seguir qual é a estrutura da JVM, quais os tipos
de dados que suporta, como opera.
Como construir um compilador utilizando ferramentas Java – p. 10/2
Tipos de dados
A JVM reconhece diferentes tipos de dados
Como construir um compilador utilizando ferramentas Java – p. 11/2
Tipos de dados
A JVM reconhece diferentes tipos de dados
Valores armazenados numa variável tem um tipo próprio
e só pode ser utilizado em operações compatíveis
Como construir um compilador utilizando ferramentas Java – p. 11/2
Tipos de dados
A JVM reconhece diferentes tipos de dados
Valores armazenados numa variável tem um tipo próprio
e só pode ser utilizado em operações compatíveis
Tipos primitivos: byte, short, int, long, char, float, double,
returnAddress, (boolean)
Como construir um compilador utilizando ferramentas Java – p. 11/2
Tipos de dados
A JVM reconhece diferentes tipos de dados
Valores armazenados numa variável tem um tipo próprio
e só pode ser utilizado em operações compatíveis
Tipos primitivos: byte, short, int, long, char, float, double,
returnAddress, (boolean)
Tipos referenciados: objetos e arrays
Como construir um compilador utilizando ferramentas Java – p. 11/2
Área de Código
A JVM possui uma área com as informações sobre as
classes carregadas
JVM
Prog. Counter
MyClass1
Cod.
x, y
main
execute
MyClass2
valor
compare
Como construir um compilador utilizando ferramentas Java – p. 12/2
Pilha
Pilha mantém informação sobre métodos sendo executados
JVM
Prog. Counter
Cod.
Pilha
FRAME 1
MyClass1.main
Como construir um compilador utilizando ferramentas Java – p. 13/2
Pilha
Pilha mantém informação sobre métodos sendo executados
JVM
Prog. Counter
Cod.
Pilha
FRAME 2
MyClass1.execute
FRAME 1
MyClass1.main
Como construir um compilador utilizando ferramentas Java – p. 13/2
Pilha
Pilha mantém informação sobre métodos sendo executados
JVM
Prog. Counter
Cod.
Pilha
FRAME 3
MyClass2.compare
FRAME 2
MyClass1.execute
FRAME 1
MyClass1.main
Como construir um compilador utilizando ferramentas Java – p. 13/2
Frame
JVM
Prog. Counter
Cod.
Locais
Pilha
n
Pilha
FRAME 2
3
MyClass1.execute
2
1
FRAME 1
0
MyClass1.main
Como construir um compilador utilizando ferramentas Java – p. 14/2
Frame: locais
Cada variável local ocupa 1 (ou 2) posições do vetor de
variáveis locais
Os valores passados como argumentos ocupam as
primeiras posições deste vetor
public int soma(int x, int y)
{
int k;
k = x + y;
return k;
}
...
u = t.soma(10,20);
Como construir um compilador utilizando ferramentas Java – p. 15/2
Frame: locais
main
u = t.soma(10,20);
t
u
Como construir um compilador utilizando ferramentas Java – p. 16/2
Frame: locais
k
y (20)
x (10)
this
u = t.soma(10,20);
main
t
u
Como construir um compilador utilizando ferramentas Java – p. 16/2
Frame: pilha
A pilha é utilizada para fazer qualquer tipo de operação
Como construir um compilador utilizando ferramentas Java – p. 17/2
Frame: pilha
A pilha é utilizada para fazer qualquer tipo de operação
Instruções para colocar valor no topo da pilha
Como construir um compilador utilizando ferramentas Java – p. 17/2
Frame: pilha
A pilha é utilizada para fazer qualquer tipo de operação
Instruções para colocar valor no topo da pilha
Instruções para operar sobre os elementos no topo da
pilha
Como construir um compilador utilizando ferramentas Java – p. 17/2
Frame: pilha
A pilha é utilizada para fazer qualquer tipo de operação
Instruções para colocar valor no topo da pilha
Instruções para operar sobre os elementos no topo da
pilha
Instruções para armazenar valores que estão no topo da
pilha
Como construir um compilador utilizando ferramentas Java – p. 17/2
Frame: pilha
k = x + y;
ILOAD_1
soma
0
20
10
this
main
20
t
10
u
t
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
ILOAD_1
soma
ILOAD_2
0
20
10
this
10
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
ILOAD_1
soma
ILOAD_2
0
20
IADD
10
20
this
10
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
soma
ILOAD_1
0
ILOAD_2
IADD
20
10
this
30
ISTORE_3
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
soma
ILOAD_1
ILOAD_2
IADD
30
20
10
this
ISTORE_3
return k;
ILOAD_3
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
ILOAD_1
soma
30
ILOAD_2
20
IADD
ISTORE_3
10
this
30
return k;
main
ILOAD_3
IRETURN
20
t
10
u
t
Como construir um compilador utilizando ferramentas Java – p. 18/2
Frame: pilha
k = x + y;
ILOAD_1
ILOAD_2
IADD
ISTORE_3
return k;
main
ILOAD_3
IRETURN
t
u
30
Como construir um compilador utilizando ferramentas Java – p. 18/2
Heap
JVM
Prog. Counter
Cod.
Obj
Obj
Heap
Pilha
Obj Obj
Obj
Obj
Como construir um compilador utilizando ferramentas Java – p. 19/2
Heap: alocação
Existem instruções para alocar espaço par os objetos
new MyClass2
HEAP
30
20
10
this
30
Como construir um compilador utilizando ferramentas Java – p. 20/2
Concorrência na JVM
Como é que se pode ter concorrência em Java?
Troca de mensagens...
JVM1
JVM2
msg
Prog. Counter
Heap
Prog. Counter
Cod.
Heap
Pilha
Cod.
Pilha
msg
Múltiplas threads
Como construir um compilador utilizando ferramentas Java – p. 21/2
Múltiplas threads
JVM
Cod.
Heap
Prog. Counter
Pilha
Como construir um compilador utilizando ferramentas Java – p. 22/2
Múltiplas threads
JVM
Cod.
Prog. Counter
Thread 1
Heap
Pilha
Prog. Counter
Thread 2
Pilha
Como construir um compilador utilizando ferramentas Java – p. 22/2
Múltiplas threads
Codigo
PC
Pilha
PC
Pilha
HEAP
Como construir um compilador utilizando ferramentas Java – p. 23/2
Jasmin: Assembler JVM
.class public MyClass1
.super java/lang/Object
.field x Lpackage2/MyClass2;
.field y Lpackage2/MyClass2;
.method public <init>()V
.limit stack 1
.limit locals 1
Label1:
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
Como construir um compilador utilizando ferramentas Java – p. 24/2
Para visualizar
prog.x.ClasseA.jas
prog.x
ClassA.class
Jasmin
X++
prog.x.ClasseB.jas
ClassB.class
Jasmin
Como construir um compilador utilizando ferramentas Java – p. 25/2
Para visualizar
ClassA.class
prog.x.ClasseA.jas
prog.x
Jasmin
X++
prog.x.ClasseB.jas
ClassB.class
Jasmin
Como construir um compilador utilizando ferramentas Java – p. 25/2
Referências
Jasmin: http://jasmin.sourceforge.net/
JVM e Jasmin: Jon Meyer, Troy Downing, Java Virtual
Machine, O’Reilly
Tim Lindholm, Frank Yellin, The Java Virtual Machine
Specification, The Java Series, Addison Wesley
http://java.sun.com/docs/books/vmspec/
Como construir um compilador utilizando ferramentas Java – p. 26/2
Download