Was bedeutet der Satz "Wir wollten, dass er kompiliert wird, damit die CPU nicht die falschen Dinge tut."

10

Ich habe diesen Artikel gelesen . Es hat den folgenden Absatz.

Und hat sich Scala als schnell herausgestellt? Was ist Ihre Definition von schnell? Etwa so schnell wie Java. Es muss nicht so schnell sein wie C oder Assembly. Python ist nicht wesentlich schneller als Ruby. Wir wollten mit weniger Maschinen mehr erreichen und die Parallelität besser nutzen. Wir wollten, dass es kompiliert wird, damit die CPU nicht die falschen Dinge tut.

Ich suche nach der Bedeutung des letzten Satzes. Wie wird die CPU durch interpretierte Sprache "falsch" gemacht?

user2434
quelle
3
Das Aufrufen von allem, was zu interpretiertem JVM-Bytecode kompiliert wird, ist bei der Verwendung etwas liberal.
Rig

Antworten:

47

Wenn der Code sagt

A = A + 1

kompilierter Code macht das

add A, 1

interpretierter Code macht dies (oder eine Variation)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

bekomme eine Vorstellung?

Mike Dunlavey
quelle
3
Manchmal macht eine zu starke Vereinfachung das Bild wirklich klarer ;-) (nur um vollständig zu sein: Viele bekannte Dolmetscher optimieren einige der Schritte entfernt, sodass sie sich auf halbem Weg zwischen den beiden Beispiel- "Implementierungen" befinden).
Joachim Sauer
3
@ JoachimSauer: Du hast natürlich recht. Es ist immer noch schwierig, einen Interpreter mit weniger als dem Faktor 10 Geschwindigkeitsstrafe im Vergleich zu kompiliertem Code zum Laufen zu bringen. Wenn die Sprache wirklich ihre ganze Zeit in untergeordneten kompilierten Funktionen verbringt, die ohnehin aufgerufen werden müssen, wie z. B. Mathematikbibliotheken oder E / A, sind die Kosten für das Dolmetschen kein Problem.
Mike Dunlavey
1
Dies ist eine erstaunliche Beschreibung
Jamie Taylor
13

Wir wollten, dass es kompiliert wird, damit die CPU nicht die falschen Dinge tut.

Klingt so, als würden sie sich auf kompilierte oder interpretierte beziehen. Höchstwahrscheinlich auf die ganze Geschichte von Twitter zurückzuführen, in der Hintergrundverarbeitungsaufgaben nach der ersten Entwicklung in Ruby On Rails (interpretiert) nach Scala (kompiliert) verschoben wurden.

Eine Erklärung des kompilierten und des interpretierten Codes hier .

Bei einer kompilierten Sprache wird der eingegebene Code auf eine Reihe von maschinenspezifischen Anweisungen reduziert, bevor er als ausführbare Datei gespeichert wird. Bei interpretierten Sprachen wird der Code in demselben Format gespeichert, das Sie eingegeben haben. Kompilierte Programme werden im Allgemeinen schneller ausgeführt als interpretierte, da interpretierte Programme zur Laufzeit auf Maschinenanweisungen reduziert werden müssen.

KrisG
quelle
Gerne geben wir Ihnen Ihre ersten +1. Willkommen bei P.SE!
Haylem
4
(Könnte erwähnenswert sein, dass Scala - wie es auf der JVM ist - technisch nur bytekompiliert ist).
Haylem
Ich wusste nicht, dass Scala JVM-basiert ist. Das heißt, es ist wahrscheinlich JIT kompiliert. Warum ist Twitter in diesem Fall nicht einfach von Ruby on Rails zu JRuby gewechselt? Sie würden denken, dass dies eine einfachere Migration mit dem Vorteil der Kompilierung wäre.
KrisG
3
Sie suchten auch nach einem besseren Parallelitätsmodell und hatten Probleme mit Rubys Garbage Collection. Der Artikel beschreibt es im Detail.
Scrwtp
9

"Falsches Zeug" bedeutet hier den Overhead, den der Interpreter benötigt, um den Code zu analysieren und zu verarbeiten. Es hängt mit dem Begriff der interpretierten und kompilierten Sprachen zusammen. Es werden verschiedene Modelle der Codeübersetzung verwendet, die grob in eine der folgenden Kategorien fallen:

  • Native Kompilierung - Der Quellcode wird direkt in Maschinencode kompiliert. Beste Leistung auf Kosten der Portabilität. Häufig mit C und C ++ verbunden,
  • Zwischenkompilierung - Der Quellcode wird in eine vereinfachte Zwischensprache (Bytecode) kompiliert, die später während der Ausführung interpretiert oder in Maschinencode kompiliert (Just-in-Time-Kompilierung) wird. Bessere Portabilität als nativer Code, bessere Leistung als reine Interpretation unter Beibehaltung einiger Vorteile der Interpretation (z. B. späte Bindung). Beispiele hierfür sind C #, Java und andere Sprachen für JVM und .NET CLR.
  • Interpretation - Der Quellcode wird nicht direkt in Maschinencode übersetzt, sondern von einem speziellen Interpreterprogramm interpretiert und ausgeführt. Interpreter unterscheiden sich in ihrer Raffinesse, in der naiven Implementierung geht es jedoch darum, den Quellcode Zeile für Zeile zu analysieren, zu analysieren und auszuführen. Die Interpretation ermöglicht eine größere Flexibilität als die Kompilierung. Daher nutzen interpretierte Sprachen beispielsweise die dynamische Typisierung oder Reflexion in größerem Umfang. Interpretierte Sprachen bieten häufig eine höhere Entwicklerproduktivität, da sie weniger Boilerplate-Code erfordern und sich gut für Rapid Prototyping eignen. Nachteil ist reduzierte Leistung. Wird häufig mit JavaScript, Ruby oder Python verwendet.

Daher läuft die Wahl zwischen interpretierter und kompilierter Sprache auf die Frage hinaus, was wir mehr schätzen, Entwicklerproduktivität oder Leistung? Die im Artikel beschriebene Migration scheint dem gleichen Gedankengang zu folgen, wobei die starke Prototyping-Sprache Ruby aus Leistungsgründen durch JVM-basierte Scala ersetzt wird.

scrwtp
quelle
-1 Die Art und Weise, wie die Antwort formuliert ist, sieht viel zu simpel aus. Dinge wie JIT ( Just-in-Time-Kompilierung ) werden völlig ignoriert - so läuft Scala übrigens über JVM / CLR
Mücke
Wahr. Die Antwort wurde umgeschrieben und fügte dem Thema sozusagen wenig hinzu.
Scrwtp
-3

In diesem Fall habe ich the wrong stuffunter mangelnder Typensicherheit in nicht kompiliertem Code verstanden.

Somit wird Code nicht nur langsamer interpretiert, sondern ist auch fehlerhafter ...

Neil Twist
quelle
8
Sie gehen davon aus, dass kompilierte Sprachen typsicher sind und interpretierte Sprachen nicht. Es gibt viele Gegenbeispiele. Zum Beispiel kann lisp kompiliert werden und ist nicht stark typisiert, während Haskell interpretiert werden kann und SEHR typsicher ist
Zachary K
1
Das Gleichsetzen von "nicht typsicher" mit "mehr Buggy" ist FUD, das von Leuten mit Produkten zum Verkauf angeboten wird.
user16764
1
@ user16764: Es ist nicht FUD, wenn es wahr ist. IME sind die Leute, die Unsinn in Bezug auf den Verkauf von Produkten vorantreiben, diejenigen, die versuchen, die Verbindung zwischen dynamischer Eingabe und Fehlern herunterzuspielen. ("Es ist nur eine Art von Fehler " usw.)
Mason Wheeler