Hay tres modos generales de ejecución para los lenguajes modernos de alto nivel:
Interpretado Cuando el código escrito en un lenguaje es interpretado, su sintaxis se lee y luego se ejecuta directamente, sin etapa de compilación. Un programa llamado intérprete lee cada declaración del programa, siguiendo el flujo del mismo, luego decide qué hacer y lo hace. Un híbrido entre un intérprete y un compilador compila la sentencia en código máquina y lo ejecuta; el código máquina se descarta, para ser interpretado de nuevo si la línea se ejecuta de nuevo. Los intérpretes suelen ser las implementaciones más sencillas del comportamiento de un lenguaje, en comparación con las otras dos variantes enumeradas aquí. Compilado Cuando el código escrito en un lenguaje se compila, su sintaxis se transforma en una forma ejecutable antes de ejecutarse. Hay dos tipos de compilación: Generación de código máquina Algunos compiladores compilan el código fuente directamente en código máquina. Este es el modo original de compilación, y los lenguajes que se transforman directa y completamente en código máquina de este modo pueden llamarse verdaderos lenguajes compilados. Véase lenguaje ensamblador. Representaciones intermedias Cuando el código escrito en un lenguaje se compila en una representación intermedia, dicha representación puede optimizarse o guardarse para su posterior ejecución sin necesidad de releer el archivo fuente. Cuando se guarda la representación intermedia, puede estar en una forma como bytecode. A continuación, la representación intermedia debe ser interpretada o compilada para ejecutarla. Las máquinas virtuales que ejecutan directamente el bytecode o lo transforman en código máquina han desdibujado la distinción, antes clara, entre las representaciones intermedias y los lenguajes verdaderamente compilados. Traducido o transcompilado de fuente a fuente El código escrito en un lenguaje puede traducirse a términos de un lenguaje de nivel inferior para el que ya son habituales los compiladores de código nativo. JavaScript y el lenguaje C son objetivos habituales de este tipo de traductores. Véase CoffeeScript, Chicken Scheme y Eiffel como ejemplos. En concreto, el código C y C++ generado puede verse (tal y como se genera desde el lenguaje Eiffel cuando se utiliza el IDE EiffelStudio) en el directorio EIFGENs de cualquier proyecto Eiffel compilado. En Eiffel, el proceso de traducción se denomina transcompilación o transcompilado, y el compilador de Eiffel como transcompilador o compilador fuente a fuente.
Nótese que los lenguajes no son estrictamente lenguajes interpretados o lenguajes compilados. Más bien, las implementaciones del comportamiento del lenguaje utilizan la interpretación o la compilación. Por ejemplo, ALGOL 60 y Fortran han sido ambos interpretados (aunque eran más típicamente compilados). Del mismo modo, Java muestra la dificultad de intentar aplicar estas etiquetas a los lenguajes, en lugar de a las implementaciones; Java se compila a bytecode que luego se ejecuta interpretando (en una máquina virtual Java (JVM)) o compilando (normalmente con un compilador just-in-time como HotSpot, de nuevo en una JVM). Además, la compilación, transcompilación e interpretación no se limita estrictamente a una descripción del artefacto del compilador (ejecutable binario o ensamblador IL).
Arquitectura de ordenador de lenguaje de alto nivelEditar
Alternativamente, es posible que un lenguaje de alto nivel sea implementado directamente por un ordenador – el ordenador ejecuta directamente el código HLL. Esto se conoce como una arquitectura de ordenador de lenguaje de alto nivel – la arquitectura del ordenador en sí está diseñada para ser objetivo de un lenguaje de alto nivel específico. Los grandes sistemas Burroughs eran máquinas objetivo para ALGOL 60, por ejemplo.