La Gaceta de Linux ...¡ haciendo a Linux un poco más divertido !
Por Rob Tougher
Traducción al español por José Gregorio del Sol Cobos
el día 20 de Abril de 2004, para La Gaceta de Linux
Este artículo analiza Jython, un proyecto de software que intenta proporcionar integración sólida entre Java y Python. Este artículo requiere una comprensión básica de ambos lenguajes.
Hay muchos lenguajes de programación diferentes. The Language List, una completa base de datos de lenguajes de ordenador, pone un número de unos 2500. Tener diferentes lenguajes es ventajoso para los desarrolladores - cada lenguaje tiene características que son particularmente apropiadas para ciertos tipos de problemas. Por ejemplo, cuando estoy transformando XML, XSLT es mi herramienta elegida (éste es un método popular de implementar HTML para sitios web dinámicos). Al programar aplicaciones en el lado del servidor, prefiero lenguajes como Java, C++ y Python. Creo que en principal consejo para los programadores es "emplea la herramienta correcta para la tarea".
Una desventaja notable de la abundancia de lenguajes es la incapacidad (o dificultad extrema) de reutilizar código escrito en un lenguaje con otro lenguaje. Por ejemplo, suponga que tenía escrita una librería de bases de datos en Java, y que quisiera reutilizarla en Python. Podría escribir una capa de pegamento, empleando una tecnología como COM, CORBA, puertos o SOAP, pero la capa consumiría tiempo para hacerla. Estaría bien si esta capa de pegamento ya existiera, preparada para consumirse con poco o ningún esfuerzo gastado.<7p>
Entre en Jython. El objetivo del proyecto Jython es proporcionar integración sin costuras entre Java y Python. El proyecto contiene dos herramientas principales:
jython - un intérprete de Python escrito al 100 % en puro Java. este intérprete le permite utilizar las clases de Java en sus programas en Python.
jythonc - un compilador de Python que compila la fuente en Python a "bytecode" de Java. Este código resultante se puede interpretar por cualquier Máquina Virtual de Java estándar.
Este artículo proporciona una introducción básica a Jython. Primero describiré la instalación, seguido hablaré sobre el intérprete jython, y terminaré con una discusión sobre el compilador jythonc. Utilizaré los siguientes convenios de nombres cuando me refiera a los diferentes intérpretes, compiladores y proyectos:
jython - con j minúscula, se refiere al intérprete jython
jythonc - se refiere al compilador jythonc
Jython - con J mayúscula, se refiere al proyecto Jython completo. Este proyecto incluye el intérprete jython y el compiladore jythonc.
CPython - se refiere a la implementación en C de Python. Ésta es la implementación con la que más gente está familiarizada.
Python - se refiere al propio lenguaje. Utilizaré este término cuando analice los conceptos de Python independientes de la implementación.
Para usar Jython en sus sistema necesita dos piezas de software: el Java SDK, y la distribución Jython.
Puede obtener el último Java SDK para Linux (1.4.2) en el sitio principal de Java. Sun distribuye el SDK como un solo archivo binario que puede descargar y ejecutar sobre su máquina Linux. Después de que se complete la instalación, el paso que queda es crear una variable de entorno como parte del archivo /.bashrc de la carpeta raíz del usuario:
# # Para el sdk 1.4.2 # export JAVA_HOME=~/apps/j2sdk1.4.2_01 export PATH=~/apps/j2sdk1.4.2_01/bin:$PATH
Observe que también establezco la variable de entorno PATH - lo hago para que pueda acceder a las herramientas de Java de la línea de comandos (java, javac, jar, etc.) desde cualquier directorio.
La última entrega de Jython (2.1) se distribuye desde el sitio principal de Jython. El proyecto Jython proporciona un instalador gráfico escrito en Java y empaquetado como una solo archivo *.class de Java. Cuando uno ejecuta el instalador se le presenta un asistente gráfico de instalación, que te pide especificar el tipo de instalación, aceptar los términos de la licencia, y decir el directorio destino de la instalación. Cuando ésta termina, uno ya está listo para emplear Jython en su máquina. Es útil actualizar las variables PATH y CLASSPATH para que apunten a la recién instalada distribución de Jython. Yo lo hago así en mi archivo ~/.bashrc:
# # Para Jython # export JYTHON_HOME=~/jython-2.1/ export PATH=$JYTHON_HOME:$PATH export CLASSPATH=$JYTHON_HOME/jython.jar:$CLASSPATH
Para comprobar que la instalación tuvo éxito, escriba "jython" en la línea de comandos:
prompt$ jython Jython 2.1 on java1.4.2_01 (JIT: null) Type "copyright", "credits" or "license" for more information. >>>
Si ve lo de arriba, ha instalado Jython con éxito.
El intérprete jython es un intérprete de Python implementado al 100 % en Java. Le permite escribir código Python que acceda a las clases de Java.
La última versión estable de jython, entregada en diciembre de 2001, implementa las características de Python 2.1. Sin embargo, Python ya ha alcanzado la versión 2.3. Esto significa que las características de Python únicas a las versiones 2.2 y 2.3 no están disponibles en la actual versión estable de Jython:
derivación de tipos preconstruidos
descriptores de método y atributo
cambios en el algoritmo de supervisión de clase para jerarquías de clase complicadas.
nuevos métodos preconstruidos para el acceso a métodos
iteradores
generadores
nuevos tipos booleano y de conjunto de datos
codificaciones del código fuente
importación de archivos zip
soporte universal de nueva línea
una función enumerate para bucles más claros
nuevos ganchos import
Una versión alfa de jython, disponible para descargar en el sitio de Jython, implementa una mezcla de Python 2.1 y 2.2 El grupo Jython determina esta versión alfa como una entrega experimental e inestable que contiene cosas conocidas significantes. En otras palabras, use la versión alfa por su cuenta y riesgo
Además de la falta de las características recientes de Python, jython también carece de algunos módulos de Python en las librerías de su implementación. Por encima de esto, hay poca documentación que describa qué módulos se soportan y cuáles no. Si quiere saber si un módulo está soportado, las FAQ sugieren intentar importar el módulo en cuestión. Si la importación falla, puede intentar copiar sobre el correspondiente módulo *.py de la implementación de CPython. Como último recurso, puede pedir ayuda en las listas de correo públicas.
Mientras que el soporte Python den jython está restringido a la versión 2.1, el soporte Java está completamente actualizado. Puede utilizar cualquier código Java desde el intérprete jython. Esto incluye las librerías 1.4.2 estándares, las escritas por terceros, y sus propias librerías.
Por ejemplo, podría usar el Abstract Window Toolkit de Java (AWT). El AWT es una librería de ventanas que proporciona contenedores para la creación de interfaces (ventanas, botones, áreas de texto, etc.) Usted podría escribir código Python que accediese al AWT, y luego correr ese código usando el intérprete jython.
He aquí un ejemplo de usar la funcionalidad de AWT con Python:
#
# file: AWTTest.jy
#
#
# Importar las clases AWT.
#
from java.awt import Frame
from java.awt import Panel
from java.awt import Button
from java.awt import TextArea
from java.awt.event import ActionListener
#
# Definir la clase TestButtonAction. TestButtonAction
# hereda desde la interfaz Java ActionListener.
#
class TestButtonAction(ActionListener):
def actionPerformed(self, e):
textArea.append("Test Button Clicked!\n")
#
# Crear los objetos Marco (Frame), Panel, Botón (Button),
# TextArea y TestButtonAction.
#
frame = Frame("Hello World")
panel = Panel()
button = Button("Test Button")
buttonAction = TestButtonAction()
textArea = TextArea()
#
# Juntarlo todo y mostrar
# la ventana.
#
button.addActionListener(buttonAction)
panel.add(button)
panel.add(textArea)
frame.add(panel)
frame.pack()
frame.show()Puede ejecutar esto usando el intérprete jython:
prompt$ jython AWTTest.jy
Ejecutar este código produciría una ventana parecida a la sifuiente:
El ejemplo crea una ventana y le añade un botón y un área de texto. Cuando aprieta el botón, el texto "Text Button Clicked!" (¡Botón de Texto Apretado!) se anexa a los contenidos del área de texto. El ejemplo muestra unas cuantas características claves de Jython:
Imports - Las clases de Java se importan empleando la sintaxis import estándar de Python. El ejemplo de arriba importa las clases Frame, Button, Panel, TextArea y ActionListener desde el AWT.
Instanciación - Las clases Java se pueden instanciar, y sus propiedades públicas y métodos son accesibles. Esto se muestra con las clases Frame, Panel, Button y TextArea.
Herencia - usted puede definir una clase python que derive de una clase Java, y luego pasar la clase Python a código Java que espere una clase Java como entrada. El ejemplo pasa la clase TestButtonAction al método addActionListener() de la clase TestButtonAction.
La segunda herramienta que Jython proporciona es jythonc. jythonc compila el código fuente Python a bytecode de Java. Éste se puede ejecutar usando una Máquina Virtual de Java normal.
(El bytecode de java es el lenguaje intermediario que ejecuta la Máquina Virtual de Java. Cuando compilas un archivo fuente de java con javac, la salida de la compilación es un fichero con extensión .class. Éste contiene bytecode de java, que uno puede ejecutar usando la Máquina Virtual de java. Para más información sobre el bytecode y la JVM, eche un vistazo a The Java Virtual Machine Specification ("Especificación de la Máquina Virtual de Java))
jythonc sufre el mismo mal que el intérprete jython en cuanto a las características - la última entrega de jythonc implementa características de Python 2.1. Más aún, la versión alfa de Jython contiene un compilador jythonc que básicamente no ha cambiado desde la última entrega. Parece como si jythonc fuese a estar pegado a la versión 2.1 durante un tiempo.
Al compilar una clase de Python con jythonc, uno necesita proporcionar información extra sobre cada método accesible públicamente en su clase. Esta información incluye el tipo de devolución, los argumentos, los tipos de los argumentos, la cláusula "throws" y la declaración de control de acceso ("private", "public" o "protected"). Esta información se puede proporcionar de dos maneras:
Herencia - usted deriva su clase Python de una clase Java ya existente o de un interfaz que defina los métodos accesibles públicamente, y sobreescribe dichos métodos en su clase Python. La clase Java base proporciona la información que necesita la JVM.
"Docstrings" - usted describe la firma de cada método en su docstring. Éstas necesitan seguir un convenio especial para estar disponibles para la JVM.
Por ejemplo, usted podría escribir un servlet de Java en Python (los servlets son clases de Java que se ejecutan dentro de contenedores de servlets, como Tomcat y Jetty, y responden a las peticiones de las páginas web). Usted podría crear una clase Python que derivase de HttpServletRequest, compilarla con el compilador jythonc, y ejecutar el bytecode dentro de un contenedor de servlets.
El siguiente es un servlet sencillo escrito en Python:
#
# archivo HelloWorldFromJython.py
#
import os
from javax.servlet.http import HttpServlet
class HelloWorldFromJython(HttpServlet):
def service(self, request, response):
response.setContentType("text/html")
out = response.getOutputStream()
print >>out, """<html>
<head>
<title>Hello World Servlet</title>
</head>
<body>
<p>Hello World From Jython!</p>
<p>os.getcwd() == """ + str(os.getcwd()) + """</p>
</body>
</html>"""
Puede ejecutar este ejemplo usando Tomcat. La instalación de Tomcat es directa - sólo requiere descargar la distribución y extraerla a su disco duro. Debería crear una variable de entorno llamada TOMCAT_HOME y establecer su valor al directorio raíz de Tomcat:
# # Para Tomcat. # export TOMCAT_HOME=~/apps/jakarta-tomcat-4.1.27/
El siguiente paso es compilar el servlet de Python con el compilador jythonc (observe que la variable de entorno CLASSPATH necesita ser actualizada para incluir el archivo servlet.jar):
prompt$ export CLASSPATH=$TOMCAT_HOME/common/lib/servlet.jar:$CLASSPATH
prompt$ jythonc --deep HelloWorldFromJython.py
processing HelloWorldFromJython
processing javaos
processing string
processing UserDict
processing copy
processing repr
processing javapath
processing re
processing sre
processing sre_constants
processing sre_compile
processing copy_reg
processing sre_parse
Required packages:
java.lang
org.python.core
java.io
javax.servlet.http
Creating adapters:
Creating .java files:
sre_constants module
javaos module
sre module
javapath module
re module
string module
sre_compile module
copy_reg module
HelloWorldFromJython module
HelloWorldFromJython extends javax.servlet.http.HttpServlet
UserDict module
sre_parse module
repr module
copy module
Compiling .java to .class...
[snip]El compilador jythonc crea un directorio llamado "jpywork" en su directorio actual. Este directorio contiene el archivo .class de salida de la compilación de jythonc, junto con los archivos de soporte.
El siguiente paso es desplegar los archivos binarios .class al directorio de las aplicaciones web del servidor. Normalmente usted crearía una nueva aplicación web para sus servlets, pero para este ejemplo puede usar la aplicación web "examples" que viene con Tomcat. Cree un nuevo directorio dentro de esa aplicación web y copie allí los archivos de clase:
prompt$ mkdir $TOMCAT_HOME/webapps/examples/WEB-INF/classes/HelloWorldFromJython prompt$ cp jpywork/*.class $TOMCAT_HOME/webapps/examples/WEB-INF/classes/HelloFromJython/
Ahora que el servlet Python ha sido compilado y desplegado en el servidor Tomcat, y que el archivo jythonc.jar se ha incluido en el directorio lib, puede ejecutar el servidor Tomcat:
prompt$ $TOMCAT_HOME/bin/startup.sh Using CATALINA_BASE: /home/robt/apps/jakarta-tomcat-4.1.27 Using CATALINA_HOME: /home/robt/apps/jakarta-tomcat-4.1.27 Using CATALINA_TMPDIR: /home/robt/apps/jakarta-tomcat-4.1.27/temp Using JAVA_HOME: /home/robt/apps/j2sdk1.4.2_01
Debería poder acceder a su servlet Python usando la siguiente URL:
http://yourmachine:8080/examples/servlet/HelloWorldFromJython/HelloWorldFromJython
El servlet producirá una salida similar a lo siguiente:
prompt$ wget http://yourmachine:8080/examples/servlet/HelloWorldFromJython/HelloW
orldFromJython
prompt$ cat HelloWorldFromJython
<html>
<head>
<title>Hello World Servlet</title>
</head>
<body>
<p>Hello World From Jython!</p>
<p>os.getcwd() == /home/robt/apps/jakarta-tomcat-4.1.27/bin</p>
</body>
</html>Este artículo servía como una introducción al proyecto Jython. Para más información sobre los subproyectos presentados en este artículo, prueba los siguientes enlaces:
Jython, Python, Java - sitios web para los lenguajes de programación Jython, Python y Java
Tecnología de Servlet de Java - información sobre servlets de java.
Historia de los Lenguajes de Programación - una línea del tiempo visual de los principales lenguajes de programación, mostrando las relaciones entre ellos.
La Lista de Lenguajes - una lista completa de lenguajes de programación. ¡Hay cerca de 2500 lenguajes incluidos!
Rob
es un desarrollador de software en el área de Nueva York