• Últimas noticias

    3. Compiladores e intérpretes

    Tercera entrega  del curso de Java.

    Más allá de que lenguaje de programación y el paradigma que utilicemos el ordenador comprende un solo lenguaje, el lenguaje de máquina, conformado por bits, por lo tanto si no le indicamos en ceros y unos lo que queremos que haga nunca nos va a entender. Es aquí donde entran los conceptos de compilador e intérprete.


    índice de este curso


    Versión de este curso en video


    Si querés podés ver el video correspondiente a este curso


    ¿Qué son los compiladores e intérpretes?

    Al hablar de compilador o intérprete se habla de un programa que se encarga de traducir el código escrito por el programador a código de máquina. La computadora solo entiende ceros y unos por lo tanto si no se le indica que ordenes realizar en forma de ceros y unos no va a entender lo que se le quiere transmitir. Es por eso que este elemento es de vital importancia ya que sin él la máquina no entendería el código de programación que escribimos. Esto es porque se programa en un lenguaje más cercano al lenguaje natural humano y no en el lenguaje que maneja la maquina, incluso si se programara en ensamblador no se estaría programando en ceros y unos, sino que en el medio se ponen palabras que, por ejemplo, indican operaciones, y valores que por lo general no están en binario sino en hexadecimal.

    mov ah,01h  ;Se guarda 01h en el registro ah
    int 21h     ;Se llama a la interrupción 21h
    mov ah,02h  ;Se guarda 02h en el registro ah
    int 21h     ;Se llama a la interrupción 21h
    Ejemplo de programa en lenguaje ensamblador 

    Tanto el compilador como el intérprete son programas que traducen el código que se programa en algún lenguaje a código de máquina. Si ambos hacen lo mismo entonces ¿cual es la diferencia entre estos?

    Compilador 

    El compilador toma el código de fuente escrito en algún lenguaje de programación, lo traduce entero a código de máquina, y luego lo guarda en un archivo ejecutable.

    La traducción la realiza de una sola vez, y al mismo tiempo se encarga de detectar errores. Si existen errores en el código, el programa no compilará y en vez de eso se mostrarán mensajes indicando que errores hay en el programa para poder corregirlos y volver a pedir al compilador que haga la traducción del código.

    Una vez que el programa compila y genera el archivo ejecutable se va a poder correr el programa sobre la plataforma para la cual se programó.

    Para poder asociar un poco mejor el concepto de compilador vamos a hacer una analogía.
    Imaginen que una persona quiere mandar una carta dirigida a otra persona que vive en china, pero que esa persona solo conoce el idioma español y la persona oriunda de china solo sabe chino. Si esta persona escribiera la carta en español y la mandaría por correo a china, cuando la persona en china la reciba, no entenderá nada del contenido de esta carta.


    Si en el medio de este proceso tuviera una persona que trabaje de traductor, podría pedirle que me traduzca la carta al idioma chino, y una vez echo eso mandar esta carta traducida hacia el país destino. En este caso, cuando la carta llegue a china y la reciba la persona correspondiente, va a poder leera y entender lo que dice la misma.
    Esta analogía coincide con el funcionamiento del compilador, quien como mencionamos, traduce el código que se escribió en un cierto lenguaje, al lenguaje de la computadora.

    Volviendo a la analogía vamos a destacar un problema que puede surgir, y que va a resultar útil para luego comparar al compilador del intérprete. Este problema tiene que ver con que la carta que se ha traducido será entendible para cualquier persona que sepa chino, pero si yo quisiera mandar la carta a otro país no sería entendible, esto quiere decir que si la misma carta la mando a Rusia la persona que reciba la carta y sea oriunda de ese país no va a entender el contenido de la misma, si la mando a Francia, Italia, Brasil, Corea, o a cualquier otro país que no hable chino va a suceder lo mismo.

    En términos informáticos esto quiere decir que el compilador genera un archivo ejecutable que solo sirve para la plataforma sobre la cual se hizo el programa. Si quisiera que el programa se ejecutara sobre otra plataforma tendría que encargarme de compilarlo nuevamente pero esta vez para esa plataforma.

    Intérprete

    El intérprete es un programa que traduce el programa que se codificó con un cierto lenguaje de programación a código de máquina. ¿O sea que es lo mismo que el compilador? NO, ya que si bien hace lo mismo la diferencia radica en como hace esa traducción.

    El compilador traduce todo el programa de una sola vez y genera un archivo ejecutable mientras que el intérprete es un programa que reside en memoria y va traduciendo el programa a medida que se vaya necesitando, lo que quiere decir que este intérprete no genera ningún archivo ejecutable, y por tanto el mismo seguirá cargado en memoria hasta que finalice el programa.
    Retomando la analogía anterior imaginemos que la persona de habla hispana ahora viaja a china. Ya no nos sirve el documento traducido porque ahora lo que va a pasar es que esta persona va a hablar con otra de nacionalidad china, y al hacerlo recibirá una respuesta. Pero al no hablar chino, todo lo que diga esta persona no va a ser entendida por la otra persona.

    Entonces en este caso lo que se necesitaría es que el traductor viaje con él, para que al momento de hablar, este haga la traducción y ésta traducción sea transferida a la persona de origen chino. Hay que tener en cuenta que el traductor tendrá que estar en todo momento con la persona ya que cuando necesite hablar con otra persona del país a donde viajo, pueda comunicarle el mensaje que quiera transmitir, lo que tendrá un costo económico mayor. No es lo mismo contratar una persona para traducir una carta, que contratar una persona para ir de viaje y traducir en el momento todo lo que le quiera comunicar a un individuo que no entiende mi idioma.

    Ahora sí, si viajo entonces con el traductor, voy a poder hablar con cualquier persona del país donde viaje, y para sumarle algo mejor, mi traductor es un erudito, o sea, que si ahora viajo a rusia, el mismo va a poder transmitir el mensaje en mi idioma a un ruso, y si despues viajo a francia va a suceder lo mismo.

    Volviendo a problematica que habiamos planteado cuando explicamos el concepto de compilador, la cual radicaba que el documento traducido solo se podía envíar al país para el cual habia elegido traducirse, podemos deducir que con el intérprete desaparece.

    O sea que en términos informáticos el programa que sea traducido por un intérprete podrá ejecutarse en cualquier plataforma sin necesidad de recompilar como sucede con el compilador. Esto quiere decir que un programa que es interpretado puede correr en Windows, Linux, Mac, Android, en celulares, computadoras, televisores, consolas de videojuegos, y en cualquier dispositivo que tenga un sistema operativo.

    Un ejemplo de programas que usan un intérprete son los navegadores web. Se puede programar una página web sin preocuparse en que plataforma debe correr ya que la misma se ejecutará sin ningún problema en cualquier dispositivo.

    Visibilidad del código fuente

    Finalmente hay un detalle que es importante aclarar, y que hace a la diferencia si un programa se compila o lo interpreta. Este detalle tiene que ver con el acceso al código de fuente del programa. Un programa que es compilado y por tanto traducido al lenguaje de máquina evita que una persona tenga acceso al código original del programa, ya que si intentara ver lo que hay en el archivo ejecutable vería todos ceros y unos, mientras que un programa que es interpretado, necesita disponer del código de fuente para ir traduciendolo cuando se lo necesite, por tanto este código estará visible para todo el mundo y volviendo al ejemplo de los navegadores web, es de público conocimiento que se puede acceder al código fuente de la página que se esta viendo (o por lo menos de lo que se conoce como front end). Por tanto este detalle no es menor si es que como propietario del código del programa deseo protegerlo.

    Compilador vs intérprete

    Si se hace una comparativa entre compilador e interprete se puede destacar que el programa que sea compilado será más rápido que uno interpretado, ya que en este caso la traducción se encuentra hecha y la computadora solo tiene que leerla, mientras que el intérprete, al traducir código solo cuando es necesario, se mantiene siempre en memoria y esto tiene un costo que justamente es el tiempo de ejecución del programa.

    Como segundo punto se puede remarcar que un programa compilado solo va a poder ejecutarse en la plataforma para la cual se compiló y si se deseara ejecutar en otra plataforma habría que recompilar el código para la plataforma destino sobre la cual se quiera ejecutar, mientras que, un programa interpretado se podrá ejecutar sobre cualquier plataforma.

    Por último un programa que es compilado genera un ejecutable en código de máquina por lo cual el código fuente estará fuera de las manos de cualquier persona que no sea la propietaria del programa mientras que un programa interpretado tendrá siempre el código fuente a disposición de cualquiera.

    En lo personal me parece que una persona que se dedica a la programación no puede desconocer estos aspectos y solamente codificar en parte de memoria. Si no tenemos la habilidad de poder razonar aspectos que involucran a la programación incluso partiendo de la arquitectura de un lenguaje, a mediano o largo plazo estaremos limitados en aprendizaje o directamente fracasaremos como programadores. Por tanto creo que aunque parezca que son solo definiciones teóricas sin importancia alguna, todo lo explicado hasta ahora tiene un porque y se deberían tener en la memoria, ya que va a servir para entender explicaciones futuras.

    En la próxima entrega conoceremos la historia completa de JAVA, historia que en cualquier fuente está resumida, y que para poder escribirla llevo mucho tiempo de investigación.

    ANTERIOR
    2. Conceptos de lenguajes
    SIGUIENTE
    4. La historia completa de JAVA

    Autor: Pablo Jasinski

    Profesor en Escuela Técnica UBA y Escuela Técnica Nº35, especializado en materias de programación, arquitectura de las computadoras y redes. Profesional en el área de programación y desarrollo de videojuegos.

    No hay comentarios