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]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é.