Pular para o conteúdo

Partida e segurança: o mapa

Item por item das partes 13 e 15 da referência Deep Tech — bootstrapping, TLS, pilha, globais, modelo de segurança e unsafe.

58 · Antes do `main()` (parte 13)#

ItemNo DataForgeOnde
runtime initializationas sete fases, nomeadas e em ordemA partida
static constructorscomptime — roda na carga, numa caixa sem E/Scomptime
global variablessteady, e o hoisting das declarações de topoA partida
runtime servicesos adopt, cronometrados um a umA partida
boot / loader, stack setup, stack probesnão se aplica: quem faz o boot é o CPython

59 · Thread Local Storage (parte 13)#

ItemNo DataForgeOnde
thread-local variablesI.local / I.meuPor thread
TLS initializationuma ação que constrói o valor, uma vez por threadPor thread
TLS destructorsao_terminar, quando a thread é coletadaPor thread
runtime thread state_por_thread no interpretador: pilha e profundidade já eram por threadPilha
thread-local allocatorsnão se aplica: quem aloca é o CPython

60 · Stack (parte 13)#

ItemNo DataForgeOnde
stack framesI.quadros() — ação, linha e arquivoPilha
stack overflow detectionteto de mil quadros, com as duas saídas na mensagemPilha
coroutine / fiber stacksas fibras são sem pilhaFibras
stack allocation, probes, guards, growthnão se aplica: a pilha é a do CPython

61 · Variáveis globais (parte 13)#

ItemNo DataForgeOnde
static/constant initializationsteady, e comptime para o que é calculadocomptime
lazy initializationo modificador lazy em campo de blueprintModificadores
initialization orderinga ordem do arquivo; ciclo é erro do `check`, com a cadeia inteira na mensagemCarga
destructiondefer de topo roda no fim, na ordem inversaA partida
global constructors (C++)não se aplica

65 · Modelo de segurança (parte 15)#

ItemNo DataForgeOnde
memory safetypor construção: não há ponteiro na linguagem, e o coletor responde pela memória. A exceção é `Arcane.C`, e ela é declaradaFFI
type safetydataforge check, que atravessa arquivosAnálise
thread safetynão automática, e medida: duas threads escrevendo no mesmo nome perderam 40.425 de 80.000. O check avisa (escrita-concorrente), e Arcane.Stm dá escritas que acontecem juntasSTM
bounds checkingem execução sempre, e antes de rodar quando se prova (indice-fora-do-alcance)Análises
null safety??, ?., e o talvez-nao-definida do fluxoAnálises
integer overflow policiesnão há overflow: o inteiro é de precisão arbitrária. Uma classe inteira de bug não existe aqui — e o preço é a conta ser mais lenta que uma de 64 bitsTipos
resource safety`Arcane.Posse`: liberação determinística, e o check cobra o recurso não soltoPosse
capability boundariesArcane.CapacidadeCapacidade

66 · `unsafe` (parte 15)#

ItemNo DataForgeOnde
raw pointers, manual allocationArcane.C: ponteiro, alocar, liberarPonteiros
FFIo módulo inteiro é a região inseguraFFI
minimizar regiões unsafenão há bloco unsafe a marcar: o módulo é a fronteira, e a documentação diz isso em vez de espalhar uma palavra pelo códigoFFI
validar entradasa assinatura é declarada e a lista de tipos é fechada; o ponteiro nulo é conferidoChamar C
encapsular APIs insegurasP.com(P.dono(C.alocar(n), …)) — o bloco sai no fim do escopo, inclusive no caminho de erroPonteiros
documentar precondiçõesexpects / promises / invariant, cobrados em execuçãoContratos
assembly, SIMD, MMIO, kernelnão se aplica — ver o mapa de hardware

O resumo honesto#

A parte 13 rendeu o que dependia do runtime da linguagem (fases visíveis, TLS com finalizador, a pilha que se pergunta) e deixou de fora o que é do CPython (boot, stack probes, guards). A parte 15 já estava quase toda pronta — segurança de memória é por construção, e a ausência de overflow de inteiro elimina uma classe de bug inteira —, e o que faltava era a fronteira de capacidade, que agora existe com os limites escritos em voz alta.