Es un lenguaje bastante joven ya que la primera versión publica estable es de 2015, potenciado por Mozilla, con el que se realizo el motor de renderizado de Mozilla (Proyecto Servo) y es en 2021 cuando se separa de Mozilla y se crea la fundación Rust (AWS, Huawei, Google, Microsoft y Mozilla) y Google también lo acoge en Android.
Las características que se pretende cubrir con este nuevo lenguaje son:
Énfasis en la seguridad, el control de distribución de la memoria y la concurrencia, no permite punteros nulos o colgantes, nos permite escribir un código eficiente.
Eficacia en la memoria, controla y elimina los elementos no utilizados sin recolector, lo que da una mejora de rendimiento,
Ayuda a prevenir errores de programación lógica al permitir tipos altamente expresivos, con una verificación fuerte en tiempo de compilación.
Manejo de errores Las funciones con fallas recuperables pueden devolver un tipo de resultado (Result) que indique si es exito o error, forzando el compilador a que se verifique y se maneje el error. Reduciendo los errores de fallos no controlados (OJO reduce no elimina)
Manejo de enteros más seguro Las conversiones de tipo entero son conversiones explícitas. La comprobación de desbordamiento está activada de forma predeterminada.
Aprender el lenguaje realizando ejemplos esta bien, pero lo mejor para sacar conclusiones sobre si estaba consolidando bien mi información y verificar si es interesante usar este lenguaje en mis proyectos es crear un pequeño proyecto.
Este pequeño proyecto es pequeño pero me ayudo también a ver que tal estábamos de librerías y como de complejo es pasar de un ejecutable Linux a Windows. Así que decidí generar un programa para envío masivo de mails personalizados, programa que en tiempo realice en python para un tema puntual, y surgió el proyecto CaroMail (https://github.com/pinguytaz/CaroMail) que no contaremos en este POST pero si los PROS y CONTRAS que he encontrado.
PROS
- Librerias
Una de las primeras cosas que me gusto es que disponemos de muchas librerías, esto me recuerda a Python lenguaje que no me convence, especialmente por el uso obligado de TAB para los bloque en lugar de encerrarlos entre llaves o palabras claves, pero que uso para rápidos scripts en los que un Shell se complica. No solo dispone de muchas sino que se buscan fácilmente en Craters.io, en mi caso use librerías para leer fichero en formato .ini para la configuración, .csv para la base de datos de los usuarios a los que enviaría mail, librerías para el envió de mail, expresiones regulares y una que me gusto mucho «indicatif» para la barra de progreso.
- Compilación cruzada
En relación con las librerías me gusto la herramienta «cargo» que nos proporciona Rust para la compilación, el compilador es «rustc«, y gestión de paquetes de forma sencilla y que ademas nos facilita de forma sencilla el poder realizar la compilación cruzada de múltiples plataformas de forma sencilla. Tendremos un fichero Cargo.toml que define las dependencias, librerías utilizadas, de nuestro proyecto así como nombre del proyecto etc. pero lo divertido es que casi no lo deberemos editar nosotros ya que cargo add <libreria> lo añade en el fichero para que al compilarla si es necesario se carguen y compilen o se actualicen, y cuando queramos quitar una librería no utilizada bastara con poner cargo remove <libreria>.
- –target x86_64-unknown-linux-gnu Para un ejecutable ELF de Linux 64bits
- –target x86_64-pc-windows-gnu Para un ejecutable Windows compilado con mingw-w64
Debemos pensar que Rust no tiene su propio linker por lo que debemos tener uno instalado y utilizara el que corresponda según el target que deseemos usar, por eso en el target de windows deberemos instalar «mingw-w64-gcc» si no lo tenemos instalado para que no nos de error de linker
rustup target list nos permitirá visualizar los target disponibles, compilaciones cruzadas, y si están instalados o no. para instalarlo solo deberemos ejecuta rustup target add <TARGET> y también borrarlos con remove.
CONTRAS
Tenia que poner CONTRAS pero la verdad es cuestión de acostumbrarse.
- Por defecto inmutables
Las variables por defecto son inmutables, es decir no podemos cambiar su valor salvo que las definamos como mutables
let a = 12; // Inmutable no podemos cambiar su valor
let mut a =12; // Ya podrá cambiarse como las variables que conocemos.
Lo pongo en CONTRAS porque en un principio me lió, siempre las creaba inmutables :-), pero la verdad es que esta bien en especial con el paso de parámetros por referencia a una función. Ya que mejor que el compilador no diga que no podemos cambiar el valor, y corregimos el código, a que de repente estemos cambiando el valor de una variable sin ser consciente.
- OwnnerShip
Una variable solo puede tener un solo propietario, es un contra pero es cuestión de acostumbrarse ya que esta propiedad da ventajas.
El problema, pero como digo esto sera cuestión de acostumbrarse, es que lo típico de asignar el valor de una variable a otra o simplemente pasar esta como parámetro hace que desaparezca, aunque esto se solventa fácilmente con lo llamados prestamos.
let a=12;
let b=a; // Desde este momento no podemos usar 'a' ya quele hemos pasado la propiedad a 'b' no el valor.
f(b); // le pasamos la propiedad a la llamada de la función por lo que 'b' no podemos volver a usarla.
f(&b) // Si podemos usar 'b' a la vuelta de función ya que en este caso se presta.
Esto que hemos explicado muy rápido es muy interesante verlo con detenimiento al aprender Rust ya que como he comentado es una cosa que no me gusta acostumbrado a otros lenguajes pero como digo es cuestión de acostumbrarse a los prestamos y movimientos parciales que nos proporciona el lenguaje, pues el echo que una variable en Rust no sea simplemente un almacenamiento nos permite controlar mejor la memoria, no usamos recolectores de basura, pero sabe gracias a estas propiedades cuando puede liberar el recurso evitando así nuestra intervención, lo que permite que no eliminemos un recurso que todavía esta en uso o la perdida de memoria por no eliminar variables no usadas.
La verdad que poco de lo que quejarme, es cuestión de acostumbrarse con estos nuevos detalles, tanto es así que voy a estudiar algo más la parte gráfica (Slint parece interesante y de un tirón compile para Linux, Windows y un navegador) también el desarrollo en placas como Arduino que parece interesante el problema puede que este en las librerías para sensores a ver que tal y lo que me esta llamando la atención es poder realizar un programa Android totalmente en Rust no solo librería.
Ya iré contando estas nuevas experiencias.