1 puntos por GN⁺ 2024-08-26 | 1 comentarios | Compartir por WhatsApp

¿Por qué escribir un compilador de Rust en C?

  • Hay varias razones por las que mi actividad reciente ha disminuido

    • Acontecimientos personales, como la muerte de un familiar
    • Más responsabilidades en el trabajo
    • Menos entusiasmo por el código abierto
    • Enfoque en un proyecto nuevo
  • Este proyecto consiste en escribir un compilador de Rust en C puro

    • Escrito en C puro, sin C++, flex, yacc ni Makefile
    • El nombre del proyecto es Dozer

¿Por qué hacer esto?

  • Hay que entender el bootstrapping y su importancia
    • Para ejecutar código Rust, se necesita un compilador
    • El compilador principal de Rust es rustc
    • rustc está escrito en Rust y se necesita para compilar código Rust
    • Para compilar rustc, se necesita una versión anterior de rustc
    • Las primeras versiones de rustc estaban escritas en OCaml
    • El compilador de OCaml puede compilarse con Guile, y Guile está escrito en C

El principio del descenso

  • Introducción al proyecto Bootstrappable Builds

    • Comienza con una semilla binaria de 512 bytes
    • A partir de compiladores simples, genera gradualmente compiladores más complejos
    • Al final, permite compilar TinyCC, GCC, Linux y más
  • Rust aparece muy tarde en este proceso

    • Usa mrustc para compilar rustc versión 1.56
    • Si quieres usar Rust antes de introducir C++, no es posible
  • Dozer apunta a ser un compilador de Rust que pueda bootstrappsearse desde C

    • Debe poder arrancar desde TinyCC

Plan

  • Trabajo en Dozer durante los últimos dos meses

    • Puede compilarse con TinyCC y cproc
    • Usa QBE como backend
    • Actualmente ya están listos el lexer y parte del parser
    • La expansión de macros/módulos se está posponiendo
    • La verificación de tipos solo soporta i32
    • La generación de código aún es limitada
  • Planes a futuro

    • Desarrollar Dozer gradualmente hasta poder compilar ejemplos básicos con libc, libcore y rustc
    • Crear una herramienta similar a cargo para poder compilar paquetes de Rust
    • Eliminar el código generado automáticamente
    • Crear un proceso para compilar rustc y cargo

Resumen de GN⁺

  • Este artículo trata sobre un proyecto para escribir un compilador de Rust en C puro
  • Explica la importancia del bootstrapping y el proceso para crear un compilador de Rust de esta forma
  • El proyecto Dozer busca ser un compilador de Rust que pueda bootstrappsearse desde C
  • Es un proyecto muy desafiante y no está claro si tendrá éxito, pero el intento en sí ya tiene valor

1 comentarios

 
GN⁺ 2024-08-26
Opinión de Hacker News
  • Para hacer el bootstrap de Rust, sería bueno escribir un proto-Rust en C y luego escribir el compilador completo de Rust en proto-Rust

    • El proto-Rust no tendría borrow checker ni soporte para macros, no liberaría memoria y no necesitaría generar buen código
    • Proto-Rust sería como C con sintaxis de Rust
    • Me pregunto por qué no se eligió este camino
  • Como hobby, estoy escribiendo un compilador de C en Rust, y lo llamo "Small C Compiler"

    • Usa Cranelift como backend, y la arquitectura del compilador es conectable y hackeable
    • No hay planes de hacerlo open source hasta que pueda procesar printf("Hello World!")
    • Estoy tratando de implementar el preprocesador y el parser, y participo en rust-peg y HimeCC
    • Tengo curiosidad por las soluciones académicas al problema de typedef
  • El mismo problema de bootstrap también existe en hardware

    • Las computadoras se construyen con computadoras y software hechos previamente
    • Es un tema interesante para pensar
  • Tuve que seguir 4 enlaces para encontrar la ventaja del bootstrap

    • Esperaba que la parte de "por qué" en el título explicara esa razón
  • Si se introduce C++ en la cadena de bootstrap, el bootstrap prácticamente termina ahí

    • Si se va a usar Rust, habría que usarlo antes de introducir C++
    • Sería bueno que el compilador de Rust pudiera hacer bootstrap desde C
    • Pero las versiones anteriores de rustc se compilan con versiones anteriores de rustc
    • Es posible compilar con éxito el compilador de OCaml con Guile
    • El autor quiere eliminar la etapa de C++ y prefiere la etapa en C
    • La motivación del autor no está clara
  • Para generar un nuevo binario en el sistema objetivo, rustc debe soportar ese sistema

    • Si se agrega ese soporte a rustc, puede construirse a sí mismo
  • Imagino escribir un intérprete o compilador de C++ en Scheme

    • Pasar directamente de Scheme al gcc actual sería un atajo enorme
    • Sin embargo, la sabiduría convencional dice que escribir un compilador de C++ es casi imposible
  • Mirando todo el stack, podría ser una forma de evitar el problema de "trusting trust"

  • Me gusta que use QBE como backend

    • Sería interesante ver una comparación con Rust y LLVM
    • Buena suerte
  • Se podría considerar usar FORTH como parte de la toolchain en el proceso de bootstrap