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