{"id":982,"date":"2024-03-28T23:14:46","date_gmt":"2024-03-28T22:14:46","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=982"},"modified":"2024-03-28T23:14:46","modified_gmt":"2024-03-28T22:14:46","slug":"mi-primera-incursion-en-rust","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2024\/03\/28\/mi-primera-incursion-en-rust\/","title":{"rendered":"Mi primera incursi\u00f3n en Rust"},"content":{"rendered":"\n<p>Es un lenguaje bastante joven ya que la primera versi\u00f3n 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\u00f3n Rust (AWS, Huawei, Google, Microsoft y Mozilla) y Google tambi\u00e9n lo acoge en Android.<\/p>\n\n\n\n<p>Las <strong>caracter\u00edsticas<\/strong> que se pretende cubrir con este nuevo lenguaje son:<\/p>\n\n\n\n<p><strong>\u00c9nfasis en la seguridad<\/strong>, el control de distribuci\u00f3n de la memoria y la <em><strong>concurrencia<\/strong><\/em>, no permite punteros nulos o colgantes, nos permite escribir un c\u00f3digo eficiente.<\/p>\n\n\n\n<p><strong>Eficacia en la memoria<\/strong>,  controla y elimina los elementos no utilizados sin recolector, lo que da una mejora de rendimiento, <\/p>\n\n\n\n<p><strong>Ayuda a prevenir errores de programaci\u00f3n l\u00f3gica<\/strong> al permitir tipos altamente expresivos, con una verificaci\u00f3n fuerte en tiempo de compilaci\u00f3n.<\/p>\n\n\n\n<p><strong>Manejo de errores<\/strong> 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)<br><strong>Manejo de enteros m\u00e1s seguro<\/strong> Las conversiones de tipo entero son conversiones expl\u00edcitas. La comprobaci\u00f3n de desbordamiento est\u00e1 activada de forma predeterminada.<\/p>\n\n\n\n<p>Aprender el lenguaje realizando ejemplos esta bien, pero lo mejor para sacar conclusiones sobre si estaba consolidando bien mi informaci\u00f3n y verificar si es interesante usar este lenguaje en mis proyectos es crear un peque\u00f1o proyecto.<\/p>\n\n\n\n<p>Este peque\u00f1o proyecto es peque\u00f1o pero me ayudo tambi\u00e9n a ver que tal est\u00e1bamos de librer\u00edas y como de complejo es pasar de un ejecutable Linux a Windows. As\u00ed que decid\u00ed generar un programa para env\u00edo masivo de mails personalizados, programa que en tiempo realice en python para un tema puntual, y surgi\u00f3 el proyecto  <em><strong>CaroMail<\/strong><\/em> (https:\/\/github.com\/pinguytaz\/CaroMail) que no contaremos en este POST pero si los <strong>PROS<\/strong> y <strong>CONTRAS<\/strong> que he encontrado.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>PROS<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Librerias<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Una de las primeras cosas que me gusto es que disponemos de<strong> muchas librer\u00edas<\/strong>, 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\u00e1pidos scripts en los que un Shell se complica. No solo dispone de muchas sino que se buscan f\u00e1cilmente en <a href=\"https:\/\/crates.io\">Craters.io<\/a>, en mi caso use librer\u00edas para leer fichero en formato .ini para la configuraci\u00f3n, .csv para la base de datos de los usuarios a los que enviar\u00eda mail, librer\u00edas para el envi\u00f3 de mail, expresiones regulares y una que me gusto mucho \u00ab<strong>indicatif<\/strong>\u00bb para la barra de progreso.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Compilaci\u00f3n cruzada<\/strong><\/li>\n<\/ul>\n\n\n\n<p>En relaci\u00f3n con las librer\u00edas me gusto la herramienta \u00ab<strong>cargo<\/strong>\u00bb que nos proporciona Rust para la compilaci\u00f3n, el compilador es \u00ab<em>rustc<\/em>\u00ab, y gesti\u00f3n de paquetes de forma sencilla y que ademas nos facilita de forma sencilla el poder realizar la compilaci\u00f3n cruzada de m\u00faltiples plataformas de forma sencilla. Tendremos un fichero <em><strong>Cargo.toml <\/strong><\/em>que define las dependencias, librer\u00edas utilizadas, de nuestro proyecto as\u00ed como nombre del proyecto etc. pero lo divertido es que casi no lo deberemos editar nosotros ya que <kbd><mark style=\"background-color:#8ed1fc\" class=\"has-inline-color has-luminous-vivid-orange-color\">cargo add &lt;libreria><\/mark><\/kbd> lo a\u00f1ade en el fichero para que al compilarla si es necesario se carguen y compilen o se actualicen, y cuando queramos quitar una librer\u00eda no utilizada bastara con poner <kbd><mark style=\"background-color:#8ed1fc\" class=\"has-inline-color has-luminous-vivid-orange-color\">cargo remove &lt;libreria><\/mark><\/kbd>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>&#8211;target x86_64-unknown-linux-gnu         Para un ejecutable ELF de Linux 64bits<\/li>\n\n\n\n<li>&#8211;target x86_64-pc-windows-gnu               Para un ejecutable Windows compilado con mingw-w64<\/li>\n<\/ol>\n\n\n\n<p>Debemos pensar que Rust no tiene su propio linker por lo que debemos tener uno instalado y utilizara el que corresponda seg\u00fan el target que deseemos usar, por eso en el target de windows deberemos instalar \u00abmingw-w64-gcc\u00bb si no lo tenemos instalado para que no nos de error de <strong><em>linker<\/em><\/strong><\/p>\n\n\n\n<p><kbd><mark style=\"background-color:#8ed1fc\" class=\"has-inline-color has-luminous-vivid-orange-color\">rustup target list<\/mark><\/kbd> nos permitir\u00e1 visualizar los target disponibles, compilaciones cruzadas,  y si est\u00e1n instalados o no. para instalarlo solo deberemos ejecuta <kbd><mark style=\"background-color:#8ed1fc\" class=\"has-inline-color has-luminous-vivid-orange-color\">rustup target add &lt;TARGET><\/mark><\/kbd>   y tambi\u00e9n borrarlos con remove. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CONTRAS<\/strong><\/h2>\n\n\n\n<p>Tenia que poner CONTRAS pero la verdad es cuesti\u00f3n de acostumbrarse.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Por defecto inmutables<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Las variables por defecto son inmutables, es decir no podemos cambiar su valor salvo que las definamos como mutables<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let a = 12;    \/\/ Inmutable no podemos cambiar su valor\nlet mut a =12;  \/\/ Ya podr\u00e1 cambiarse como las variables que conocemos.<\/code><\/pre>\n\n\n\n<p>Lo pongo en <strong>CONTRAS<\/strong> porque en un principio me li\u00f3, siempre las creaba inmutables :-),  pero la verdad es que esta bien en especial con el paso de par\u00e1metros por referencia a una funci\u00f3n. Ya que mejor que el compilador no diga que no podemos cambiar el valor, y corregimos el c\u00f3digo, a que de repente estemos cambiando el valor de una variable sin ser consciente.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OwnnerShip<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Una variable solo puede tener un solo propietario, es un contra pero es cuesti\u00f3n de acostumbrarse ya que esta propiedad da ventajas.<\/p>\n\n\n\n<p>El problema, pero como digo esto sera cuesti\u00f3n de acostumbrarse, es que lo t\u00edpico de asignar el valor de una variable a otra o simplemente pasar esta como par\u00e1metro hace que desaparezca, aunque esto se solventa f\u00e1cilmente con lo llamados prestamos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let a=12;\nlet b=a;   \/\/ Desde este momento no podemos usar 'a' ya quele hemos pasado la propiedad a 'b' no el valor.\nf(b);      \/\/ le pasamos la propiedad a la llamada de la funci\u00f3n por lo que 'b' no podemos volver a usarla.\nf(&amp;b)      \/\/ Si podemos usar 'b' a la vuelta de funci\u00f3n ya que en este caso se presta.<\/code><\/pre>\n\n\n\n<p>Esto que hemos explicado muy r\u00e1pido es muy interesante verlo con detenimiento al aprender <em>Rust<\/em> ya que como he comentado es una cosa que no me gusta acostumbrado a otros lenguajes pero como digo es cuesti\u00f3n de acostumbrarse a los prestamos y movimientos parciales que nos proporciona el lenguaje, pues el echo que una variable en <em>Rust<\/em> 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\u00ed nuestra intervenci\u00f3n, lo que permite que no eliminemos un recurso que todav\u00eda esta en uso o la perdida de memoria por no eliminar variables no usadas.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>La verdad que poco de lo que quejarme, es cuesti\u00f3n de acostumbrarse con estos nuevos detalles, tanto es as\u00ed que voy a estudiar algo m\u00e1s la parte gr\u00e1fica (Slint parece interesante y de un tir\u00f3n compile para Linux, Windows y un navegador) tambi\u00e9n el desarrollo en placas como Arduino que parece interesante el problema puede que este en las librer\u00edas para sensores a ver que tal y lo que me esta llamando la atenci\u00f3n es poder realizar un programa Android totalmente en Rust no solo librer\u00eda.<\/p>\n\n\n\n<p>Ya ir\u00e9 contando estas nuevas experiencias.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es un lenguaje bastante joven ya que la primera versi\u00f3n 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\u00f3n Rust (AWS, Huawei, Google, Microsoft y Mozilla) y Google tambi\u00e9n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":990,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[84,186,16],"tags":[187],"class_list":["post-982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lenguajes","category-rust","category-seguridad","tag-rust"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=982"}],"version-history":[{"count":5,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/982\/revisions"}],"predecessor-version":[{"id":987,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/982\/revisions\/987"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/990"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}