Antes de volcarnos de lleno al lenguaje en sí y “get our hands rusty”, mejor escribir una pequeña introducción sobre que es Rust y con que background me lanzo a aprender este lenguaje.
Por supuesto, que en mi caso, debo mi acercamiento a Rust al ecosistema montado sobre la red de Cosmos y su Tendermint. Según las encuestas anuales realizadas por Stackoverflow, Rust ha sido elegido como el lenguaje de progamación favorito, o más querido, por parte de sus usuarios durante los últimos cuatro años. Sin dudas, este lugar en la encuesta, no tiene estrecha relación con el mundo blockchain. Entonces, veamos de que trata Rust, para entender su gran aceptación general.
All about RUST
Se trata de un lenguaje compilado, de software libre y código abierto, multi-propósito, multi-paradigma y de bajo nivel, pero que permite aprovechar conceptos de alto nivel.
Ahora sí, desentrañemos esta oración tan ostentosa.
Lenguaje compilado
Cuando definimos a Rust como un lenguaje compilado, estamos diferenciándolo de un lenguaje interpretado. Los lenguajes compilados, como C o C++, utilizan un compilador, el cual traduce el código fuente, escrito por el programador. Esta traducción que realiza el compilador, a un lenguaje entendible por nuestras computadoras, produce lo que se conoce como archivo ejecutable. Por otro lado, los lenguajes interpretados, como Python o JavaScript, en lugar de un compilador, cuentan con un intérprete que traduce el código al momento de la ejecución del mismo, en desmero de cierta perfomance.
Precisamente, el compilador de Rust, es uno de sus grandes atributos. Se lo conoce por ser sumamente quisquilloso y “entrar en pánico” cuando cometemos un error al escribir nuestro código. Pero es esta “quisquillocidad” la que hace de Rust un lenguaje tan confiable ya que elimina o resalta errores en el código al momento de la compilación.
¿Qué nos evita esto? Encontrarnos con errores al tiempo de la ejecución del programa, como me ha sucedido con JavaScript. Además el compilador nos da una mano al facilitar una identificación extremadamente visual de estos errores e incluso nos brinda consejos para solucionarlos.
Software libre y código abierto
Esta característica, no me cabe la menor duda, la apreciaremos mucho quienes ya nos encontramos en el ecosistema crypto. El código de Rust es libre, cualquiera puede consultarlo y realizar sus propias contribuciones.
La comunidad de Rust es extremadamente activa y unida. Las contribuciones a mejoras del lenguaje por parte de sus usuarios resultan algo cotidiano. Un buen ejemplo, son sus librerías. Por medio de ellas encontraremos código previamente escrito y probado, que podremos incluir de manera simple mediante Cargo, el gestor de paquetes de Rust.
Ahora bien, Cargo, un gran aliado de cada “rustacean”, no solo se limita a ser un gestor de paquetes, es también un sistema de construcción y un gestor de dependencias.
Lenguaje multi-propósito
Ya en mi anterior artículo, dejé en claro que Rust es un lenguaje de programación sumamente versátil. Si bien nació con el fin de escribir sistemas operativos, y bien que continúa construyéndolos, su adaptabilidad le permitió extender sus horizontes.
Solo por mencionar algunos de sus usos actuales, podemos enumerar los siguientes:
-> Líneas de comandos
-> Aplicaciones web, compilando por medio de WebAssembly
-> Creación de servidores
-> Programación desde sistemas distribuidos a sistemas embebidos
-> Tecnología blockchain y contratos inteligentes
Lenguaje multi-paradigma
Otra muestra de su versatilidad, desde otro ángulo de análisis.
A diferencia de muchos lenguajes, creados específicamente bajo un paradigma de programación, Rust soporta varios de ellos.
A lo largo de este aprendizaje, si bien en la mayor cantidad de tiempo estaremos dentro del paradigma de la programación funcional, tanto por procedimientos e imperativa, también tocaremos conceptos de programación orientada a objetos.
Lenguaje de bajo nivel
Y arriesgándome a aburrirlos, desde temprano, con esta palabra, aquí una nueva evidencia de la flexibilidad de Rust.
Para entender a que nos referimos cuando decimos que Rust es un lenguaje de bajo nivel, debemos tener en cuenta la siguiente noción.
Los ordenadores únicamente entienden código binario, aquel lenguaje compuesto pura y exclusivamente por unos y ceros. De acuerdo a lo cercano que sea un lenguaje de programación al lenguaje comprendido por nuestras máquinas, se los denomina de bajo nivel o alto nivel.
Los lenguajes de bajo nivel, más cercanos al lenguaje binario, se crean teniendo en cuenta las características de los ordenadores, por lo tanto nos permiten controlar o determinar su funcionamiento. Un claro ejemplo, es el control sobre la memoria que ejercemos mediante Rust, tema del que hablaremos largo y tendido. En la vereda contraria, se posan los lenguajes de alto nivel, los cuales están, por definirlos de una manera, más alejados del lenguaje máquina y contiguos al lenguaje humano o del desarrollador. Con ellos, por ejemplo, no se controla la memoria al momento de la escritura.
La virtud de Rust es que, siendo un lenguaje de bajo nivel, permite servirse de funcionalidades de los lenguajes de alto nivel, como por ejemplo lo son las iteraciones e interfaces. También, quienes tengan experiencia, podrán notar que al escribir en Rust, la sensación de la escritura es de un lenguaje de alto nivel, lo que facilita mucho la tarea.
Sobre mi “background” y objetivos
Mi formación “profesional”, lejos está de tener una génesis en el mundo informático. Tiempo atrás deseaba iniciarme en este mundo, sin encontrar un ámbito al cual aplicarlo. El mundo blockchain, me dio un objetivo claro y un lugar en el cual aplicar estas habilidades.
Tras unos cuantos meses estudiando sobre el tema y comenzando a explicarlo, un día me cuestioné “estoy explicando en base a lo que otros interpretan… Necesito entender el código”.
Así intenté comenzar con Solidity por mi cuenta, pero fracasé al no disponer de nociones generales sobre la programación y sus aplicaciones.
Entonces pensé dar un paso atrás y aprender primero JavaScript. Lo intenté desde cero y una vez más fracasé. Por lo tanto, enfoqué mi camino en una “escalera” de distintos pasos. Para entender Solidity, primero JavaScript, pero para entender JS, ¿por qué no empezar por HTML y entender aquello que JS manipula?
De esta manera, terminé tomando el camino largo. Diferentes cursos de front-end me dieron, lo que considero, una buena base como para comprender, ¡¡gracias JS!!, conceptos generales de programación y sobre todo cómo y para qué aplicarlos.
Con esta experiencia y conocimientos, me zambullo de lleno al mundo de Rust. Y es por mi corta experiencia, que de encontrar errores u omisiones importantes en mis artículos, los invito a resaltármelos y entre todos, llegar a buen puerto.
Para cerrar esta extensa segunda entrega, solo queda perpetuar mi objetivo. Mas allá del primigenio fin de comprender el código detrás de las aplicaciones que consumo a diario, construir una de ellas sería lograrlo todo en este ámbito.
Pequeño disclaimer. En este artículo apenas resumo algunas de las características más importantes de Rust y detallo algunos conceptos básicos que aprendí en el camino.
Cada comparación que realizo, no es con el objetivo de ponderar los lenguajes, si no brindar ejemplos “palpables” o entendibles.
En el próximo artículo empezaré a sumergirme en el código.
“Let’s get our hands rusty”