2017-01-25 5 views
2

Ich lerne etwas typisierten Schläger im Moment, und ich habe ein etwas philosophisches Dilemma:typisiert Racket Optimizer

Racket behauptet, ein Sprachentwicklungsrahmen und typisiert Racket ist eine solche Sprachen auf es umgesetzt werden. Die Dokumentation erwähnt, dass der Compiler aufgrund der verwendeten Typen nun mehr/bessere Optimierungen vornehmen kann.

Die konkrete Frage:

Wo passieren diese Optimierungen?

1) Bei der Kompilierung/erweitert Teil (die "Programmable" als Teil des Sprachgebäuderahmen ist)

-oder

2) weiter unten in der Linie in dem (Bytecode) Optimierer (welches in C geschrieben ist und nicht direkt über das Framework modifizierbar ist).

Wenn 2) wahr ist, bedeutet das, dass die Typinformationen nach dem Kompilieren/Erweitern und später vom Optimierer "neu erstellt/erraten" wurden oder die Zwischenrepräsentation geändert wurde, um die Typinformationen aufzunehmen und später zu informieren Stadien über sie? Der Grund, warum ich diese spezielle Frage stelle, ist, weil ich ein Gefühl dafür bekommen möchte, wie allgemein das Racket-Sprachframework wirklich ist, dh auch für statisch getippte Sprachen ohne irgendwelche Modifikationen im Backend gegenüber dem Typsystem, das nur ist ein Front-End-Ding, während der Code zur Laufzeit noch dynamisch typisiert ist (aber natürlich statisch überprüft wird).

Vielen Dank.

Antwort

2

Typisierte Racket-Optimierungen treten während der Makroerweiterung auf. Um selbst zu sehen, können Sie #lang typed/racket in #lang typed/racket #:no-optimize ändern, was zeigt, dass Typed Racket die vollständige Kontrolle darüber hat, welche Optimierungen angewendet werden.

Die Optimierungen bestehen aus der Verwendung von Typinformationen, um verschiedene Verwendungen bestimmter Prozeduren durch their unsafe equivalents zu ersetzen. Die unsicheren Prozeduren führen keine Laufzeitprüfungen für die Typen ihrer Argumente durch und verursachen bei falscher Verwendung undefiniertes Verhalten (lese: segfaults). Weitere Informationen finden Sie im Dokumentationsabschnitt Optimization in Typed Racket.

Die Exposition der unsicheren Varianten von Prozeduren macht es wirklich möglich, dass benutzerdefinierte Sprachen diese Optimierungen implementieren können. Wenn Sie z. B. Ihre eigene Sprache mit einem Typsystem geschrieben haben, das beweisen könnte, dass auf Vektoren niemals mit Out-of-Bounds-Indizes zugegriffen wurde, können Sie Verwendungen von vector-ref durch unsafe-vector-ref ersetzen.

Es gibt ähnliche Optimierungen, die auf der Bytecodeebene auftreten, aber diese gelten meistens, wenn das JIT Typinformationen ableiten kann, die bei der Makroerweiterungszeit nicht sichtbar sind. Diese sind nicht benutzergesteuert, aber Sie müssen sich nicht auf sie verlassen.

+0

Dies beantwortet alles, was ich wissen wollte! Danke! – Lazarus535