Frage

Ich war über das Für und Wider der interpretierten Sprachen zu lesen, und eine der häufigsten Nachteile ist die Langsamkeit, aber warum sind Programme in interpretierten Sprachen langsam?

War es hilfreich?

Lösung

Native Programme läuft Anweisungen für den Prozessor geschrieben mit sie laufen.

interpretierte Sprachen sind genau das, „interpretiert“. Eine andere Form der Anweisung gelesen und interpretiert, durch eine Laufzeit, die wiederum führt nativen Maschinenbefehle.

Denken Sie an es auf diese Weise. Wenn Sie in Ihrer Muttersprache mit jemandem sprechen kann, dass in der Regel schneller arbeiten würde als einen Dolmetscher mit, die Ihre Sprache in eine andere Sprache zu übersetzen für den Zuhörer zu verstehen.

Beachten Sie, dass, was ich beschreibe oben ist, wenn eine Sprache in einem Interpreter ausgeführt wird. Es gibt Dolmetscher für viele Sprachen, die es gibt auch einheimische Linker für diesen Build nativen Maschinenbefehle. Die Geschwindigkeitsreduzierung nur (aber die Größe, dass auch sein mag) den interpretierten Kontext gilt.

So ist es etwas falsch zu sagen, dass die Sprache ist langsam, sondern es ist der Kontext, in dem es ausgeführt wird, das ist langsam.

C # ist nicht eine interpretierte Sprache, obwohl es eine Zwischensprache (IL) beschäftigt, wird dies native Befehle JITted bevor sie ausgeführt werden, so hat es einig die gleiche Geschwindigkeitsreduzierung, aber nicht alles, aber ich würde wetten, dass, wenn Sie einen vollwertigen Interpreter für C # oder C ++ gebaut, es auch langsamer laufen würde.

Und nur klar zu sein, wenn ich „langsam“ sagen, das ist natürlich ein relativer Begriff.

Andere Tipps

Alle Antworten scheinen die wirklich wichtigen Punkt hier zu verpassen. Es ist das Detail, wie „interpretiert“ Code implementiert wird.

interpretierte Skriptsprachen sind langsamer, weil ihre Methode, Objekt und globale Variable Raummodell dynamisch ist. Meiner Meinung nach ist dies die wirkliche Definition von Skriptsprache nicht die Tatsache, dass es interpretiert wird. Dies erfordert viele zusätzliche Hash-Table Lookups auf jedem Zugriff auf eine Variable oder einen Methodenaufruf. Und ist der Hauptgrund, warum sie bei Multithreading all schrecklich sind und mit einem GIL (Global Interpreter Lock). Diese Lookups ist, wo die meiste Zeit verbracht wird. Es ist ein schmerzhafter Zufall Speicher-Lookup, was wirklich weh tut, wenn Sie eine L1 / L2-Cache-Miss zu bekommen.

Google Javascript Core8 ist so schnell und fast C Geschwindigkeit für eine einfache Optimierung Targeting: Sie können das Objektdatenmodell nehmen als festes und internen Code erstellen, um darauf zuzugreifen, wie die Datenstruktur eines nativen kompilierte Programms. Wenn eine neue Variable oder Methode hinzugefügt wird, oder dann der ganze kompilierten Code entfernt wird verworfen und neu kompiliert.

Die Technik ist in der Deutsch / Schiffman Papier "Effiziente Umsetzung des Smalltalk-80 System" erklärt.

Die Frage, warum PHP, Python und Ruby nicht tun dies ist ziemlich einfach zu beantworten: die Technik ist äußerst kompliziert zu implementieren

.

Und nur Google hat das Geld für JavaScript zu zahlen, weil ein schneller Browser-basierten JavaScript-Interpreter ihre grundsätzliche Notwendigkeit ihrer Milliarden-Dollar-Geschäftsmodell ist.

Denken Sie an die interpeter als Emulator für eine Maschine, die Sie passieren nicht über

Die kurze Antwort ist, dass die kompilierten Sprachen durch Maschinenbefehle ausgeführt werden, während die interpretierten diejenigen, die durch ein Programm (geschrieben in einer kompilierten Sprache) ausgeführt werden, die entweder die Quelle oder einen Bytecode liest und dann emuliert im Wesentlichen eine hypothetische Maschine, die em < > würde das Programm direkt ausgeführt werden, wenn die Maschine gegeben.

Denken Sie an die interpretierte Laufzeit als Emulator für eine Maschine, die Sie tatsächlich im Moment nicht passieren müssen um zu.

Dies wird offensichtlich durch die JIT (Just In Time) Compiler, die Java, C # und andere kompliziert haben. In der Theorie sind sie genauso gut wie „AOT“ ( „At One Time“) Compiler aber in der Praxis laufen diese Sprachen langsamer und werden behindert durch, um den Compiler zu haben, um Speicherplatz und Zeit bei der Programmlaufzeit zu verbrauchen. Aber wenn Sie etwas davon sagen, hier auf so vorbereitet werden, tollwütige JIT Verteidiger zu gewinnen, die darauf bestehen, dass es kein theoretischer Unterschied zwischen JIT und AOT. Wenn Sie sie fragen, ob Java und C #, so schnell wie C und C ++ sind, dann fangen sie an, Ausreden und Art ein wenig zu beruhigen. : -)

So, C ++ total Regeln in Spielen, in denen die maximale Menge an zur Verfügung stehenden Rechen können immer in Gebrauch genommen werden.

Auf dem Desktop und Web, informationsorientierten Aufgaben werden oft von Sprachen mit mehr Abstraktion oder zumindest weniger Kompilierung durchgeführt, weil die Computer sehr schnell sind und die Probleme sind nicht rechenintensiv, so können wir einige Zeit auf Ziele ausgeben wie Time-to-Market, die Produktivität von Programmierern, zuverlässige Speichersichere Umgebungen, dynamische Modularität und andere leistungsstarke Werkzeuge.

Dies ist eine gute Frage, aber soll ein wenig anders meiner Meinung nach, zum Beispiel formuliert werden: „Warum? Sprachen interpretieren langsamer als kompilierte Sprachen“

Ich denke, es ist ein weit verbreitetes Missverständnis ist, dass Sprachen langsam interpretiert sind per se. Interpretierten Sprachen sind nicht bremsen , sondern, je nach Anwendungsfall, möglicherweise langsamer als die kompilierte Version. In den meisten Fällen interpretierte Sprachen sind eigentlich schnell genug

„Schnell genug“, sowie die Steigerung der Produktivität von einer Sprache wie Python über, zum Beispiel, sollte C Rechtfertigung genug sein, um eine interpretierte Sprache zu betrachten. Sie können aber auch immer bestimmte Teile des interpretierten Programms ersetzen mit einer schnellen C-Implementierung, wenn Sie wirklich Geschwindigkeit benötigen. Aber dann wieder, zuerst messen und festzustellen, ob Geschwindigkeit wirklich das Problem ist, dann optimieren.

Schleife 100 mal, wird der Inhalt der Schleife 100 Mal in niedrigen Niveau-Code interpretiert.

nicht im Cache gespeichert, nicht wieder verwendet, nicht optimiert.

In einfachen Worten, ein Compiler interpretiert einmal in geringen Code

Bearbeiten, nachdem Kommentare:

  • JIT zusammengestellt Code , nicht interpretiert. Es ist nur später kompiliert nicht up-front
  • Ich verweise auf die klassische Definition, nicht modern praktische Implementierungen

Zusätzlich zu den anderen Antworten gibt es Optimierung: Wenn Sie ein Programm kompilieren, müssen Sie in der Regel nicht, wie lange es dauert zu kompilieren - der Compiler hat viel Zeit, Ihren Code zu optimieren. Wenn Sie Code zu interpretieren, hat es sehr schnell getan werden, so einige der cleveren Optimierungen nicht gemacht werden könnten können.

Eine einfache Frage, ohne wirkliche einfache Antwort. Unterm Strich ist, dass alle Computer wirklich „verstehen“ binäre Instruktionen sind, das ist das, was „schnell“ Sprachen wie C in kompiliert werden.

Dann gibt es virtuelle Maschinen, die verschiedene binäre Instruktionen verstehen (wie Java und .NET), aber die haben im Fluge zu Maschinenbefehlen von einem Just-In-Compiler (JIT) übersetzt werden. Das ist fast so schnell (noch schneller in einigen speziellen Fällen, da der JIT mehr Informationen als ein statischer Compiler auf, wie der Code verwendet wird.)

Dann gibt es interpretiert Sprachen, die in der Regel auch ihre eigenen Zwischen binären Instruktionen haben, aber die Interpreter funktionieren ähnlich wie eine Schleife mit einer großen switch-Anweisung in es mit einem Fall für jede Anweisung, und wie es auszuführen. Diese Abstraktionsebene über den darunterliegenden Maschinencode ist langsam. Es gibt mehr Befehle beteiligt, lange Ketten von Funktionsaufrufen in dem Interpreter selbst einfache Dinge zu tun, und es kann argumentiert werden, dass der Speicher und Cache sind nicht so effektiv als Folge verwendet wird.

Aber interpretierten Sprachen sind oft schnell genug für die Zwecke, für die sie verwendet werden. Web-Anwendungen werden immer gebunden durch IO (in der Regel Zugriff auf die Datenbank), die um eine Größenordnung langsamer als jeder Dolmetscher.

Es gibt nicht so etwas wie eine interpretierte Sprache. Jede Sprache kann durch einen Interpreter oder Compiler implementiert werden. Heutzutage haben die meisten Sprachen haben Implementierungen einen Compiler.

Das heißt, Dolmetscher sind in der Regel langsamer, weil sie die Sprache oder etwas ziemlich nahe zur Laufzeit verarbeiten müssen und übersetzen es zu Maschinenbefehlen. Ein Compiler erledigt diese Übersetzung Maschinenbefehle nur einmal, nach, dass sie direkt ausgeführt werden.

about.com :

  

Eine interpretierte Sprache verarbeitet wird   zur Laufzeit. Jede Zeile gelesen wird,   analysiert und ausgeführt werden. Mit zu   einer Linie, jedes Mal in einer Schleife erneut verarbeiten   ist es, was so interpretiert Sprachen macht   schleppend. Dieser Aufwand bedeutet, dass   interpretierten Code läuft zwischen von 5 bis 10   mal langsamer als kompilierte Code. Das   interpretierten Sprachen wie Basic oder   JavaScript sind die langsamste. Ihr   Vorteil ist, um nicht zu sein   nach Änderungen neu kompiliert und das ist   praktisch, wenn Sie zum Programm sind zu lernen.

Die 5-10-mal langsamer ist nicht unbedingt wahr für Sprachen wie Java und C #, aber. Sie werden interpretiert, aber die just-in-time-Compiler Maschinensprache generieren Anweisungen für einige Operationen, die Beschleunigung Dinge dramatisch (in der Nähe der Geschwindigkeit einer kompilierten Sprache manchmal).

interpretierten Sprachen benötigen Quellcode zur Ausführungszeit lesen und zu interpretieren. Mit kompilierten Code ist eine Menge dieser Auslegung vor der Zeit getan (bei der Kompilierung).

Nur sehr wenige zeitgenössischen Skriptsprachen sind "interpretiert" in diesen Tagen; sie typischerweise im laufenden Betrieb, entweder in Maschinencode oder in eine Zwischen Bytecode Sprache erstellt, die sie in einer virtuellen Maschine ausgeführt ist (effiziente).

Having said that, sie sind langsamer, weil Ihre CPU ist viel mehr Befehle pro „Codezeile“ ausgeführt wird, da viele der Befehle ausgegeben werden, zu verstehen, den Code, anstatt zu tun, was die Semantik der Linie vorschlagen!

Lesen Sie diese Vor-und Nachteile interpretierten Sprachen

Dies ist die entsprechende Idee in diesem Beitrag zu Ihrem Problem.

  

Eine Ausführung durch einen Dolmetscher ist   in der Regel viel weniger effizient dann   regelmäßige Programmausführung. Es passiert   weil entweder jede Anweisung   sollte eine Interpretation passieren bei   Laufzeit, oder wie in neueren   Implementierungen muss der Code sein   zu einem Zwischen kompilierten   Vertretung vor jeder Ausführung.

Aus dem gleichen Grunde, dass es langsamer ist über Übersetzer zu sprechen als in der Muttersprache. Oder das Lesen mit Wörterbuch. Es braucht Zeit, zu übersetzen.

Update: nein, ich habe nicht gesehen, dass meine Antwort die gleiche wie die akzeptiert ist, zu einem gewissen Grad; -)

Ja, interpretierte Sprachen sind langsam ...

Beachten Sie jedoch die folgenden. Ich hatte ein Problem zu lösen. Es dauerte 4 Minuten das Problem in Python zu lösen, und das Programm dauerte 0,15 Sekunden zu laufen. Dann versuchte ich es in C zu schreiben, und ich habe eine Laufzeit von 0,12 Sekunden und es dauerte 1 Stunde, es zu schreiben. All dies, weil die praktische Art und Weise in Frage kommenden Problem zu lösen war Hashtables zu verwenden, und die Hash-Tabelle dominierte die Laufzeit trotzdem.

Wikipedia sagt ,

  

Interpretieren Code ist langsamer als die kompilierte Code ausgeführt wird, weil die Interpreter jede Anweisung im Programm es jedes Mal analysieren muss ausgeführt wird, und dann die gewünschte Aktion ausführen, während nur der kompilierte Code die Aktion in einem festen Zusammenhang führt bestimmt durch die Zusammenstellung . Diese Laufzeitanalyse wird als „interpretierende Overhead“ bekannt. Der Zugriff auf Variablen ist auch langsamer in einem Dolmetscher, weil die Zuordnung von Kennungen auf Speicherort muß immer wieder zur Laufzeit statt zum Zeitpunkt der Kompilierung durchgeführt werden.

Siehe diese IBM doc ,

  

interpretierte Programm muss jedes Mal übersetzt wird sie ausgeführt wird, gibt es einen höheren Aufwand. Somit ist eine interpretierte Sprache im Allgemeinen besser geeignet, um Ad-hoc-Anfragen als vordefinierte Anfragen.

In Java obwohl es als eine interpretierte Sprache betrachtet wird, verwendet es JIT (Just-in-Time) zusammen~~POS=TRUNC, die durch die Verwendung einer Caching-Technik cachen der kompilierte Bytecode das oben genannte Problem zu mildern.

  

Der JIT-Compiler liest den Bytecode in vielen Abschnitten (oder ganz selten) und kompiliert diese Maschinencode dynamisch in so dass das Programm schneller laufen kann. Dies kann per-Datei durchgeführt werden, pro-Funktion oder auch auf jedem beliebigen Code-Fragment; der Code kompiliert werden, wenn es um später (den Namen „just-in-time“, also) und dann im Cache gespeichert und wiederverwendet ausgeführt werden, ohne neu kompiliert werden muß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top