.

JINHWA JANG

Computación

Breve historia de Rust, el lenguaje de programación que ha destronado a C

1

Durante décadas, los programadores han escrito sistemas críticos en C y C++. Ahora, recurren a Rust

  • por Clive Thompson | traducido por Ana Milutinovic
  • 03 Marzo, 2023

Muchos proyectos de software surgen porque, en algún lugar, un programador tenía un problema personal que resolver.

Eso, más o menos, le ocurrió a Graydon Hoare. En el año 2006, Hoare era un programador informático de 29 años que trabajaba para Mozilla, la empresa de navegadores de código abierto. Al volver a su apartamento de Vancouver, descubrió que el ascensor no funcionaba: su software se había bloqueado. Y no era la primera vez que le ocurría.

Hoare vivía en el piso 21 y, mientras subía las escaleras, se enfadó. "Es ridículo que los informáticos ni siquiera podamos hacer un ascensor que funcione sin bloquearse", pensó. Hoare sabía que muchos de esos fallos se debían a problemas en el uso de la memoria. El software de aparatos como los ascensores suele estar escrito en lenguajes como C++ o C, conocidos por permitir a los programadores escribir código que se ejecuta de manera rápida y compacta. El problema es que esos lenguajes también facilitan la introducción accidental de fallos de memoria, es decir, errores que provocan bloqueos. Microsoft calcula que el 70% de las vulnerabilidades de su código se deben a errores de memoria procedentes del código escrito en estos lenguajes.

La mayoría de nosotros, si estuviéramos subiendo a duras penas 21 tramos de escaleras, nos cabrearíamos y ya está. Pero Hoare decidió hacer algo al respecto. Abrió su portátil y empezó a diseñar un nuevo lenguaje informático con el que esperaba escribir código pequeño y rápido sin errores de memoria. Lo llamó Rust, en honor a un grupo de hongos muy resistentes que están, dice, "diseñados para sobrevivir".

Ahora, 17 años después, Rust se ha convertido en uno de los lenguajes más populares del planeta, quizá el más popular. Hay 2,8 millones de programadores escribiendo en Rust, y empresas como Microsoft o Amazon lo consideran clave para su futuro. La plataforma de chat Discord utilizó Rust para acelerar su sistema; Dropbox lo emplea para sincronizar archivos con tu ordenador; y Cloudflare lo utiliza para procesar más del 20% de todo el tráfico de Internet.

Rust ha sido calificado como el lenguaje de programación "más querido" durante siete años consecutivos en la encuesta anual de Stack Overflow, el foro de discusión de programadores. Incluso el Gobierno de EE UU fomenta el software en Rust para que sus procesos sean más seguros. El lenguaje se ha convertido, como muchos proyectos exitosos de código abierto, en un trabajo colectivo y ahora hay cientos de colaboradores, la mayoría voluntarios. El propio Hoare se apartó del proyecto en el año 2013, encantado de cederlo a otros ingenieros, incluido el equipo central en Mozilla.

No es raro que alguien cree un nuevo lenguaje informático. Muchos programadores suelen crear pequeños lenguajes como proyectos paralelos. Pero es peculiar que uno se consolide, convirtiéndose en parte del panteón de lenguajes conocidos junto a, por ejemplo, JavaScript, Python o Java. ¿Cómo lo ha conseguido Rust?


Para comprender por qué Rust es tan útil, merece la pena echar un vistazo a cómo los lenguajes de programación gestionan la memoria de los ordenadores.

En líneas generales, la memoria dinámica de un ordenador es como una pizarra. Mientras se ejecuta un programa, se escriben pequeños fragmentos de datos en la pizarra de manera constante, se hace un seguimiento de cada uno y se borran cuando ya no son necesarios. Sin embargo, los lenguajes informáticos gestionan esto de distintas formas. Un lenguaje más antiguo, como C o C++, está diseñado para dar al programador mucho poder sobre cómo y cuándo el software utiliza la pizarra. Ese poder es clave, pues con tanto control sobre la memoria dinámica, un programador puede hacer que el software se ejecute rápidamente. Por eso, C y C++ se utilizan a menudo para escribir código bare metal, el tipo de código que interactúa directamente con el hardware. Las máquinas que no tienen un sistema operativo como Windows o Linux, desde máquinas de diálisis hasta cajas registradoras, funcionan con este tipo de código. Además, se utiliza para la informática más avanzada: en algún momento, un sistema operativo necesita comunicarse con el hardware. Los kernels, o núcleos de Windows, Linux y MacOS están todos escritos en su mayoría en C.

“Es agradable utilizar Rust, quizá sea un poco raro decirlo así, pero ese lenguaje es fantástico. Es divertido. Me siento como un mago, y eso nunca pasa con otros lenguajes”.

Parker Timmerman, ingeniero de software

Sin embargo, por muy rápidos que sean, los lenguajes C y C++ tienen una contraparte. Ya que requieren que el programador controle cuidadosamente en qué memoria se está escribiendo y cuándo borrarla. ¿Y si, por accidente, olvidas borrar algo? Puedes provocar un fallo, el software intentará más tarde utilizar un espacio de memoria que cree un vacío cuando hay algo allí. O podrías proporcionar a un intruso digital una forma de colarse. Un hacker podría descubrir que un programa no está limpiando su memoria de manera correctamente, ya que la información que debería borrarse (contraseñas, o información financiera) sigue ahí; y adquirir esos datos a escondidas. A medida que un fragmento de código C o C++ se vuelve más y más grande, es posible que incluso el programador más cuidadoso cometa muchos errores de memoria, llenando el software de bugs, o fallos.

"En C o C++ siempre tienes ese miedo a que tu código explote aleatoriamente", dice Mara Bos, cofundadora Fusion Engineering, empresa de drones, y jefa del equipo de bibliotecas de Rust.

En los años 90, se volvió popular un nuevo conjunto de lenguajes como Java, JavaScript y Python con un enfoque muy diferente. Para aliviar el estrés de los programadores, gestionaban automáticamente la memoria utilizando "recolectores de basura", es decir, componentes que limpiaban periódicamente la memoria mientras se ejecutaba una pieza de software. Así podría escribirse código que no tuviera errores de memoria. Pero la desventaja fue la pérdida de ese control tan detallado. Sus programas también funcionaban más despacio porque la recogida de basura consume un tiempo crucial de procesamiento. El software escrito en estos lenguajes también utilizaba más memoria. Así que el mundo de la programación se dividió, más o menos, en dos tribus. Si el software tenía que ejecutarse rápido, o en un pequeño chip dentro de un dispositivo integrado, era más probable que estuviera escrito en C o C++. Si se trataba de una aplicación web o una app de teléfono móvil, una parte cada vez más grande del mundo del código, entonces se usaba un lenguaje más nuevo, con recolector de basura.

Con Rust, Hoare pretendía crear una fusión de lenguaje entre estos dos enfoques. No requeriría que los programadores averigüen manualmente en qué parte de la memoria están colocando los datos, Rust lo haría por ellos. Pero impondría muchas reglas estrictas sobre cómo se pueden usar o copiar los datos dentro de un programa. Habría que aprender esas reglas de codificación, que serían más engorrosas que las de Python o JavaScript. Además, su código sería más difícil de escribir, pero "seguro para la memoria", sin miedo a que, por accidente, se inserten esos bugs letales para la memoria. Rust también ofrecería "seguridad de concurrencia". Los programas modernos hacen varias cosas a la vez, es decir, de manera simultánea y, a veces, esos diferentes hilos de código intentan modificar la misma pieza de memoria casi al mismo tiempo. El sistema de memoria de Rust prevendría esto.

Cuando abrió por primera vez su portátil para comenzar a diseñar Rust, Hoare ya tenía 10 años de experiencia en software y trabajaba a tiempo completo en Mozilla. Al principio, Rust fue solo un proyecto paralelo y Hoare se dedicó a ello durante unos años. Cuando se lo mostró a otros programadores, las reacciones fueron distintas. "Algo de entusiasmo. Muchas miradas de desacuerdo y comentarios 'Esto nunca funcionará' o 'Esto nunca se podrá usar'", me escribió en un correo electrónico.

Sin embargo, los directivos de Mozilla estaban intrigados. Se dieron cuenta de que Rust podía ayudarles a crear un motor de navegación mejor. Los navegadores son piezas de software complejas con muchas oportunidades para errores de memoria peligrosos.

Patrick Walton fue uno de los empleados que se involucró. Walton se había unido a Mozilla tras abandonar sus estudios de doctorado en lenguajes de programación. Y recuerda que Brendan Eich, inventor de JavaScript, le llevó a una reunión en Mozilla: "Me dijo: '¿Por qué no vienes a esta reunión donde vamos a discutir las decisiones de diseño para Rust?". Walton pensó que Rust sonaba fantástico, así se unió a Hoare y a un creciente grupo de ingenieros para desarrollar el lenguaje. Muchos de ellos, como Niko Matsakis y Felix Klock, ingenieros de Mozilla, tenían experiencia académica en la investigación de lenguajes de memoria y programación.

disparos a la cabeza de Walton, Matsakis, Klock y Goregaokar
Los directivos de Mozilla se dieron cuenta de que Rust podría ayudarles a construir un mejor motor de navegador e introdujeron a varios ingenieros en el proyecto, incluido Patrick Walton (1), quien se había unido a Mozilla después de decidir dejar sus estudios de doctorado en lenguajes de programación; Niko Matsakis (2) y Felix Klock (3), ambos con experiencia universitaria en la investigación de la memoria y los lenguajes de programación; y Manish Goregaokar (4), quien actualmente dirige el equipo de herramientas para los desarrolladores de Rust.

En el año 2009, Mozilla decidió patrocinar oficialmente a Rust. El lenguaje sería de código abierto y solo disponible para las personas que lo crearan, pero Mozilla estaba dispuesta a impulsarlo pagando a sus ingenieros. Un grupo de Rust ocupó una sala de conferencias de la empresa y Dave Herman, cofundador de Mozilla Research, la llamó "la cueva de los empollones", colocó un cartel en la puerta. Hoare calcula que, en los siguientes diez años, Mozilla empleó en Rust a más de una docena de ingenieros a tiempo completo.

"Todo el mundo creía estar trabajando en algo grande", recuerda Walton. Ese entusiasmo también se extendió fuera del edificio de Mozilla. A principios de 2010, Rust atraía a voluntarios de todo el mundo y de todos los rincones de la tecnología, algunos incluso trabajaban para grandes empresas tecnológicas. Uno de los principales colaboradores era un estudiante de secundaria en Alemania. En una conferencia de Mozilla en la Columbia Británica en 2010, Eich se levantó para decir que habría una charla sobre un lenguaje experimental y que "no asistieran a menos que fueran auténticos frikis de los lenguajes de programación. Por supuesto, llenó la sala", recuerda Walton.


A principios de la década de 2010, los ingenieros de Mozilla y los voluntarios de todo el mundo perfeccionaron gradualmente el núcleo de Rust: la forma en que está diseñado para gestionar la memoria. Crearon un sistema de "propiedad" para que una sola variable pudiera hacer referencia a un fragmento de datos; esto reduce, en gran medida, las posibilidades de que se produzcan problemas de memoria. El compilador de Rust, que toma las líneas de código escrito y las convierte en el software que se ejecuta en un ordenador, aplicaría las reglas de propiedad rigurosamente. Si un programador infringe estas normas, el compilador se negaría a recoger el código y convertirlo en un programa ejecutable.

Muchos de los trucos empleados por Rust no eran ideas nuevas: "En su mayor parte, son investigaciones de hace décadas", según afirma Manish Goregaokar, quien dirige el equipo de herramientas para desarrolladores de Rust y trabajó para Mozilla aquellos primeros años. Pero los ingenieros de Rust fueron expertos en encontrar estos conceptos perfeccionados y convertirlos en funciones prácticas y utilizables.

A medida que el equipo mejoraba el sistema de gestión de memoria, cada vez Rust necesitaba menos su propio recolector de basura y, en el año 2013, lo eliminó. Los programas escritos en Rust se ejecutaban aún más rápido: sin paradas periódicas mientras el ordenador realizaba la limpieza. Hoare señala que algunos ingenieros de software que argumentarían que Rust todavía posee elementos un poco parecidos a la recolección de basura. Como su sistema de "conteo de referencias", parte de cómo funciona su mecánica de propiedad de la memoria. En cualquier caso, el rendimiento de Rust se había vuelto eficiente. Se acercaba más a C y C++, y con mayor seguridad para la memoria.

La eliminación de la recolección de basura "condujo a un lenguaje más ágil y dinámico", dice Steve Klabnik, un programador que se involucró en Rust en el año 2012 y escribió documentación sobre ese lenguaje durante los siguientes 10 años.

Mientras tanto, la comunidad de Rust también fue construyendo una cultura conocida por ser amistosa y abierta a los recién llegados. "Nadie te llama nunca novato. Ninguna pregunta se considera estúpida", dice Nell Shamrell-Harrington, ingeniera principal de Microsoft que, por aquel entonces trabajaba en Rust en Mozilla.

Shamrell-Harrington explica que esto, en parte, se debe a que Hoare publicó muy pronto un "código de conducta", que prohibía el acoso, y se esperaba que cumpliera cualquiera que contribuyera a Rust. La comunidad lo aceptó y, según los miembros más veteranos de la comunidad Rust, por ello los programadores queer y trans se involucraron en Rust en mayor proporción que en otros lenguajes. Incluso los mensajes de error que crea el compilador cuando el programador erra son cuidadosos: describen el error, y sugieren amablemente cómo solucionarlo.

"Cuando cometo errores, los compiladores de C y C++ me hacen sentir como una persona terrible. El compilador de Rust es como si te guiara para escribir un código muy seguro", admite Shamrell-Harrington riendo.


En el año 2015, el equipo estaba obsesionado con publicar al fin una versión "estable" de Rust, lo bastante fiable como para que las empresas la utilizaran para crear software para clientes reales. Habían pasado seis años desde que Mozilla tomó a Rust bajo su tutela y, durante ese largo periodo de desarrollo, los programadores tenían ganas de probar versiones de demostración, a pesar de que podían ser poco fiables: "El compilador se rompía todo el tiempo", comenta Goregaokar. Pero ya era el momento de presentar una versión 1.0 al mundo.

Walton recuerda pasar horas encorvado sobre su portátil. Klabnik "escribió unas 45 páginas de documentación en las últimas dos semanas", recuerda el informático. El 15 de mayo de 2015, el grupo por fin publicó la primera versión, y grupos de frikis de Rust se reunieron en fiestas por todo el mundo para celebrarlo.

La inversión de Mozilla pronto empezó a dar sus frutos. En 2016, un grupo de Mozilla lanzó Servo, un nuevo motor de navegador construido con Rust. Al año siguiente, otro grupo utilizó Rust para reescribir la parte de Firefox que renderiza CSS, un lenguaje utilizado para especificar la apariencia de los sitios web. El cambio mejoró el rendimiento del navegador. La empresa también utilizó Rust para reescribir el código que gestionaba los archivos multimedia MP4, y que había corrido el riesgo de admitir código inseguro y malicioso.

Los programadores de Samsung le dijeron a Klock, que trabajaba desde la oficina de Mozilla en Francia, que habían empezado a utilizarlo. Facebook, más tarde conocida como Meta, utilizó Rust para rediseñar el software que sus programadores utilizaban para gestionar su código fuente interno. "Es difícil exagerar su importancia", dice Walton, quien ahora trabaja para Meta.

Muy pronto, Rust apareció en el núcleo de algunos programas informáticos de importancia. En el año 2020, Dropbox presentó una nueva versión de su "motor de sincronización", es decir, el software responsable de sincronizar los archivos entre los ordenadores de los usuarios y el almacenamiento en la nube de Dropbox. Los ingenieros habían reescrito este motor en Rust. El sistema se codificó originalmente en Python, pero ya gestionaba miles de millones de archivos, y billones de archivos sincronizados en línea. Rust hizo más fácil, e incluso más agradable. manejar esa complejidad, dice Parker Timmerman, ingeniero de software que acaba de dejar Dropbox.

"Es agradable escribir Rust, lo que quizá sea un poco raro de decir, pero es que el lenguaje es fantástico. Es divertido. Te sientes como un mago, y eso nunca ocurre en otros lenguajes. Hicimos una gran apuesta: es una tecnología nueva", afirma Timmerman.

Algunas empresas descubrieron que Rust aliviaba su miedo a los fallos de memoria. Por ejemplo, Mara Bos utilizó Rust para reescribir por completo el software de su empresa para controlar drones, que estaba escrito originalmente en C++.

Otros descubrieron las ventajas de abandonar el recolector de basura. En Discord, a los ingenieros les molestaba desde hacía tiempo que el recolector de basura de Go, el lenguaje que habían utilizado para construir partes críticas de su software ralentizara las cosas. El software de Go llevaba a cabo el procedimiento cada dos minutos, más o menos, a pesar de que los ingenieros de Discord habían escrito todo con tanto cuidado que no había basura que recoger. En 2020, reescribieron el sistema en Rust y descubrieron que ahora funcionaba diez veces más rápido.

Incluso los ejecutivos e ingenieros de Amazon Web Services, la plataforma de computación en la nube del gigante tecnológico, cada vez están más convencidos de que Rust puede ayudarles a escribir código de forma más segura y rápida. "Rust está en una posición única para ofrecer ventajas que no puedo obtener con otros lenguajes. Da múltiples super-poderes en un solo lenguaje", afirma Shane Miller, quien creó un equipo de Rust en AWS antes de dejar la empresa en 2022.

Quizás lo más importante para el gigante de la computación en la nube sea que un estudio del código basado en Rust descubrió que se ejecuta de forma tan eficiente que consume la mitad de electricidad que un programa similar escrito en Java, un lenguaje de uso común en AWS. "Así que podría crear un centro de datos que ejecute el doble de las cargas de trabajo que tengo ahora", afirma Miller. O hacer el mismo trabajo en un centro de datos que tiene la mitad del tamaño, lo que permitiría crearlo en una ciudad, en lugar de plantarlo en un campo exurbano.


El éxito de Rust ha creado nerviosismo entre algunos colaboradores veteranos. A medida que los gigantes tecnológicos adoptan el lenguaje, también obtienen más influencia sobre él. Tienen dinero suficiente para pagar a los ingenieros para que trabajen a tiempo completo desarrollando Rust; varios de los líderes de los equipos de Rust, por ejemplo, son empleados de Amazon y Microsoft. Otros colaboradores valiosos tienen que hacer su trabajo en Rust durante su tiempo libre. Por ejemplo, Bos trabaja por contrato en Rust para Huawei, además de dirigir su start-up de drones, pero su papel como jefa del equipo de la biblioteca de Rust no está remunerado.

Esta es una dinámica habitual en los proyectos de código abierto, asegura Bos: las grandes empresas pueden permitirse participar más e impulsar un proyecto para resolver problemas que les preocupan, pero las pequeñas no. "Eso les da cierta influencia", afirma Bos. Pero, añade, hasta ahora ninguna de las empresas ha hecho nada que active las alarmas. Klabnik, quien expresó su preocupación por la participación de Amazon en Rust y abandonó Rust en 2022, está de acuerdo. "¿Me preocupa? Sí. ¿Creo que es malo o que está en peor situación que muchos otros lugares? No".

En 2021, las principales empresas tecnológicas pagaron para crear una Fundación Rust sin ánimo de lucro y apoyar así a los programadores voluntarios. Dirigida durante sus dos primeros años por Miller, esta Fundación ofrece becas de 20.000 dólares (18.800 euros) a los programadores que quieran trabajar en alguna de las principales características de Rust, así como subvenciones "por dificultades económicas" para contribuyentes con necesidades financieras a corto plazo. También financia los servidores en los que se aloja el código de Rust y paga a una empresa de tecnología para garantizar que funcionen 24 horas al día, cada día de la semana. Al estilo clásico del código abierto, ese trabajo lo hacían antes "dos voluntarios que estaban de guardia el 50% de su vida. Uno de ellos era un estudiante en Italia", cuenta Miller.

El lenguaje ha crecido de manera improbable y rápida. Si Rust nació en 2006, ahora está saliendo de la adolescencia para entrar en su madurez. Las empresas automovilísticas están adoptando Rust para crear el código crucial que hace funcionar los coches; las compañías aeroespaciales también lo están adoptando. "Se va a utilizar en todas partes", predice Timmerman, de Dropbox. Los directivos de Microsoft incluso han sugerido públicamente lo que otras empresas tecnológicas están pensando a puerta cerrada: que usarán Rust cada vez más para el código nuevo, y C y C++ se utilizará cada vez menos. Y, al final, quizá nunca más.

Todo ese viejo código C y C++, que ya está dando vueltas por ahí, no desaparecerá, sino que seguirá en uso durante muchas décadas. Pero si Rust se convierte en la forma habitual de escribir código nuevo, que necesita ser rápido y bare-metal, podríamos empezar a notar que, gradualmente, año tras año, nuestro paisaje de software se volverá más y más fiable. Es decir, menos propenso a los fallos, menos inseguro.

Eso no asombraría a nadie más que a Hoare: "La mayoría de los lenguajes mueren en su primera etapa de desarrollo antes de dar fruto".

Clive Thompson es periodista de ciencia y tecnológico, residente en Nueva York y autor de Coders: The Making of a New Tribe and the Remaking of the World .

Computación

Las máquinas cada vez más potentes están acelerando los avances científicos, los negocios y la vida.

  1. Estas estructuras de madera que se moldean solas anticipan el futuro de la arquitectura sostenible

    Achim Menges utiliza técnicas asistidas por ordenador destinadas a hacer los edificios más sostenibles y asequibles

    Menges con una estructura de madera a pequeña escala.
  2. Cómo la gamificación pasó de una fuerza positiva a la coacción

    La gamificación siempre ha sido conductismo disfrazado de píxeles y sistemas de puntos. ¿Por qué hemos caído en ella?

    Collage de mensajes pop up de aplicaciones gamificadas
  3. Un circuito analógico podría ofrecer una alternativa energéticamente eficiente a los chips digitales

    El nuevo enfoque creativo podría conducir a un hardware de aprendizaje automático más eficiente desde el punto de vista energético

    Imagen estilizada de un circuito analógico a base de resistencias