Aprendiendo Rust - Kiwi Towers

Lecherito

Pues no me he puesto con el scripting, me he puesto a hacer una manera mas sencilla de crear los ejemplos (a lo json), y asi poder incluso cambiar los tests para que incluyan esos recursos. Esto lo hare mas adelante (si es que lo hago), pero por ahora todo es top.

Me he decidido por la libreria ron para estos ficheros en vez de Json ya que eso deja hacer unas cosas que Json no te deja, ademas de que parece mucho mas claro.

He creado un nuevo bevy plugin que sustituye al SimpleMapPlugin que se llama RonMapLoaderPlugin que carga un fichero (por ahora estatico) que se llama resources/simple.ron y el contenido es el siguiente:

Game(
    lives: 10,
    starting_coins: {
        "Gold": 10,
        "Silver": 20,
    },
    towers: [],
    waves: [
        Wave(
            timer: 0.5,
            mobs: [
                Mob(
                    hp: 1000,
                    ms: Speed(100),
                    attack: None,
                ),
            ],
        ),
    ],
)

Y el loader:

impl Plugin for RonMapLoaderPlugin {
    fn build(&self, app: &mut AppBuilder) {
        let str = include_str!("../../resources/simple.ron");
        let game: Game = from_str(str).expect("Unable to load the game file.");
        let state = GameState::from(&game);

        app.add_resource(state);
        app.add_resource(game);

        app.add_startup_system(add_tower.system());
    }
}

Todo lo demas es exactamente lo mismo. Ahora tengo un ficherito que puedo actualizar y que mas adelante servira para cargar los mapas (el editor los serializara y el juego los deserializara a este mismo formato).

Lecherito

Pues he estado mirando algunas posibilidades y por ahora me he decidido por Rune, un lenguaje bastante parecido a rust (por lo que todo seria bastante familiar). Aunque no voy a dejar de lado la posibilidad de usar algun crate para Lua del tipo rlua asi que me hare una api mas o menos generica para registrar funciones y primero ira Rune pero luego hay mucha gente comoda con Lua (aunque para mi sea una basura).

Asi que ahora a cortar jamoncito para cenar y despues de cenar le doy a saco paco.

Lecherito

He estado experimentando un poco con Rune y no tiene mala pinta, es facil registrar las funciones que se quieran y el input/output de las funciones tambien parece ser bastante sencillo. Este es el ejemplo que tengo ahora mismo con 0.7

    fn mytest() {
        let hello_world = r#"pub fn main(a) {
    println("Hello World");
    return name(a);
}"#;
        let mut context = Context::with_default_modules().unwrap();
        let mut module = Module::default();
        module.function(&["name"], |a: i32| a + 1);
        context.install(&module);

        let mut sources = Sources::default();
        sources.insert(Source::new("test", hello_world));

        let mut errors = Errors::new();

        let unit = rune::load_sources(
            &context,
            &Options::default(),
            &mut sources,
            &mut errors,
            &mut Warnings::disabled(),
        )
        .unwrap();

        let vm = runestick::Vm::new(Arc::new(context), Arc::new(unit));
        let result = vm.execute(&["main"], (1,)).unwrap().complete().unwrap();
        println!("{:?}", result);
    }

Es algo super random pero queria ver como funciona, las funciones que habra (si es que estan definidas, puede que no esten definidas) seran relacionadas con eventos, cosas del tipo: on_turret_fire, on_mob_death o algo por el estilo, he de escribir un poco mas sobre ello para pensar que me gustaria tener si yo fuera el editor del un mapa.

Empezar con algo super sencillo y ya vere que depara el futuro pero me gusta este lenguaje y creo que puede ser muy sencillo eso de tener varios lenguajes, no creo que haya demasiadas funciones en la libreria estandar de TD que esten disponibles dentros de los dos lenguajes suponiendo que ya traen una por defecto.

Lecherito

Pues no esta siendo tan facil dado que no se si he encontrado un bug con la libreria pero no puedo pasar tipos definidos en Rust como argumentos ni con su propio derive para ello. Asi que estoy intentando lidiar con ello pero he conseguido hacer un "ScriptingEngine" que sera inicializado con cada Component que tenga scripting y tambien que funcione cuando mato a un mob, que se llame al metodo definido en el script. Cuando lo tenga todo mas limpito y mejor hecho ya pondre el codigo por aqui, pero vamos, sigo trabajando en ello poco a poco que estos dias es de hacer pizza y comer con la familia.

Edit: Justo cuando escribo esto veo por que era el problema xDDD, ahora pongo el siguiente post con mas info

1 año después
Zerokkk

Veo que hay cero actividad respecto a este lenguaje aquí. ¿Cuántos le habéis pegado un tiento a Rust en estos años? Yo he empezado recientemente, y por ahora mi impresión es muy buena, aunque obviamente no todo es color de rosas.

Quiero decir, si se programa bien, siguiendo las guidelines y respetando el borrow checker, los programas funcionan. El compilador se queja por todo, pero casi te garantiza que tu código funcione, a menos que hayas sido un gañán y hayas cometido errores de diseño. Lo malo, que se tarda bastante y la productividad es mucho más baja que con lenguajes de programación de alto nivel. La otra queja que se podría dar es que los tiempos de compilación tienden a ser muy altos para programas algo grandes, pero yo por lo menos no veo mal hace ese tradeoff entre tiempos de compilación, y gran seguridad y velocidad.

Mi conclusión es que si este lenguaje de verdad termina de despegar en el ámbito laboral (hay muy pocos curros en Rust), podría significar todo un cambio de paradigma en programación, no sólo de sistemas, sino en más ámbitos. Recordemos que, por ejemplo, Rust es probablemente el lenguaje más adaptado a WASM, y una mayor maduración de sus herramientas, podría implicar un serio cambio en la optimización de aplicaciones web, e incluso quizá de apps híbridas.

Supongo que el futuro hablará, pero yo por lo menos estoy gratamente sorprendido con Rust.

¿Qué opinión os merece a los demás?

2 respuestas
Ranthas

#65 Yo llevo trasteando con Rust varias semanas. Para alguien con bagaje en lenguajes como C++, Rust no aporta demasiado. No es más rápido que C++ y al compilar es lento y genera ejecutables enormes. En el ámbito de programación de sistemas y software embebido, no creo que sea una revolución. En la informática de gestión, hay varias librerías y frameworks, pero muy pocos son production-ready.

No obstante, tiene un punto fuerte muy grande, y es que si alguien quiere comenzar en la programación de sistemas, ya no tiene que pasar por el arco de C/C++ y puede ir directamente a Rust. Es mucho más fácil de aprender, está pensado para ser muchísimo menos propenso a errores que C++ y el resultado obtenido es muy muy similar. Te ahorras engorros como la gestión de memoria, herencia múltiple y demás. Sin contar con las múltiples herramientas que incluye el lenguaje que son una delicia, hablo de cosas como Cargo y pattern matching.

En mi opinión, es demasiado pronto para dar un veredicto lapidatorio, pero mojándome un poco, diría que es un lenguaje que va a seguir evolucionando y acabará asentándose en distintas áreas de la programación. Lamentablemente, respecto a WASM, creo que es una vía muerta, y no porque WASM sea basura, sino por el perfil de "programador web" actual y su tendencia, que es totalmente incompatible con WASM.

1 1 respuesta
Zerokkk

#66

#66Ranthas:

No es más rápido que C++ y al compilar es lento y genera ejecutables enormes

Lo sé, pero la verdad que no creo que sea un problema. Ya no tenemos que ser excesivamente cuidadosos en materia de disco o memoria, exceptuando casos límite de software embedido donde haya unas limitaciones gigantes.

#66Ranthas:

Lamentablemente, respecto a WASM, creo que es una vía muerta, y no porque WASM sea basura, sino por el perfil de "programador web" actual y su tendencia, que es totalmente incompatible con WASM.

Entiendo por qué lo dices, pero no me extrañaría que WASM pase a ser dominio general de los programadores web en un futuro. La cosa es que no es "necesario" porque con los equipos actuales no es difícil hacer una app web que funcione "bien" (y cada vez menos), pero para tareas computacionalmente intensivas que no se deriven al backend, me da que WASM se volverá un must. Que se termine adoptando bien o no... es otra cosa. Al igual que Rust, que vete a saber si gozará de más market share en un futuro.

Yo con C trasteé un poco pero no me metí demasiado, y siempre he escuchado mucho su tendencia a tener problemas de memoria, lo que precisamente Rust promete resolver. En tu caso, ¿sigues prefiriendo C para programación de sistemas, o crees que sí te vale la pena el cambio a Rust por dichas comodidades y características? Hasta ahora, me ha dado mucho la sensación de que la peña escéptica lo es por ya tener mucha comodidad con C, y darle un status casi mitológico (lo cual hasta cierto punto es comprensible), pero yo por lo menos veo bastante positivo que los estándares en programación evolucionen, y nuevas tecnologías desplacen a las viejas, siempre y cuando resulten efectivas resolviendo los problemas previos.

1 respuesta
Ranthas

#67 Por eso digo que es muy pronto para sentar cátedra. Por ahora sólo podemos especular, pero yo soy más pesimista en lo que respecta a WASM, aunque lo veo un tema interesante; en un hilo nuevo creo que podríamos conseguir un intercambio de ideas muy enriquecedor.

Respecto a tu pregunta sobre C, hace mil años (casi literalmente) que no hago nada de programación de sistemas. Mi experiencia con C++ es en software de gestión extremadamente antiguo. Si es cierto que C++ era la herramienta perfecta para este tipo de software en 1990, pero hoy en día sólo da quebraderos de cabeza: no hay mano de obra, los makefiles son más largos que la Verdad Imperial y nos enfrentamos a código que hoy en día es ridículamente absurdo; te hablo de cosas como de drivers in-house para consumir bases de datos como Adabas (sí, bases de datos JERÁRQUICAS) e Informix, y un larguísimo etc.

No obstante, sí que creo que a la larga Rust podrá desplazar a C, y creo que lo hará por lo que comentaba anteriormente: la gente que empieza de cero, empieza en Rust y no en C. Ya hay muy pocos desarrolladores de C/C++, y en cuanto mi generación vaya desapareciendo, cada vez serán menos. Rust "soluciona" el problema de la gestión de memoria con el sistema de ownership de una manera que quizás no sea la mejor en términos absolutos, pero que si que es sobresaliente en cuanto a facilitar el aprendizaje y la velocidad de desarrollo.

También, si tenemos en cuenta que la gran mayoría de problemas del software hecho en C y C++ vienen de la gestión de memoria, parece lógico pensar que Rust sea el sucesor adecuado, a pesar de que el propio lenguaje te permite cometer las mismas cagadas que C/C++, aunque claro, si te pasa eso es que lo andas buscando.

Por último, no deberíamos perder de vista también a Carbon (https://github.com/carbon-language/carbon-lang), que parece ser otro candidato.

1
1 mes después
desu
#65Zerokkk:

¿Cuántos le habéis pegado un tiento a Rust en estos años? Yo he empezado recientemente, y por ahora mi impresión es muy buena, aunque obviamente no todo es color de rosas.

Yo lo he usado para CLIs simples y serverless en AWS.

En mi experiencia y conclusion, cuando la gente programa en cosas como python, java, incluso go, hacemos tantas "malas practicas" a bajo nivel que ni lo sabemos. Pero estas malas practicas no tienen mucha importancia cuando escribes rust y las usas para cosas de backend tipicas. Estas cosas importan si haces bajo nivel...

Si por ejemplo tienes algun problema de ownership simplemente clonas y a tomar por culo... Fin del problema. Tener un Map<String, T> por ejemplo, y acceder desde varios sitios. En plan cache simple en un server. Es un patron muy tipico si te quieres guardar el id que es un string, pues vas a tener que clonar la string... XD Son cosas obvias que en el dia a dia con python no piensas. El problema esta en que la gente no sabe que esta haciendo el lenguaje (python, java, go...) a bajo nivel para replicarlo en rust XD

Asique Rust en conclusion y en prod es muy comodo, es facil programar con el y muy facil de leer por todos... Si y solo si, sabes la manera facil no optima de resolver los problemas. Escribiendo codigo de mierda como digo, me va como un tiro todo. El problema es que la gente no sabe programar, y cuando pilla rust, quiere aprender rust "embedded" o super optimizado... No hace falta.

Los puntos tipicos negativos de rust, el async por ejemplo, a mi no me han afectado aunque no me gusta el diseño... Y el mayor punto negativo en adopcion es si que para hacer cosas mas grandes requiere un commit del equipo. Si elijes rust para backend todo deberias hacerlo con rust para ir bien... En un entorno enterprise de fperos donde la gente hace python,node,java,go(si tiene que ir rapido)... Nada. Si tu equipo/empresa hace rust, entonces full yolo a rust y scripting/python como mucho. Es que quizas no haria ni rust+go en backend... Xq el esfuerzo de rust a la larga te acaba compensando mantener 2 stacks.