Principais bibliotecas integradas e padrão
seed mantém o núcleo da linguagem pequeno. Arquivos, redes, processos, formatação, coleções e sincronização são bibliotecas comuns compiladas separadamente, e não integradas universais. A superfície integrada do compilador limpo está abaixo; o catálogo de pacotes operacionais do compilador está documentado em Library Reference, enquanto a árvore Grove de geração mista é classificada separadamente em Grove Compatibility Tree.
Tipos principais
O compilador define void, never, bool, inteiros de largura fixa, isize, usize, f32, f64, str, string, bytes, shared_bytes, alloc_error, e o oculto region_handle. byte é aceito como u8. alloc_result<t> é a abreviação canônica para result<t, alloc_error>. Hospedado main() -> result<i64, e> mapeia o sucesso para o status do processo. alloc_error possui diagnóstico fixo; outro e deve ser cópia, não ter destruidor e implementar emprestado display() -> str. A falha é impressa uma vez antes do status 1, após a limpeza e sem desenrolar.
Operações seguras conhecidas pelo compilador
| Operação | Contrato |
|---|---|
len(value) |
usize byte/element comprimento para str, string, bytes, shared_bytes, fatias e matrizes |
str.bytes() |
visualização []u8 somente leitura, livre de alocação e com a origem da origem |
slice.slice(start, count) |
subvisão livre de alocação verificada, preservando o tipo e a mutabilidade do elemento |
mut_slice.split_at_mut(index) |
verificado par livre de alocação de visualizações lexicais exclusivas e não sobrepostas |
mut_slice.fill(value) |
preenche uma fatia do elemento Copy sem alocação |
mut_slice.copy_from(source) |
Transferência de elemento de cópia de comprimento igual e segura sobreposição sem alocação |
bytes.into_prefix(length) |
consumindo truncamento lógico verificado que reutiliza a alocação e capacidade |
some(value) / none |
construção de opção canônica; none necessidades esperadas ?t |
result.ok(value) / result.error(problem) |
construção de resultado canônico com esperado result<t,e> |
option.is_some() / option.is_none() |
inspeção de empréstimo sem alocação |
result.is_ok() / result.is_error() |
inspeção de empréstimo sem alocação |
option_or_result.unwrap_or(value) |
consumindo padrão com limpeza exata do valor de propriedade não selecionado |
or_abort() / expect(message) |
limite fatal não desenrolado explícito |
or_exit(status) |
limite principal i64 option/result usando retorno limpo comum |
value.clone() |
clone estrutural explícito quando existe capacidade; o efeito de alocação é rastreado |
string.view() |
emprestado sem alocação str |
bytes.view() |
livre de alocação somente leitura []u8 |
bytes.mutable_view() |
lexical exclusivo mut []u8 cobrindo todo o comprimento alocado |
bytes.zeroed(length) |
falível inicializado com zero result<bytes, alloc_error>; length deve ser i64 |
unsafe { bytes.uninitialized(length) } |
alocação falível de capacidade interna; os chamadores devem inicializar cada byte antes de expor um prefixo |
shared_bytes.view() |
livre de alocação somente leitura []u8 |
array.view() / array.mutable_view() |
fatia compatível sem alocação explícita; visão mutável requer um proprietário mutável |
str.equal(other) |
comparação de bytes UTF-8 sem alocação |
str.find_ascii(delimiter, start) |
pesquisa de delimitador livre de alocação verificada; delimitadores não-ASCII rejeitados |
byte_slice_equal(a, b) |
igualdade de comprimento e conteúdo []u8 livre de alocação |
sqrt(value) / abs(value) / min(a, b) / max(a, b) |
f32/f64 operações matemáticas |
str.slice(start, count) |
subvisão de cópia zero verificada preservando a procedência |
slice.slice(start, count) |
subvisão genérica verificada de cópia zero []t preservando a proveniência |
byte_view.equal(other) |
igualdade de comprimento e conteúdo []u8 livre de alocação |
str.to_string() / string.from(view) |
result<string, alloc_error>; alocação 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 próprios; result<shared_bytes, alloc_error> |
region(capacity) { body } |
escopo de alocação de colisão verificado lexicalmente |
io.input_stream.read(chunk) |
leitura parcial falível limitada; os chamadores podem processar EOF/data incrementalmente sem reter todas as entradas |
A indexação segura de arrays/slices aceita cada largura inteira integrada e verifica o índice matemático antes da formação do ponteiro. APIs de texto expõem bytes; O processamento Unicode scalar/grapheme pertence às bibliotecas.
Limitação conhecida: leituras de índice variável (buf[i] onde i é uma variável) não são suportadas em mut []u8 ou em subfatias derivadas de []u8 via .slice(). As leituras de índice fixo (buf[0]) funcionam em todos os tipos de fatia. Os parâmetros diretos da função []u8 e a fatia original de bytes.view() suportam leituras de índice variável. Para contornar essa limitação, escopo de visualizações mutáveis dentro de um bloco e use parâmetros de função []u8 somente leitura ou a fatia bytes.view() original para acesso de índice variável.
byte_buffer nota: byte_buffer.mutable_view() retorna uma visualização do prefixo inicializado, que tem comprimento 0 para um buffer recém-criado. Escrever além do comprimento retornado causa uma armadilha fora dos limites. Para escrever em um buffer bruto, use bytes.zeroed(n) cujo mutable_view() cobre a alocação total ou o uso byte_buffer métodos push/extend/reserve/resize.
Substrato do compilador inseguro
As seguintes operações requerem um bloco unsafe ou unsafe fn:
| Família | Operações |
|---|---|
| memória bruta digitada | 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 ajudantes mais ordenados load/store/fetch-add/exchange/compare-exchange |
| encomendar | compilador e cercas atômicas com ordens de memória validadas |
| dispositivos | digitou read/write volátil e conversões de espaço de endereço |
| arquitetura | intrínsecos de assembly brutos digitados |
| interoperabilidade | ponteiros brutos, FFI, syscalls e uniões brutas |
raw_try_alloc<t> relata contagem negativa, estouro de tamanho ou falha no alocador como alloc_error. Raw read/write/free depende do chamador inseguro auditado para limites, inicialização, proveniência, sincronização e liberação exata.
Pacotes de biblioteca comuns
O compilador limpo organiza pacotes representativos em compiler/llvm/libs:
| Pacote | Função |
|---|---|
box |
indireção de propriedade segura falível para valores recursivos e grandes |
byte_buffer |
construção falível de bytes crescentes, mutação, visualizações e consumo bytes conversão |
file |
wrapper output/file hospedado durante o tempo de execução ABI |
fibonacci |
iterativo livre de alocação O (n) i64 Fibonacci com negative/overflow explícito none |
net |
wrapper de rede hospedada |
io |
entrada partial/read-all hospedada digitada, saída text/bytes/format write-all, buffer limitado e print/println para saída rápida |
math |
portátil f32/f64 raiz quadrada, valor absoluto, mínimo e máximo |
parse |
verificação de análise de número inteiro signed/unsigned e auxiliares padrão explícitos |
process |
argumentos de processo livres de alocação, visualizações de ambiente e identidade de processo |
serialize |
pacote de serialização seguro representativo |
sort |
classificação escalar de fatia mutável e classificação estática order_key para valores somente de movimentação |
slice |
auxiliares genéricos de janela reversa, rotação e largura fixa, sem alocação; fatias principais fornecem fill/copy_from |
text |
UTF-8 validação, escalar Unicode verificado sem alocação iteration/counting, conversão de string própria e cursores de token delimitados por ASCII |
time |
milissegundos hospedados monotônicos mais relógio de parede Unix seconds/milliseconds |
vec |
vetor genérico falível com construtores capacity/filled e @mut reserve/push/update/pop, além de fila, conjunto e mapa |
task |
canais de divisão de propriedade, digitados one-shot e result<t,e> junções, eventos, cancelamento, grupos de espera, semáforos, barreiras e bloqueios |
system |
wrappers de sistemas seguros sobre espaços de endereço, MMIO, atômicos, páginas, DMA, init-once e mecanismos locais de CPU |
O incremental do lançador build/run path prepara automaticamente esses pacotes principais do repositório quando um pacote comum usa uma importação simples, como use "vec" ou use "fibonacci"; nenhuma instalação manual de interface ou FFI visível ao aplicativo é necessária. Quanto mais estreito check O subcomando não prepara primeiro um pacote vazio ausente. Os usuários diretos do compilador podem consumir uma fonte explícita ou .sdi pacote. Estes não são nomes de idiomas mágicos.
Formatação e saída
A linguagem implementa digitada phase-1/2 f"..." interpolação. Uma string F produz efêmero format_args sem alocação de heap. compiler/llvm/libs/io é a superfície digitada canônica para texto, fatia de bytes e saída de formato. Para saída rápida, print(text) escreve em stdout e println(text) escreve com uma nova linha à direita. .to_string()? realiza materialização falível explícita. Width/fill/alignment, especificadores de base inteira e emprestados sem alocação display a formatação de características é implementada. A Fase 2 adiciona libc-free f32/f64 formatação fixa, científica e geral, além de formatação emprestada display/debug características.
Aviso de compatibilidade
llvm-v1 e histórico Grove/runtime tabelas expõem muitos nomes, como str_cat, read_file, net_connect, vec_newe sd_*. Sua existência em um compilador arquivado não os torna integrados ao compilador limpo. Ao portar código legado, importe ou implemente um wrapper seguro atual e deixe seu .sdi contrato define propriedade, efeitos, ABI e disponibilidade.