( hory | 2020. 09. 02., sze – 01:03 )

Szerkesztve: 2020. 09. 02., sze – 01:18

Rust hatalmas hatulutoje a meredek learning curve. Plane a C-hez kepest. Ugye 2 hetnyi C tanulas utan mar akar a kernel kodot is olvashatja az ember. 2 hetnyi rust utan mar erted, miert van annyi kerdes a stackoverflow-n. ;)

Ami iszonyatosan megneheziti a fejlesztest, az az, hogy statikus typing van ugyan, de a fordito implicit koveti a tipusokat, vagyis nem kell megadni kezzel a tipust, okos compiler kitalalja neked (tm). Amit aztan a lib-keszitok ki is hasznalnak, es olyanra epitik meg a lib-eket, hogy masszivan fuggnek attol, hogy egy adott modon csurd-csavard a kodot. Ha nem ugy teszed, szetesik az egesz, a fordito meg valami teljesen zagyva hibauzenetet ad (siman fel kepernyonyi tipushiba terminalon), amit szinte lehetetlen lenyomozni. Foleg a nagyon magas szintu lib-eknel vannak ezek, mint pl. hyper rest lookup megspekelve json deser-rel. Gyakorlatilag jopar nap, mire az ember kiismer egy library-t es tenyleg (alapszinten) el tudja hasznalni. Viszonyitaskeppen, es java/kotlin-ban kb. egy-ket ora.

Hasonlo gyilkos az implicit conversion. Elmeletileg a fordito kitalalja, hogy hogyan tudja az egyik tipust a masikra konvertalni, de pl. csak akkor, ha a konverzio fuggveny importalva van (!!!). Es nem mindig megy az sem. Gyakran sokaig tart, mire rajon az ember, hogy a 'foobar("10.0.0.1".parse())' miert mukodik, maskor meg miert nem.

Szinten gond, hogy nincs normalis fejlesztoi kornyezet. Persze, rust language server es tsai, de az egy modern platform kenyelmehez szokott dev-nek durvan fapados, kb. 20 evet vissza az idoben. Ami mukodott, az a clion volt, annak is csak a legujabb verzioi, de az meg penzes (cegunk vett par licenszet).

A borrow checker szinten erdekes dolgokat tud eredmenyezni, es amikor egy sima builder pattern-t csinalni egy napig tart eloszor, az ember a hajat tudja tepni. Szerencsere mostanra van egy par jo guide, meg best practice, hogy mit hogyan erdemes. De spec. a borrow checker azt kell mondjam, nagyon jo - mar tobbszor is belefutottam, hogy "minek ez a .clone() ide, lekapom, jo lesz", aztan ahogy probalja az ember vegigvinni az egesz kodon, derul ki, hogy azert kellett a clone(), mert minden thread-nek kell egy peldany. Es hasonlok. Ha nincs borrow checker, maris olyan hibat vetek, amit nem lett volna konnyu levadaszni.

Meg egy hatranya van a rust-nak: iszonyu gyorsan fejlodik, valtozik. Ami egy eve meg best practice volt, mara mar elavult kod. OK, pont az utobbi evben jott be az async/await, meg lett okosabb a borrow checker meg az implicit tipus-eldontes.

Nekem egyebkent az a benyomasom, hogy sok a hype korulotte, es sokan nem probaltak meg ki elesben. Szerintem a hype-olok fele feladna egy het szenvedes utan. :) Azert sokmindent lehetett volna benne egyszerubben, es talan C-szerubben csinalni. A legnagyobb fajdalmam az exception teljes hianya, ami miatt mindent egy Result<> -ba kell gyurni es mappelgetni a hibakat mindenhol. Iszonyu macera, teljesen feleslegesen. De ezen kivul sok feature, amit megszokott az ember egy modern nyelvtol, hianyzik.

Viszont, nemi tokolodessel lehet egy olyan statikus binarist forditani, amit a docker egy scratch containerben el tud futtatni.

 

(NB, mi a cegnel az idonk 20%-aban egy modern FTP serveren dolgozunk, GCS backenddel)