Projetos Pessoais
Aqui estão os meus projetos mais interessantes, mais ou menos em ordem cronológica reversa.
Tide (2026–)
Uma linguagem de programação, projetada para ser pequena e bem-feita, e eventualmente ter uma implementação portável. Ainda está incompleta, mas o projeto parece promissor até agora, com uma fundação híbrida entre procedural e funcional, inferência de tipos com o algoritmo Hindley-Damas-Milner, e uma biblioteca padrão projetada com cuidado.
Eu tenho uma seção do meu blog escrita sobre este projeto (em inglês).
Bible Reader (2025–)
Um aplicativo (ainda não lançado) para leitura da Bíblia. O objetivo é principalmente ter boa tipografia e uma experiência de leitura agradável, para permitir uma leitura por longos períodos de tempo, sem interrupções, como uma Bíblia de papel.
Está no meio de uma reescrita em Flutter, vindo de tecnologias Web. Também estou trabalhando para licenciar as traduções para o português da Sociedade Bíblica do Brasil.
cmod (2025)
Um sistema de compilação para C. Ele lista recursivamente todos os arquivos C e os liga juntos, mas com compilação incremental e padrões melhores. Tem também um arquivo de configuração opcional para ligar dependências de sistema ou configurar opções do compilador.
Foi implementado como um script para shell que gera um build.ninja e imediatamente invoca o Ninja. Falta muita funcionalidade, mas já é o suficiente para todos os meus programas em C. Mesmo neste estado incompleto, é agradável de usar.
cmod: a modern C build system that doesn’t require build files
Oken (2022–2025)
Oken é um projeto muito ambicioso que eu refiz várias vezes e tenho muito pouco para mostrar.
O objetivo era ter um depurador REPL estilo Lisp, sintaxe estilo Tcl, sistema de tipos gradual, multimétodos, e a capacidade de compilar para C para execução mais rápida. Era para servir como shell, linguagem de extensão, ou para escrever aplicativos completos.
Era ambicioso demais e o projeto nunca foi completado. O mais perto que eu cheguei foi um protótipo de interpretador em Lua, seguindo o guia do Make-A-Lisp[a], sem a sintaxe estilo Tcl, mas com todas as funcionalidades que eu queria. Eu percebi que eu tinha feito um mini Common Lisp com outra sintaxe.
O projeto agora está congelado até eu terminar o Tide, que tem um escopo mais bem definido.
Lake (2020–2021)
Lake era um “substituto para C”. Comecei com um compilador de C que já existia, e fiz várias modificações. Mudei a sintaxe, adicionei operator overloading, macros melhores, tipagem estrutural em alguns casos, genéricos, e várias outras melhorias de qualidade de vida. Eu tentei adicionar um sistema de ownership (que não funcionava muito bem). E assim que eu tentei usar, percebi que copiar cegamente funcionalidades de Rust tinha criado um design incoerente.
Eu desisti quando estava tentando implementar inferência de tipos para genéricos e estava tendo muitos bugs. Eu percebi que eu já não acreditava no design da linguagem, e decidi recomeçar do zero.
Depois de mais dois redesigns do zero (só projetos, sem código), desisti. Eu precisaria de um projeto ativo de programação de sistemas para saber o que é necessário no projeto desta linguagem, e eu não tinha nenhum. Eu talvez tente criar outra linguagem de sistemas no futuro, mas por enquanto eu quero trabalhar em outros problemas.
The Lake programming language: C but sweeter
Craft (2019–2020)
Este era um fork do Craft do Michael Fogleman[a]. Aprendi muito sobre como ele funcionava, e muito mais sobre como não escrever C. Não é uma codebase muito boa. Eu tentei fazer algum design de verdade, mas acabei me distraindo reescrevendo tudo.
[a] Craft: a simple Minecraft clone written in C using modern OpenGL (shaders)
No fim, as únicas novas funcionalidades notáveis foram a geração de mundo no servidor, e raytracing. Eu queria provar que dava para fazer raytracing em tempo real no meu laptop de 2014, e escrevi um raymarcher DDA no pixel shader[b] para isso. Tinha sombras e refração, mas qualquer tentativa de usar sub-raios acabava com o desempenho. Ele rodava a 30 FPS se a janela fosse metade da tela, o que era suficiente para mim na época.
[b] Inspirado no noeuclid, mas usando um algoritmo diferente.
Hoje eu sei como fazer muito, muito melhor, desde começar com um depth map até fazer path tracing com denoising, mas eu nunca mais quero revisitar aquele código. Talvez algum dia eu reescreva.
Distribuição com Static Linking (2018–2019)
Eu infelizmente perdi o código deste projeto. Tinha feito um “gerenciador de pacotes” pequeno em shell, sem suporte para dependências. Então, eu compilei musl, binutils, GCC, sbase e outros pacotes até que meu editor de texto (vis) e gerenciador de janelas (dwm, na época) estivessem todos empacotados como binários com static linking, compilados com o meu sistema.
Eu cheguei bem longe. Estava usando esses pacotes todos os dias, em vez dos fornecidos pela distribuição. Empacotar as bibliotecas do X foi interessante; como elas não são feitas para static linking, tive que juntar as bibliotecas estáticas com as dependências delas (desempacotando e reempacotando) para não ter erros de dependências ausentes.
Eventualmente, percebi que é impossível fazer static linking do OpenGL porque ele é um driver que precisa combinar com o driver do kernel. O que significa que todo programa gráfico no Linux moderno (com Wayland) precisa usar dynamic linking, mesmo que só por este motivo. Por isso desisti do projeto.
Yax (2018–2019)
O Yax era um “microkernel” estilo Unix, com multitarefa, paginação e um sistema de arquivos virtual (VFS). O VFS suporta montagens de usuário estilo Plan 9, e é usado como IPC. O nome vem do meu nome do meio, Ieks. Meu sobrenome (Minicz) soa parecido com outro microkernel estilo Unix, o MINIX.
Este foi meu primeiro projeto grande em C. Comecei do tutorial “Bare Bones” do OSDev[a] e segui de lá. A minha obsessão por evitar bugs, ao invés de depurá-los depois, começou aqui, porque depurar um kernel não é fácil.
Parei de trabalhar nele quando eu comecei a escrever um driver de disco e percebi que eu não gosto de escrever drivers. Além disso, ele não é diferente o suficiente do Linux para valer a pena usar (imagino que depois de bastante trabalho para tornar ele utilizável), então eu decidi abandoná-lo e considerá-lo pronto. Ele cumpriu seus objetivos de design: um “microkernel” com o VFS como IPC.