2 puntos por GN⁺ 2023-12-19 | 1 comentarios | Compartir por WhatsApp

Situación del desarrollo del compilador de Rust basado en GCC

  • gccrs, el proyecto de compilador de Rust basado en GCC, comenzó en 2014 y tiene como objetivo implementar un compilador de Rust dentro de GNU Compiler Collection (GCC).
  • El objetivo de gccrs era ser incluido en la versión GCC 13, pero no se logró, y ahora apunta a ser incluido en GCC 14 (cuyo lanzamiento se espera a mediados de 2024).
  • gccrs apunta a Rust versión 1.49, la última versión anterior a la introducción de const generics.
  • Uno de los principios importantes del proyecto gccrs es no crear un "superset" de Rust, sino reproducir exactamente la salida de rustc.
  • La biblioteca estándar de Rust está compuesta por varios "crates", y gccrs se está enfocando en soportar la compilación de los crates core y alloc.
  • Actualmente gccrs no puede compilar estos crates debido a varias funciones faltantes; entre los problemas están la ausencia de un borrow checker y la falta de LLVM intrinsics que GCC no soporta.

Aprovechando las ventajas del ecosistema GCC

  • Una de las principales razones del desarrollo de gccrs es permitir el uso de los plugins de seguridad de GCC.
  • gccrs ya se está usando en la comunidad homebrew de Sega Dreamcast, y puede utilizar plugins de GCC para realizar análisis estático de código Rust unsafe.
  • Gracias al trabajo de gccrs, ha sido posible aportar funciones adicionales a la especificación de Rust, y el proyecto busca participar en la redacción de la especificación oficial de Rust.

Funciones en desarrollo

  • gccrs todavía carece de muchas funciones centrales, entre ellas async/await, LLVM intrinsics ausentes en GCC y el macro format_args!().
  • El proyecto Polonius implementa un borrow checker que calcula la vida útil de las referencias con un algoritmo distinto para resolver las desventajas del borrow checker actual de rustc.
  • Ya comenzó el trabajo sobre el macro format_args!(), que es necesario para construir los argumentos que se pasan a otros macros de formateo de cadenas.

rustc_codegen_gcc

  • rustc_codegen_gcc es otro proyecto de Rust basado en GCC, más maduro que gccrs y con un alcance más limitado.
  • rustc_codegen_gcc usa la biblioteca libgccjit para conectarse a la API del backend LLVM de rustc, y compila en etapas tardías tanto de rustc como de GCC.
  • Hasta octubre de 2023, rustc_codegen_gcc puede compilar Rust for Linux sin parches adicionales.

Rust for Linux

  • El proyecto Rust for Linux ofrece documentación sobre cómo compilar código Rust para el kernel usando rustc o rustc_codegen_gcc.
  • gccrs también apunta a soportar Rust for Linux, pero por la gran diferencia con la versión de rustc actualmente soportada, todavía parece un objetivo lejano.

Opinión de GN⁺

  • El proyecto gccrs busca implementar un compilador de Rust basado en GCC, lo que puede aportar diversidad al ecosistema de Rust y ofrecer el potencial de aprovechar herramientas existentes como los plugins de seguridad de GCC.
  • Aunque gccrs todavía no puede compilar partes centrales de la biblioteca estándar de Rust, es notable que ya tenga un caso de uso real en la comunidad homebrew de Sega Dreamcast.
  • Este artículo ofrece una mirada interesante a las distintas implementaciones de compiladores para el lenguaje Rust y a las posibilidades de expansión del ecosistema que eso conlleva.

1 comentarios

 
GN⁺ 2023-12-19
Opiniones de Hacker News
  • Resumen del primer comentario:

    • Siente que el artículo presenta débilmente la motivación para desarrollar gccrs.
    • gccrs se está desarrollando para aprovechar los plugins de seguridad de GCC.
    • La iniciativa "Rust for Linux", que agrega soporte de Rust al kernel de Linux, es otra razón.
    • Es una motivación importante porque muchos desarrolladores del kernel quieren compilar el kernel de Linux usando solo la toolchain de GNU.
    • Se explica por qué se usa GCC como backend, pero falta explicar por qué se necesita un frontend duplicado.
    • Hay que aprender de los errores de C++, y tener varios frontends dificulta el desarrollo entre plataformas.
    • Se está teniendo cuidado de que gccrs no se convierta en "GNU Rust", y se busca replicar la salida de rustc.
  • Resumen del segundo comentario:

    • Rust necesita un estándar del lenguaje.
    • Muchas organizaciones e industrias no adoptarán Rust si no tiene un estándar.
    • Otros lenguajes como C, C++, C#, JavaScript (ECMAScript) tienen estándares.
  • Resumen del tercer comentario:

    • Le sorprende la reacción negativa hacia GCC-RS.
    • Si un lenguaje no tiene varias implementaciones, ese lenguaje está incompleto.
  • Resumen del cuarto comentario:

    • gccrs permitirá soporte de Rust para arquitecturas que LLVM no soporta.
  • Resumen del quinto comentario:

    • Cree que es un error que gccrs intente replicar incluso los bugs y rarezas de rustc.
    • Rust no tiene una especificación oficial, y documentarlo solo con una única implementación de referencia es una debilidad a largo plazo.
    • Intentar que el código existente funcione en todas las implementaciones es razonable, pero tiene el problema de perpetuar decisiones equivocadas y bugs.
    • Microsoft hace mucho esfuerzo para que programas antiguos sigan funcionando.
    • Rust no debería cargar con esa mochila tan temprano en su desarrollo.
    • Para que el lenguaje evolucione, debe aceptar QA y QC.
    • Los lenguajes con estándares sólidos aceptan esa idea.
  • Resumen del sexto comentario:

    • Agradece que hayan publicado el enlace de lwn.net porque le recordó renovar su suscripción.
  • Resumen del séptimo comentario:

    • Linux ya puede compilarse usando clang.
    • Desarrollar y mantener este esfuerzo duplicado por la "pureza" de GNU no parece valer la pena.