Como han dicho otros, compilado e interpretado son específicos de una implementación de un lenguaje de programación; que son no inherentes al lenguaje. Por ejemplo, hay intérpretes de C.
Sin embargo, podemos (y en la práctica lo hacemos) clasificar los lenguajes de programación en función de su implementación más común (a veces canónica). Por ejemplo, decimos que C está compilado.
Primero, debemos definir sin ambigüedad los intérpretes y compiladores:
Un intérprete para el lenguaje X es un programa (o una máquina, o simplemente algún tipo de mecanismo en general) que ejecuta cualquier programa p escrito en el lenguaje X de manera que realice los efectos y evalúe los resultados según lo prescrito por la especificación de X .
Un compilador de X a Y es un programa (o una máquina, o simplemente algún tipo de mecanismo en general) que traduce cualquier programa p de algún lenguaje X a un programa p ' semánticamente equivalente en algún lenguaje Y de tal manera que interpretar p ' con un intérprete para y se obtendrán los mismos resultados y tienen los mismos efectos que la interpretación de p con un intérprete para X .
Tenga en cuenta que desde el punto de vista del programador, las CPU son intérpretes de máquina para sus respectivos lenguajes de máquina nativos.
Ahora, podemos hacer una clasificación tentativa de lenguajes de programación en 3 categorías dependiendo de su implementación más común:
- Lenguajes de compilación rígida: cuando los programas se compilan completamente en lenguaje de máquina. El único intérprete utilizado es una CPU. Ejemplo: generalmente, para ejecutar un programa en C, el código fuente se compila en lenguaje de máquina, que luego es ejecutado por una CPU.
- Idiomas interpretados: Cuando no hay compilación de ninguna parte del programa original a lenguaje máquina. En otras palabras, no se genera ningún código de máquina nuevo; sólo se ejecuta el código de máquina existente. También se debe usar un intérprete que no sea la CPU (generalmente un programa). Ejemplo: en la implementación canónica de Python, el código fuente se compila primero en el código de bytes de Python y luego ese código de bytes es ejecutado por CPython, un programa de interpretación para el código de bytes de Python .
- Lenguajes compilados suaves: cuando se utiliza un intérprete distinto de la CPU, pero también se pueden compilar partes del programa original en lenguaje máquina. Este es el caso de Java, donde el código fuente se compila en bytecode primero y luego, el código de bytes puede ser interpretado por el intérprete de Java y / o compilado posteriormente por el compilador JIT.
A veces, los lenguajes compilados suaves y rígidos se denominan simplemente compilados, por lo que se dice que C #, Java, C, C ++ están compilados.
Dentro de esta categorización, JavaScript solía ser un lenguaje interpretado, pero eso fue hace muchos años. Hoy en día, está compilado con JIT en el lenguaje de máquina nativo en la mayoría de las principales implementaciones de JavaScript, por lo que diría que cae en lenguajes compilados suaves.