Entradas

Mostrando las entradas etiquetadas como rust

Rust, mutabilidad y recursión

Imagen
Se visualiza mejor (aquí)   con código completo Como ya he comentado en alguna ocasión, la mutabilidad no es vírica y en Rust se puede diseñar un sistema que evite la copia de forma explícita combinándola con el ownership . Este es un ejemplo de una función que recibe la propiedad de status y lo declara como mutable. Luego utilzamos un bucle for pub ( crate ) fn parse_literal < ' a >( mut status: Status< ' a >, literal: & ' a Literal< ' a >) -> Result < ' a > { for byte in literal. 0 . bytes () { status = parse_byte (status, byte) . map_err ( | st | Error :: from_status ( & st, & format! ( "parsing literal {}" , literal. 0 )))?; } Ok ((status, literal. 0 . to_string ())) }   No es una mala solución. Quizá debería haber quitado los lifetimes para dejar el ejemplo más sencillo. No es relevante para lo que estoy planteando aquí. Tampoco molesta ni es malo familiarizar...

No dejes que la inmutabilidad te amargue un buen rendimiento

link La inmutabilidad está de moda. Esto da un nuevo vigor a los lenguajes funcionales. Y en muchos lenguajes no funcionales, cada vez se valora más la inmutabilidad. El código es más legible. Esto es importante porque el código se empieza una vez, pero se mantiene durante años. Los problemas son más fáciles de razonar. Es más difícil tener inconsistencias, evitas race-conditions en programación concurrente y esto supone la puerta al paralelismo. Además, es más fácil diseñar correctamente con esta restricción. La inmutabilidad conlleva copias, en ocasiones muchas. Pero los compiladores son listos, muy listos, y son capaces de remplazar una copia por cambio insitu (mutación) sin que el diseño y tu código expresen ni padezcan de mutaciones. Esto es fantástico, ¡¡¡Qué más se puede pedir!!! Pues quizá sí, si el rendimiento te preocupa mucho, quizá te gustaría representar en el diseño que no quieres que se copie. Está bien que el compilador en muchos casos evite la cop...

Optimizaciones Rust.

Rust utiliza LLVM y toda su infraestructura de opctimizaciones. A persar de lo dicho durante años con los compiladores  jit  la realidad ha  demostrado que las estrategias más efectivas para conseguir el mejor rendimiento,  son las optimizaciones en tiempo de compilación apoyadas en tipado estático. En este sentido, Rust es fuerte. Pero tanto en Rust como en C++, hay cuestiones que se dejan al compilador. Por ejemplo el  RVO , hasta hace poco, era una opción del compilador. En otros veteranos lenguajes, como Pascal, por ejemplo, es algo explícito que  viene de serie. Y por ser explícito es sencillo y fácil de entender. En C++, saber cuándo y cómo el compilador hace su magia con el  RVO  u otras  optimizaciones complejas, dificulta el poder afinar al máximo en rendimiento. Otro ejemplo let mut a : [ i32 ; 4 ]; Podemos crear una variable sin darle un valor. Podemos dárselo más tarde, pero  en el caso del array, Rust ...

Un poquito de seguridad, por favor

Nos encontramos en un periodo de guerra civil. Las naves espaciales rebeldes atacando desde una base oculta, han logrado su primera victoria contra el malvado Imperio Galáctico. Durante la batalla, los espías rebeldes han conseguido apoderarse de los planos secretos del arma total y definitiva del Imperio: la web, una especificación enrevesada con potencial suficiente para destruir todos los ordenadores de la galaxia. Perseguida por los siniestros agentes del Imperio, la princesa Leia vuela hacia su patria a bordo de su nave espacial llevando consigo los planos robados que podrán salvar los ordenadores y devolver la libertad a internet… Contexto Los navegadores, renderizadores y máquinas virtuales, se han convertido en grandes monstruos difíciles de controlar. Todas las tecnologías de navegadores web están en C++ El paso del tiempo y la complejidad de la especificación, han hecho que alcancen tamaños poco manejables. A esto hay que añadirle que C++, tiene implícito "unde...