Pesquisar

sábado, 30 de agosto de 2008

Inteligência e otimização direto no compilador Java javac

Java há muito tempo não é vista como uma plataforma computacional lenta. Parte da "nova rapidez" foi conseguida através da evolução do interpretador e do compilador java.
Os esforços e as características contidas no núcleo do interpretador e do compilador (java.exe e javac.exe), a cada nova versão, na maioria das vezes não é visto pelo desenvolvedor.

Vou apresentar um exemplo interessante (ao menos eu achei :D ):
A seguinte classe implementa a idéia da execução de um código de máquina...
public class Cpu6502{
private final static boolean isDebug = true;

public void execute(){
while(true){
int opcode = memoria[PC++];
switch (opcode){
case NOP:
log("nop executado");
break;
case ANDI:
log("and immediate executado");
...
case default:
log("opcode não suportado " + opcode);
break;
}


}

System.out.println("Fim");
}


private void log(String msg){
if (isDebug) System.out.println("6502 Debug > " + msg);
}
}


Até agora nada de novo, é necessário saber quais opcodes ainda não estão implementados ... mas e quando quisermos "tirar o pesso da saída padrão"? Basicamente é só mudar o valor do campo isDebug pra false. Ainda nenhuma novidade!!!

Realmente não há nenhuma novidade visível, veja o que o compilador javac faz quando compilamos a classe com o campo isDebug = false: (pra decompilar usei o Jode)

public class Cpu6502{
private final static boolean isDebug = false;

public void execute(){
while(true){
int opcode = memoria[PC++];
switch (opcode){
case NOP:
log("nop executado");
break;
case ANDI:
log("and immediate executado");
...
case default:
log("opcode não suportado " + opcode);
break;
}


}

System.out.println("Fim");
}


private void log(String msg){

}
}


O compilador viu que esse código nunca seria executado, dado as características do campo isDebug=false(final), então o compilador retira esse bloco... Esperto esse javac não!?
Só pra finalizar, acredito que o java.exe vê que o bloco não faz nada e simplesmente ignora-o. Esses são aqueles tipos de maravilhas invisíveis ao olho do desenvolvedor.

ps: Isso pra não citar o HotSpot... simplesmente fantástico!

terça-feira, 19 de agosto de 2008

Jpcsp - um emulador de psp feito em java

Depois de muito tempo sem postar nada, volto com uma notícia (in)útil: apos tanto admirar e estudar o mundo da emulação, resolvi participar ativamente de um projeto (opensource claro :) ) desses.

Nesse projeto estamos tentando emular um psp (uma máquina portatil da sony muito interessante, com hardware bem similar ao Playstation 2) usando Java como linguagem e OpenGl (JOGL) como nosso motor renderizador. A escolha dessas tecnologias visa um emulador multiplataforma e também um desafio.

O Psp é uma máquina que possui um processaor (RISC) MIPS baseado no R4000 (32-bits), também possui um GPU com 2MB de VRAM: O CPU roda a 222MHz (apesar de ir até 333MHz, por questões de economia de consumo a sony "clocou-o" de 0 a 222Mhz inicialmente, todavia em novas versões do firmware é possível rodar jogos a 333Mhz) e a GPU roda a 166Mhz. Tem 32MB de Ram, algumas versões novas do psp já vem com 64MB, enfim é se trata de um aparelho muito interessante.

O projeto atualmente está rodando algumas demos e o time de desenvolvedores estão integrando código (commit) praticamente todos os dias, a velocidade de desenvolvimento está ótima. Pra quem deseja conhecer mais sobre o projeto há os links abaixo.


Links.
Site Oficial: http://www.jpcsp.org/
Forum oficial: http://jpcsp.org/forum/
Repositório: http://code.google.com/p/jpcsp/source/list