Código fuente -> Ejecutable
Al ejecutable podemos llegar de dos formas:
- Compilador. Todas las líneas son interpretadas a la vez y convertidas a código binario, es decir obtenemos un fichero ejecutable sin necesidad de ningún interprete. Son más rápidos y tienes mayor control del hardware, pero para que funcionen tienes que tener la compilación completa y se depende de la plataforma (arquitectura y procesador) para generar el código binario.
- Lenguajes compilados puros: C, C++, Pascal, Delphi, Rust, Go, … de hecho, en algunos como C podemos incluso incluir sentencias en lenguaje ensamblador directamente, por ejemplo: asm(«int $3»);
- Lenguajes híbridos:
- Lenguajes de doble compilación: .Net (C#, F#, vB, …) funcionan con código compilado en un lenguaje ensamblador (MSIL - Microsoft Intermediate Language), no necesitan de una máquina virtual propiamente dicha, pero sí de la existencia de algunas librerías del framework de Microsoft .Net
- Lenguajes compilados e interpretados: Java funcionan con código compilado en un lenguaje ensamblador, bytecode en el caso de Java, pero no lo hacen directamente sobre la máquina sino sobre máquinas virtuales JVM.
- Interprete. Tiene que ir línea a línea interpretando cada una de las instrucciones. Son lenguajes más flexibles completamente independientes de la arquitectura de la plataforma. La principal desventaja viene a ser la velocidad.
- PHP, Javascript, Ruby, Python, Haskell …
Python: Python es ‘lento’, porque como lenguaje no se puede compilar (o al menos no es fácil). Ser capaz de compilar algo en código de máquina depende de que el compilador pueda identificar de manera confiable y precisa exactamente qué tipo de datos representa una ‘variable’ dada en cualquier momento. Existen compiladores para C, C ++ y otros lenguajes, ya que el compilador puede indicar sin ambigüedades exactamente qué tipo de datos representa cada nombre en cada punto del código fuente.
Por el contrario, para Python, el código de máquina requerido para una expresión simple x[1]
variará mucho dependiendo de si x
es una cadena, una lista, un diccionario o un contenedor personalizado. Cualquier código de máquina generado tendría que tomar decisiones importantes en tiempo de ejecución en cuanto al tipo de datos y cómo calcular las expresiones relevantes.
Esas determinaciones en tiempo de ejecución son, en efecto, exactamente lo que hace el intérprete.
Existe software que intenta compilar aplicaciones de Python como por ejemplo Nuitka (https://nuitka.net), Numba (https://numba.pydata.org) o PyPy (https://www.pypy.org) que mediante diferentes técnicas intenta acelerar las ejecuciones de aplicaciones Python.