Você está na página 1de 4

: : www.mundoj.com.

br : :

Fernando Paim Lima


(fpaimlima@gmail.com): Graduado em Ciência da Computação
(2005), especialista em Banco de Dados (2006). Atualmente é
mestrando em Engenharia de Sistemas e professor do Instituto
Federal de Educação, Ciência e Tecnologia – Minas Gerais. Tem
Na maioria das vezes, um software experiência na área de Ciência da Computação, com ênfase em
Lógica Fuzzy, Redes Neurais, Programação Web, Programação
científico necessita de alto desempenho Comercial, Banco de Dados, Interoperabilidade entre plataformas e
em operações aritméticas e, realmente, Visão Computacional.

comparada a algumas linguagens de


baixo nível, Java tem um desempenho
duvidoso neste viés. Porém, isso
não inviabiliza o desenvolvimento
científico com Java. Existem soluções
para este problema, e este artigo vem
demonstrar uma que diminui o tempo
de desenvolvimento de um software que
precise resolver (de forma extremamente
confiável) expressões aritméticas e pode
até diminuir o tempo de execução
destas operações.

Java + Máxima
Alternativa para Desenvolvimento Científico
Integrando Java à ferramenta algébrica “Maxima”.

xistem algumas informações equivocadas em algumas Assim o maior “preconceito” com o desenvolvimento Java (por
mídias de comunicação deixando a entender que Java parte de desenvolvedores da área científica) é essa disparidade no
não pode ser útil a cientistas que trabalham com uma desempenho entre Java x Linguagens de Baixo Nível se tratando de
“massa” muito grande de dados e que precisem de várias operações operações aritméticas.
aritméticas.
Este artigo vem propor uma forma alternativa de solução de ex-
De fato, Java não tem a mesma performance que linguagens de bai- pressões aritméticas para softwares desenvolvidos na linguagem de
xo nível como C [7][8] ou a facilidade de programação de Fortran programação Java, utilizando um driver de conexão com o pacote
se tratando de operações aritméticas[1]. Talvez seja por causa destes algébrico Maxima de forma a diminuir o tempo de desenvolvimen-
motivos que existam várias ferramentas algébricas desenvolvidas to, e podendo até diminuir o tempo de execução na solução de
em Fortran, C ou Lisp, e pouquíssimas em Java. expressões aritméticas com altíssima confiabilidade nos resultados
das expressões aritméticas.

62
Ciência e Java Segundo Thomas Wang (2000)[3], o padrão IEEE 754 prevê a
definição de ponto flutuante infinitos, infinitos negativo, zero
Quem acha que Java não é presente no mundo científico precisa negativo, e NaN (não um número). Para entender melhor esse
se informar melhor, pois existem várias ferramentas científicas que padrão, verifique a referência [12]
possuem módulos em Java ou que auxiliam a comunidade de de-
senvolvimento científico Java, como, por exemplo:
- Maple[6]: pacote algébrico proprietário que tem interface gráfica Mas, para não haver problemas de execução de softwares Java em
em Java; JVMs anteriores à 1.2, existe o modificador strictfp que atua na
- Oculus[5]: a representação gráfica interativa de dados financeiros compilação Java (geração de byte codes) obrigando que durante
e eventos, também tem uma implementação Java; sua execução, seja adotada grande parte das regras do padrão IEEE
- JScience[2]: pacote Java científico com suporte para várias áreas 754 para pontos flutuantes, mesmo que a aplicação seja executada
do conhecimento: matemática, física, sociologia, biologia, astro- em JVMs anteriores a 1.2. Abaixo é demonstrado um exemplo de
nomia, economia etc.; utilização do modificador em um método:
- Joone[14]: pacote com ferramentas para se trabalhar com redes
neurais escrito em Java;
- jFuzzyLogic[15]: pacote de ferramentas para se trabalhar com public strictfp void teste() {
Lógica Fuzzy escrito em Java; //...
-JEP Java: Math Expression Parser[19]: pacote Java para analisar e }
avaliar expressões matemáticas.
Além destes exemplos, existem vários indícios de que a utilização Também podemos utilizar este modificador para toda uma classe:
de Java no meio científico vem aumentando, como, por exemplo,
a disponibilização de temas para dissertações em programas de
mestrado[4]. public strictfp class Teste{
//...
Recursos aritméticos da linguagem Java }

Além dos operadores aritméticos clássicos (+, -, *, /, %), Java possui


Deve se observar que mesmo que se tenha um hardware com
a classe Math que é um recurso muito utilizado para operações arit-
capacidade maior de armazenamento e processamento aritmético,
méticas. A classe possui vários métodos úteis como os métodos para
este modificador limita tais recursos extra de hardware[1] (para
potenciação, radiciação, além de métodos trigonométricos como
saber mais sobre este limite, consultar também [18]).
seno, cosseno etc. Como exemplo de utilização da classe Math, o
código Java abaixo imprime na tela seno de 45 graus somado ao
valor do cosseno de 45 graus, matematicamente sen(45)+cos(45) As principais diferenças entre a aritmética de ponto flutuan-
te apoiado pela máquina virtual Java e do padrão IEEE 754
segundo LINDHOLM, T., et.al.(1999) [13] são os seguintes:
System.out.println( Math.sin(45) + Math.cos(45) ); - As operações de ponto flutuante da máquina virtual Java não
lançam exceções em condições excepcionais de operação
inválida, divisão por zero, overflow, underflow, ou inexata.
Recursos numéricos da linguagem Java A máquina virtual Java não trabalha com sinalização (posi-
tivo, negativo) para valores NaN.
Um problema da linguagem quase totalmente resolvido foi a falta - Nas operações de arredondamento da máquina virtual Java,
de aplicação efetiva de grande parte de regras do padrão IEEE 754 os resultados inexatos são arredondados para o valor mais
para ponto flutuante nas primeiras JVMs. Nas primeiras versões próximo representável.
da JVM foram escolhidas duas formas representativas de ponto -Na conversão de um tipo ponto flutuante para inteiro, os va-
flutuante na linguagem, os tipos de dados float e double. O tipo lores decimais são arredondados para zero. A máquina vir-
float trabalha com 4 bits de armazenamento e possui 23 dígitos de tual Java não dá qualquer meio para mudar o modo deste
precisão, já o tipo double trabalha com 8 bytes de armazenamen- arredondamento.
to, e tem 52 dígitos binários de precisão[3]. - A máquina virtual Java não suporta, exatamente como o pa-
drão IEEE 754, os formatos de: ponto flutuante double es-
Foi observado em JVMs anteriores a 1.2 que havia um problema tendido ou float estendido, com apenas algumas exceções.
com os valores-resultados de operações aritméticas que exigiam
vários cálculos com números flutuantes em uma operação, e por Para mais informações sobre tais diferenças, consulte a refe-
rência [13].
isso também se exigia grande precisão numérica. Se houvesse
algum overflow ou underflow durante tais operações, sempre era
retornado um número válido, acarretando erros numéricos[11]. A
partir da JVM 1.2, foi disponibilizado o recurso Strict Float Point Considerações entre Ciência e Java
que restringe operações com valores dos tipos foat e double a se-
rem adequadas à grande parte das regras do padrão IEEE 754[12] Mesmo com tantos exemplos e recursos aritméticos, em compara-
para ponto flutuante[9][11], de forma a corrigir o problema de se ção com linguagens de baixo nível, são raros os softwares científi-
retornar sempre um número válido mesmo ocorrendo overflow cos Java que objetivam ou que utilizam de operações aritméticas
ou underflow durante as operações aritméticas. na própria linguagem. Java não possui o mesmo desempenho
que algumas linguagens de baixo nível se tratando de operações

63
: : www.mundoj.com.br : :

aritméticas [10], além de não obedecer totalmente ao padrão IEEE Pacote


754[13]. Software
Algébrico
Desenvolvido
Maxima
No intuito de se criar uma alternativa a este problema, é de-
maxidriver.jar
monstrada na continuação deste texto, uma forma de realizar
todo o processamento aritmético de um software Java em um Figura 2. Utilização do driver “maximadriver.jar”.
pacote algébrico construído em Lisp, o Maxima melhorando a
performance aritmética e diminuindo drasticamente o tempo de
desenvolvimento. Por enquanto, existem duas formas de conexão, pela classe Connec-
tionMaxima e pela ConnectionMaximaGenerica. Utilizando a
conexão com a classe ConnectionMaxima, ao instanciar o objeto, já
Ferramenta Algébrica Maxima é estabelecida a conexão através de streams, a partir daí, pode-se exe-
cutar quantos comandos (funções aritméticas) forem necessários, pois
Maxima é um sistema de álgebra computacional implementado o software Máxima estará “aberto” internamente em seu software Java.
em Lisp para a manipulação de expressões simbólicas e numéricas,
séries de Taylor, transformadas de Laplace, equações diferenciais Obs.: foram realizados testes com sucesso em ambientes Windows,
ordinárias, sistemas de equações lineares, polinômios etc.[16] mas ainda apresenta instabilidade em ambientes Linux.

Segundo GAT, E. (2000)[17], Lisp é muito mais indicada para Utilizando a conexão com a classe ConnectionMaximaGenerica não
operações aritméticas em termos de desempenho que as Lingua- é aberto um canal de streams na instância do objeto da classe, esse
gens C++ e Java. canal é aberto junto com o envio do comando (função aritmética) e
fechado logo após o recebimento da resposta do Maxima.
Para utilizar o Maxima, basta baixar o software no site do
fabricante [16], instalá-lo, executar seu console e digitar a Obs.: com a classe ConnectionMaximaGenerica foram realizados testes
expressão aritmética que quiser dentro de uma função float(); com sucesso em ambientes Windows e Linux.
e pressionar a tecla enter que será retornado o resultado
em números reais e, se for o caso, em números imaginários. Forma prática
Veja o exemplo abaixo, ele retorna o resultado da operação
“sen(45)+cos(45)”: Abaixo segue a forma de utilização da classe ConnectionMaxima,
analogamente à ConnectionMaximaGenerica.Primeiramente se
adiciona o driver às bibliotecas do seu software. Se sua IDE for o
NetBeans, basta você selecionar o projeto de seu software na aba
projetos, clicar com o botão direito em cima no nome do seu pro-
jeto, clicar na opção propriedades, selecionar a opção bibliotecas,
a partir daí adicionar o arquivo maximadriver.jar às bibliotecas do
seu projeto.

Figura 1. Console xmaxima.


Figura 3. Biblioteca “maximadriver.jar”.
O Maxima também possui várias outras funcionalidades em rela-
ção a cálculo diferencial e integral. Posteriormente, é feita a instância de um objeto da classe Connec-
tionMaxima passando a URL do arquivo de execução do software
“Maxima”:
Materiais e métodos
Está sendo construído (primeiramente pelo autor deste texto) ConnectionMaxima ece =
um driver de conexão entre Java e a ferramenta algébrica Maxima ConnectionMaxima.getInstance(
(protótipo disponível para download no site da revista) que a prin- "C:/Program Files/Maxima-5.21.1/bin/maxima.bat"
cípio será disponibilizado para o uso gratuito, e posteriormente );
será disponibilizado de forma livre para que possa ser melhorado.
Esse driver é indispensável para o propósito deste artigo.
A partir daí, pode-se executar comandos (funções aritméticas) e
obter suas respostas:
Funcionamento do driver
Modelo de funcionamento do driver: String expressao =
JoptionPane.showInputDialog("Digite a expressão");
ece.enviaComando(expressao + ";\n");

64
Software exemplo Nota-se que:
- para a fórmula da densidade populacional, todas as tecnologias
No site da revista, existe para download, um exemplo prático retornaram o mesmo resultado (correto), sendo que a ordem
de utilização do driver proposto neste artigo. Em execução, sua das tecnologias para a velocidade de processamento é a se-
primeira tela (JOptionPane) simplesmente pede que seja digitada guinte: Java + Classe Math, Java + JEP e Java + Máxima;
a URL do arquivo “maxima.bat” em seu diretório raiz. - para a fórmula da energia livre, a tecnologia Java + JEP retornou
o resultado errado e a ordem de velocidade de processamento
continua a mesma;
- para a fórmula da entropia, somente Java + Maxima retornou o
resultado de forma correta, pois a tecnologia Java + JEP retor-
nou um resultado errado, e Java + Classe Math retornou NaN
(provavelmente houve underflow ou overflow).

Figura 4. Software Exemplo – tela 1. Obs1: os resultados obtidos em um computador com o processa-
dor Intel Core 2 Duo T65000 2.1GHz, e memória RAM de 3GB,
Caso o usuário clique em OK, em seguida irá aparecer uma tela no sistema operacional Windows Vista Home Premium 32 bis
em que o usuário deve digitar qualquer expressão aritmética. Service Pack 2.

Obs2: as fórmulas da entropia, densidade populacional e energia


livre estão disponíveis na classe TesteTecnologias.java no projeto
exemplo no site da revista.

Considerações finais
Figura 4. Software exemplo – tela 2. Assim como algumas linguagens de alto nível, Java possui limi-
tações quanto a desempenho a respeito de operações aritméticas,
E finalmente, após o usuário clicar em no botão OK, irá aparecer o mas isso não inviabiliza a utilização de Java na ciência, basta esco-
resultado da operação aritmética calculado pelo pacote algébrico lher a melhor forma de se trabalhar com a linguagem. Utilizando
Máxima. o driver proposto, de fato pode haver certa perda de performance
por causa da troca de informações entre as duas aplicações, mas
há um ganho em confiabilidade de resultados, pois, o Maxima
é uma ferramenta matemática de alta confiabilidade usada no
mundo inteiro por cientistas das mais diversificadas áreas do
conhecimento (engenharias, física etc.) e também há um ganho
muito grande no tempo de desenvolvimento, pois o programador
Software exemplo – tela 3. não precisa fazer módulos (sintáticos, semânticos e aritméticos)
necessários para solução de expressões aritméticas•
Comparações entre Java+Maxima, Java+JEP
e Java+Classe Math
Referências
Java+Maxima Java+JEP Java+Math
[1] http://www.developer.com/java/ent/article.php/631201/Java-as-a-Scientific-
Resultado: Resultado: Resultado:
Programming-Language-Part-1-More-Issues-for-Scientific-Programming-in-Java.
Densidade 7.328457504199093, 7.328457504199093, 7.328457504199093,
htm, Acessado em 02/07/2010
Populacional Duração: Duração: Duração:
[2] http://jscience.org/, Acessado em 02/07/2010
2 milissegundos 0 milissegundos 0 milissegundos
[3] http://www.concentric.net/~Ttwang/tech/javafloat.htm, Acessado em
Resultado: Resultado: Resultado: 02/07/2010
7.389237985167935, 2.3835706919459616, 7.389237985167935, [4] http://www.peb.ufrj.br/noticias/2010-05-26-RelacaoTemas2010.pdf, Acessado
Energia Livre
Duração: Duração: Duração: em 02/07/2010
5 milissegundos 2 milissegundos 0 milissegundos [5] http://www.oculusinfo.com, Acessado em 02/07/2010
Resultado: Resultado: Resultado: [6] http://www.maplesoft.com/, Acessado em 02/07/2010
1.091432967835645 0.9992561797106484, NaN, [7] http://www.sbmac.org.br/eventos/cnmac/xxxi_cnmac/PDF/114.pdf, Acessado
Entropia em 02/07/2010
Duração: Duração: Duração:
24 milissegundos 33 milissegundos 0 milissegundos [8] http://www.ukhec.ac.uk/publications/tw/hpcjava.pdf, Acessado em 02/07/2010
[9] http://www.roseindia.net/help/java/s/strictfp.shtml, Acessado em 02/07/2010
[10] http://www.developer.com/java/article.php/3856906/Java-vs-C-The-Perfor-
Junto ao exemplo de utilização do drivermaxima.jar, no site da mance-Showdown.htm, Acessado em 02/07/2010
[11] http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.
revista existe uma classe que realiza testes simples da tecnologia html#24465, Acessado em 02/07/2010
apresentada neste trabalho: Java+Maxima e de outras tecnologias: [12] IEEE, "ANSI/IEEE Std 754-1985, An American National Standard IEEE Standard for
Java + JEP e Java com a classe Math. Tais testes foram realizados Binary Floating-Point Arithmetic", (1985)
de forma a verificar a confiabilidade das tecnologias visando os [13] LINDHOLM, T., YELLIN, F., The Java Virtual Machine Specification, Second Edition,
Sun Microsystems, 1999.
resultados das expressões aritméticas e o tempo de duração que [14] http://sourceforge.net/projects/joone/, Acessado em 02/07/2010
cada tecnologia executou tal processamento. [15] http://jfuzzylogic.sourceforge.net/html/index.html, Acessado em 02/07/2010
[16] http://maxima.sourceforge.net/, Acessado em 02/07/2010
[17] GAT, E. Lisp as an alternative to Java. Intelligence 11(4), pag. 21-24, 2000.
[18] http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf, Acessado 07/10/2010
[19] http://sourceforge.net/projects/jep/
65

Você também pode gostar