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