Was ist der Unterschied zwischen Laufzeit und Kompilierungszeit?
language-agnostic
runtime
compile-time
devforall
quelle
quelle
Antworten:
Der Unterschied zwischen Kompilierungszeit und Laufzeit ist ein Beispiel dafür, was spitzköpfige Theoretiker die Phasendifferenzierung nennen . Es ist eines der am schwierigsten zu erlernenden Konzepte, insbesondere für Menschen ohne viel Hintergrundwissen in Programmiersprachen. Um dieses Problem anzugehen, finde ich es hilfreich zu fragen
Kompilierzeit
Laufzeit
Was schief gehen kann, sind Laufzeitfehler :
Es kann auch Fehler geben, die vom Programm selbst erkannt werden:
quelle
Ich denke an Fehler und daran, wann sie abgefangen werden können.
Kompilierungszeit:
Einem Zeichenfolgenwert kann keine Variable vom Typ int zugewiesen werden, sodass der Compiler zur Kompilierungszeit sicher weiß , dass dieser Code ein Problem aufweist
Laufzeit:
Hier hängt das Ergebnis davon ab, welche Zeichenfolge von ReadLine () zurückgegeben wurde. Einige Werte können zu einem int analysiert werden, andere nicht. Dies kann nur zur Laufzeit ermittelt werden
quelle
.app
Erweiterung kompiliert ? oder passiert es beim Start jedes Mal, wenn der Benutzer die App startet?Kompilierungszeit: Der Zeitraum, in dem Sie als Entwickler Ihren Code kompilieren.
Laufzeit: Der Zeitraum, in dem ein Benutzer Ihre Software ausführt.
Benötigen Sie eine klarere Definition?
quelle
int x = 3/0
aber Sie tun nichts mit dieser Variablen. Wir drucken es nicht oder so. Wird das immer noch als Laufzeitfehler angesehen?( Bearbeiten : Folgendes gilt für C # und ähnliche, stark typisierte Programmiersprachen. Ich bin mir nicht sicher, ob dies Ihnen hilft.)
Beispielsweise wird der folgende Fehler vom Compiler (zur Kompilierungszeit ) erkannt , bevor Sie ein Programm ausführen, und führt zu einem Kompilierungsfehler:
Andererseits kann ein Fehler wie der folgende vom Compiler nicht erkannt werden. Sie erhalten zur Laufzeit (wenn das Programm ausgeführt wird) einen Fehler / eine Ausnahme .
quelle
Die Übersetzung von Quellcode in Dinge, die auf dem [Bildschirm | Festplatte | Netzwerk] geschehen, kann auf (ungefähr) zwei Arten erfolgen. Nennen Sie sie Kompilieren und Interpretieren.
In einem kompilierten Programm (Beispiele sind c und fortran):
Dinge, die im ersten Schritt geschehen, sollen zur "Kompilierungszeit" geschehen, Dinge, die im zweiten Schritt geschehen, sollen zur "Laufzeit" geschehen.
In einem interpretierten Programm (Beispiel MicroSoft Basic (on dos) und Python (glaube ich)):
In diesem Fall ist der Unterschied zwischen Kompilierungszeit und Laufzeit schwieriger zu bestimmen und für den Programmierer oder Benutzer viel weniger relevant.
Java ist eine Art Hybrid, bei dem der Code zu Bytecode kompiliert wird, der dann auf einer virtuellen Maschine ausgeführt wird, die normalerweise ein Interpreter für den Bytecode ist.
Es gibt auch einen Zwischenfall, in dem das Programm zu Bytecode kompiliert und sofort ausgeführt wird (wie in awk oder perl).
quelle
Wenn Ihr Compiler herausfinden kann, was Sie meinen oder was ein Wert "zur Kompilierungszeit" ist, kann er dies grundsätzlich in den Laufzeitcode fest codieren. Wenn Ihr Laufzeitcode jedes Mal eine Berechnung durchführen muss, wenn er langsamer ausgeführt wird, ist es natürlich viel besser, wenn Sie zur Kompilierungszeit etwas bestimmen können.
Z.B.
Ständiges Falten:
Wenn ich schreibe:
Der Compiler kann diese Berechnung zur Kompilierungszeit durchführen, da er weiß, was 2 ist und was MY_CONSTANT ist. Als solches erspart es sich, bei jeder einzelnen Ausführung eine Berechnung durchzuführen.
quelle
Hmm, ok, Laufzeit wird verwendet, um etwas zu beschreiben, das auftritt, wenn ein Programm ausgeführt wird.
Die Kompilierungszeit wird verwendet, um etwas zu beschreiben, das beim Erstellen eines Programms auftritt (normalerweise von einem Compiler).
quelle
Kompilierungszeit:
Dinge, die zur Kompilierungszeit ausgeführt werden, verursachen (fast) keine Kosten, wenn das resultierende Programm ausgeführt wird, können jedoch beim Erstellen des Programms hohe Kosten verursachen.
Laufzeit:
Mehr oder weniger das genaue Gegenteil. Geringe Kosten beim Erstellen, höhere Kosten beim Ausführen des Programms.
Von der anderen Seite; Wenn etwas zur Kompilierungszeit ausgeführt wird, wird es nur auf Ihrem Computer ausgeführt, und wenn etwas zur Laufzeit ausgeführt wird, wird es auf dem Computer Ihres Benutzers ausgeführt.
Relevanz
Ein Beispiel dafür, wo dies wichtig ist, wäre ein Gerätetragetyp. Eine Version zur Kompilierungszeit (wie Boost.Units oder meine Version in D ) ist genauso schnell wie die Lösung des Problems mit nativem Gleitkomma-Code, während eine Laufzeitversion Informationen über die Einheiten, die ein Wert sind, umpacken muss in und führen Sie neben jeder Operation Überprüfungen durch. Andererseits erfordern die Versionen zur Kompilierungszeit, dass die Einheiten der Werte zur Kompilierungszeit bekannt sind, und können den Fall nicht behandeln, in dem sie aus der Laufzeiteingabe stammen.
quelle
Nach der vorherigen ähnlichen Antwort auf die Frage Was ist der Unterschied zwischen Laufzeitfehler und Compilerfehler?
Kompilierungs- / Kompilierungszeit- / Syntax- / Semantikfehler: Kompilierungs- oder Kompilierungszeitfehler sind Fehler, die aufgrund eines Tippfehlers aufgetreten sind. Wenn wir nicht der richtigen Syntax und Semantik einer Programmiersprache folgen, werden Kompilierungszeitfehler vom Compiler ausgelöst. Sie lassen Ihr Programm keine einzelne Zeile ausführen, bis Sie alle Syntaxfehler entfernt oder die Fehler bei der Kompilierung behoben haben.
Beispiel: Fehlen eines Semikolons in C oder falsches Eingeben
int
alsInt
.Laufzeitfehler: Laufzeitfehler sind die Fehler, die generiert werden, wenn das Programm ausgeführt wird. Diese Art von Fehlern führt dazu, dass sich Ihr Programm unerwartet verhält oder sogar Ihr Programm beendet. Sie werden oft als Ausnahmen bezeichnet.
Beispiel: Angenommen, Sie lesen eine nicht vorhandene Datei, was zu einem Laufzeitfehler führt.
Lesen Sie mehr über alle Programmierfehler hier
quelle
Als Ergänzung zu den anderen Antworten würde ich es einem Laien folgendermaßen erklären:
Ihr Quellcode ist wie die Blaupause eines Schiffes. Es definiert, wie das Schiff hergestellt werden soll.
Wenn Sie Ihre Blaupause an die Werft übergeben und sie beim Bau des Schiffes einen Defekt feststellen, hören sie auf zu bauen und melden ihn Ihnen sofort, bevor das Schiff jemals das Trockendock verlassen oder Wasser berührt hat. Dies ist ein Fehler bei der Kompilierung. Das Schiff schwebte noch nie oder benutzte seine Motoren. Der Fehler wurde gefunden, weil dadurch verhindert wurde, dass das Schiff überhaupt hergestellt wurde.
Wenn Ihr Code kompiliert wird, ist es so, als würde das Schiff fertiggestellt. Gebaut und bereit zu gehen. Wenn Sie Ihren Code ausführen, ist das wie das Starten des Schiffes auf einer Reise. Die Passagiere sind an Bord, die Motoren laufen und der Rumpf ist auf dem Wasser, also ist dies Laufzeit. Wenn Ihr Schiff einen schwerwiegenden Fehler aufweist, der es auf seiner Jungfernfahrt versenkt (oder auf einer Reise nachher wegen zusätzlicher Kopfschmerzen), ist ein Laufzeitfehler aufgetreten.
quelle
Beispiel: In einer stark typisierten Sprache kann ein Typ zur Kompilierungszeit oder zur Laufzeit überprüft werden. Zur Kompilierungszeit bedeutet dies, dass sich der Compiler beschwert, wenn die Typen nicht kompatibel sind. Zur Laufzeit bedeutet, dass Sie Ihr Programm problemlos kompilieren können, zur Laufzeit jedoch eine Ausnahme auslösen.
quelle
In einfachen Worten Differenz s / w Kompilierzeit & Laufzeit.
Kompilierungszeit: Der Entwickler schreibt das Programm im Java-Format und konvertiert es in den Bytecode, der eine Klassendatei ist. Während dieser Kompilierung kann jeder auftretende Fehler als Kompilierungszeitfehler definiert werden.
Laufzeit: Die generierte .class-Datei wird von der Anwendung für ihre zusätzliche Funktionalität verwendet. Die Logik stellt sich als falsch heraus und gibt einen Fehler aus, der ein Laufzeitfehler ist
quelle
Hier ist ein Zitat von Daniel Liang, Autor von 'Introduction to JAVA Programming', zum Thema Compilation:
...Er fährt fort...
Wenn wir Code auf hoher Ebene / für Menschen lesbar eingeben, ist dies zunächst nutzlos! Es muss in eine Abfolge von "elektronischen Ereignissen" in Ihrer winzigen kleinen CPU übersetzt werden! Der erste Schritt dazu ist die Zusammenstellung.
Einfach ausgedrückt: Während dieser Phase tritt ein Kompilierungsfehler auf, während später ein Laufzeitfehler auftritt.
Denken Sie daran: Nur weil ein Programm fehlerfrei kompiliert wurde, heißt das nicht, dass es fehlerfrei ausgeführt wird.
Ein Laufzeitfehler tritt im bereiten, laufenden oder wartenden Teil eines Programmlebenszyklus auf, während ein Kompilierungsfehler vor der 'neuen' Phase des Lebenszyklus auftritt.
Beispiel für einen Fehler bei der Kompilierung:
Ein Syntaxfehler - Wie kann Ihr Code in Anweisungen auf Maschinenebene kompiliert werden, wenn diese nicht eindeutig sind? Ihr Code muss zu 100% den syntaktischen Regeln der Sprache entsprechen, sonst kann er nicht in funktionierenden Maschinencode kompiliert werden .
Beispiel für einen Laufzeitfehler:
Speichermangel - Ein Aufruf einer rekursiven Funktion kann beispielsweise bei einer Variablen eines bestimmten Grades zu einem Stapelüberlauf führen! Wie kann der Compiler dies antizipieren? es kann nicht.
Und das ist der Unterschied zwischen einem Fehler bei der Kompilierung und einem Laufzeitfehler
quelle
Laufzeit bedeutet, dass etwas passiert, wenn Sie das Programm ausführen.
Kompilierungszeit bedeutet, dass etwas passiert, wenn Sie das Programm kompilieren.
quelle
Kompilierungszeit:
Dinge, die zur Kompilierungszeit ausgeführt werden, verursachen (fast) keine Kosten, wenn das resultierende Programm ausgeführt wird, können jedoch beim Erstellen des Programms hohe Kosten verursachen. Laufzeit:
Mehr oder weniger das genaue Gegenteil. Geringe Kosten beim Erstellen, höhere Kosten beim Ausführen des Programms.
Von der anderen Seite; Wenn etwas zur Kompilierungszeit ausgeführt wird, wird es nur auf Ihrem Computer ausgeführt, und wenn etwas zur Laufzeit ausgeführt wird, wird es auf dem Computer Ihres Benutzers ausgeführt.
quelle
Kompilierungszeit: Die Zeit, die benötigt wird, um den Quellcode in einen Maschinencode umzuwandeln, damit er zu einer ausführbaren Datei wird, wird als Kompilierungszeit bezeichnet.
Laufzeit: Wenn eine Anwendung ausgeführt wird, wird sie als Laufzeit bezeichnet.
Kompilierungszeitfehler sind solche Syntaxfehler, fehlende Dateireferenzfehler. Laufzeitfehler treten auf, nachdem der Quellcode in ein ausführbares Programm kompiliert wurde und während das Programm ausgeführt wird. Beispiele sind Programmabstürze, unerwartetes Programmverhalten oder nicht funktionierende Funktionen.
quelle
Stellen Sie sich vor, Sie sind ein Chef und haben einen Assistenten und ein Dienstmädchen. Sie geben ihnen eine Liste der zu erledigenden Aufgaben. Der Assistent (Kompilierungszeit) greift nach dieser Liste und überprüft, ob die Aufgaben verständlich sind und Sie hat nicht in einer unangenehmen Sprache oder Syntax geschrieben, also versteht er, dass Sie jemanden für einen Job zuweisen möchten, also weist er ihn für Sie zu und er versteht, dass Sie einen Kaffee möchten, also ist seine Rolle vorbei und das Dienstmädchen (Laufzeit) beginnt diese Aufgaben auszuführen, damit sie dir Kaffee macht, aber plötzlich findet sie keinen Kaffee mehr, damit sie aufhört, ihn zu machen, oder sie verhält sich anders und macht dir Tee (wenn das Programm anders verhält, weil er einen Fehler gefunden hat ).
quelle
Hier ist eine Erweiterung der Antwort auf die Frage "Unterschied zwischen Laufzeit und Kompilierungszeit?" - Unterschiede im Overhead im Zusammenhang mit Laufzeit und Kompilierungszeit?
Die Laufzeitleistung des Produkts trägt zu seiner Qualität bei, indem es schnellere Ergebnisse liefert. Die Leistung des Produkts zur Kompilierungszeit trägt zu seiner Aktualität bei, indem der Zyklus zum Bearbeiten, Kompilieren und Debuggen verkürzt wird. Sowohl die Laufzeitleistung als auch die Kompilierungsleistung sind jedoch sekundäre Faktoren für die Erzielung einer zeitnahen Qualität. Daher sollten Verbesserungen der Laufzeit und der Kompilierungszeit nur in Betracht gezogen werden, wenn dies durch Verbesserungen der Gesamtproduktqualität und -aktualität gerechtfertigt ist.
Eine großartige Quelle für weitere Informationen hier :
quelle
Ich habe immer darüber nachgedacht, was den Aufwand für die Programmverarbeitung betrifft und wie sich dies auf die Leistung auswirkt, wie bereits erwähnt. Ein einfaches Beispiel wäre, entweder den für mein Objekt erforderlichen absoluten Speicher im Code zu definieren oder nicht.
Ein definierter Boolescher Wert benötigt x Speicher. Dieser befindet sich dann im kompilierten Programm und kann nicht geändert werden. Wenn das Programm ausgeführt wird, weiß es genau, wie viel Speicher für x reserviert werden muss.
Wenn ich dagegen nur einen generischen Objekttyp definiere (dh eine Art undefinierten Platzhalter oder vielleicht einen Zeiger auf einen riesigen Blob), ist der für mein Objekt erforderliche tatsächliche Speicher erst bekannt, wenn das Programm ausgeführt wird und ich ihm etwas zuweise Daher muss es ausgewertet werden, und die Speicherzuweisung usw. wird dann zur Laufzeit dynamisch behandelt (mehr Laufzeitaufwand).
Wie es dynamisch gehandhabt wird, hängt dann von der Sprache, dem Compiler, dem Betriebssystem, Ihrem Code usw. ab.
In diesem Sinne hängt es jedoch wirklich vom Kontext ab, in dem Sie die Laufzeit im Vergleich zur Kompilierungszeit verwenden.
quelle
Wir können diese in zwei große Gruppen einteilen: statische Bindung und dynamische Bindung. Es basiert darauf, wann die Bindung mit den entsprechenden Werten erfolgt. Wenn die Referenzen zur Kompilierungszeit aufgelöst werden, handelt es sich um eine statische Bindung. Wenn die Referenzen zur Laufzeit aufgelöst werden, handelt es sich um eine dynamische Bindung. Statische Bindung und dynamische Bindung werden auch als frühe Bindung und späte Bindung bezeichnet. Manchmal werden sie auch als statischer Polymorphismus und dynamischer Polymorphismus bezeichnet.
Joseph Kulandai.
quelle
Der Hauptunterschied zwischen Laufzeit und Kompilierungszeit ist:
int a = 1 int b = a/0;
Hier hat die erste Zeile am Ende kein Semikolon ---> Kompilierungszeitfehler nach Ausführung des Programms während der Ausführung von Operation b, Ergebnis ist unendlich ---> Laufzeitfehler.
quelle
Hier ist eine sehr einfache Antwort:
Laufzeit und Kompilierungszeit sind Programmierbegriffe, die sich auf verschiedene Phasen der Softwareprogrammentwicklung beziehen. Um ein Programm zu erstellen, schreibt ein Entwickler zuerst den Quellcode, der definiert, wie das Programm funktioniert. Kleine Programme enthalten möglicherweise nur einige hundert Zeilen Quellcode, während große Programme möglicherweise Hunderttausende von Zeilen Quellcode enthalten. Der Quellcode muss in Maschinencode kompiliert werden, um ein ausführbares Programm zu werden. Dieser Kompilierungsprozess wird als Kompilierungszeit bezeichnet (stellen Sie sich einen Compiler als Übersetzer vor).
Ein kompiliertes Programm kann von einem Benutzer geöffnet und ausgeführt werden. Wenn eine Anwendung ausgeführt wird, wird sie als Laufzeit bezeichnet.
Die Begriffe "Laufzeit" und "Kompilierungszeit" werden von Programmierern häufig verwendet, um auf verschiedene Arten von Fehlern hinzuweisen. Ein Kompilierungszeitfehler ist ein Problem wie ein Syntaxfehler oder ein fehlender Dateiverweis, der verhindert, dass das Programm erfolgreich kompiliert wird. Der Compiler erzeugt Fehler bei der Kompilierung und gibt normalerweise an, welche Zeile des Quellcodes das Problem verursacht.
Wenn der Quellcode eines Programms bereits in ein ausführbares Programm kompiliert wurde, können weiterhin Fehler auftreten, während das Programm ausgeführt wird. Beispiele hierfür sind nicht funktionierende Funktionen, unerwartetes Programmverhalten oder Programmabstürze. Diese Arten von Problemen werden als Laufzeitfehler bezeichnet, da sie zur Laufzeit auftreten.
Die Referenz
quelle
IMHO müssen Sie viele Links und Ressourcen lesen, um eine Vorstellung vom Unterschied zwischen Laufzeit und Kompilierungszeit zu bekommen, da es sich um ein sehr komplexes Thema handelt. Ich habe unten eine Liste dieser Bilder / Links, die ich empfehlen kann.
Abgesehen von dem, was oben gesagt wurde, möchte ich hinzufügen, dass manchmal ein Bild mit 1000 Wörtern:
CLR_diag Kompilierungszeit und dann Laufzeit2
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
Laufzeit, Laufzeit oder Laufzeit können sich beziehen auf:
Computing
Laufzeit (Programmlebenszyklusphase) , der Zeitraum, in dem ein Computerprogramm ausgeführt wird
Runtime Library , eine Programmbibliothek zur Implementierung von Funktionen, die in eine Programmiersprache integriert sind
Laufzeitsystem , Software zur Unterstützung der Ausführung von Computerprogrammen
Software-Ausführung, der Prozess der Ausführung von Anweisungen nacheinander während der Laufzeitphase
Liste der Compiler https://en.wikipedia.org/wiki/List_of_compilers
;;
3.2 der Unterschied zwischen diesen 3 Dingen: Kompilieren vs Build vs Laufzeit
https://www.quora.com/Was-ist-das-differenz- zwischen- build-run-and- compile Fernando Padoan, ein Entwickler, der nur ein bisschen neugierig auf Sprachdesign ist Beantwortet 23. Februar Ich gehe in Bezug zurück zu anderen Antworten:
Beim Ausführen wird eine ausführbare Binärdatei (oder ein Skript für interpretierte Sprachen) als neuer Prozess auf dem Computer ausgeführt. Beim Kompilieren wird ein Programm analysiert, das in einer höheren Sprache geschrieben ist (im Vergleich zum Maschinencode höher), die Syntax und Semantik überprüft, Bibliotheken verknüpft, möglicherweise optimiert und anschließend ein ausführbares Binärprogramm als Ausgabe erstellt. Diese ausführbare Datei kann in Form von Maschinencode oder einer Art Bytecode vorliegen, dh Anweisungen, die auf eine Art virtuelle Maschine abzielen. Das Erstellen umfasst normalerweise das Überprüfen und Bereitstellen von Abhängigkeiten, das Überprüfen von Code, das Kompilieren des Codes in Binärdateien, das Ausführen automatisierter Tests und das Packen der resultierenden Binärdateien und anderer Elemente (Bilder, Konfigurationsdateien, Bibliotheken usw.) in ein bestimmtes Format einer bereitstellbaren Datei. Beachten Sie, dass die meisten Prozesse optional sind und einige von der Zielplattform abhängen, für die Sie erstellen. Wenn Sie beispielsweise eine Java-Anwendung für Tomcat packen, wird eine .war-Datei ausgegeben. Das Erstellen einer ausführbaren Win32-Datei aus C ++ - Code kann nur das EXE-Programm ausgeben oder es auch in einem MSI-Installationsprogramm verpacken.
quelle
Schauen Sie sich dieses Beispiel an:
Der obige Code wurde erfolgreich kompiliert, es gibt keinen Syntaxfehler, er ist vollkommen gültig. Zur Laufzeit wird jedoch der folgende Fehler ausgegeben.
Wie wenn in der Kompilierungszeit bestimmte Fälle überprüft wurden, wurden nach dieser Laufzeit bestimmte Fälle überprüft, sobald das Programm alle Bedingungen erfüllt, die Sie erhalten. Andernfalls erhalten Sie einen Kompilierungs- oder Laufzeitfehler.
quelle
öffentliche Klasse RuntimeVsCompileTime {
}}
}}
}}
}}
}}
quelle
Sie können die Code-Kompilierungsstruktur anhand des tatsächlichen Codes verstehen. Die Laufzeitstruktur ist nur klar, wenn Sie das verwendete Muster verstehen.
quelle
Es ist keine gute Frage für SO (es ist keine spezifische Programmierfrage), aber es ist im Allgemeinen keine schlechte Frage.
Wenn Sie denken, dass es trivial ist: Was ist mit Lesezeit und Kompilierungszeit, und wann ist dies eine nützliche Unterscheidung? Was ist mit Sprachen, in denen der Compiler zur Laufzeit verfügbar ist? Guy Steele (kein Dummy, er) hat in CLTL2 7 Seiten über EVAL-WHEN geschrieben, mit denen CL-Programmierer dies steuern können. 2 Sätze reichen kaum für eine Definition , die selbst weit hinter einer Erklärung zurückbleibt .
Im Allgemeinen ist es ein schwieriges Problem, das Sprachdesigner zu vermeiden versucht haben. Sie sagen oft nur "hier ist ein Compiler, er macht Dinge zur Kompilierungszeit; alles danach ist Laufzeit, viel Spaß". C ist so konzipiert, dass es einfach zu implementieren ist und nicht die flexibelste Umgebung für die Berechnung. Wenn der Compiler zur Laufzeit nicht verfügbar ist oder Sie nicht einfach steuern können, wann ein Ausdruck ausgewertet wird, kommt es häufig zu Hacks in der Sprache, um häufige Verwendungen von Makros vorzutäuschen, oder Benutzer entwickeln Entwurfsmuster zur Simulation mächtigere Konstrukte haben. Eine einfach zu implementierende Sprache kann definitiv ein lohnendes Ziel sein, aber das bedeutet nicht, dass es das Ende aller Programmiersprachenentwürfe ist. (Ich benutze EVAL-WHEN nicht viel, aber ich kann mir ein Leben ohne EVAL nicht vorstellen.)
Und der Problembereich um Kompilierungs- und Laufzeit ist riesig und noch weitgehend unerforscht. Das heißt nicht, dass SO der richtige Ort ist, um die Diskussion zu führen, aber ich ermutige die Menschen, dieses Gebiet weiter zu erkunden, insbesondere diejenigen, die keine vorgefassten Vorstellungen davon haben, was es sein sollte. Die Frage ist weder einfach noch albern, und wir könnten zumindest den Inquisitor in die richtige Richtung weisen.
Leider kenne ich hierzu keine guten Referenzen. CLTL2 spricht ein wenig darüber, aber es ist nicht gut, um etwas darüber zu lernen.
quelle