2.2. Python es un lenguaje interpretado

En general, se puede decir que un lenguaje es interpretado si sus instrucciones se ejecutan secuencialmente a partir de código fuente. Para ejecutar el código de un lenguaje interpretado, necesitamos un intérprete de ese lenguaje. El intérprete irá recibiendo líneas de código que traducirá a lenguaje máquina para que se ejecute. A diferencia de los lenguajes compilados, no se produce un ejecutable (no, los ficheros *.pyc de Python no son ejecutables). De este modo, de una plataforma a otra, sólo habrá que cambiar el intérprete, no el código... Algún lector avispado ya sabrá que queremos decir con los puntos suspensivos. Si alguien ha programado alguna vez, sabe que, aunque el código es en general multiplataforma (siempre que dispongamos de compilador o intérprete para el lenguaje en cuestión) cada plataforma tiene sus peculiaridades que hay que tener muy presentes a la hora de escribir nuestros programas. Quizá Java sea la excepción.

Ejemplo 2-2. Cuidado con la portabilidad del código en Python

En general, para abrir un fichero en Python tenemos que crear un objeto fichero y abrirlo. Sin embargo no todos los SO abren los ficheros del mismo modo. Por ejemplo, en Windows podemos abrir los ficheros de dos formas, el modo binario y el modo texto. Esto es porque Windows distingue entre ficheros binarios y de texto: los caracteres de fin de línea de los ficheros de texto se alteran ligeramente de forma automática al leer o escribir datos. Esta modificación oculta no afecta en el caso de ficheros de texto ASCII, pero corrompe los ficheros de datos binarios, tales como ficheros JPEG o .EXE.

Aviso

Ten mucho cuidado de utilizar el modo binario al leer y escribir dichos ficheros.

Sintácticamente, en un lenguaje compilado se require que todos los elementos que intervendrán en el programa estén previamente especificados (declarados). Aunque esta es la norma general de los lenguajes compilados, existen excepciones como VB.

El código interpretado es más lento que el compilado por razones obvias. El código compilado sabe en todo momento la memoria que le hace falta y la que le hará falta a medida que se ejecute. El intérprete, sin embargo, tendrá que realizar estas tareas durante la ejecución, sin ningún tipo de previsión, además de la carga adicional de tener que "traducir" las sentencias del lenguaje, al lenguaje que el intérprete comprende.

Sin embargo, en cuanto a la lentitud podemos realizar una observación general y dos particulares de Python:

Si bien los lenguajes interpretados son más lentos que sus equivalentes compilados, también es cierto que llevan menos tiempo de desarrollo, y que como hemos comentado, se trata de programas cortos, en los que no existen diferencias significativas.

En el caso de Python, si necesitamos velocidad en una rutina, siempre podemos implementar esa rutina en C e importarla a nuestro código. Por otro lado, siempre que importemos con éxito un módulo, el intérprete intentará generar un fichero """"compilado"""", los *.pyc. Se trata de ficheros binarios (bytecode) en el "idioma" del intérprete. Se asemejan al código de bajo nivel que genera un compilador Java. Los *.pyc se cargan con más velocidad, pero los tiempos durante la ejecución son los mismos. En ocasiones se utilizan estos *.pyc para no distribuir los ficheros fuente y dificultar la ingeniería inversa.

Ejemplos de lenguajes compilados son Pascal o C entre muchos otros. Como lenguajes interpretados citaremos Python, Perl o Tcl. A medio camino entre compilados e interpretados se sitúa Java. Los compiladores de Java producen un código de bajo nivel que luego es interpretado por la máquina virtual Java de cada plataforma. Así pues podemos decir que es compilado e interpretado al mismo tiempo.