Una build pubblica il modulo <name> in <out_dir>/<name>, per impostazione predefinita
$OUT_DIR/lungo/<name>, dove <name> è il nome del pacchetto Lake salvo diversa
configurazione (vedi configurazione). La directory viene sostituita in
modo atomico: contiene o l’output completo precedente o quello nuovo.
File
| File | Contenuto |
|---|---|
<name>.rs |
Il target di inclusione aggregato: la facciata pubblica e il livello del compilatore. |
modules/<Module>.rs |
Il codice compilato di un modulo del programma, incluso dall’aggregato. Nei nomi dei file . è sostituito da - e gli altri caratteri non ammessi negli identificatori da +<hex>+. |
names.json |
Mappature dei nomi. |
externs.json |
Risoluzioni degli extern. |
sources.json |
Posizioni nel sorgente delle dichiarazioni compilate. |
manifest.json |
Versioni, moduli ed export. |
assurance.json |
Il documento di garanzia del programma: ciò che il suo codice Lean afferma e dimostra di ogni export, ciò di cui si fida e ciò che assume dell’host. |
build-info.json |
Chiave e input della build, per le ricompilazioni incrementali. Non viene compilato nel crate. |
native/liblungo_oracle_<name>.a |
Solo in modalità LeanOracle: il codice nativo di Lean per il progetto (- in <name> diventa _). |
I percorsi registrati in questi file sono relativi al pacchetto Cargo; i file al di fuori sono
scritti <lean>/… (sorgenti della toolchain) o <package>/… (dipendenze Lake). Nessun file
tranne build-info.json registra percorsi specifici della macchina.
Il modulo aggregato
lungo::include_lean!("<name>") include l’aggregato dalla directory di output predefinita,
dove si espande in include!(concat!(env!("OUT_DIR"), "/lungo/<name>/<name>.rs")). Di solito è
l’unico elemento di un modulo Rust:
pub mod formal {
lungo::include_lean!("formal");
}
| Elemento | Contenuto |
|---|---|
| tipi e funzioni | La facciata: un elemento per ogni dichiarazione esportata e per ogni tipo raggiungibile dagli export e dalle funzioni rust_extern, tranne i tipi extern. Le dichiarazioni nel namespace della facciata stanno alla radice; A.B.f è a::b::f; gli altri nomi stanno sotto _root_. |
Tratti <Op>Handler |
Uno per ogni facility asincrona usata dagli export, nel modulo del suo tipo di operazioni Op: vedi export asincroni. |
__meta |
Metadati; vedi sotto. |
__lean_main(), __lean_main_with(args) |
Presenti quando un modulo radice definisce main. Eseguono il programma Lean con gli argomenti del processo (o args) e ne restituiscono il codice di uscita. |
__lng, __opaque, __oracle |
Nascosti: il livello del compilatore, i tipi marcatore dei valori opachi, il backend LeanOracle. Non sono un’interfaccia stabile. |
Ogni funzione della facciata inizializza i moduli del programma al primo uso. Il suo commento
di documentazione registra il nome Lean, il tipo e la posizione nel sorgente, a meno che
disable_comments la selezioni. I tipi generati derivano Clone, Debug (a meno che
skip_debug li selezioni), e PartialEq, Eq e Hash dove tutti i loro campi li
implementano, seguiti dagli attributi configurati.
Operazioni delle facility
Le operazioni delle facility del programma (gli extern @[lungo_operation]) sono implementate
dalle funzioni Rust su cui le mappa rust_extern. Il codice compilato chiama ciascuna tramite
un adattatore generato, quindi la funzione prende e restituisce tipi di facciata:
un’operazione hostLookup (key : @& String) : Option Nat è implementata da
fn lookup(key: String) -> Option<lungo::Nat>, e un’operazione IO restituisce
Result<T, lungo::IoError>. Un’operazione con un tipo Lean puro deve rispondere allo stesso modo
agli stessi argomenti: Lean può valutare una chiamata una sola volta e conservarne il valore.
Export asincroni
Un export che restituisce Lungo.Async.Program Op α è una async fn il cui primo parametro è
un handler della facility asincrona su Op:
pub trait AskHandler {
/// What a method fails with.
type Error;
/// Performs `Host.Ask.fetch`.
fn fetch(&self, key: String) -> impl Future<Output = Result<Result<Nat, String>, Self::Error>>;
/// Performs `Host.Ask.tool`.
fn tool(&self, name: String) -> impl Future<Output = Result<LeanClosure<fn(Nat) -> Nat>, Self::Error>>;
}
pub async fn sum_keys<H: AskHandler>(handler: &H, keys: List<String>) -> Result<Nat, H::Error>;
Il tratto prende il nome dal tipo di operazioni, <Op>Handler, con un metodo per ogni
costruttore di Op, che prende i campi del costruttore e risponde con il tipo che gli assegna
l’istanza Lungo.Async.Interface della facility (una async fn implementa un tale metodo). La
funzione esegue il programma, attende l’handler per ogni operazione che chiede e riprende il
programma con la risposta. Un errore di un metodo abbandona il programma e la funzione lo
restituisce. Abbandonare il future prima che termini rilascia il programma e tutto ciò che
trattiene. La funzione non richiede un executor particolare.
__meta
| Elemento | Tipo |
|---|---|
LEAN_VERSION, LEAN_GITHASH |
&str: la toolchain con cui è stato compilato il codice. |
BIR_VERSION |
u32 |
GENERATOR_VERSION |
&str: la versione di lungo. |
declaration(lean_name) |
Option<&'static lungo::DeclarationInfo> per una dichiarazione esportata. |
declarations() |
&'static [DeclarationInfo], ordinate per nome Lean. |
module_source(module), source(lean_name) |
Option<&'static str>: il sorgente Lean incorporato. Presenti con embed_sources. |
assurance() |
&'static lungo::Assurance: la garanzia del programma, tipizzata. Vedi sotto. |
ASSURANCE_JSON |
&str: il testo di assurance.json, byte per byte. |
DeclarationInfo:
| Campo | Tipo | Significato |
|---|---|---|
lean_name |
&str |
Nome Lean pienamente qualificato. |
module |
&str |
Modulo che la definisce. |
source_file |
Option<&str> |
File sorgente, relativo al pacchetto. |
range |
Option<SourceRange> |
start/end SourcePosition { line, column } a partire da uno. |
lean_type |
&str |
Il tipo Lean, formattato. |
compiled_signature |
&str |
Rappresentazione in esecuzione, per esempio (u8, obj) -> tobj; @& indica i parametri presi in prestito. |
rust_path |
&str |
Percorso dell’elemento Rust all’interno del modulo aggregato. |
trust |
ExportTrust |
Vedi sotto. |
assurance |
ExportAssurance |
Vedi sotto. |
ExportTrust:
| Campo | Significato |
|---|---|
axioms |
Assiomi da cui dipende la definizione, escluso sorryAx. |
depends_on_sorry |
Se dipende da sorry. |
unsafe_dependencies |
Costanti unsafe nella chiusura eseguibile: la dichiarazione stessa e quelle al di fuori della toolchain di Lean. |
partial_dependencies |
Costanti partial, con lo stesso ambito. |
extern_dependencies |
Simboli extern chiamati dal codice compilato. |
ExportAssurance:
| Campo | Significato |
|---|---|
claims |
I claim che riguardano l’export (i nomi dei loro teoremi di evidenza). |
assumptions |
Le assunzioni sull’host a cui quei claim sono condizionati, e quelle delle facility che l’export chiama. |
facilities |
Le facility di cui l’export chiama le operazioni (nomi Lean). |
roles |
I ruoli dell’export, come lungo.oracle. |
asynchronous |
Se l’export restituisce un programma asincrono. |
lungo::Assurance contiene ogni record del documento di garanzia, ogni slice
ordinata per nome: specifications (Specification: name, kind, statement, definition, package,
fingerprint), facilities (Facility: name, id, asynchronous, operations,
assumptions, package, fingerprint), assumptions (Assumption: name, facility,
statement, definition, package, fingerprint), claims (Claim: name, relation, subjects,
specifications, statement, status — ClaimStatus::Proved o ClaimStatus::Incomplete —,
evidence_axioms, assumptions, package, fingerprint) e roles (Role: name, role,
exported), con schema_version e program. claim(name), claims_about(lean_name),
facility(name), assumption(name) e specification(name) cercano i record.
names.json
Un array di record, uno per ogni nome Rust pubblico:
| Campo | Significato |
|---|---|
lean_name |
Il nome Lean. I campi delle structure sono <Structure>.<field>; gli altri argomenti dei costruttori <Constructor>.<binder>, oppure <Constructor>#<index> per i binder senza nome. |
kind |
type, function, constructor, field, oppure extern type per un tipo che l’applicazione fornisce con extern_type. |
rust_path |
Il percorso Rust all’interno del modulo aggregato (per un tipo extern, il percorso configurato); i campi sono <constructor path>.<field>, per esempio Sess.is_open, Shape::Rect.width, Pixel.0. |
renamed |
Se l’identificatore Rust differisce dall’ultimo componente del nome Lean. |
Prima vengono gli elementi, in ordine di collocazione, poi i costruttori e i campi.
externs.json
Un array, un record per ogni dichiarazione extern del programma:
| Campo | Significato |
|---|---|
declaration |
La dichiarazione extern Lean. |
key |
Il simbolo (o il nome della dichiarazione per gli extern adhoc). |
resolution |
lean_export (una definizione Lean @[export]), runtime (una primitiva di lungo) oppure application (una funzione rust_extern). |
implementation |
La definizione Lean, il percorso nel runtime o il percorso Rust. |
lean_type |
Il tipo Lean, quando la dichiarazione ha una costante a livello di sorgente. |
source |
Posizione nel sorgente, quando è nota. |
sources.json
Un array di { lean_name, file, start, end }, con start/end come [line, column] oppure
null, per ogni dichiarazione a livello di sorgente con codice compilato.
manifest.json
| Campo | Significato |
|---|---|
lean_version, lean_githash |
La toolchain. |
bir_version, generator_version, runtime_abi |
Versioni di lungo. |
modules |
I moduli del programma, in ordine di inizializzazione. |
declarations |
Numero di dichiarazioni compilate. |
exports |
Per ogni export: lean_name, module, rust_path, lean_type, source. |
Ciò di cui gli export si fidano sta in assurance.json, con i loro claim e le loro assunzioni.
assurance.json
Il documento di garanzia del programma, lo stesso file byte per byte in ogni output che lungo
genera per il programma, qualunque sia il linguaggio. Il modulo aggregato ne incorpora il testo come
__meta::ASSURANCE_JSON e i record come __meta::assurance() (sopra). Il suo schema,
l’ordinamento e i fingerprint sono in assurance.json.
build-info.json
| Campo | Significato |
|---|---|
build_key |
Digest di tutto ciò da cui dipende l’output oltre ai file di input: identità della toolchain, configurazione, target, versioni di lungo e del worker, binario del generatore. |
lean_version, lean_githash, bir_version, adapter_version, lungo_version, runtime_abi, worker_identity |
Versioni. |
input_digests |
I file di input (relativi al progetto Lean) e i digest del loro contenuto. |
project |
La directory del progetto Lean, relativa al pacchetto. |
link_directives |
Direttive di collegamento di Cargo (vuote in modalità PureRust). |
Versionamento
Il codice generato verifica in fase di compilazione l’ABI del runtime per cui è stato generato
(lungo::__runtime::assert_abi::<N>()), così un output generato da una versione diversa di
lungo non compila invece di essere eseguito con un runtime incompatibile.