Hay muchas razones que pueden considerarse para elegir un lenguaje X sobre un lenguaje Y. La legibilidad del programa, la facilidad de programación, la portabilidad a muchas plataformas, la existencia de buenos entornos de programación pueden ser tales razones. Sin embargo, consideraré solo la velocidad de ejecución según lo solicitado en la pregunta. La pregunta no parece considerar, por ejemplo, la velocidad del desarrollo.
Dos idiomas pueden compilarse con el mismo código de bytes, pero eso no significa que se producirá el mismo código,
En realidad, bytecode es solo código para una máquina virtual específica. Tiene ventajas de ingeniería, pero no introduce diferencias fundamentales con la compilación directa de un hardware específico. Por lo tanto, podría considerar comparar dos idiomas compilados para ejecución directa en la misma máquina.
Dicho esto, el problema de la velocidad relativa de los idiomas es antiguo y se remonta a los primeros compiladores.
Durante muchos años, en aquellos primeros tiempos, el profesional consideraba que el código escrito a mano era más rápido que el código compilado. En otras palabras, el lenguaje de máquina se consideraba más rápido que los lenguajes de alto nivel como Cobol o Fortran. Y fue, tanto más rápido como generalmente más pequeño. Los lenguajes de alto nivel aún se desarrollaron porque eran mucho más fáciles de usar para muchas personas que no eran informáticos. El costo de usar lenguajes de alto nivel incluso tenía un nombre: la relación de expansión, que podría referirse al tamaño del código generado (un tema muy importante en esos momentos) o al número de instrucciones realmente ejecutadas. El concepto era principalmente experimental, pero la proporción era mayor que 1 al principio, ya que los compiladores hicieron un trabajo bastante simple para los estándares actuales.
Así, el lenguaje de máquina fue más rápido que decir, Fortran.
Por supuesto, eso cambió con los años, a medida que los compiladores se volvieron más sofisticados, hasta el punto de que la programación en lenguaje ensamblador ahora es muy rara. Para la mayoría de las aplicaciones, los programas en lenguaje ensamblador compiten mal con el código generado al optimizar los compiladores.
Esto muestra que un problema importante es la calidad de los compiladores disponibles para el lenguaje considerado, su capacidad para analizar el código fuente y optimizarlo en consecuencia.
Esta capacidad puede depender en cierta medida de las características del lenguaje para enfatizar las propiedades estructurales y matemáticas de la fuente con el fin de facilitar el trabajo del compilador. Por ejemplo, un lenguaje podría permitir la inclusión de declaraciones sobre las propiedades algebraicas de las funciones definidas por el usuario, para permitir que el compilador use estas propiedades con fines de optimización.
El proceso de compilación puede ser más fácil, por lo tanto, produce un mejor código, cuando el paradigma de programación del lenguaje está más cerca de las características de las máquinas que interpretarán el código, ya sea una máquina real o virtual.
Otro punto es si los paradigmas implementados en el lenguaje están cerrados al tipo de problema que se está programando. Es de esperar que un lenguaje de programación especializado para paradigmas de programación específicos compile de manera muy eficiente características relacionadas con ese paradigma. Por lo tanto, la elección de un lenguaje de programación puede depender, por claridad y velocidad, de la elección de un lenguaje de programación adaptado al tipo de problema que se está programando.
La popularidad de C para la programación del sistema probablemente se deba al hecho de que C está cerca de la arquitectura de la máquina, y que la programación del sistema también está directamente relacionada con esa arquitectura.
Algún otro problema se programará más fácilmente, con una ejecución más rápida utilizando programación lógica y lenguajes de resolución de restricciones .
Los sistemas reactivos complejos se pueden programar de manera muy eficiente con lenguajes de programación síncronos especializados como Esterel, que incorpora conocimiento muy especializado sobre dichos sistemas y genera código muy rápido.
O para tomar un ejemplo extremo, algunos lenguajes son altamente especializados, como los lenguajes de descripción de sintaxis utilizados para programar analizadores. Un generador de analizadores no es más que un compilador para tales lenguajes. Por supuesto, Turing no está completo, pero estos compiladores son extremadamente buenos para su especialidad: producir programas de análisis eficientes. Al restringirse el dominio del conocimiento, las técnicas de optimización pueden ser muy especializadas y ajustadas muy finamente. Estos generadores de analizadores suelen ser mucho mejores de lo que se podría obtener escribiendo código en otro idioma. Hay muchos lenguajes altamente especializados con compiladores que producen un código excelente y rápido para una clase restringida de problemas.
Por lo tanto, al escribir un sistema grande, puede ser aconsejable no confiar en un solo idioma, sino elegir el mejor idioma para los diferentes componentes del sistema. Esto, por supuesto, plantea problemas de compatibilidad.
Otro punto que a menudo importa es simplemente la existencia de bibliotecas eficientes para los temas que se programan.
Finalmente, la velocidad no es el único criterio y puede estar en conflicto con otros criterios como la seguridad del código (por ejemplo, con respecto a la entrada incorrecta o la resistencia a los errores del sistema), el uso de la memoria, la facilidad de programación (aunque la compatibilidad de paradigma puede ayudar a que ), tamaño del código objeto, mantenibilidad del programa, etc.
La velocidad no siempre es el parámetro más importante. También puede adoptar diferentes formas, como la complejidad, que puede ser la complejidad promedio o la peor de las situaciones. Además, en un sistema grande como en un programa más pequeño, hay partes donde la velocidad es crítica y otras donde importa poco. Y no siempre es fácil determinar eso de antemano.