Grafika és Rust

Elkezdtem tanulni a Rust nyelvet. Valójában NodeJS-t, mert kellhet még a munkámhoz. Még ingyen Udemy előfizetést is kaptam. Az első 20 perc után én ezt azonnal letöröltem, egyszerűen okádék az egész. Most itt vagyok, előttem a Rust, fogalmam sincs, hogy mire fogom használni a jövőben.

Nagyon gyors, a dokumentáció érthető, bár kicsit szűkös és hiányolom a kezdők számára alkotott tutorialokat. Átírtam egy 15 évvel ezelőtt készített C programot, de el is akadtam. Eredetileg OpenGL-t használtam, de a Rust felhozatal 3D téren nem használható. Vagy többszáz sort kellene írni egy egyszerű ablak nyitáshoz, vagy a lib "unmaintained" vagy nincs még kész teljesen. Most még csak 2D-ben jelenítem meg a forgó galaxist, minifb segítségével, de az is lehet, hogy egyszerűbb lesz kiszámolni a képernyő koordinátákat mini_math segítségével. Alapértelmezésként a fordító static link, amitől a lefordított program 20MB-ot foglal. Beállítás kérdése a dynamic linking, de úgy is 500kB, ami szerintem nagyon sok. (A C OpenGL változat 6kB volt, de strip ez alá is tudja vinni)

 

https://gitlab.com/sandorczettner/rust-universe

Eredeti: https://gitlab.com/sandorczettner/3D-Rotating-Universe

minifb: https://docs.rs/minifb/latest/minifb/

mini_math: https://docs.rs/mini-math/latest/mini_math/

Hozzászólások

Nincs Rust tapasztalatom, de amit tudok róla, az alapján tetszik.

> Alapértelmezésként a fordító static link, amitől a lefordított program 20MB-ot foglal. Beállítás kérdése a dynamic linking, de úgy is 500kB, ami szerintem nagyon sok.

Ha viszont Java-hoz hasonlítod, akkor ott kezdődik, hogy JRE kell hozzá, ami szintén pártíz mega minimum. Mivel a Rust rendesen lefordítja a kódot CPU natív binárisra (AFAIK, nagyon nem néztem még a Rust részleteit), ezért gyorsabban indul mint a Java alap JRE-vel.

C-hez hasonlítva sok, de valójában miféle problémát okoz, hogy 500kB egy bináris? Kivétel ha mikrokontrollerre programoznál.

A méretek ráadásul a kód mennyiségével utána már alig nőnek, sokkal inkább az a meghatározó kérdés, hogy mennyi libet használsz. Milyen valós alkalmazás az, ahol nem engedhetsz meg magadnak 30 megát a programnak?

 

A libek kérdése szintén hasonló a Java-hoz: ott is nagyon sokára lett rendes OpenGL lib. Egyébként meglepően könnyű ilyen libet csinálni (megint Java-C illesztésből indulok ki, mert a Rustot nem ismerem, de tuti, hogy nem lehet sokkal bonyolultabb) akár úgy, hogy csak azokat a műveleteket valósítod meg, ami kell neked.

Úgyhogy ha csak ennyi a problémád, akkor próbáld meg ignorálni, és kitartással haladj tovább!

Szerintem ez a statikus linkeles dolog a Go, meg a dockerben futo 1db binaris-os microservice-ek miatt lett divat.

Eddig nem astam bele magam Rust-ba (pedig jo lenne), de gondolom lehet azert itt is strippelni a binarist. Kulonben nemcsak mikrokontrollernel, hanem barmi nagyobb beagyazott cuccnal is (openwrt es tarsai) gond lehet.

Régóta vágyok én, az androidok mezonkincsére már!

Grafikus dolgok eddig elkerülték az érdeklődésemet.
A mainstream irányokból (command line, webassembly, networking, embedded) eddig a webassembly (WASM és WASI) egy-egy próbát leszámítva elkerülte az érdeklődésemet. A maradék 3 témára viszont gyakran használom.

Méret: vegyünk egy alap C programot.

// teszt.c
#include <stdio.h>

int main() {
    printf("Hello\n");
    return 0;
}

$ gcc -O2 -Wall -s teszt.c -o teszt --static
$ ls -lh teszt
.... 801 kB

De miért dobtam be a --static módot?

Rust kódot is lehetne dynamic módon fordítani, de ennek feltétele, hogy a /usr/lib/ mappában ott legyenek a dinamikusan betöltődő libek.
Egyelőre a default a static a Rust modulokat tekintve. Nézzük konkrétabban:

Egy default "$ cargo new teszt2" hello world lefordítva és strip-elve x86_64 architektúrán:

$ ls -lh teszt2
.... 303 kB

$ RUSTFLAGS='-C prefer-dynamic' cargo build --release
$ ls -lh tesz2
.... 15 kB

Sajnos nálam sincs feltelepítve a /usr/lib/-be a Rust runtime, így

$ ./teszt
./teszt: error while loading shared libraries: libstd-a46a068050a12a4b.so: cannot open shared object file: No such file or directory

Egyelőre jobb a békesség, marad a statikus fordítás és a végén a kész binárisra egy strip. Ezt a friss 1.59-es fordítóban már be is építheted a Cargo.toml-be:

[profile.release]
strip = "symbols"