Rust ha llegado para destronar a C
Durante décadas, los programadores han escrito sistemas críticos en C y C++. Ahora, recurren a Rust
Rust nació en 2006 y 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.
Rust incorpora la seguridad y protección de memoria que ofrecen lenguajes como Java y Python al mismo tiempo que la velocidad de ejecución, eficiencia energética y el control en bajo nivel de C.
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. Incluso el Gobierno de EE UU fomenta el software en Rust para que sus procesos sean más seguros
C o C++, están diseñados para dar al programador mucho poder sobre cómo y cuándo el software utiliza la memoria. 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.
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 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.
Rust no requiere que los programadores averigüen manualmente en qué parte de la memoria están colocando los datos, Rust lo hace por ellos. Pero impondrá 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.
Rust posee 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.
Al gestionar la memoria tan eficientemente, Rust no necesita recolector de basura. Por esta razon, los programas escritos en Rust se ejecutan aún más rápido: sin paradas periódicas mientras el ordenador realizaba la limpieza. El rendimiento de Rust se había vuelto eficiente. Se acercaba más a C y C++, y con mayor seguridad para la memoria.
Otra ventaja muy importante es que el código se ejecuta de forma tan eficiente que consume la mitad de electricidad que un programa similar escrito en Java