Argonalyst

Lançamento do tmux-rs: Portando tmux de C para Rust

Argonalyst
3 July 2025

3 de julho de 2025

**Lançamento do tmux-rs**

Por Collin Richards

Após seis meses de trabalho silencioso, finalmente consegui portear o tmux de C para Rust. Recentemente, alcancei um marco significativo: a base de código agora é 100% (unsafe) Rust. Quero compartilhar o processo de migração do código original, que tinha cerca de 67.000 linhas em C, para aproximadamente 81.000 linhas em Rust (excluindo comentários e linhas vazias). Você pode estar se perguntando: por que reescrever o tmux em Rust? E, sinceramente, não tenho uma boa justificativa. É um projeto de hobby, como jardinagem, mas com mais segfaults.

**Iniciando com C2Rust**

O projeto começou como uma forma de testar o C2Rust, um transpiler de C para Rust. Embora a ferramenta tenha sido um pouco complicada de configurar, assim que funcionou, a saída gerada foi uma portabilidade bem-sucedida da base de código do tmux para Rust.

Apesar do código gerado funcionar, ele era basicamente incontrolável e três vezes maior que o original em C. Não era algo que você gostaria de tocar. Um exemplo do código gerado ilustra esse problema: o código Rust resultante tinha muitos casts desnecessários que poluíam a implementação. A minha principal preocupação era perder informações de constantes nomeadas, como COLOUR_FLAG_256, que foi traduzido para 0x1000000.

Depois de muito tempo refatorando manualmente o código Rust gerado, percebi que continuava a precisar olhar para o código original em C para entender a intenção do programa. Assim, desisti dessa abordagem e decidi traduzir todos os arquivos manualmente de C para Rust.

**Processo de Construção**

O aspecto mais importante dessa reescrita foi desenvolver uma compreensão sólida de como o projeto era construído. Para o tmux, utilizei o autotools e ajustei os arquivos em autogen.sh para modificar o Makefile gerado, incluindo uma biblioteca estática criada pelo meu crate Rust.

No início, tentei dividir o projeto em mini-crates, mas acabei achando mais fácil manter tudo no mesmo crate, devido a restrições de dependência circular e problemas de vinculação que surgiam ao tentar vincular múltiplas bibliotecas Rust em um único binário.

Depois de traduzir cerca da metade dos arquivos C, percebi que o processo de construção estava um pouco absurdo. Em vez de construir um binário C e vincular a uma biblioteca Rust, deveria ser o contrário, utilizando o crate cc para facilitar essa alteração.

**Bugs Interessantes**

Durante a tradução do código, introduzi muitos bugs. Um exemplo foi um erro de segfault após traduzir uma função trivial. O erro foi causado por uma declaração implícita incorreta no código C, que fazia com que o compilador pensasse que um inteiro de 4 bytes estava sendo retornado, quando na verdade deveria ser um ponteiro de 8 bytes. A correção envolveu simplesmente adicionar o protótipo correto ao código C.

Outro bug notável ocorreu ao traduzir uma função simples que também estava causando segfaults. Ao investigar, percebi que um campo de tipo na estrutura havia sido traduzido incorretamente, resultando em diferentes visões do tipo entre C e Rust. A correção foi tão simples quanto ajustar os tipos errôneos no código Rust.

**Padrões de C em Rust**

Os ponteiros brutos foram uma parte importante da tradução, já que as referências Rust não podiam ser utilizadas devido a invariantes que não podiam ser mantidos. A utilização de ponteiros brutos (*mut T e *const T) era necessária para manter a semântica de ponteiros em C, embora isso tornasse o código menos ergonômico.

Além disso, a linguagem C possui o comando goto, que, embora tenha uma reputação negativa, foi utilizado de forma controlada no código do tmux. A transpiração de goto foi feita utilizando blocos rotulados e instruções de quebra, simplificando a lógica de controle.

**Conclusão**

Embora o código agora esteja 100% em Rust, não tenho certeza se alcancei meu objetivo principal. O código que traduzi manualmente não é significativamente melhor do que a saída do C2Rust, e é fácil fazê-lo travar. O próximo objetivo é converter a base de código para Rust seguro.

Últimos vídeos

Confira os últimos vídeos publicados no canal

Argonalyst

O plano SECRETO das Big Techs para cobrar MUITO mais pela IA

Argonalyst

BOLHA da IA ou NOVA era de crescimento EXPONENCIAL? O mercado está dividido

Argonalyst

Nova IA da OpenAI traduz em TEMPO REAL e pode mudar o mundo dos negócios

Argonalyst

Spec Driven Development (SDD): a habilidade que vai separar quem SOBREVIVE à IA

Argonalyst

DeepSeek V4: o Open Source que está AMEAÇANDO GPT 5.5 e Opus 4.7

Argonalyst

Prometeram Renda Universal… mas só veio desemprego?

Argonalyst

Mythos Preview: o começo da AGI ou só mais hype?

Argonalyst

Ele automatizou TUDO com IA… e pode virar bilionário sozinho

Argonalyst

Programadores foram só o começo… agora a IA quer o topo

Argonalyst

Multi-agentes, memória e IA eterna: o vazamento que mudou tudo

Argonalyst

VIBE CODING vai acabar… e o que vem agora é muito mais SINISTRO

Argonalyst

IA na Guerra: estamos criando algo mais PERIGOSO que a Bomba Atômica?

Argonalyst

O dinheiro vai desaparecer? A era da IA pode mudar tudo

Argonalyst

O Apocalipse do SaaS: Como a IA pode DESTRUIR o modelo bilionário do software

Argonalyst

Bitcoin é software… e o software está morrendo (isso explica a queda?)