2 Stimmen

Programmspeicherbedarf bei verschiedenen Interpretern/Compilern

Hier ist ein Auszug aus der Wikipedia-Eintrag zur Programmiersprache K :

Die geringe Größe des Interpreters und die kompakte Syntax der Sprache ermöglichen es, dass K-Anwendungen vollständig in den Level-1-Cache des Prozessors passen.

Was macht die K-Programme so klein? Wenn man verwendet ' Operator in K, map in einer kompilierten funktionalen Sprache wie Haskell oder einer gleichwertigen Sprache for Schleife in einer kompilierten imperativen Sprache wie C, kann ich mir nicht vorstellen, dass einer der Compiler eine radikal unterschiedlichen Assembler-Code oder dass sich die Vorgänge in den Interpreter-Interna stark von for Schleife. Gibt es irgendetwas Besonderes an K, das seine Laufzeit und seine Programme so klein macht?

Es gibt eine ähnliche Frage auf SO, aber die Antworten dort klären im Grunde nichts.

1voto

Brian Sullivan Punkte 11

Ich bin nicht der Autor der obigen Wikipedia-Erklärung, sondern nur jemand, der K ausgiebig nutzt.

Was den Code betrifft, so rollt K keine Schleifen ab und nimmt auch keine anderen Änderungen an der Programmstruktur vor, die den Umfang des Programms über das von Ihnen erwartete Maß hinaus erhöhen würden. Der ausführbare Interpreter selbst ist winzig. Und die Programme neigen dazu, klein zu sein (wenn auch nicht unbedingt so). Es ist nicht die Ausführung bestimmter Anweisungen für das Mapping usw., die es wahrscheinlicher macht, dass der Code selbst vollständig im Cache ausgeführt wird.

K-Programme sind in der Regel klein, weil sie einen kleinen, kompakten Bytecode speichern und ihre Syntax dazu neigt, sehr kleine Mengen an Code für eine bestimmte Operation zu liefern.

Vergleichen Sie dieses Java-Programm:

int r=0;
for(int i=0; i<100; i++) {
  r+=i;
}

Gegen dieses K-Programm wird das gleiche Ergebnis erzielt:

+/!100

Die Menge des auszuführenden Codes ist ähnlich, aber der vom Programm benötigte Speicherplatz (viel weniger Tipparbeit!) ist viel geringer. K eignet sich hervorragend für Personen mit Verletzungen durch wiederholte Belastung.

Was die Daten anbelangt, so wird durch die Ermutigung, mehrere Datenelemente mit einem einzigen Befehl zu bearbeiten, der Zugriff eher sequentiell und damit cachefreundlich als zufällig erfolgen. All dies macht es lediglich wahrscheinlicher, dass das Programm cache-freundlich ist.

Aber das sind alles nur Tendenzen und bewährte Verfahren innerhalb der Sprache in Kombination mit der ausführbaren Datei K selbst. Wenn Sie große Mengen an zusätzlichem Code einbinden, viele Funktionen mit Spezialfällen versehen und Ihre Indizes vor dem Zugriff auf Ihre Daten randomisieren, wird Ihr Programm genauso unfreundlich gegenüber dem Cache sein, wie Sie es erwarten würden.

1voto

SK-logic Punkte 9388

Es gibt Möglichkeiten, einen sehr kompakten Code zu erzeugen. Zum Beispiel, eine http://en.wikipedia.org/wiki/Threaded_code von Forth und ähnlichem. Es ist wahrscheinlich, dass K in irgendeiner Form davon zusammengestellt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X