Wird nicht jede Sprache in eine Low-Level-Computersprache übersetzt?
Wenn ja, sollten nicht alle Sprachen dieselbe Leistung haben?
Ich frage mich nur ...
Wie von anderen dargelegt, wird nicht jede Sprache in Maschinensprache übersetzt; einige werden in eine Form übersetzt (Bytecode, Reverse Polish, AST), die interpretiert wird.
Aber auch unter Sprachen, die in Maschinencode übersetzt werden,
Ein Beispiel für einen Übersetzer, der besser ist als andere, ist der GCC-C-Compiler. Es hat viele Jahre Arbeit in die Produktion von gutem Code investiert, und seine Übersetzungen übertreffen die der einfacheren Compiler lcc
und tcc
zum Beispiel.
Ein Beispiel für ein Feature, das schwer in Hochleistungscode übersetzt werden kann, ist die Fähigkeit von C, Zeigerarithmetik auszuführen und Zeiger zu dereferenzieren: Wenn ein Programm über einen Zeiger speichert, ist es für den Compiler sehr schwierig, zu wissen, welche Speicherorte sind betroffen. Wenn eine unbekannte Funktion aufgerufen wird, muss der Compiler sehr pessimistische Annahmen darüber treffen, was mit den Inhalten der auf dem Heap zugewiesenen Objekte geschehen könnte. In einer Sprache wie Java kann der Compiler eine bessere Übersetzungsarbeit leisten, da das Typsystem eine größere Trennung zwischen Zeigern unterschiedlicher Typen erzwingt. In einer Sprache wie ML oder Haskell kann der Compiler es noch besser machen, weil in diesen Sprachen die meisten im Speicher zugewiesenen Daten nicht durch einen Funktionsaufruf geändert werden können. Aber natürlich stellen objektorientierte Sprachen und funktionale Sprachen ihre eigenen Übersetzungsprobleme dar.
Schließlich ist die Übersetzung einer Turing-vollständigen Sprache selbst ein schweres Problem: Die beste Übersetzung eines Programms zu finden, ist im Allgemeinen ein NP-schweres Problem, das bedeutet, dass die einzigen bekannten Lösungen möglicherweise exponentiell Zeit in der Größe des Programms nehmen. Dies wäre in einem Compiler inakzeptabel (kann nicht ewig warten, um ein paar tausend Zeilen zu kompilieren), und so verwenden Compiler Heuristiken. In diesen Heuristiken gibt es immer Raum für Verbesserungen.
Es ist einfacher und effizienter, einige Sprachen in die Maschinensprache zu mappen als andere. Es gibt keine einfache Analogie, die mir dafür einfällt. Der nächste, den ich erreichen kann, ist das Übersetzen von Italienisch nach Spanisch und das Übersetzen einer Khoisan Sprache in Hawaiianisch.
Eine andere Analogie lautet: "Nun, die Gesetze der Physik bestimmen, wie sich jedes Tier bewegt, also warum bewegen sich manche Tiere so viel schneller als andere? Sollten sich nicht alle mit derselben Geschwindigkeit bewegen?". p>
Nein, einige Sprachen werden einfach interpretiert. Sie werden nie wirklich in Maschinencode umgewandelt. Daher werden diese Sprachen im Allgemeinen langsamer als Low-Level-Sprachen wie C ausgeführt.
Selbst für die Sprachen, die in Maschinencode kompiliert werden, ist manchmal nicht das, was aus dem Compiler kommt, die effizienteste Möglichkeit, das gegebene Programm zu schreiben. So ist es oft möglich, Programme in Assembler-Sprachen zu schreiben, die schneller als ihre C-Äquivalente laufen, und C-Programme, die schneller laufen als ihre JIT-kompilierten Java-Äquivalente usw. (Moderne Compiler sind jedoch ziemlich gut, das ist nicht so viel von einem Problem in diesen Tagen)
Ja, alle Programme werden schließlich in Maschinencode übersetzt. ABER:
Einige Programme erhalten übersetzt während der Kompilierung , während andere on-the-fly von einem Dolmetscher übersetzt werden (zum Beispiel Perl) oder eine virtuellen Maschine (z ursprüngliche Java)
Offensichtlich ist letzteres viel langsamer, da Sie während des Laufens Zeit für die Übersetzung benötigen.
Verschiedene Sprachen können in verschiedene Maschinencodes übersetzt werden. Auch wenn die gleiche Programmieraufgabe erledigt ist. Je nach Sprache kann der Maschinencode daher schneller oder langsamer sein.
Sie sollten den Unterschied zwischen dem Übersetzen (was übersetzt) und dem Dolmetschen (das simulieren) verstehen. Sie sollten auch das Konzept einer universellen Basis für die Berechnung verstehen.
Eine Sprache oder ein Befehlssatz ist universal , wenn damit ein Interpreter (oder Simulator) für eine andere Sprache oder einen anderen Befehlssatz geschrieben werden kann. Die meisten Computer sind elektronisch, aber sie können auf viele andere Arten hergestellt werden, beispielsweise durch Fluidik oder mechanische Teile oder sogar durch Personen, die den Anweisungen folgen. Eine gute Unterrichtsübung besteht darin, ein kleines Programm in BASIC zu schreiben und dann einen Klassenraum von Schülern zu verwenden, um das Programm "auszuführen", indem man seinen Schritten folgt. Da BASIC universell ist (in erster Näherung), können Sie damit ein Programm schreiben, das den Befehlssatz für jeden anderen Computer simuliert.
Du könntest also ein Programm in deiner Lieblingssprache machen, es in Maschinensprache für deine Lieblingsmaschine übersetzen, einen Dolmetscher für diese Maschine in BASIC schreiben lassen und dann (im Prinzip) eine Klasse voller Schüler haben " Führ es aus. Auf diese Weise wird es zunächst auf einen Befehlssatz für eine "schnelle" Maschine reduziert und dann von einem sehr, sehr langsamen "Computer" ausgeführt. Es wird immer noch die gleiche Antwort geben, nur etwa eine Billion mal langsamer.
Punkt ist, das Konzept der Universalität macht alle Computer gleichwertig, auch wenn einige sehr schnell und andere sehr langsam sind.
Nein, einige Sprachen werden von einem 'Software-Interpreter' als Byte-Code ausgeführt.
Es hängt auch davon ab, was die Sprache auch im Hintergrund tut, also können zwei gleich funktionierende Programme in verschiedenen Sprachen unterschiedliche Mechanismen hinter den Kulissen haben und daher unterschiedliche Anweisungen ausführen, was zu unterschiedlichen Leistungen führt.
Tags und Links performance compiler-construction interpreter