A la hora de elegir un lenguaje de pro­gra­ma­ción, se debe prestar especial atención a dos cosas: por una parte, el lenguaje debe contar con todos los co­m­po­ne­n­tes básicos ne­ce­sa­rios para el proyecto de software que se quiera de­sa­rro­llar. Por la otra, tiene que permitir programar e im­ple­me­n­tar este proyecto de la manera más sencilla posible. La buena le­gi­bi­li­dad y si­m­pli­ci­dad del código fuente son fu­n­da­me­n­ta­les para ga­ra­n­ti­zar lo segundo, porque estas ca­ra­c­te­rí­s­ti­cas no solo facilitan el apre­n­di­za­je del lenguaje de pro­gra­ma­ción, sino también, ob­via­me­n­te, su posterior uti­li­za­ción en el día a día.

En primer lugar, para que el ordenador o el pro­ce­sa­dor puedan co­m­pre­n­der las in­s­tru­c­cio­nes que contiene un programa de­sa­rro­lla­do pre­via­me­n­te, el código fuente escrito en los lenguajes de pro­gra­ma­ción actuales debe co­n­ve­r­ti­r­se a un formato legible por máquina. De este pro­ce­di­mie­n­to, de­pe­n­die­n­do del lenguaje de pro­gra­ma­ción, se encarga un co­m­pi­la­dor o un in­té­r­pre­te. ¿Qué son exac­ta­me­n­te estos dos programas? Y ¿en qué se di­fe­re­n­cian?

¿Qué es un in­té­r­pre­te?

Un in­té­r­pre­te es un programa in­fo­r­má­ti­co que procesa el código fuente de un proyecto de software durante su tiempo de ejecución, es decir, mientras el software se está eje­cu­ta­n­do, y actúa como una interfaz entre ese proyecto y el pro­ce­sa­dor. Un in­té­r­pre­te siempre procesa el código línea por línea, de modo que lee, analiza y prepara cada secuencia de forma co­n­se­cu­ti­va para el pro­ce­sa­dor. Este principio también se aplica a las se­cue­n­cias re­cu­rre­n­tes, que se ejecutan de nuevo cada vez que vuelven a aparecer en el código. Para procesar el código fuente del software, el in­té­r­pre­te recurre a sus propias bi­blio­te­cas internas: en cuanto una línea de código fuente se ha traducido a los co­rre­s­po­n­die­n­tes comandos legibles por máquina, esta se envía di­re­c­ta­me­n­te al pro­ce­sa­dor.

El proceso de co­n­ve­r­sión no finaliza hasta que se ha in­te­r­pre­ta­do todo el código. Solo se in­te­rru­m­pe pre­ma­tu­ra­me­n­te si se produce un fallo durante el pro­ce­sa­mie­n­to, lo que si­m­pli­fi­ca mucho la re­so­lu­ción de los errores, ya que la línea de código pro­ble­má­ti­ca se detecta in­me­dia­ta­me­n­te después de ocurrir el fallo.

Nota

BASIC, Perl, Python, Ruby y PHP son algunos de los lenguajes de pro­gra­ma­ción más famosos que dependen de un in­té­r­pre­te para ser tra­du­ci­dos de código fuente a código máquina. Por ello, también suelen llamarse lenguajes in­te­r­pre­ta­dos.

¿Qué es un co­m­pi­la­dor?

Un co­m­pi­la­dor es un programa in­fo­r­má­ti­co que traduce todo el código fuente de un proyecto de software a código máquina antes de eje­cu­tar­lo. Solo entonces el pro­ce­sa­dor ejecuta el software, ob­te­nie­n­do todas las in­s­tru­c­cio­nes en código máquina antes de comenzar. De esta manera, el pro­ce­sa­dor cuenta con todos los co­m­po­ne­n­tes ne­ce­sa­rios para ejecutar el software, procesar las entradas y generar los re­su­l­ta­dos. No obstante, en muchos casos, durante el proceso de co­m­pi­la­ción tiene lugar un paso in­te­r­me­dio fu­n­da­me­n­tal: antes de generar la tra­du­c­ción final en código máquina, la mayoría de los co­m­pi­la­do­res suelen convertir el código fuente en un código in­te­r­me­dio (también llamado código objeto) que, a menudo, es co­m­pa­ti­ble con diversas pla­ta­fo­r­mas y que, además, también puede ser utilizado por un in­té­r­pre­te.

Al producir el código, el co­m­pi­la­dor determina qué in­s­tru­c­cio­nes van a enviarse al pro­ce­sa­dor y en qué orden. Si las in­s­tru­c­cio­nes no son in­te­r­de­pe­n­die­n­tes, incluso es posible que puedan pro­ce­sar­se en paralelo.

Nota

Entre los lenguajes co­m­pi­la­dos puros se incluyen, entre otros, los veteranos C, C++ y Pascal.

Co­m­pi­la­dor e in­té­r­pre­te: di­fe­re­n­cias, en resumen

Tanto los co­m­pi­la­do­res como los in­té­r­pre­tes cumplen la función de convertir el código de software que se ha escrito a un formato eje­cu­ta­ble y legible por máquina. Sin esta tra­du­c­ción, los pro­ce­sa­do­res in­fo­r­má­ti­cos no podrían ejecutar el software en lenguajes como C, C++, PHP, Python o Ruby, lo que convierte estos programas en unos co­m­po­ne­n­tes im­pre­s­ci­n­di­bles para utilizar or­de­na­do­res, po­r­tá­ti­les o sma­r­t­pho­nes. En los apartados an­te­rio­res, hemos visto que co­m­pi­la­do­res e in­té­r­pre­tes presentan algunas di­fe­re­n­cias básicas, algo que debe tenerse es­pe­cia­l­me­n­te en cuenta a la hora de elegir un lenguaje de pro­gra­ma­ción adecuado para de­sa­rro­llar un nuevo software. En la siguiente tabla, se resumen los aspectos clave que ca­ra­c­te­ri­zan in­té­r­pre­tes y co­m­pi­la­do­res:

In­té­r­pre­te Co­m­pi­la­dor
Momento en que se traduce el código fuente Durante el tiempo de ejecución del software Antes de ejecutar el software
Pro­ce­di­mie­n­to de tra­du­c­ción Línea por línea Siempre todo el código
Pre­se­n­ta­ción de errores de código Después de cada línea En conjunto, después de toda la co­m­pi­la­ción
Velocidad de tra­du­c­ción Alta Baja
Efi­cie­n­cia de tra­du­c­ción Baja Alta
Coste de de­sa­rro­llo Bajo Alto
Lenguajes típicos PHP, Perl, Python, Ruby, BASIC C, C++, Pascal

Si ob­se­r­va­mos las di­fe­re­n­cias entre co­m­pi­la­dor e in­té­r­pre­te, vemos cla­ra­me­n­te los puntos fuertes y débiles de cada solución para traducir el código fuente: con el in­té­r­pre­te, los programas se pueden ejecutar de inmediato y, por lo tanto, se inician mucho más rápido. Además, el de­sa­rro­llo es mucho más fácil que con un co­m­pi­la­dor, porque el proceso de de­pu­ra­ción (es decir, la co­rre­c­ción de errores) se lleva a cabo igual que la tra­du­c­ción, línea por línea. En el caso del co­m­pi­la­dor, primero debe tra­du­ci­r­se todo el código antes de poder resolver los errores o iniciar la apli­ca­ción. Sin embargo, una vez que se ejecuta el programa, los servicios del co­m­pi­la­dor ya no son ne­ce­sa­rios, mientras que el in­té­r­pre­te continúa uti­li­za­n­do los recursos in­fo­r­má­ti­cos.

Ventaja In­co­n­ve­nie­n­te
In­té­r­pre­te Proceso de de­sa­rro­llo sencillo (sobre todo en términos de de­pu­ra­ción) Proceso de tra­du­c­ción poco eficiente y velocidad de ejecución lenta
Co­m­pi­la­dor Pro­po­r­cio­na al pro­ce­sa­dor el código máquina completo y listo para ejecutar Cualquier mo­di­fi­ca­ción del código (re­so­lu­ción de errores, de­sa­rro­llo del software, etc.) requiere volverlo a traducir

Solución híbrida de in­té­r­pre­te y co­m­pi­la­dor: co­m­pi­la­ción en tiempo de ejecución

Para compensar los puntos débiles de ambas so­lu­cio­nes, también existe el llamado modelo de co­m­pi­la­ción en tiempo de ejecución (en inglés, just-in-time-compiler, o “co­m­pi­la­dor justo a tiempo”). Este tipo de co­m­pi­la­dor, que a veces también se conoce por el término inglés compreter (acrónimo de compiler e interpreter), rompe con el modelo habitual de co­m­pi­la­ción y traduce el código del programa durante el tiempo de ejecución, al igual que el in­té­r­pre­te. De esta forma, la alta velocidad de ejecución típica de los co­m­pi­la­do­res se co­m­ple­me­n­ta con la si­m­pli­fi­ca­ción del proceso de de­sa­rro­llo.

Java es uno de los ejemplos más conocidos de lenguaje basado en co­m­pi­la­ción en tiempo de ejecución: el co­m­pi­la­dor JIT, que figura entre los co­m­po­ne­n­tes del Java Runtime En­vi­ro­n­me­nt (JRE), mejora el re­n­di­mie­n­to de las apli­ca­cio­nes Java tra­du­cie­n­do el código de bytes en código máquina de manera dinámica.

Ir al menú principal