Есть много причин, по которым можно выбрать язык X вместо языка Y. Такими причинами могут быть читаемость программы, простота программирования, переносимость на многие платформы, наличие хороших сред программирования. Тем не менее, я буду рассматривать только скорость выполнения, как указано в вопросе. Вопрос, похоже, не учитывает, например, скорость разработки.
Два языка могут компилироваться в один и тот же байт-код, но это не значит, что будет создан один и тот же код,
На самом деле байт-код является только кодом для конкретной виртуальной машины. Он имеет технические преимущества, но не вносит принципиальных отличий в компиляцию для конкретного программного обеспечения. Таким образом, вы могли бы также рассмотреть возможность сравнения двух языков, скомпилированных для непосредственного выполнения на одном компьютере.
Тем не менее, проблема относительной скорости языков является давней, начиная с первых компиляторов.
В течение многих лет, в те ранние времена, профессионалы считали, что рукописный код работает быстрее, чем скомпилированный код. Другими словами, машинный язык считался более быстрым, чем языки высокого уровня, такие как кобол или фортран. И это было быстрее и обычно меньше. Языки высокого уровня все еще развивались, потому что их было намного проще использовать для многих людей, которые не были компьютерными учеными. У стоимости использования языков высокого уровня даже было имя: коэффициент расширения, который мог бы касаться размера сгенерированного кода (очень важная проблема в те времена) или количества фактически выполненных инструкций. Концепция была в основном экспериментальной, но сначала соотношение было больше 1, поскольку по современным стандартам компиляторы проделали довольно простую работу.
Таким образом, машинный язык был быстрее, чем, скажем, Fortran.
Конечно, с годами ситуация изменилась, так как компиляторы стали более сложными, и в настоящее время программирование на языке ассемблера встречается очень редко. Для большинства приложений программы на ассемблере плохо конкурируют с кодом, сгенерированным оптимизирующими компиляторами.
Это показывает, что одной из основных проблем является качество компиляторов, доступных для рассматриваемого языка, их способность анализировать исходный код и соответственно оптимизировать его.
Эта способность может зависеть в некоторой степени от особенностей языка, чтобы подчеркнуть структурные и математические свойства источника, чтобы упростить работу для компилятора. Например, язык может разрешить включение утверждений об алгебраических свойствах пользовательских функций, чтобы компилятор мог использовать эти свойства в целях оптимизации.
Процесс компиляции может быть проще, и, следовательно, производить лучший код, когда парадигма программирования языка ближе к функциям машин, которые будут интерпретировать код, будь то реальная или виртуальная машина.
Другой момент заключается в том, что парадигмы, реализованные в языке, близки к типу программируемой проблемы. Следует ожидать, что язык программирования, специализированный для конкретных парадигм программирования, будет очень эффективно компилировать функции, связанные с этой парадигмой. Следовательно, выбор языка программирования может зависеть, для ясности и скорости, от выбора языка программирования, адаптированного к типу программируемой проблемы.
Популярность C для системного программирования, вероятно, обусловлена тем фактом, что C близок к архитектуре машины, и что системное программирование напрямую связано с этой архитектурой.
Некоторые другие проблемы будут легче программироваться, с более быстрым выполнением с использованием логического программирования и языков разрешения ограничений .
Сложные реактивные системы могут быть очень эффективно запрограммированы с помощью специализированных языков синхронного программирования, таких как Esterel, которые воплощают очень специализированные знания о таких системах и генерируют очень быстрый код.
Или, например, некоторые языки являются узкоспециализированными, например языки описания синтаксиса, используемые для программирования синтаксических анализаторов. Генератор синтаксический анализатор не что иное, как компилятор для таких языков. Конечно, он не является полным по Тьюрингу, но эти компиляторы чрезвычайно хороши для своей специальности: создание эффективных программ синтаксического анализа. Область знаний ограничена, методы оптимизации могут быть очень специализированными и очень точно настроенными. Эти генераторы синтаксических анализаторов обычно намного лучше, чем то, что можно получить, написав код на другом языке. Есть много узкоспециализированных языков с компиляторами, которые производят отличный и быстрый код для ограниченного класса задач.
Следовательно, при написании большой системы может быть целесообразно не полагаться на один язык, а выбирать лучший язык для различных компонентов системы. Это, конечно, поднимает проблемы совместимости.
Другой важный момент - это просто наличие эффективных библиотек для программируемых тем.
Наконец, скорость не является единственным критерием и может вступать в противоречие с другими критериями, такими как безопасность кода (например, при неправильном вводе или устойчивость к системным ошибкам), использование памяти, простота программирования (хотя совместимость парадигмы может действительно помочь этому ), размер объектного кода, сопровождение программы и т. д.
Скорость не всегда самый важный параметр. Также это может принимать разные формы, такие как сложность, которая может быть средней сложности или сложности в худшем случае. Кроме того, в большой системе, как и в небольшой программе, есть части, где скорость имеет решающее значение, и другие, где она не имеет большого значения. И это не всегда легко определить заранее.