Patinir, E., 1515-1524, Landschaft mit Charon, das das Styx [Öl auf Holz] überquert . Museo del Prado, Madrid. QuelleCharon fungiert als Schnittstelle zwischen dem RustC -Compiler und der Programmüberprüfungsprojekte. Sein Zweck ist es, Rostkisten zu verarbeiten und sie in Dateien umzuwandeln, die von Programmverifikern einfach zu verarbeiten sind. Es wird als benutzerdefinierter Treiber für den RustC -Compiler implementiert.
Charon ist in der griechischen Mythologie ein alter Mann, der die Seelen des verstorbenen Styx trägt, ein Fluss, der die Welt des Lebens von der Welt der Toten trennt. Im gegenwärtigen Kontext erlaubt Charon uns, von der Welt der Rost -Programme in die Welt der formellen Überprüfung zu gelangen.
Wir sind offen für Beiträge ! Bitte kontaktieren Sie uns, damit wir uns selbst koordinieren können, wenn Sie bereit sind, einen Beitrag zu leisten. Zu diesem Zweck können Sie sich dem Zulip anschließen.
Charon konvertiert den MIR-Code in UllBC (unstrukturierte Low-Level-Kredit-Kalkül) und dann in LLBC. Beide ASTs können von Charon ausgegeben werden.
UllBC ist eine leicht vereinfachte MIR, bei der wir versuchen, so viele Redundanzen wie möglich zu entfernen. Zum Beispiel vereinfachen wir die Darstellung von Konstanten, die aus dem Rost -Compiler stammen, drastisch.
LLBC ist UllBC, wo wir den Kontrollfluss mit Schleifen umstrukturieren, if ... then ... else ... usw. anstelle von Gotos. Infolgedessen fusionieren wir MIR -Aussagen und Terminatoren in einen einzigen LLBC -Anweisungsart. Wir führen auch einige zusätzliche Modifikationen durch, von denen einige unten aufgeführt sind:
Bemerkung : Die meisten Transformationen, die die MIR in UllBC verwandeln, dann werden LLBC mittels Mikropassen implementiert. Abhängig von den Bedürfnissen könnten wir sie optional machen und mit Flaggen steuern. Wenn Sie mehr über die Details erfahren möchten, siehe translate in src/driver.rs , wodurch die Mikropassen nacheinander angewendet werden.
Bemerkung : Wenn Sie die vollständigen Details von (u) llbc kennen möchten, schauen Sie sich an: types.rs , values.rs , expressions.rs , ullbc_ast.rs und llbc_ast.rs .
Der extrahierte AST wird in .ullbc und .llbc -Dateien (mit dem JSON -Format) serialisiert. Wir extrahieren eine ganze Kiste in einer Datei.
charon : Die Rost -Implementierung.charon-ml : Die ML-Bibliothek. Bietet Dienstprogramme zum Abrufen und Manipulieren des AST in OCAML (Deserialisierung, Druck usw.).tests und tests-polonius : Testerdateien Verzeichnisse. tests-polonius enthält Code, für den der Polonius Ausleihen-Checker erforderlich ist. Sie müssen zuerst rustup installieren.
Während Charon mit Fracht eingerichtet ist, wird Rustup beim Erstellen des Projekts automatisch die richtigen Pakete herunterladen und installieren. Wenn Sie nur das Rust-Projekt (in ./charon ) bauen möchten, machen Sie einfach Run make build-charon-rust im oberen Verzeichnis.
Wenn Sie auch die ML-Bibliothek (in ./charon-ml ) erstellen möchten, müssen Sie OCAML und die richtigen Abhängigkeiten installieren.
Wir empfehlen Ihnen, diese Anweisungen zu befolgen und OPAM auf dem Weg zu installieren (gleiche Anweisungen).
Für Charon-ML verwenden wir OCAML 4.13.1 : opam switch create 4.13.1+options
Die Abhängigkeiten können mit dem folgenden Befehl installiert werden:
opam install ppx_deriving visitors easy_logging zarith yojson core_unix odoc menhir unionFind
Sie können dann make build-charon-ml ausführen, um die ML-Bibliothek zu erstellen, oder einfach nur für den Bau des gesamten Projekts (Rust und Ocaml) make . Schließlich können Sie die Tests mit make test .
Alternativ können Sie NIX verwenden und nix develop (oder https://direnv.net/ und direnv allow ), und alle Abhängigkeiten sollten zur Verfügung gestellt werden.
Sie können online auf die Rust -Dokumentation zugreifen.
Sie können auch make ausführen, um die dokumentation lokal zu generieren. Es wird eine Dokumentation generieren, die von doc-rust.html (für das Rust-Projekt) und doc-ml.html (für die ML-Bibliothek) zugänglich ist.
Um Charon zu leiten, sollten Sie die Charon Binary aus der Kiste ausführen, die Sie zusammenstellen möchten, als ob Sie die Kiste mit cargo build bauen möchten. Die ausführbare Charon -Datei befindet sich in bin/charon .
Charon wird die Kiste und ihre Abhängigkeiten bauen und dann den AST extrahieren. Charon bietet verschiedene Optionen und Flaggen, um sein Verhalten zu optimieren: Sie können eine detaillierte Dokumentation mit --help anzeigen. Insbesondere können Sie die von Charon erzeugte LLBC mit --print-llbc erzeugt.
Wenn sich eine Charon.toml -Datei zum Stammvermögen Ihres Projekts befindet, nimmt Charon auch Optionen aus. Die Datei unterstützt die gleichen Optionen an der CLI-Schnittstelle, mit Ausnahme der Optionen, die sich auf Eingabe/Ausgabe beziehen, wie --print-llbc . Beispiel Charon.toml :
[ charon ]
extract_opaque_bodies = true
[ rustc ]
flags = [ " --cfg " , " abc " ] Bemerkung : Da Charon mit Rost -Nighly zusammengestellt ist (dies ist eine Voraussetzung für die Implementierung eines RustC -Fahrers), baut sie Ihre Kiste jeden Abend mit Rost auf. Sie finden die nächtliche Version, die Charon in rust-toolchain.template für Charon festpasst.