Notas sobre o processador picoJava. O processador picoJava é um processador destinado a executar directamente código Java compilado, de acordo com as especificações JVM (Java Virtual Machine). Para uma melhor compreensão deste processador, das suas características e das suas vantagens, é conveniente uma explicação prévia sobre o funcionamento de máquinas virtuais e de formas de execução de linguagens, interpretadas ou compiladas, neste caso particular a linguagem Java. Um processador só tem capacidade para entender uma linguagem, a linguagem máquina, que difere de processador para processador. Assim, se pretendermos executar uma sequência de instruções (programa), teremos de a fornecer ao processador (máquina) na linguagem que este entende. No entanto, como esta linguagem é normalmente muito primária e detalhada, optou-se por criar linguagens mais integradas e funcionais. O problema é que um programa escrito nesta linguagem não é entendido pela máquina, pelo que é necessário um processo intermédio para efectuar esta adaptação. Este processo pode ser efectuado de duas formas: • Interpretação - uma interpretação instrução a instrução, em que cada instrução de nível superior é convertida no código máquina respectivo que vai sendo executado à medida que o programa decorre. • Compilação – O programa é integralmente convertido (traduzido) para a linguagem máquina e pode então ser executado como se tivesse sido directamente produzido para essa máquina. Desta forma podemos considerar que a máquina base acrescida do software capaz de efectuar a interpretação, ou compilação, de uma nova linguagem, constitui uma máquina virtual. A máquina M0 aceita a linguagem própria L0. Se existe uma forma de adaptar uma linguagem L1 à máquina M0, pode-se considerar que existe uma máquina M1, embora se trate de uma máquina virtual. Se agora se considerar a existência de um software capaz de adaptar uma nova linguagem L2 à máquina virtual M1, ou mesmo directamente à máquina M0, pode-se igualmente conceber a existência de uma máquina virtual M2. É possível projectar este raciocínio para n níveis, concebendo a existência de n máquina virtuais, numa única máquina real. Uma máquina onde existem vários níveis é referida como uma máquina multinível. É importante referir que se um compilador consegue gerar um código optimizado para a máquina M0, dispensando as máquinas virtuais intermédias, em especial os processos de interpretação que estas possam efectuar durante a execução do programa, consegue-se obter uma melhor eficácia e consequentemente melhor velocidade. Isto só é parcialmente verdade no caso de um interpretador, pois é normal o próprio processo de interpretação degradar a velocidade. Devido a diversos factores tais como o aumento de complexidade das máquinas, as necessidades de uniformização do seu funcionamento e o acesso a periféricos, as linguagens de programação actuais disponibilizadas aos utilizadores ( C/C++, Fortran, Pascal, etc.) encontram-se normalmente num nível bastante elevado. Considerando que um computador moderno terá pelo menos 5 níveis bem determinados, sendo estes Máquina, Microarquitectura, Instruction Set, Sistema operativo e programas do utilizador , os compiladores ou interpretadores são executados neste ultimo nível, produzindo código adaptado aos diversos níveis inferiores. A linguagem Java é um caso especial de linguagem de programação, pois foi criada com o objectivo de ser independente da plataforma em que é executada, além de gerar um código pequeno. A forma de obter esta esta portabilidade é criar em cada tipo de plataforma uma máquina virtual capaz de reconhecer a linguagem Java. Assim surgiu a JVM (Java Virtual Machine). A JVM é um software necessário à maioria dos computadores para efectuar a interpretação do código Java para a linguagem do processador (M0), ou pelo menos para alguma das máquinas virtuais existentes no computador. A JVM pode também funcionar sob a forma de compilador, efectuando a compilação antes de proceder à execução do programa (JIT – Just in Time compilation). Conforme referido anteriormente, se o código compilado for optimizado para o processador (nível M0), obtém-se uma maior eficácia, visível normalmente em termos de velocidade. É isto que se passa no caso do processador picoJava. O processador picoJava for criado após a especificação da JVM com o objectivo de optimizar a execução de código Java, acelerando-a. Para atingir este objectivo o picoJava executa parte das instruções do código Java directamente, optimiza a sincronização de fios de processamento e optimiza a gestão de variáveis locais, conseguindo um menor numero de CPI (Ciclos de relógio Por Instrução). No caso da segunda versão deste processador, o picoJava II, acrescenta ainda optimização na execução de instruções de C/C++ e melhorias a nível de pipeline, de 4 para 6 níveis. É possível a configuração de acordo com o objectivo seu funcionamento entre consumo, tamanho, e velocidade. Além das optimizações referidas, o picoJava disponibiliza instruções para uso exclusivo do sistema operativo, para gestão do cache e acesso a registos. No que diz respeito a hardware o picoJava apresenta ainda cache de stack, instruções e dados. No caso do stack o cache armazena até 64 posições, enquando que no caso de instruções e dados o cache é de 16Kbyte para cada, configuráveis em blocos de 0 a 16Kbyte. A unidade de cálculo inteiro é de 32 bits e a de cálculo em virgula flutuante é opcional, sendo também de 32 bits. O Picojava disponibiliza 16 portas I/O programáveis, o que dispensa a utilização de controladores de I/O, comuns noutras arquitecturas. Mas as vantagens do picoJava não são só a nível do processador mas também da arquitectura que implementa. Pode-se usar um bus PCI para acesso a periféricos ou memória, sendo o acesso a este bus gerido pelo controlador de memória. Este controlador permite ainda a ligação directa a uma flash PROM e uma DRAM. A PROM destina-se a armazenar o programa a executar e a DRAM a ser usada como memória de dados. É também possivel a ligação a um interface de I/O que disponibiliza as portas série e paralelas comuns nos PC’s. Este processador destina-se a ser usado em dispositivos de eletrónica de consumo (TV’s, Videos, Microondas, Agendas electrónicas, etc.) daí a importância da sua versatilidade em termos de hardware e do seu baixo custo. Fernando Rui Russell Pinto