Bibliothèques intégrées de base et standard
seed garde le noyau du langage petit. Les fichiers, la mise en réseau, les processus, le formatage, les collections et la synchronisation sont des bibliothèques ordinaires compilées séparément, et non des bibliothèques intégrées universelles. La surface intégrée du compilateur propre se trouve ci-dessous ; le catalogue de packages opérationnels par étapes par le compilateur est documenté dans Library Reference, tandis que la génération mixte Grove l'arbre est classé séparément dans Grove Arbre de compatibilité.
Types de base
Le compilateur définit void, never, bool, entiers à largeur fixe, isize, usize, f32, f64, str, string, bytes, shared_bytes, alloc_error, et le caché region_handle. byte est accepté comme u8. alloc_result<t> est le raccourci canonique pour result<t, alloc_error>. Hébergé main() -> result<i64, e> mappe le succès à l’état du processus. alloc_error a le diagnostic fixe ; un autre e doit être une copie, ne pas avoir de destructeur et implémenter emprunté display() -> str. L'échec est imprimé une fois avant l'état 1, après nettoyage et sans déroulement.
Opérations sécurisées connues du compilateur
| Fonctionnement | Contrat |
|---|---|
len(value) |
usize byte/element longueur pour str, string, bytes, shared_bytes, tranches et tableaux |
str.bytes() |
vue []u8 en lecture seule sans allocation avec la provenance de la source |
slice.slice(start, count) |
sous-vue vérifiée sans allocation préservant le type d'élément et la mutabilité |
mut_slice.split_at_mut(index) |
paire vérifiée sans allocation de vues lexicales exclusives et sans chevauchement |
mut_slice.fill(value) |
remplit une tranche d'élément de copie sans allocation |
mut_slice.copy_from(source) |
Transfert d'éléments de copie de longueur égale et sans chevauchement sans allocation |
bytes.into_prefix(length) |
consommer une troncature logique vérifiée qui réutilise l'allocation et la capacité |
some(value) / none |
construction d'options canoniques ; Besoins attendus pour none ?t |
result.ok(value) / result.error(problem) |
construction du résultat canonique avec attendu result<t,e> |
option.is_some() / option.is_none() |
inspection empruntée sans allocation |
result.is_ok() / result.is_error() |
inspection empruntée sans allocation |
option_or_result.unwrap_or(value) |
consommation par défaut avec nettoyage exact de la valeur possédée non sélectionnée |
or_abort() / expect(message) |
limite fatale explicite sans déroulement |
or_exit(status) |
limite principale uniquement i64 option/result utilisant un retour nettoyé ordinaire |
value.clone() |
clone structurel explicite lorsque la capacité existe ; l'effet d'allocation est suivi |
string.view() |
prêté sans allocation str |
bytes.view() |
lecture seule sans allocation []u8 |
bytes.mutable_view() |
lexical exclusif mut []u8 couvrant toute la longueur allouée |
bytes.zeroed(length) |
faillible initialisé à zéro result<bytes, alloc_error>; length doit être i64 |
unsafe { bytes.uninitialized(length) } |
une allocation faillible des capacités internes ; les appelants doivent initialiser chaque octet avant d'exposer un préfixe |
shared_bytes.view() |
lecture seule sans allocation []u8 |
array.view() / array.mutable_view() |
tranche compatible explicite sans allocation ; la vue mutable nécessite un propriétaire mutable |
str.equal(other) |
comparaison d'octets UTF-8 sans allocation |
str.find_ascii(delimiter, start) |
recherche de délimiteur sans allocation vérifiée ; délimiteurs non-ASCII rejetés |
byte_slice_equal(a, b) |
égalité de longueur et de contenu []u8 sans allocation |
sqrt(value) / abs(value) / min(a, b) / max(a, b) |
f32/f64 opérations mathématiques |
str.slice(start, count) |
sous-vue vérifiée sans copie préservant la provenance |
slice.slice(start, count) |
générique vérifié zéro copie []t sous-vue préservant la provenance |
byte_view.equal(other) |
égalité de longueur et de contenu []u8 sans allocation |
str.to_string() / string.from(view) |
result<string, alloc_error>; allocation explicite |
str.to_bytes() / bytes.from(view) |
result<bytes, alloc_error>; explicite copy/allocation |
bytes.to_shared() / shared_bytes.from(data) |
consommer les octets possédés ; result<shared_bytes, alloc_error> |
region(capacity) { body } |
portée de l'allocation de bosses vérifiée lexicale |
io.input_stream.read(chunk) |
lecture partielle faillible limitée ; les appelants peuvent traiter EOF/data de manière incrémentielle sans conserver toutes les entrées |
L'indexation sécurisée de arrays/slices accepte chaque largeur entière intégrée et vérifie l'index mathématique avant la formation du pointeur. Les API de texte exposent des octets ; Le traitement Unicode scalar/grapheme appartient aux bibliothèques.
Limitation connue : les lectures d'index variable (buf[i] où i est une variable) ne sont pas prises en charge sur mut []u8 ou sur les sous-tranches dérivées de []u8 via .slice(). Les lectures à index fixe (buf[0]) fonctionnent sur tous les types de tranches. Les paramètres de fonction directs []u8 et la tranche originale de bytes.view() prennent en charge les lectures à index variable. Pour contourner cette limitation, étendue aux vues mutables dans un bloc et utilisez les paramètres de fonction []u8 en lecture seule ou la tranche bytes.view() d'origine pour l'accès à l'index variable.
byte_buffer remarque : byte_buffer.mutable_view() renvoie une vue du préfixe initialisé, qui est de longueur 0 pour un tampon fraîchement créé. L'écriture au-delà de la longueur renvoyée provoque un piège hors limites. Pour écrire dans un tampon brut, utilisez bytes.zeroed(n) dont mutable_view() couvre la totalité de l’allocation, ou l’utilisation byte_buffer méthodes push/extend/reserve/resize.
Substrat de compilateur dangereux
Les opérations suivantes nécessitent un unsafe bloquer ou unsafe fn:
| Famille | Opérations |
|---|---|
| mémoire brute typée | raw_try_alloc<t>, raw_null<t>, raw_is_null<t>, raw_read<t>, raw_write<t>, raw_free<t>, raw_slice<t> |
| atomiques | acquire/release aides plus commandées load/store/fetch-add/exchange/compare-exchange |
| commande | compilateur et clôtures atomiques avec commandes de mémoire validées |
| appareils | typé volatile read/write et conversions d'espace d'adressage |
| architecture | intrinsèques d'assemblage brut typés |
| interopérabilité | pointeurs bruts, FFI, appels système et unions brutes |
raw_try_alloc<t> signale un décompte négatif, un dépassement de taille ou une défaillance de l'allocateur sous la forme alloc_error. Raw read/write/free s'appuie sur l'appelant non sécurisé audité pour les limites, l'initialisation, la provenance, la synchronisation et la publication exacte.
Forfaits de bibliothèque ordinaires
Le compilateur propre organise les packages représentatifs sous compiler/llvm/libs:
| Forfait | Rôle |
|---|---|
box |
indirection faillible et sûre pour les valeurs récursives et grandes |
byte_buffer |
construction, mutation, vues et consommation d'octets évolutifs faillibles bytes transformation |
file |
wrapper output/file hébergé sur le runtime ABI |
fibonacci |
O(n) itératif sans allocation i64 Fibonacci avec negative/overflow explicite none |
net |
wrapper de réseau hébergé |
io |
entrée partial/read-all hébergée, sortie text/bytes/format en écriture complète, mise en mémoire tampon limitée et print/println pour une sortie rapide |
math |
portable f32/f64 racine carrée, valeur absolue, minimum et maximum |
parse |
vérifié l'analyse des entiers signed/unsigned et les aides par défaut explicites |
process |
arguments de processus sans allocation, vues d'environnement et identité de processus |
serialize |
package de sérialisation sécurisé représentatif |
sort |
tri scalaire par tranches mutables et tri statique order_key pour les valeurs de déplacement uniquement |
slice |
des assistants génériques d'inversion, de rotation et de fenêtre à largeur fixe sans allocation ; les tranches de base fournissent fill/copy_from |
text |
UTF-8 validation, vérification sans allocation Unicode-scalaire iteration/counting, conversion de chaîne détenue et curseurs de jeton délimités par ASCII |
time |
millisecondes hébergées monotones plus horloge murale Unix seconds/milliseconds |
vec |
vecteur générique faillible avec les constructeurs capacity/filled et @mut reserve/push/update/pop, plus file d'attente, ensemble et carte |
task |
chaînes à propriété partagée, typées one-shot et result<t,e> jointures, événements, annulations, groupes d'attente, sémaphores, barrières et verrous |
system |
wrappers de systèmes sécurisés sur les espaces d'adressage, MMIO, atomiques, pages, DMA, init-once et mécanismes locaux du CPU |
L'incrément du lanceur build/run path met automatiquement en scène ces packages principaux du référentiel lorsqu'un package ordinaire utilise une importation simple telle que use "vec" ou use "fibonacci"; aucune installation manuelle de l'interface ou FFI visible par l'application n'est requis. Le plus étroit check La sous-commande ne prépare pas d'abord un package nu manquant. Les utilisateurs du compilateur direct peuvent consommer une source explicite ou .sdi paquet. Ce ne sont pas des noms de langue magiques.
Formatage et sortie
Le langage implémente le typage phase-1/2 f"..." interpolation. Une f-string donne des résultats éphémères format_args sans allocation de tas. compiler/llvm/libs/io est la surface typée canonique pour la sortie de texte, de tranche d'octet et de format. Pour une sortie rapide, print(text) écrit sur la sortie standard et println(text) écrit avec une nouvelle ligne finale. .to_string()? effectue une matérialisation faillible explicite. Width/fill/alignment, spécificateurs de base entière et emprunts sans allocation display le formatage des traits est implémenté. La phase 2 ajoute sans libc f32/f64 mise en forme fixe, scientifique et générale plus empruntée display/debug traits.
Avertissement de compatibilité
llvm-v1 et historique Grove/runtime les tableaux exposent de nombreux noms tels que str_cat, read_file, net_connect, vec_new, et sd_*. Leur existence dans un compilateur archivé ne les rend pas propres au compilateur intégré. Lors du portage du code existant, importez ou implémentez un wrapper sécurisé actuel et laissez-le .sdi le contrat définit la propriété, les effets, ABI et la disponibilité.