Короткий ответ: мы не знаем , спросите еще раз через 100 лет. (Возможно, мы еще не знаем тогда; возможно, мы никогда не узнаем.)
Теоретически это возможно. Возьмите все программы, которые когда-либо были написаны, вручную переведите их в максимально эффективный машинный код и напишите интерпретатор, который отображает исходные коды в машинные коды. Это возможно, поскольку только конечное число программ было написано (и по мере того, как пишется больше программ, продолжайте переводить вручную). Это также, конечно, совершенно идиотский с практической точки зрения.
Опять же, теоретически языки высокого уровня могут достичь производительности машинного кода, но они не превзойдут ее. Это все еще очень теоретически, потому что в практическом плане мы очень редко прибегаем к написанию машинного кода. Этот аргумент не применим к сравнению языков более высокого уровня: это не означает, что C должен быть более эффективным, чем Python, только тот машинный код не может работать хуже, чем Python.
Исходя из другой стороны, на чисто экспериментальных условиях мы видим, что в большинстве случаев интерпретируемые языки высокого уровня работают хуже, чем скомпилированные языки низкого уровня. Мы склонны писать не чувствительный ко времени код на языках очень высокого уровня и критичных ко времени внутренних циклах в ассемблере, с такими языками, как C и Python. Хотя у меня нет статистики, подтверждающей это, я думаю, что это действительно лучшее решение в большинстве случаев.
Тем не менее, есть неоспоримые случаи, когда языки высокого уровня превосходят код, который можно было бы реально написать: среды программирования специального назначения. Такие программы, как Matlab и Mathematica, часто гораздо лучше решают определенные виды математических задач, чем то, что могут написать простые смертные. Библиотечные функции могли быть написаны на C или C ++ (что является топливом для лагеря «низкоуровневые языки более эффективны»), но это не мое дело, если я пишу код Mathematica, библиотека - это черный ящик.
Теоретически возможно, что Python приблизится к оптимальной производительности или даже приблизится к ней по сравнению с C? Как видно выше, да, но мы очень далеки от этого сегодня. Опять же, компиляторы добились большого прогресса за последние десятилетия, и этот прогресс не замедляется.
Языки высокого уровня, как правило, делают больше вещей автоматическими, поэтому им приходится выполнять больше работы и, следовательно, они менее эффективны. С другой стороны, они, как правило, содержат больше семантической информации, поэтому может быть легче обнаружить оптимизации (если вы пишете компилятор на Haskell, вам не нужно беспокоиться о том, что другой поток изменит переменную под вашим носом). Одним из нескольких попыток сравнить яблоки и апельсины на разных языках программирования является тестовая версия Computer Language Benchmark Game (ранее известная как перестрелка). Фортран имеет тенденцию сиять на численных задачах; но когда дело доходит до манипулирования структурированными данными или высокоскоростной коммутации потоков, F # и Scala преуспевают. Не воспринимайте эти результаты как Евангелие: многое из того, что они измеряют, заключается в том, насколько хорош был автор тестовой программы на каждом языке.
Аргумент в пользу языков высокого уровня заключается в том, что производительность в современных системах не так сильно коррелирует с количеством выполняемых инструкций и тем меньше со временем. Языки низкого уровня хорошо подходят для простых последовательных машин. Если высокоуровневый язык выполняет вдвое больше инструкций, но умудряется использовать кэш более разумно, поэтому он делает вдвое меньше кешей, он может оказаться победителем.
На серверных и настольных платформах процессоры почти достигли плато, где они не работают быстрее (мобильные платформы тоже там); это благоприятствует языкам, где параллелизм легко использовать. Многие процессоры проводят большую часть своего времени в ожидании ответа ввода / вывода; время, затрачиваемое на вычисления, не имеет большого значения по сравнению с количеством операций ввода-вывода, и язык, который позволяет программисту свести к минимуму обмен данными, является преимуществом.
В целом, хотя языки высокого уровня начинаются со штрафа, у них больше возможностей для совершенствования. Как близко они могут получить? Спросите еще раз через 100 лет.
Последнее замечание: часто сравнение проводится не между самой эффективной программой, которая может быть написана на языке A и той же на языке B, ни между самой эффективной программой, когда-либо написанной на каждом языке, а между самой эффективной программой, которая может быть написана. человеком в определенное количество времени на каждом языке. Это вводит элемент, который не может быть проанализирован математически, даже в принципе. С практической точки зрения это часто означает, что лучшая производительность - это компромисс между тем, сколько низкоуровневого кода вам нужно написать для достижения целей производительности, и сколько низкоуровневого кода у вас есть время, чтобы написать даты выпуска.