Integraciones principales y bibliotecas estándar
seed mantiene pequeño el núcleo del lenguaje. Los archivos, las redes, los procesos, el formato, las colecciones y la sincronización son bibliotecas ordinarias compiladas por separado, no integradas universales. La superficie incorporada del compilador limpio está debajo; el catálogo de paquetes operativo preparado por el compilador está documentado en Referencia de biblioteca, mientras que el árbol Grove de generación mixta se clasifica por separado en Grove Árbol de compatibilidad.
Tipos de núcleos
El compilador define void, never, bool, enteros de ancho fijo, isize, usize, f32, f64, str, string, bytes, shared_bytes, alloc_errory lo escondido region_handle. byte es aceptado como u8. alloc_result<t> es la abreviatura canónica para result<t, alloc_error>. Alojado main() -> result<i64, e> asigna el éxito al estado del proceso. alloc_error tiene el diagnóstico fijo; otro e debe ser Copiar, no tener destructor e implementar prestado display() -> str. El fallo se imprime una vez antes del estado 1, después de la limpieza y sin desenrollarse.
Operaciones seguras conocidas por el compilador
| Operación | Contrato |
|---|---|
len(value) |
usize byte/element longitud para str, string, bytes, shared_bytes, cortes y matrices |
str.bytes() |
vista []u8 de solo lectura sin asignación con la procedencia de la fuente |
slice.slice(start, count) |
subvista marcada sin asignación que preserva el tipo de elemento y la mutabilidad |
mut_slice.split_at_mut(index) |
par de vistas léxicas exclusivas y no superpuestas sin asignación marcada |
mut_slice.fill(value) |
llena un segmento de elemento de copia sin asignación |
mut_slice.copy_from(source) |
Transferencia de elementos de copia de igual longitud y segura para superponerse sin asignación |
bytes.into_prefix(length) |
consumir truncamiento lógico comprobado que reutiliza la asignación y la capacidad |
some(value) / none |
construcción de opciones canónicas; none necesita lo esperado ?t |
result.ok(value) / result.error(problem) |
construcción de resultados canónicos con el esperado result<t,e> |
option.is_some() / option.is_none() |
inspección prestada sin asignación |
result.is_ok() / result.is_error() |
inspección prestada sin asignación |
option_or_result.unwrap_or(value) |
consumir valor predeterminado con limpieza exacta del valor de propiedad no seleccionado |
or_abort() / expect(message) |
límite fatal explícito que no se deshace |
or_exit(status) |
límite principal i64 option/result usando retorno limpio ordinario |
value.clone() |
clon estructural explícito cuando existe capacidad; Se realiza un seguimiento del efecto de asignación. |
string.view() |
prestado sin asignación str |
bytes.view() |
Sin asignación, de solo lectura []u8. |
bytes.mutable_view() |
Léxico exclusivo mut []u8 que cubre toda la longitud asignada. |
bytes.zeroed(length) |
falible inicializado en cero result<bytes, alloc_error>; length debe ser i64 |
unsafe { bytes.uninitialized(length) } |
asignación falible de capacidad interna; las personas que llaman deben inicializar cada byte antes de exponer un prefijo |
shared_bytes.view() |
Sin asignación, de solo lectura []u8. |
array.view() / array.mutable_view() |
segmento compatible explícito sin asignación; la vista mutable requiere un propietario mutable |
str.equal(other) |
comparación de bytes UTF-8 sin asignación |
str.find_ascii(delimiter, start) |
búsqueda de delimitadores sin asignación marcada; delimitadores no ASCII rechazados |
byte_slice_equal(a, b) |
sin asignación []u8 igualdad de longitud y contenido |
sqrt(value) / abs(value) / min(a, b) / max(a, b) |
f32/f64 operaciones matemáticas |
str.slice(start, count) |
subvista de copia cero comprobada que preserva la procedencia |
slice.slice(start, count) |
Subvista genérica de copia cero comprobada []t que preserva la procedencia |
byte_view.equal(other) |
sin asignación []u8 igualdad de longitud y contenido |
str.to_string() / string.from(view) |
result<string, alloc_error>; asignación explícita |
str.to_bytes() / bytes.from(view) |
result<bytes, alloc_error>; explícito copy/allocation |
bytes.to_shared() / shared_bytes.from(data) |
consumir bytes propios; result<shared_bytes, alloc_error> |
region(capacity) { body } |
alcance de asignación de impactos verificado léxico |
io.input_stream.read(chunk) |
lectura parcial falible limitada; las personas que llaman pueden procesar EOF/data de forma incremental sin conservar todas las entradas |
La indexación segura de arrays/slices acepta cada ancho de entero incorporado y verifica el índice matemático antes de la formación del puntero. Las API de texto exponen bytes; El procesamiento Unicode scalar/grapheme pertenece a las bibliotecas.
Limitación conocida: las lecturas de índice variable (buf[i] donde i es una variable) no se admiten en mut []u8 ni en subporciones derivadas de []u8 a través de .slice(). Las lecturas de índice fijo (buf[0]) funcionan en todos los tipos de sectores. Los parámetros de función directa []u8 y el segmento original de bytes.view() admiten lecturas de índice variable. Para solucionar esta limitación, alcance las vistas mutables dentro de un bloque y use los parámetros de función []u8 de solo lectura o el segmento bytes.view() original para acceso de índice variable.
byte_buffer nota: byte_buffer.mutable_view() devuelve una vista del prefijo inicializado, que tiene una longitud de 0 para un búfer recién creado. Escribir más allá de la longitud devuelta provoca una trampa de fuera de límites. Para escribir en un búfer sin formato, use bytes.zeroed(n) cuyo mutable_view() cubre la asignación total, o el uso byte_buffer metodos push/extend/reserve/resize.
Sustrato de compilador inseguro
Las siguientes operaciones requieren un bloque unsafe o unsafe fn:
| familia | Operaciones |
|---|---|
| memoria bruta escrita | raw_try_alloc<t>, raw_null<t>, raw_is_null<t>, raw_read<t>, raw_write<t>, raw_free<t>, raw_slice<t> |
| atómicos | acquire/release ayudantes más ordenados load/store/fetch-add/exchange/compare-exchange |
| ordenar | Compilador y vallas atómicas con órdenes de memoria validadas. |
| dispositivos | volátil escrito read/write y conversiones de espacio de direcciones |
| arquitectura | intrínsecos de ensamblaje sin procesar mecanografiados |
| interoperabilidad | punteros sin formato, FFI, llamadas al sistema y uniones sin formato |
raw_try_alloc<t> informa el recuento negativo, el desbordamiento de tamaño o el error del asignador como alloc_error. Raw read/write/free depende de la persona que llama insegura auditada para los límites, la inicialización, la procedencia, la sincronización y la liberación exacta.
Paquetes de biblioteca ordinarios
El compilador limpio presenta paquetes representativos en compiler/llvm/libs:
| Paquete | Rol |
|---|---|
box |
Dirección indirecta de propiedad segura y falible para valores recursivos y grandes |
byte_buffer |
Construcción, mutación, vistas y consumo de bytes falibles y cultivables. bytes conversión |
file |
contenedor output/file alojado durante el tiempo de ejecución ABI |
fibonacci |
iterativo sin asignación O (n) i64 Fibonacci con explícito negative/overflow none |
net |
contenedor de red alojado |
io |
entrada partial/read-all alojada escrita, salida text/bytes/format de escritura total, almacenamiento en búfer limitado y print/println para salida rápida |
math |
portátil f32/f64 raíz cuadrada, valor absoluto, mínimo y máximo |
parse |
marcado signed/unsigned análisis de enteros y ayudantes predeterminados explícitos |
process |
Argumentos de proceso, vistas del entorno e identidad del proceso sin asignación. |
serialize |
paquete de serialización seguro representativo |
sort |
clasificación escalar de corte mutable y clasificación estática order_key para valores de solo movimiento |
slice |
asistentes genéricos de ventana de ancho fijo, rotación y reversa sin asignación; los cortes centrales proporcionan fill/copy_from |
text |
UTF-8 validación, escalar Unicode verificado sin asignación iteration/counting, conversión de cadena propia y cursores de token delimitados por ASCII |
time |
milisegundos alojados monótonos más reloj de pared Unix seconds/milliseconds |
vec |
vector genérico falible con constructores capacity/filled y @mut reserve/push/update/pop, además de cola, conjunto y mapa |
task |
canales de propiedad dividida, one-shot mecanografiados y result<t,e> uniones, eventos, cancelaciones, grupos de espera, semáforos, barreras y bloqueos |
system |
contenedores de sistemas seguros sobre espacios de direcciones, MMIO, atomics, páginas, DMA, init-once y mecanismos locales de CPU |
El incremental del lanzador build/run path prepara automáticamente estos paquetes principales del repositorio cuando un paquete normal utiliza una importación simple como use "vec" o use "fibonacci"; no se requiere instalación manual de la interfaz ni FFI visible en la aplicación. el más estrecho check El subcomando no prepara primero un paquete básico que falta. Los usuarios directos del compilador pueden consumir una fuente explícita o .sdi paquete. Estos no son nombres de idiomas mágicos.
Formateo y salida
El lenguaje implementa la interpolación phase-1/2 f"..." escrita. Una cadena f produce un format_args efímero sin asignación de montón. compiler/llvm/libs/io es la superficie escrita canónica para salida de texto, segmento de bytes y formato. Para una salida rápida, print(text) escribe en la salida estándar y println(text) escribe con una nueva línea al final. .to_string()? realiza una materialización falible explícita. Se implementan Width/fill/alignment, especificadores de base de números enteros y formato de rasgo display prestado sin asignación. La fase 2 agrega formato fijo, científico y general f32/f64 sin libc, además de rasgos display/debug prestados.
Advertencia de compatibilidad
llvm-v1 e histórico Grove/runtime Las tablas exponen muchos nombres como str_cat, read_file, net_connect, vec_new, y sd_*. Su existencia en un compilador archivado no los convierte en elementos integrados limpios del compilador. Al transferir código heredado, importe o implemente un contenedor seguro actual y deje que su .sdi contrato define propiedad, efectos, ABI y disponibilidad.