Java Básico de bytecode

Java Básico de bytecode. Linguagem Java.

Princípios:
Source File =
arquivo.java
Class File =
arquivo.class

Compilação:
Todo Source File gera um Class File quando compilado, ou seja Todo arquivo.java Compilado será um arquivo.class

– Cada Class File Contem Instruções, cada instrução possue um opcode de 1 byte (por isso bytecode) e cada opcode possui 1 mnemônico distinto.

Exemplo:

public class MinhaClasse{

}

Compilando esse Source File teremos um Class File.

Como ver os bytecodes de um Class File?
javap -c IdentificadoDoClassFile

Como fazer isso nesse Source File?
javap -c MinhaClasse Vamos obter:
public class MinhaClasse extends java.lang.Object{
public MinhaClasse();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object.“”:()V
4: return

}

Um exemplo de opcode é:
aload_0 e o Mnemônico dele é: 0x9

Qual a relação Processo main?

Toda vez que você tem um processo(para ter um processo é necessário o método main), Você tem uma thread, quando você tem uma thread você tem uma STACK, quando você tem uma Stack em um processo o Frame(Método) que vai ser executado é ou main ou um outro que não falaremos agora, Lembrando que isso é para Processos via linha de COMANDO:

Vamos ao exemplo:

public class MinhaClasse{

public static void main(String[] array){

}
}

Quando você executar o processo acontecerá isso:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

<p>
  <font style="font-weight: bold;" size="5">Mais oque é um frame?</font><br />Toda vez que um método é invocado ele vira um Frame na sua STACK.
</p>

<p>
  <font style="font-weight: bold;" size="5">Quem invoca o método main?</font><br />A própria Instância da JVM operando sobre a Stack
</p>

<p>
  <font style="font-weight: bold;" size="5"><br /></font><font style="font-weight: bold;" size="5">Oque eu tenho dentro da STACK?</font><br />&#8211; <font style="font-weight: bold;">Local Variable</font> = <font size="3">Variaveis Locais ao Frame(ao método)</font><br />&#8211; <font style="font-weight: bold;">Operand Stack</font> = <font size="3">Onde você empurra e relaciona valores, Normalmente em java trabalhamos aqui,também é usada para receber retornos de métodos e para preparar parametros para passar para argumentos.Os valores quando empurrados na Operand Stack ja tem o valor do tipo da variavel(ja tem um espaço daquele tamanho esperando aquele tamanho).</font><br />&#8211; <font style="font-weight: bold;">Referência a Constant Pool</font> = <font size="3">Todo Class file tem uma tabela chamada Constant Pool que é Mapeada para a arquitetura da JVM para a Runtime Constant Pool, que futuramente será feito Dynamic Linking para a real construção da HEAP(isso não importa agora), é o indice 0 da local Variable que é uma Referência a Constant Pool do Class File.</font>
</p>

<p>
  <font style="font-weight: bold;">Então vamos desenhar:</font>
</p>

<p>
  </init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CdmD2AaXIBs/Sp7ljjtnlWI/AAAAAAAAAIU/Wu9ptN1mf24/s1600-h/OperandStackLocalVaribleReferenceConstantPool.png"><img style="cursor: pointer; width: 301px; height: 320px;" src="http://localhost/www/wp0/uploads/OperandStackLocalVaribleReferenceConstantPool-2.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987404171711842" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><br /><font style="font-weight: bold;">Qual a relação disso com bytecode?</font><br />A agora vamos la, essas áreas de memoria são usadas como pilhas Empurando e retirando valores:</p> 

  <p>
    Temos aqui um<font style="font-weight: bold;"> Source File</font>, Por causa do método main podemos ter um processo via linha de comando
  </p>

  <p>
    public class <font style="font-weight: bold;">MinhaClasse</font>{
  </p>

  <p>
    public static void <font style="font-weight: bold;">main</font>(String[] array){<br />int x = 3;<br />int y = 2;<br />int u = x + y;
  </p>

  <p>
    }
  </p>

  <p>
    }
  </p>

  <p>
    <font style="font-weight: bold;">O Class File desse Source:</font><br /><font size="3"><br />Compiled from &ldquo;MinhaClasse.java&rdquo;<br />public class MinhaClasse extends java.lang.Object{<br />public MinhaClasse();<br />Code:<br />0: aload_0<br />1: invokespecial #1; //Method java/lang/Object.&ldquo;</font><init><font size="3">&rdquo;:()V<br />4: return</p> 

    <p>
      public static void main(java.lang.String[]);<br />Code:<br />0: iconst_3<br />1: istore_1<br />2: iconst_2<br />3: istore_2<br />4: iload_1<br />5: iload_2<br />6: iadd<br />7: istore_3<br />8: return
    </p>

    <p>
      }</font>
    </p>

    <p>
      <font style="font-weight: bold;">Vamos por instruções: </font><br />public static void main(String[] array){
    </p>

    <p>
      <font style="font-weight: bold;">Estamos assim:</font>
    </p>

    <p>
      </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CdmD2AaXIBs/Sp7ljjtnlWI/AAAAAAAAAIU/Wu9ptN1mf24/s1600-h/OperandStackLocalVaribleReferenceConstantPool.png"><img style="cursor: pointer; width: 301px; height: 320px;" src="http://localhost/www/wp0/uploads/OperandStackLocalVaribleReferenceConstantPool-2.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987404171711842" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /><font style="font-weight: bold;" size="4">Para abreviar usarei só Local Variable e Operand Stack e os bytecodes agora:</font></p> 

      <p>
        <font style="font-weight: bold;">Agora estamos na instrução:</font><br />int x = 3;<br />int y = 2;<br />int u = x + y;
      </p>

      <p>
        <font style="font-weight: bold;">e em bytecodes:</font><br />0: iconst_3<br />1: istore_1<br />2: iconst_2<br />3: istore_2<br />4: iload_1<br />5: iload_2<br />6: iadd<br />7: istore_3<br />8: return<br /></init></init></font>
      </p>

      <div style="text-align: center; font-family: arial;">
        <font style="color: rgb(0, 0, 0); font-weight: bold;" size="3"><init face="arial"><init>Ou seja dentro do Frame de main</init></init></font><br /><font style="color: rgb(0, 0, 0);" size="3"><init face="arial"><init></init></init></font>
      </div>

      <p>
        <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /><font style="font-weight: bold;">Nesse site explica oque faz os bytecodes:</font><br /><a rel="nofollow" target="_blank" href="http://www.brics.dk/~mis/dOvs/jvmspec/ref-Java.html">http://www.brics.dk/~mis/dOvs/jvmspec/ref-Java.html</a></p> 

        <p>
          <font style="font-weight: bold;">0: iconst_3</font> = Empura 3 na Operand Stack
        </p>

        <p>
          <font style="font-weight: bold;">Desenhando:</font>
        </p>

        <p>
          </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CdmD2AaXIBs/Sp7lBwUC41I/AAAAAAAAAHU/nMrSfo2Mz3c/s1600-h/OperandoStackLocalVariable1.png"><img style="cursor: pointer; width: 244px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable1-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376986823438558034" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</p> 

          <p>
            </font></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init>Lembrado que o 0(zero) da Local variable é a referência a Constant Pool, simplesmente ja esta la, não se importe com ele. <font style="font-weight: bold;">Ele também é conhecido como this.</font></p> 

            <p>
              <font style="font-weight: bold;">1: istore_1</font> = Armazena o valor que estiver no Topo da Operand Stack no index 1 da Local Variable
            </p>

            <p>
              </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CdmD2AaXIBs/Sp7lE_FsEfI/AAAAAAAAAHc/WIXYerw4MNk/s1600-h/OperandoStackLocalVariable2.png"><img style="cursor: pointer; width: 264px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable2-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376986878944481778" border="0" /></a></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /></init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init></p> 

              <p>
                <font style="font-weight: bold;">2: iconst_2</font> = Empura 2 na Operand Stack
              </p>

              <p>
                </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CdmD2AaXIBs/Sp7lIkw-faI/AAAAAAAAAHk/1 0-I3rTGHs/s1600-h/OperandoStackLocalVariable3.png"><img style="cursor: pointer; width: 264px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable3-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376986940597763490" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</p> 

                <p>
                  </font></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init><init><font style="font-weight: bold;">3: istore_2</font> = Armazena o valor que estiver no Topo da Operand Stack no index 2 da Local Variable</p> 

                  <p>
                    </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CdmD2AaXIBs/Sp7lL_bRfkI/AAAAAAAAAHs/HK7BUPXaehQ/s1600-h/OperandoStackLocalVariable4.png"><img style="cursor: pointer; width: 262px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable4-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376986999294099010" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /><font style="font-weight: bold;">4: iload_1 </font>= Carrega o inteiro que estiver no index 1 da Local Variable(Lembrando que java trabalha com cópias de valores(O valor é COPIADO))<br /></init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CdmD2AaXIBs/Sp7lPoI1gLI/AAAAAAAAAH0/9nEopqmL344/s1600-h/OperandoStackLocalVariable5.png"><img style="cursor: pointer; width: 262px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable5-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987061762228402" border="0" /></a></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /></init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /><font style="font-weight: bold;">5: iload_2</font> = Carrega o inteiro que estiver no index 2 da Local Variable(Lembrando que java trabalha com cópias de valores(O valor é COPIADO))</p> 

                    <p>
                      </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CdmD2AaXIBs/Sp7lYFUg4FI/AAAAAAAAAH8/og6WASmLrbc/s1600-h/OperandoStackLocalVariable6.png"><img style="cursor: pointer; width: 262px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable6-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987207034789970" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</font></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init face="arial"><init><br /><font style="font-weight: bold;">6: iadd</font> = Pega os 2 primeiros valores do topo da Operand Stack e soma eles</p> 

                      <p>
                        </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CdmD2AaXIBs/Sp7lcFx1H5I/AAAAAAAAAIE/tBXh1emwChw/s1600-h/OperandoStackLocalVariable7.png"><img style="cursor: pointer; width: 262px; height: 122px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable7-3.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987275877228434" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</p> 

                        <p>
                          </font></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init><init><font style="font-weight: bold;">7: istore_3</font> = Pega o inteiro que estiver no topo da Operand Stack e armazena no index 3 da Local Variable</p> 

                          <p>
                            </init></init></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CdmD2AaXIBs/Sp7lf1FbK2I/AAAAAAAAAIM/FKbOCDrEpv8/s1600-h/OperandoStackLocalVariable8.png"><img style="cursor: pointer; width: 260px; height: 146px;" src="http://localhost/www/wp0/uploads/OperandoStackLocalVariable8-2.png" alt="Exemplos Java,Linguagem Java, Programação, Java" id="BLOGGER_PHOTO_ID_5376987340115487586" border="0" /></a></font> <font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><font style="font-weight: bold;">Clique na imagem para ampliar</p> 

                            <p>
                              </font></font><font style="color: rgb(0, 0, 0); font-family: arial;" size="3"><init><init><br /><font style="font-weight: bold;">Como não há mais nenhuma instrução, termina-se o processo e perdeu-se os valores.</font></p> 

                              <p>
                                Isso é o bem básico sobre tudo, porem acredito que desenhando tudo fica fácil.<br />Bom é isso<br /><font style="font-weight: bold;">CYA DUDES!!</font>
                              </p>

                              <p>
                                </init></init></font>
                              </p>