Krótka odpowiedź brzmi: nie wiemy , zapytaj ponownie za 100 lat. (Być może nadal nie będziemy wiedzieć; być może nigdy się nie dowiemy.)
Teoretycznie jest to możliwe. Weź wszystkie napisane programy, ręcznie przetłumacz je na najbardziej wydajny kod maszynowy i napisz interpreter, który mapuje kody źródłowe na kody maszynowe. Jest to możliwe, ponieważ kiedykolwiek napisano tylko skończoną liczbę programów (a gdy więcej programów zostanie napisanych, nie przestawaj tłumaczeń ręcznych). Jest to oczywiście całkowicie idiotyczne pod względem praktycznym.
Z drugiej strony teoretycznie języki wysokiego poziomu mogą osiągnąć wydajność kodu maszynowego, ale go nie przekroczą. Jest to nadal bardzo teoretyczne, ponieważ w praktyce bardzo rzadko uciekamy się do pisania kodu maszynowego. Ten argument nie dotyczy porównywania języków wyższego poziomu: nie oznacza, że C musi być bardziej wydajny niż Python, tylko ten kod maszynowy nie może być gorszy niż Python.
Z drugiej strony, na czysto eksperymentalnych warunkach, widzimy, że w większości przypadków interpretowane języki wysokiego poziomu osiągają gorsze wyniki niż skompilowane języki niskiego poziomu. Mamy tendencję do pisania kodu, który nie jest wrażliwy na czas, w językach wysokiego poziomu i krytycznych czasowo wewnętrznych pętli w asemblerze, z językami takimi jak C i Python pomiędzy nimi. Chociaż nie mam żadnych statystyk, które mogłyby to potwierdzić, myślę, że w większości przypadków jest to najlepsza decyzja.
Istnieją jednak niekwestionowane przypadki, w których języki wysokiego poziomu pokonują kod, który można realistycznie napisać: środowiska programowania specjalnego przeznaczenia. Programy takie jak Matlab i Mathematica są często znacznie lepsze w rozwiązywaniu niektórych problemów matematycznych niż to, co potrafią napisać zwykli śmiertelnicy. Funkcje biblioteki mogły być napisane w C lub C ++ (co jest paliwem do obozu „języki niskiego poziomu są bardziej wydajne”), ale to nie moja sprawa, jeśli piszę kod Mathematica, biblioteka to czarna skrzynka.
Czy teoretycznie jest możliwe, że Python zbliży się, a może nawet, do optymalnej wydajności niż C? Jak widać powyżej, tak, ale dzisiaj jesteśmy bardzo daleko od tego. Z drugiej strony, kompilatory poczyniły duży postęp w ciągu ostatnich dziesięcioleci i postęp ten nie zwalnia.
Języki wysokiego poziomu powodują, że więcej rzeczy jest zautomatyzowanych, więc mają więcej pracy do wykonania, a zatem są mniej wydajne. Z drugiej strony mają one zwykle więcej informacji semantycznych, więc łatwiej jest dostrzec optymalizacje (jeśli piszesz kompilator Haskell, nie musisz się martwić, że inny wątek zmodyfikuje zmienną pod twoim nosem). Jednym z kilku wysiłków zmierzających do porównania jabłek i pomarańczy w różnych językach programowania jest gra Computer Language Benchmark Game (wcześniej znana jako strzelanka). Fortran błyszczy w zadaniach numerycznych; ale jeśli chodzi o manipulowanie danymi strukturalnymi lub komutacją szybkich wątków, F # i Scala mają się dobrze. Nie bierz tych wyników za ewangelię: wiele z tego, co mierzą, to to, jak dobry był autor programu testowego w każdym języku.
Argumentem przemawiającym za językami wysokiego poziomu jest to, że wydajność w nowoczesnych systemach nie jest tak silnie skorelowana z liczbą wykonywanych instrukcji, a tym bardziej z czasem. Języki niskiego poziomu są odpowiednie dla prostych maszyn sekwencyjnych. Jeśli język wysokiego poziomu wykonuje dwukrotnie więcej instrukcji, ale bardziej inteligentnie korzysta z pamięci podręcznej, dzięki czemu pomija o połowę mniej pamięci podręcznej, może wygrać.
Na platformach serwerowych i stacjonarnych procesory prawie osiągnęły płaskowyż, w którym nie przyspieszają (platformy mobilne też się tam dostają); faworyzuje to języki, w których równoległość jest łatwa do wykorzystania. Wiele procesorów spędza większość czasu na oczekiwaniu na odpowiedź We / Wy; czas spędzony na obliczeniach ma niewielkie znaczenie w porównaniu z ilością operacji we / wy, a język, który pozwala programiście zminimalizować komunikację, jest korzystny.
Podsumowując, podczas gdy języki wysokiego poziomu zaczynają się od kary, mają więcej miejsca na ulepszenia. Jak blisko mogą się zbliżyć? Zapytaj ponownie za 100 lat.
Uwaga końcowa: często nie dokonuje się porównania między najbardziej wydajnym programem, który można napisać w języku A i tym samym w języku B, ani między najskuteczniejszym programem, jaki kiedykolwiek napisano w każdym języku, ale między najskuteczniejszym programem, który można napisać przez człowieka w określonym czasie w każdym języku. Wprowadza to element, którego nie można analizować matematycznie, nawet w zasadzie. W praktyce oznacza to często, że najlepsza wydajność to kompromis między tym, ile kodu niskiego poziomu trzeba napisać, aby osiągnąć cele wydajności, a tym, ile kodu niskiego poziomu trzeba napisać, aby dotrzymać dat wydania.