Una computadora no puede comprender las instrucciones del programador por sí sola. Deben ser traducidos al lenguaje de máquina por un compilador o procesados por un intérprete en tiempo de ejecución.
Los lenguajes de programación están diseñados de tal manera que la gente pueda leerlos y usarlos con relativa facilidad. Para que un procesador pueda comprender las instrucciones individuales de un programa, el código fuente debe primero convertirse en una forma que la máquina pueda entender. Dependiendo del lenguaje de programación, esto sucede, por ejemplo, utilizando un compilador o un intérprete.
Interprete
Un intérprete procesa el código fuente de un proyecto en tiempo de ejecución. El intérprete hace esto línea por línea: una instrucción se lee, analiza y ejecuta inmediatamente. Luego continúa con la siguiente instrucción hasta que finalmente se llega al final del programa; o hasta que se produzca un error: el intérprete deja de funcionar tan pronto como algo anda mal. Como desarrollador, normalmente sabes inmediatamente dónde está el error y puedes solucionar el problema más rápidamente.
Un intérprete no crea un archivo que se pueda ejecutar varias veces. Tampoco traduce el código fuente al lenguaje de máquina, sino que actúa como una capa intermedia entre el lenguaje de programación y la máquina. El intérprete analiza cada instrucción de un programa en tiempo de ejecución y llama a la rutina correspondiente desde sus bibliotecas internas, que a su vez lleva a cabo la acción deseada en el procesador del sistema de destino.
Debido a que está trabajando virtualmente en vivo y cada declaración debe procesarse individualmente, los programas interpretados suelen ser más lentos que las compilaciones. Por ejemplo, también puedes volver a ejecutar instrucciones recurrentes cuando sea tu turno.
Python, Perl o BASIC son ejemplos de lenguajes que utilizan un intérprete.
Compilador
Un compilador convierte el código fuente en lenguaje de máquina, es decir, traduce todo el programa de un lenguaje de programación a código de máquina. El código está completamente compilado antes de que se ejecute el programa. A menudo, hay un paso intermedio antes de que el programa se traduzca al lenguaje de máquina: el código fuente se convierte primero en un código intermedio, por ejemplo, un código objeto.
El código intermedio tiene la ventaja de que normalmente funciona en diferentes plataformas y, a menudo, también puede ser utilizado por un intérprete. A partir de este resultado intermedio, el compilador o ensamblador traduce el código de máquina que comprende el sistema de destino respectivo. Finalmente, se genera un archivo ejecutable a través de un enlazador. Los lenguajes de programación modernos a menudo trabajan con código de bytes en lugar de código de máquina, un tipo de pseudocódigo para máquinas que se ejecuta internamente en máquinas virtuales especiales.
Por tanto, el compilador inicia varios pasos para crear un programa ejecutable a partir del código fuente disponible. Para ello, necesita comparativamente más tiempo y recursos. Sin embargo, una vez que el programa terminado está en funcionamiento, es más eficiente que el software interpretado porque todas las instrucciones ya se han traducido completamente al código de máquina.
Los lenguajes de compilación puros son, por ejemplo, C / C ++ y Pascal.
Compilador Just-In-Time: la solución híbrida
También hay enfoques que combinan compiladores e intérpretes y así compensan las debilidades de los respectivos sistemas. El compilador compreter o just-in-time solo traduce el programa a código de máquina en tiempo de ejecución. Por un lado, la solución híbrida ofrece un buen rendimiento de los programas compilados, por otro lado, permite una fácil resolución de problemas de los programas interpretados. Los compiladores JIT se utilizan principalmente para crear software portátil e independiente de la plataforma.
Ejemplos de lenguajes de programación con un compilador JIT son Java, Visual Basic, C # y también C ++. NET.