2010-12-28 12 views
8

In Erlang and OTP in Action (Seite 46), die Autoren die folgenden in einer Notiz angeben:Wenn der kompilierte Code unterscheidet sich von der Shell ausgewertet?

es, dass in irgendeinem seltsamen Ecke Fall passieren kann, Code in der Shell ausgewertet verhält sich aus dem gleichen Code etwas anders, wenn sie als Teil kompiliert eines Moduls. In diesem Fall ist die kompilierte Version der Goldstandard. Die Shell versucht ihr Bestes, genau das Gleiche zu tun, wenn sie die Ausdrücke interpretiert.

Können Sie sich eine oder mehrere dieser ungerade Eckfällen? Welches sind die kleinen Unterschiede in diesen Fällen?

Antwort

7

Der erlang Interpreter, erl_eval, bemüht sich sehr genau wie kompilierten Code zu verhalten. Wenn dies nicht der Fall ist, handelt es sich höchstwahrscheinlich um einen Fehler.

Außer in einem Fall und das empfängt Nachrichten. Kompilierter Code kann auf die internen Anweisungen zugreifen, um auf die Nachrichtenwarteschlange zuzugreifen und diese zu bearbeiten. Der Dolmetscher kann das nicht tun. Es muss: Nachrichten aus der Warteschlange entfernen (mehr oder weniger mit receive X -> X end); Testen Sie sie, um zu sehen, ob sie mit den Empfangsmustern übereinstimmen. behalte diejenigen, die nicht übereinstimmen; und setzen Sie alle derzeit unerwünschten Nachrichten in die Warteschlange (indem Sie alle Nachrichten erhalten und sie dann an sich selbst zurücksenden). Dies bedeutet, dass es eine kurze Zeit gibt, in der, wenn eine Nachricht eintrifft, sie nicht an derselben Stelle in der Nachrichtenwarteschlange wie für den kompilierten Code endet.

8

Der wichtigste Unterschied ist, dass die Shell interpretiert wird, während der kompilierte Code ist ... na ja .. zusammengestellt. Dies hat einen beobachtbaren Unterschied in der Ausführungsgeschwindigkeit und dem Speicherverbrauch der Funktion. Mit anderen Worten, Sie können feststellen, dass die interpretierte Variante langsamer ist oder all Ihren Speicher verbraucht, während die kompilierte Version dies nicht tut.

Dieses Problem hat viele junge Erlang Programmierer gebissen. Er oder sie denkt, dass Erlang im Vergleich zu anderen Sprachen eher langsam ist, während es in Wirklichkeit einen Test von interpretiertem Code gegen kompiliert darstellt.

Der Absatz ist eine Schutzmaßnahme. Grundsätzlich sollten sich der Interpreter und der Compiler auf alle Ein-/Ausgaben einer Funktion einigen. Aber das ist leider nicht immer der Fall. In der Praxis sind der Interpreter und der Compiler unterschiedliche Ausführungsmaschinen und können sich daher unterscheiden. Wenn Sie native über HiPE kompilieren, sind die Änderungen möglicherweise noch größer. In der Regel treten Probleme mit IEEE-754-Fließkommazahlen auf.

+1

Ein Fall, wo der Geschwindigkeitsunterschied Sie bekommen kann, ist in Spaß in der Shell erstellt. Sie sind nicht kompiliert und werden immer interpretiert, auch wenn sie in kompilierten Code übergeben werden. – rvirding

Verwandte Themen