Revista Do Linux
 
  
  
   

EDIÇÃO DO MÊS
  Para assinantes

  CD do Mês
  Capa
  Entrevista
  Estudo de Caso
  Desenvolvimento
  Programação
  Internacional
  Distro
assinantes
 

Python e Java

Enquanto a linguagem Java vem ocupando rapidamente o lugar de C na maioria das áreas de aplicação, o Python torna-se mais popular

Nos anos 80 e 90, as linguagens C e C++ foram as escolhas preferenciais para o desenvolvimento de grandes sistemas empresariais ou para aplicativos específicos para a indústria. Grandes pacotes, ERP operando em 3 camadas, controle de equipamentos hospitalares, robôs industriais, instrumentação ou eletrônica embarcada necessitavam do poder e da performance que só a linguagem C era capaz de oferecer. Mas por maior que fosse o poder da linguagem C, ela não era a solução ideal para todos os problemasde programação de computadores. Havia necessidade de produtividade para aplicativos mais simples e de agilidade para a resolução de problemas imediatos. Daí surgiram as linguagens de script, que forneciam uma sintaxe mais fácil e rápida para a escrita de aplicativos, e tomavam emprestado o poder da linguagem C para a confecção dos componentes utilizados na construção dos scripts. No mundo livre, vimos a ascensão de Perl, TCL e PHP, e no mundo proprietário o Visual Basic e seus derivados (VBScript e VBA) foram sucesso absoluto.

O final dos anos 90 e o novo milênio viram a linguagem Java ocupar rapidamente o lugar da linguagem C na maioria das áreas de aplicação. O RMI substituiu o RPC, os EJBs substituíram os objetos CORBA e as máquinas virtuais substituíram os #ifdefs. Não demorou para que as principais linguagens de script do mundo livre recebessem extensões ou "bindings" para a linguagem Java, de modo a poderem usufruir da imensa quantidade de código disponível nesta linguagem.

Python e Jython

A linguagem Python é uma das linguagens de script do mundo livre que vem ganhando popularidade rapidamente, ocupando o lugar que era, em geral, reservado à Perl ou TCL como ferramenta para resolução rápida de problemas. Visite qualquer site ou leia qualquer livro sobre UML, Extreme Programming ou Orientação a Objetos em geral e você verá que, embora o foco seja na maioria das vezes em C++ ou Java, o Python é sempre citado e elogiado.

O Python ganhou muita popularidade devido ao seu uso como base do Zope, um servidor de aplicações web. O Zope surgiu como uma ferramenta eficiente para construir páginas web a partir dos seus componentes, como menus de navegação, cabeçalhos e rodapés, e evoluiu para um repositório de objetos semelhante aos fornecidos pelo IIS para objetos COM ou pelo Tomcat para Java Servlets. O maior atrativo do Zope é a sua interface web para o gerenciamento tanto do conteúdo dinâmico quanto do conteúdo estático do site.

Outro motivo da grande popularidade do Python é sua sintaxe moderna. Em vez de seguir a tradição de "linha de comando" das outras linguagens de script, o Python fornece uma sintaxe simples e clara para programação estruturada, além de recursos de orientação a objetos inseridos como parte do design original da linguagem e não como uma extensão definida a posteriori. A facilidade com que diversos recursos como acesso a bancos de dados, XML, GTK+ eoutras tecnologias foram mapea dos para objetos Python logo a tornou a "solução mais fácil" para diversos problemas. Um reflexo da popularidade crescen- te do Python pode ser observado no fato de que grandes distribuições do GNU/Linux estão passando a desenvolver suas ferramentas administrativas em Python em vez de Perl ou TCL. Outro reflexo é o suporte do padrão Xprogramming ao Python através do framework PyUnit. Se você não conhece Xprogramming, não sabe o que está perdendo.

A primeira tentativa de realizar a interface entre Python e Java foi o JPI (Java Python Interface), que utilizava a API JNI (Java Native Interface), para a interface entre Java e C. Com o JNI é possível embutir uma máquina virtual Java (JVM) em um aplicativo Python. A mesma abordagem foi utilizada pelo módulo PyJava. Esta é a estratégia utilizada por praticamente todas as outras linguagens de script - é a mais direta, mas gera problemas como:

  • A comunicação é unidirecional - em geral apenas a linguagem de script consegue chamar o código Java, e não o contrário.
  • A portabilidade dos módulos JNI é problemática, as- sim como a portabilidade de módulos escritos em C. Além das questões de sistema operacional, arquiteturado processador e compilador C utilizado, temos as diferenças de implementação entre as diferentes máquinas virtuais Java.
  • A invocação de código Java gera um overhead considerável, pois devemos iniciar uma máquina virtual Java, muitas vezes executando em um processo separado.

    Em pouco tempo surgiu outra alternativa, inicialmente chamada JPython e depois rebatizada para Jython. Ela consiste na reescrita do interpretador Python em Java, e de um compilador Python que gera bytecodes para uma máquina virtual Java. Esta abordagem traz as seguintes vantagens:

  • A comunicação é bi-direcional: código Java também pode chamar código Python. Na verdade, classes definidas em Python estão disponíveis para aplicações escritas em Java como se fossem classes Java.
  • É fácil utilizar a imensa API padrão do Java em aplicações Python, e não apenas classes que haviam sido escritas ori- ginalmente para serem chamadas por código Python.
  • Classes Python podem herdar de classes Java e vice-versa. Ou seja, podemos criar Applets, Servlets, Beans ou mesmo EJBs em Python. Podemos também usufruir de recursos como RMI.
  • O interpretador ou o sistema de suporte de tempo de execução do Python é extremamente simplificado, pois pode usufruir de toda a infra-estrutura fornecida pela máquina virtual Java.

    Os desenvolvedores do Python consideram que Java é uma linguagem bem melhor do que C para construir o interpretador e as bibliotecas Python. As vantagens eram tantas que, em pouco tempo, o desenvolvimento do JPI e do PyJava estagnaram. Além dos recursos da linguagem Java em si ("no segmentation faults"), o fato de já haver JVMs amplamente disponíveis torna bem mais fácil portar o Jython do que o Python original, chamado de CPython para diferenciá-lo da implementação em Java. O interpretador CPython já era baseado em uma máquina virtual que executava uma espécie de bytecode, de modo que transferir isso para uma JVM significou pouco trabalho.

    Atualmente temos o CPython e o Jython evoluindo em paralelo, mas procurando manter a compatibilidade em termos da sintaxe da linguagem e das bibliotecas padrão. As principais diferenças entre os dois estão (1) no suporte a extensões escritas em C ou em Java e (2) nas diferenças semânticas impostas pela máquina virtual Java, como coleta de lixo x contagem de referências (que é uma grande dor-de-cabeça para os desenvolvedores Python tradicionais), não-garantia da execução dos destrutores e herança simples.

    Hoje o interpretador CPython é mais rápido do que o Jython, resultado da sua maior maturidade. Entretanto, se compararmos o código "compilado" (parabyte-codes) gerado pelos dois interpretadores, existem situações onde o código gerado pelo Jython é tão ou mais rápido do que o código gerado pelo CPython.

    Arquitetura do Jython

    O Jython possui três componentes fundamentais:

    1.Um analisador sintático para a linguagem Python, escrito com o JavaCC (uma espécie de yacc escrito em Java). O resultado desta análise é uma árvore sintática formada por objetos Java que descrevem as operações do programa Python.

    2. Um compilador que processa a árvore sintática gerada pelo analisador sintático e gera bytecodes Java que podem ser executados diretamente pela JVM. Este compilador é escrito em Python, o que atesta o poder da linguagem. Python é a única linguagem de script poderosa o suficiente para compilar a si mesma.

    3. Uma biblioteca de classes Java (a maior parte delas escrita origialmente em Python e compilada com o próprio Jython) que fornee o suporte de tempo de execução para a semântica do Python.

    Podemos utilizar o interpretador Jython, invocado pelo comando jython, e digitar e executar diretamente código Python, ou podemos utilizar este interpretador na sintaxe #! padrão do Unix para criar arquivos de script Python executáveis. O comando jython é na verdade um shell script que irá iniciar uma JVM para executar a classe Java (os bytecodes) do interpretador Jython.

    Outra maneira, que é a preferida uma vez que um aplicativo Python esteja pronto para entrega aos seus usuários, é utilizar o comando jythonc, que gera arquivos de classe (*.class) padrão do Java, que podem ser executados fora do ambiente Jython, desde que a biblioteca de classes do Jython esteja disponível no CLASSPATH. É graças a este comando que podemos disponibilizar classes Python para execução em aplicações Java ou em ambientes Java como um Navegador web ou container de Servlets.

    Python vs Java

    Se você já tem experiência em Java, esteja atento para as seguintes diferenças entre as duas linguagens, que existem independente do interpretador escolhido (CPython ou Jython):

  • O Java é fortemente tipada, enquanto que o Python é diamicamente tipada. Ou seja, o Python não obriga a delarar variáveis e permite atribuir qualquer tipo de objeto a qualquer variável.
  • O Python permite a execução dinâmica de código. Ou seja, um programa Python pode construir código Python interativamente e executá-lo imediatamente. O Python também permite que blocos arbitrários de código (em geral précompilados para byte-code)sejam enviados como argumentos para métodos, de modo que não precisamos criar várias classes pequenas como fazemos em Java, por exemplo, para tratamento de eventos ou para fornecer um método de comparação de objetos para ordenação de coleções.
  • O Java estrutura o código em blocos, o Python estrutura pela endentação.

    O Python não é uma linguagem "livre de formato" como a maioria das linguagens populares hoje (a exceção é o Visual Basic). A estrutura de um programa é dada pela endentação das linhas de código e não por marcadores do tipo begin...end (ou {..}). Na verdade, isto ajuda, pois obriga os programadores Python atornarem o código mais legível.

  • Sobrecarga de operadores

    Embora o Java não permita, o Python permite que sejam definidos novos significados para os operadores padrão da linguagem sobre tipos definidos pelo usuário, como o C++ permite. Esta é uma das características que permitem escrever código em Python mais conciso e eficiente do que em Java.

  • Qual classe devo utilizar?

    Como tanto o Java quanto o Python são linguagens de programação de propósito geral, ambas fornecem classes padrão para uma variedade de tarefas, como estruturas de dados, interface gráfica e acesso a bancos de dados. Com o Jython, ambas as linguagens podem utilizar ambas as bibliotecas, e o Jython inclui té interfaces mais "Python-like" para APIs importanes do Java como JDBC. Devido às diferenças semânticas entre as duas linguagens, tente utilizar as classes básicas do Python, sempre que possível, e procure utilizar classes de nível mais alto escritas em Java. Ou o contrário. Procure definir uma das linguagens como a preferencial para o front-end, seja ele em modo texto, GUI ou web, e tente se restringir ao uso de apenas objetos de negócio na outra linguagem.

  • Referências nulas

    O Java identifica referências que não apontam para nenhum objeto válido com o valor null , enquanto que o Python define o valor None para a mesma finalidade.

  • As classes devem ser importadas uma-a-uma

    Ou seja, não podemos fazer coisas como import java.sql.* , mas sim from java.applet import Applet.

    Por outro lado, o desenvolvedor Java irá encontrar no Python algumas características familiares e que dificilmente são encontradas em outras linguagens de programação:

  • Tratamento estruturado de exceções, semelhante aos blocos try..catch do Java

  • Estrutura hierárquica de pacotes

  • Arrays dinâmicos e outras estruturas de dados (coleções) genéricas

    Como é um programa Jython?

    Falamos muito sobre Python e sua relação com Java, mas não mostramos um único exemplo de código. Para satisfazer o curioso, eis um exemplo de Applet que pode ser executado em seu navegador, como qualquer outro Applet escrito em Java, mas utilizando Python. Utilize o comando jythonc para compilar este programa e gerar o arquivo HelloApplet.class que poderá ser utilizado em uma página HTML:

    import java
    class HelloApplet (java.applet.Applet):
    def paint (self, g):
    g.setColor (java.awt.Color.black)
    g.fill3DRect (5, 5, 590, 100, 0)
    g.setFont (java.awt.Font("Arial", 0, 80))
    g.setColor (java.awt.Color.magenta)
    g.drawString ("Hello World", 90, 80)

    Para saber mais

    Sobre a linguagem Python
    www.python.org
    py-howto.sourceforge.net/advocacy/advocacy.html
    www.fsbassociates.com/books/pythonchpt1.htm
    www.python.org/workshops/1997-10/proceedings/beazley.html
    www.pythonjournal.com/volume1/art-interview
    www.python.org/doc/tut/tut.html

    Sobre o interpretador/compilador Jython
    www.jython.org
    www.python.org/workshops/1997-10/proceedings/hugunin.html

    Sobre a linguagem Java
    www.javasoft.com
    www.gcc.org/gcj

    Comparações entre Python, Java e outras linguagens
    home.pacbell.net/ouster/scripting.html
    www.lib.uchicago.edu/keith/crisis

    Sobre Extreme Programming (Xprogramming)
    www.xprogramming.com


    Por Fernando Lozano - fernando@lozano.eti.br


  • A Revista do Linux é editada pela Conectiva S/A
    Todos os Direitos Reservados.

    Política de Privacidade
    Anuncie na Revista do Linux