Die kurze Antwort lautet: Wir wissen nicht , fragen Sie in 100 Jahren erneut. (Dann wissen wir es vielleicht immer noch nicht. Vielleicht werden wir es nie erfahren.)
Theoretisch ist das möglich. Nehmen Sie alle jemals geschriebenen Programme, übersetzen Sie sie manuell in den effizientesten Maschinencode und schreiben Sie einen Interpreter, der Quellcodes auf Maschinencodes abbildet. Dies ist möglich, da bisher nur eine begrenzte Anzahl von Programmen geschrieben wurde (und wenn mehr Programme geschrieben werden, behalten Sie die manuellen Übersetzungen bei). Dies ist natürlich auch praktisch völlig idiotisch.
Theoretisch sind Hochsprachen zwar in der Lage, die Leistung von Maschinencode zu erreichen, werden diese jedoch nicht übertreffen. Dies ist immer noch sehr theoretisch, da wir praktisch sehr selten auf das Schreiben von Maschinencode zurückgreifen. Dieses Argument gilt nicht für den Vergleich übergeordneter Sprachen: Es bedeutet nicht, dass C effizienter als Python sein muss, nur, dass Maschinencode nicht schlechter als Python sein kann.
Wenn wir von der anderen Seite kommen, sehen wir rein experimentell, dass interpretierte Hochsprachen die meiste Zeit schlechter abschneiden als kompilierte Niedrigsprachen. Wir neigen dazu, nicht zeitkritischen Code in sehr höheren Sprachen und zeitkritischen inneren Schleifen in Assembler zu schreiben, wobei Sprachen wie C und Python dazwischen liegen. Ich habe zwar keine Statistiken, um dies zu sichern, aber in den meisten Fällen ist dies in der Tat die beste Entscheidung.
Es gibt jedoch unbestrittene Fälle, in denen Hochsprachen den Code übertreffen, den man realistisch schreiben würde: spezielle Programmierumgebungen. Programme wie Matlab und Mathematica sind oft weitaus besser in der Lage, bestimmte Arten von mathematischen Problemen zu lösen, als das, was nur Sterbliche schreiben können. Die Bibliotheksfunktionen wurden möglicherweise in C oder C ++ geschrieben (was für die "Sprachen auf niedriger Ebene sind effizienter"), aber das geht mich nichts an, wenn ich Mathematica-Code schreibe, ist die Bibliothek eine Black Box.
Ist es theoretisch möglich, dass Python der optimalen Leistung so nahe oder sogar noch näher kommt als C? Wie oben gesehen, ja, aber davon sind wir heute sehr weit entfernt. Andererseits haben die Compiler in den letzten Jahrzehnten große Fortschritte gemacht, und diese Fortschritte werden nicht langsamer.
Hochsprachen machen in der Regel mehr Dinge automatisch, so dass sie mehr Arbeit haben und daher weniger effizient sind. Auf der anderen Seite enthalten sie tendenziell mehr semantische Informationen, sodass es einfacher ist, Optimierungen zu erkennen (wenn Sie einen Haskell-Compiler schreiben, müssen Sie sich keine Sorgen machen, dass ein anderer Thread eine Variable unter Ihrer Nase ändert). Eine von mehreren Versuchen, Äpfel und Orangen in verschiedenen Programmiersprachen zu vergleichen, ist das Computersprachen-Benchmark-Spiel (früher als Shootout bekannt). Fortran neigt dazu, bei numerischen Aufgaben zu glänzen; aber wenn es darum geht, strukturierte Daten oder hochratige Thread-Kommutierungen zu manipulieren, F # und Scala machen es gut. Nehmen Sie diese Ergebnisse nicht als Evangelium: Vieles, was sie messen, ist, wie gut der Autor des Testprogramms in jeder Sprache war.
Ein Argument für Hochsprachen ist, dass die Leistung auf modernen Systemen nicht so stark mit der Anzahl der ausgeführten Befehle korreliert, und dies im Laufe der Zeit weniger. Low-Level-Sprachen eignen sich gut für einfache sequentielle Maschinen. Wenn eine Hochsprache doppelt so viele Anweisungen ausführt, den Cache jedoch intelligenter nutzt, so dass nur halb so viele Cache-Fehler auftreten, kann dies zum Sieger werden.
Auf Server- und Desktop-Plattformen haben CPUs fast ein Plateau erreicht, auf dem sie nicht schneller werden (auch mobile Plattformen sind auf dem Weg dorthin). Dies begünstigt Sprachen, in denen Parallelität leicht auszunutzen ist. Viele Prozessoren warten die meiste Zeit auf eine E / A-Antwort. Die für die Berechnung aufgewendete Zeit ist im Vergleich zur Anzahl der E / A-Vorgänge von geringer Bedeutung, und eine Sprache, mit der der Programmierer die Kommunikation minimieren kann, ist von Vorteil.
Alles in allem haben Hochsprachen, die mit einer Strafe beginnen, mehr Raum für Verbesserungen. Wie nah können sie kommen? Fragen Sie noch einmal in 100 Jahren.
Schlussbemerkung: Häufig erfolgt der Vergleich nicht zwischen dem effizientesten Programm, das in Sprache A geschrieben werden kann, und demselben in Sprache B, noch zwischen dem effizientesten Programm, das jemals in jeder Sprache geschrieben wurde, sondern zwischen dem effizientesten Programm, das geschrieben werden kann von einem Menschen in einer bestimmten Zeit in jeder Sprache. Dies führt ein Element ein, das selbst im Prinzip nicht mathematisch analysiert werden kann. In der Praxis bedeutet dies häufig, dass die beste Leistung ein Kompromiss zwischen der Menge an Code auf niedriger Ebene, die Sie zum Erreichen der Leistungsziele schreiben müssen, und der Menge an Code auf niedriger Ebene ist, für die Sie Zeit haben, um die Veröffentlichungstermine einzuhalten.