In questa sezione

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.