La respuesta corta es: no sabemos , vuelva a preguntar en 100 años. (Es posible que aún no lo sepamos; posiblemente nunca lo sabremos).
En teoría, esto es posible. Tome todos los programas que se han escrito, traduzca manualmente al código de máquina más eficiente posible y escriba un intérprete que asigne los códigos fuente a los códigos de máquina. Esto es posible ya que solo se ha escrito un número finito de programas (y a medida que se escriben más programas, mantenga las traducciones manuales). Esto también es, por supuesto, completamente idiota en términos prácticos.
Por otra parte, en teoría, los lenguajes de alto nivel podrían alcanzar el rendimiento del código de máquina, pero no lo superarán. Esto sigue siendo muy teórico, porque en términos prácticos, rara vez recurrimos a escribir código de máquina. Este argumento no se aplica a la comparación de lenguajes de nivel superior: no implica que C deba ser más eficiente que Python, solo que el código de máquina no puede ser peor que Python.
Viniendo del otro lado, en términos puramente experimentales, podemos ver que la mayoría de las veces , los lenguajes interpretados de alto nivel tienen un rendimiento peor que los lenguajes compilados de bajo nivel. Tendemos a escribir código no sensible al tiempo en lenguajes de muy alto nivel y bucles internos críticos en el ensamblaje, con lenguajes como C y Python en el medio. Si bien no tengo ninguna estadística para respaldar esto, creo que esta es la mejor decisión en la mayoría de los casos.
Sin embargo, hay instancias indiscutibles donde los lenguajes de alto nivel superan el código que uno escribiría de manera realista: entornos de programación de propósito especial. Programas como Matlab y Mathematica a menudo son mucho mejores para resolver ciertos tipos de problemas matemáticos que lo que los simples mortales pueden escribir. Las funciones de la biblioteca pueden haber sido escritas en C o C ++ (lo cual es combustible para el campamento “los lenguajes de bajo nivel son más eficientes”), pero eso no es asunto mío si estoy escribiendo código de Mathematica, la biblioteca es un recuadro negro.
¿Es teóricamente posible que Python esté tan cerca, o tal vez incluso más cerca, de un rendimiento óptimo que C? Como se vio anteriormente, sí, pero hoy estamos muy lejos de eso. Por otra parte, los compiladores han progresado mucho en las últimas décadas, y ese progreso no se está desacelerando.
Los lenguajes de alto nivel tienden a hacer más cosas automáticas, por lo que tienen más trabajo que realizar y, por lo tanto, tienden a ser menos eficientes. Por otro lado, tienden a tener más información semántica, por lo que puede ser más fácil detectar optimizaciones (si está escribiendo un compilador Haskell, no tiene que preocuparse de que otro hilo modifique una variable debajo de su nariz). Uno de los varios esfuerzos para comparar diferentes lenguajes de programación de manzanas y naranjas es el Computer Language Benchmark Game (anteriormente conocido como el tiroteo). Fortran tiende a brillar en las tareas numéricas; pero cuando se trata de manipular datos estructurados o conmutación de hilos de alta velocidad, F # y Scala lo hacen bien. No tome estos resultados como evangelio: mucho de lo que están midiendo es lo bueno que fue el autor del programa de prueba en cada idioma.
Un argumento a favor de los lenguajes de alto nivel es que el rendimiento en los sistemas modernos no está tan fuertemente correlacionado con el número de instrucciones que se ejecutan, y menos con el tiempo. Los lenguajes de bajo nivel son una buena combinación para máquinas secuenciales simples. Si un lenguaje de alto nivel ejecuta el doble de instrucciones, pero logra usar el caché de manera más inteligente, por lo que hace la mitad de las fallas de caché, puede terminar siendo el ganador.
En las plataformas de servidor y de escritorio, las CPU casi han alcanzado una meseta en la que no llegan más rápido (las plataformas móviles también están llegando allí); Esto favorece los lenguajes donde el paralelismo es fácil de explotar. Muchos procesadores pasan la mayor parte de su tiempo esperando una respuesta de E / S; El tiempo dedicado a la computación importa poco en comparación con la cantidad de E / S, y un lenguaje que permite al programador minimizar las comunicaciones es una ventaja.
En general, si bien los idiomas de alto nivel comienzan con una penalización, tienen más margen de mejora. ¿Qué tan cerca pueden llegar? Pregunte nuevamente en 100 años.
Nota final: a menudo, la comparación no es entre el programa más eficiente que se puede escribir en el idioma A y el mismo en el idioma B, ni entre el programa más eficiente jamás escrito en cada idioma, sino entre el programa más eficiente que se puede escribir por un humano en una cierta cantidad de tiempo en cada idioma. Esto introduce un elemento que no puede analizarse matemáticamente, ni siquiera en principio. En términos prácticos, esto a menudo significa que el mejor rendimiento es un compromiso entre la cantidad de código de bajo nivel que necesita escribir para cumplir con los objetivos de rendimiento y la cantidad de código de bajo nivel que tiene tiempo de escribir para cumplir con las fechas de lanzamiento.