Notas de semana 2025 W46: É terminal

Notas de semana 2025 W46: É terminal


10 a 16 de novembro de 2025

Partes rápidas:

  • Eu gostaria de ter um paquímetro. Eu não tenho um. Eu não preciso de um. Mas seria bom ter só um, sabe?

  • Existe um lugar especial no inferno para quem para no topo de uma escada rolante. Eu mencionei isso antes? Com certeza empurrei vários infratores por não ter escolha.


Pensamentos sobre o banho:

  • Dá azar chamá-lo de “McDonald’s” – eu sempre o chamo de “o restaurante escocês”.

Ocorreu-me que as letras minúsculas a e g na sinalização digital do S-Bahn de Berlim há versões espelhadas uma da outra:

 XXXX    XXX
X   X       X
 XXXX    XXXX
    X   X   X
 XXX     XXXX

 XXX     XXXX
    X   X   X
 XXXX    XXXX
X   X       X
 XXXX    XXX

Duolingo está ficando esquisito ultimamente. Estou fazendo espanhol lá e, nos últimos dias, recebi frases como esta:

  • O cavalo fechou todas as portas.
  • Os gatos fecharam as janelas.
  • Os gatos assistiram a filmes de terror a noite toda.
  • Ontem os pássaros limparam o chão.
  • O cavalo abriu a geladeira e não fechou.
  • O cachorro aprendeu três idiomas.
  • Os cavalos aprenderam alemão.
  • Os gatos abriram um restaurante no mês passado.
  • O cachorro preparou um prato muito bom.

Não me importo com frases estranhas ocasionais, mas agora é tão bizarro que é difícil traduzir essas frases em espanhol para o inglês porque fico pensando se é realmente significa o que eu acho que significa.

Aprender uma nova língua envolve inferir o significado do contexto, mas se as frases são sobre porcos gordos escrevendo cartas em francês, isso se torna realmente muito difícil.

Duolingo talvez não seja uma ótima maneira de aprender idiomas.


Esta semana, tenho lutado com um problema específico do Zig: travamentos fariam com que o processo congelasse, sem imprimir nada e sem sair.

Para reproduzir, criei este arquivo fonte, blah.zig:

const std = @import("std");

pub fn main() !void {
    var gpa = std.heap.DebugAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    const ptr = try allocator.create(u32);
    allocator.destroy(ptr);
    allocator.destroy(ptr);
}

Eu então construí um executável (com zig build-exe blah.zig) e o executou (com ./blah), que apenas… trava:

% ./blah
 

Para ser claro: aquele segundo allocator.destroy(ptr) é intencionalmente errado. Essa linha libera uma alocação que já foi liberada. Ainda assim, pelo menos não deveria travar.

O que se espera é algo como o seguinte:

% ./blah
Segmentation fault at address 0x104fc1428
(snip)/debug_allocator.zig:875:23: 0x104ebebec in free (blah)
            if (bucket.canary != config.canary) @panic("Invalid free");
                      ^
(snip)/Allocator.zig:147:25: 0x104ebd747 in destroy__anon_19268 (blah)
    return a.vtable.free(a.ptr, memory, alignment, ret_addr);
                        ^
(snip)/blah.zig:10:22: 0x104ebd4b3 in main (blah)
    allocator.destroy(ptr);
                     ^
(snip)/start.zig:627:37: 0x104ebd9c3 in main (blah)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x184df2b97 in ??? (???)
???:?:?: 0x0 in ??? (???)
fish: Job 1, './blah' terminated by signal SIGABRT (Abort)

Você deve estar se perguntando agora: como consegui esse backtrace se o Zig trava em vez de encerrar? Bem, acontece que a execução do executável só trava quando executada em um terminal Zed, mas não quando executada no ghostty.

Acontece que isso nem é um problema para o Zig. Na verdade, mesmo o exit 1 comando faz o terminal Zed travar:

% exit 1
 

Então, registrei a edição nº 42414 do Zed.

Espero que Zed se recupere.

Espero que não seja… terminal.


Mudei meu foco do meu gerador de site estático para Deng. Uma coisa que certamente está faltando é o relatório de erros da VM. Já estava presente no compilador (incluindo o tokenizer e o analisador), mas foi fácil. O relatório de erros da VM não é tão simples.

A maneira como resolvi isso foi fazer o compilador emitir uma matriz de bytes que contém não apenas o bytecode, mas também:

  • um mapa de origem, que armazena o intervalo de bytes na entrada do modelo para cada instrução – um (u32, u32, u32) triplo do índice de instrução e intervalo de token

  • o próprio modelo original

Essa matriz de bytes começa com um cabeçalho que contém os comprimentos do bytecode e do mapa de origem, para que todas as três partes (bytecode + mapa de origem + modelo) possam ser extraídas. Embora essa codificação seja um pouco ineficiente em termos de espaço, ela funciona bem o suficiente.

Infelizmente, mapear instruções para tokens não é fácil. Aqui está uma dessas mensagens de erro de tempo de execução:

6:20: Found `null` value, which is not printable

    {{ page.title }}
                         ^^

O write instrução é emitida quando o compilador vê o }} ficha. Essa instrução retira o valor mais alto da pilha da VM e o grava no fluxo de saída.

O que eu realmente quero, porém, é uma indicação de toda a expressão que causou o erro –page.titlenesse caso, não o }} ficha:

    {{ page.title }}
              ^^^^^^^^^^

Ainda não sei como conseguir isso. Mais pesquisas e experimentações são necessárias para melhorar essas mensagens de erro.


Por recomendação de E——comecei a usar o Herb para realçar a sintaxe e lintar meus arquivos HTML+ERB.

Funciona muito bem com Nanoc, embora eu tenha que renomear o .erb layouts para ter o .html.erb extensão. Não é necessária uma única mudança no Regras arquivo, até!

Estou enfrentando o problema nº 854 do Herb, no entanto, o que torna alguns dos meus layouts incomparáveis. Esperamos que isso seja corrigido em breve.

Obrigado por Herb, porém, aprendi sobre o autocomplete atributo e ajustou todos os campos de entrada – não que existam tantos – de acordo. Viva a conveniência!


Entretenimento:

  • Após um intervalo de um mês e meio, retomamos nossa campanha Blades in the Dark. Férias e doenças fizeram com que tivéssemos que fazer uma pausa por um bom tempo.

  • Progresso lento em Warhammer 40.000: Comerciante Rogue. Não é fácil!

    Estou tão acostumado com o salvamento automático de jogos, e este jogo simplesmente não tem muitos locais para salvamento automático. Muitas vezes me meti em um problema intransponível que exige que eu carregue um save mais antigo que… bem, é de muito tempo atrás.


Toots e skeets:

Links:

Links técnicos:



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *