1 pontos por GN⁺ 2024-08-26 | 1 comentários | Compartilhar no WhatsApp

Por que escrever um compilador Rust em C?

  • Há vários motivos para a redução recente na atividade

    • acontecimentos pessoais, como a morte de familiares
    • aumento das responsabilidades no trabalho
    • diminuição da motivação por open source
    • foco em um novo projeto
  • Este projeto consiste em escrever um compilador Rust em C puro

    • escrito em C puro, sem C++, flex, yacc ou Makefile
    • o nome do projeto é Dozer

Por que fazer isso?

  • É preciso entender o bootstrapping e sua importância
    • para executar código Rust, é necessário um compilador
    • o principal compilador de Rust é o rustc
    • o rustc é escrito em Rust e é necessário para compilar código Rust
    • para compilar o rustc, é necessária uma versão anterior do próprio rustc
    • as primeiras versões do rustc eram escritas em OCaml
    • o compilador de OCaml pode ser compilado por Guile, e o Guile é escrito em C

Princípio da descida

  • Introdução ao projeto Bootstrappable Builds

    • começa com uma semente binária de 512 bytes
    • gera compiladores gradualmente mais complexos a partir de um compilador simples
    • por fim, consegue compilar TinyCC, GCC, Linux e outros
  • O Rust aparece muito tarde nesse processo

    • usa-se o mrustc para compilar a versão 1.56 do rustc
    • se você quiser usar Rust antes da introdução do C++, isso é impossível
  • O Dozer tem como objetivo ser um compilador Rust bootstrappável em C

    • ele deve conseguir fazer bootstrap com TinyCC

Plano

  • Trabalho no Dozer nos últimos dois meses

    • pode ser compilado com TinyCC e cproc
    • usa o QBE como backend
    • no momento, o lexer e parte do parser estão prontos
    • a expansão de macros/módulos está sendo adiada
    • a checagem de tipos suporta apenas i32
    • a geração de código ainda está incompleta
  • Planos para o futuro

    • evoluir o Dozer gradualmente para conseguir compilar exemplos básicos com libc, libcore e o rustc
    • criar uma ferramenta semelhante ao cargo para compilar pacotes Rust
    • remover código gerado automaticamente
    • criar um processo para compilar o rustc e o cargo

Resumo do GN⁺

  • Este texto fala sobre um projeto para escrever um compilador Rust em C puro
  • explica a importância do bootstrapping e o processo de criar um compilador Rust por esse caminho
  • o projeto Dozer tem como objetivo um compilador Rust bootstrappável em C
  • o projeto é extremamente desafiador, e não está claro se terá sucesso, mas a tentativa em si já tem valor

1 comentários

 
GN⁺ 2024-08-26
Comentários no Hacker News
  • Para fazer o bootstrap do Rust, parece melhor escrever um proto-Rust em C e depois escrever o compilador completo de Rust em proto-Rust

    • O proto-Rust não teria borrow checker nem suporte a macros, não liberaria memória e não precisaria gerar código bom
    • Proto-Rust seria como C com sintaxe de Rust
    • Fico curioso sobre por que esse caminho não foi escolhido
  • Estou escrevendo um compilador de C em Rust como hobby, e o chamo de "Small C Compiler"

    • Usa Cranelift como backend, e a arquitetura do compilador é plugável e fácil de hackear
    • Não há planos de open source até conseguir lidar com printf("Hello World!")
    • Estou tentando implementar o pré-processador e o parser, e contribuo com rust-peg e HimeCC
    • Tenho curiosidade sobre as soluções da academia para o problema de typedef
  • O mesmo problema de bootstrap também existe no hardware

    • Computadores são feitos com computadores e software já existentes
    • É um tema interessante para se pensar
  • Tive que seguir 4 links para encontrar as vantagens do bootstrap

    • Eu esperava que a parte "por quê" do título explicasse isso
  • Quando C++ entra na cadeia de bootstrap, o bootstrap praticamente acaba

    • Para usar Rust, ele precisa ser usado antes da introdução de C++
    • Seria bom se o compilador de Rust pudesse fazer bootstrap a partir de C
    • Mas versões anteriores do rustc são compiladas por versões anteriores do rustc
    • É possível compilar com sucesso o compilador de OCaml com Guile
    • O autor elimina a etapa em C++ e prefere a etapa em C
    • A motivação do autor não está clara
  • Para gerar um novo binário no sistema-alvo, o rustc precisa oferecer suporte a esse sistema

    • Se esse suporte for adicionado ao rustc, ele poderá se construir sozinho
  • Imagino escrever um interpretador ou compilador de C++ em Scheme

    • Ir de Scheme direto para o gcc atual seria um enorme atalho
    • Mas o consenso geral é que escrever um compilador de C++ é quase impossível
  • Olhando a pilha inteira, isso pode ser uma forma de contornar o problema de "trusting trust"

  • Gosto da ideia de usar QBE como backend

    • Seria interessante ver uma comparação com Rust e LLVM
    • Boa sorte
  • Dá para considerar usar FORTH como parte da toolchain no processo de bootstrap