Bei der Transformation von Begriffen von einer Sprache in eine andere ist die intuitiv gewünschte Eigenschaft die Beibehaltung der Semantik (wie sie beispielsweise hier für eine CPS-Transformation verwendet wird):
Ich bin jedoch ein wenig beunruhigt, wenn ich dies mit den klassischen Begriffen Korrektheit (oder Solidität) und Vollständigkeit von Logiksystemen in Einklang bringe . Normalerweise würde ich die obige Aussage als Vollständigkeitseigenschaft von betrachten (und umgekehrt die Definition von Korrektheit).
Intuitiv sollte ein Compiler jedoch eher korrekt als vollständig sein (da beispielsweise eine Typprüfung häufig korrekte Programme ausschließt). Die Umkehrung der obigen Aussage ist nur wahr, wenn ist injektiv: Wenn die Ausgangssprache beispielsweise Boolesche Werte und Operationen enthält und die Kompilierung sie über die Church-Codierung ersetzt, kann die Zielsprache boolesche Operationen anhand von Begriffen aus booleschen Literalen und Lambda-Abstraktionen auswerten, die die Ausgangssprache nicht auswerten kann.
- Bin ich zu Recht davon ausgegangen, dass die obige Aussage die Vollständigkeitseigenschaft von ist (Die intuitive Anforderung hat also tatsächlich einen kontraintuitiven Namen)?
- Habe ich auch Recht mit meiner Schlussfolgerung, dass ein nicht injektiver Compiler dann normalerweise nicht korrekt ist?
quelle
Intuitiv ausgedrückt besagt die Korrektheitseigenschaft für eine Transformation über eine Sprache, für die ein Bewertungsbegriff definiert ist, dass, wenn ein Begriff eine bestimmte Semantik hat, das Bild des Begriffs durch diese Transformation zum Bild dieser Semantik ausgewertet wird. Mit anderen Worten, ein korrekter Compiler wandelt ein Programm in ein anderes Programm mit demselben Verhalten um (ausgedrückt in der Zielsprache).
Hier schließe ich aus Ihren Notizen, dass die Ausgangssprache eine Sprache der Begriffe ists mit einem Begriff der Bewertung ⇓ :: s ⇓ v bedeutet, dass s reduziert (in beliebig vielen Schritten) auf den Wert v . Ein korrekter Compilerc ist eine, die jedes Programm transformiert s in ein kompiliertes Programm c ( s ) Dies ergibt den entsprechenden Compilerwert c ( v ) .
Dies entspricht der Definition auf Wikipedia, wenn Werte zu sich selbst kompiliert werden: ifs hat die Eigenschaft ⇓ v dann auch c ( s ) .
Ein Sound-Compiler muss nicht injektiv sein: Es ist möglich und äußerst häufig, dass verschiedene Quellprogramme mit derselben Semantik zu demselben kompilierten Programm kompiliert werden.
Compiler sind im Allgemeinen nicht vollständig : Wie Sie bemerken, ist es üblich, Begriffe in der kompilierten Sprache zu haben, die nicht die Ausgabe des Compilers sein können, dh der Compiler ist nicht surjektiv.
quelle