Rust jsem zkusil, to, co slibuje, skutečně splňuje. Ale rozhodně nemám dojem, že by to byl jazyk, který má vše, co má C nebo C++, ale bezpečněji.
Největší mou kritikou je to, že není modulární na binární úrovni, jinak řečeno, neuděláte si sdílené knihovny jako DLL/so soubory. Ano, lze to provést, ale kompilátor vůbec nezaručuje binární kompatibilitu mezi verzemi, takže vytvořit takovou DLL je vlastně nebezpečné, protože při takovém slinkování za běhu se může stát cokoli.
Na argument, kdo dnes potřebuje DLL, řeknu, že si nedokážu poředstavit třeba linuxovou distribuci, že kde by každá aplikace byla zkompilována staticky. To je návrat o desítky let k prvotním Unixům. Ta instalace by se pěkně nafoukla.
Ale i kdybyste argumentovali, že jednou budeme mít exabytové disky, pořád je nepříjemné, že nemůžete udělat modulární software, kam přidáte něco později, aniž byste museli vše zkompilovat znova.
Stejnou kritiku mám ostatně k golang, kde je problém obdobný.
Takže Rust i golang jsou jazyky vhodné buď na nemodulární všeobecné nebo úzce customizované aplikace, kde zákazníkovi dáte binárky, kde bude jen to, co kód dělá a nic víc dodatečně.
Co se týče samotných jazykových vlastností Rustu, už to bylo mnohokrát zmíněno, není to jazyk, kde by se psaly pohodlně struktury se složitými odkazy mezi sebou typu graf. Ano lze to poskládat ze smart pointerů, ale psát v tom je pěkný a nepřehledný code bloat. Takže ten graf typicky implementují pomocí typu vector (nebo analogicky strukturovaný kontainer) a pointery jsou nahrazeny indexy do kontainteru. A náhle se nám vracejí problémy s pointery, i když v odlehčené verzi ... ano, nelze ukázat mimo daný kontainer, ale lze mít různé analogické situace typu užití už uvolněného prvku v kontaineru, atd.
Dále je borrow checker přísnější než se hodí, protože pokud nedokáže prokázat v dané situaci korektnost kódu, přikloní se k variantě, kdy vám nedovolí , co si umím´dokázat. Asi je to tak lepší řešení, ale zdržuje to a ohýbáte svůj kod tak, abyste dodrželi omezení Rustu, ne logiku aplikace.
Typický problém je, že potřebujete předat někam dvě reference na dva prvky ze stejného vectoru, ale to bohužel nejde, protože borrow prvku implikuje borrow kontaineru a ten nelze provést (lze jen u vícenásobného čtení).
Takže zapoměňte, že byste si napsali funkci, která by třeba kopírovala něco mezi dvěma prvky - strukturami, které jsou ve stejném vectoru.
Psát GUI aplikaci je taky pěkně na divoko ...
Nemám tedy dojem, že by Rust byl jasnou lepší náhradou C-C++.
Všechny use case nepokrývá, a typická rustová aplikace je jakýsi backendový konzolový monolit ...
30. 12. 2024, 23:03 editováno autorem komentáře
Struktury se složitými odkazy se dnes (často) nedělají pomocí pointerů ani v C++. Protože cache locality a výkon.
Rust pointery používat umí, unsafe totiž jen znamená, že vývojář explicitně deklaroval, že tento kód je "bezpečný", i když to Rust neumí dokázat.
Stejně tak Rust umí přenositelné dynamické knihovny. Stačí cargo nakonfigurovat na výstup typu cdylib.
Samozřejmě, že jsou situace, kdy se člověk zasekne na přísném borrow checkeru. Ale zase tak často se to nestává. Na druhou stranu Rust hlídá Send+Sync za uživatele, takže udělat race condition ve vícevláknovém kódu je mnohem mnohem těžší.
A v C++ jsou zase situace, kdy člověk omylem napíše nějakou chybnou konstrukci a překladač ji neodchytí (tady v té diskuzi je zrovna jedna taková ukázána). A celosvětově jsou paměťové chyby největším zdrojem CVE a pádů aplikací.
Takže ano, Rust nedovolí všechno co C++ a C++ nedovolí všechno co ASM. Kdysi jsme dělali samomodifikující se programy.. dnes už to není obvyklé (a vzhledem k NX flagům ani možné).
Ja teda neviem odkiaľ čerpáte, ale tieto nástroje sa normálne používajú aj pre C++ a nie je to nijako tajné, takže sa o tom aj úplne normálne publikuje. Navyše väčšina ich je zameraných na nízkoúrovňové detaily, pracujú s primitívami operačného systému, takže nie sú vôbec závislé na jazyku. Okrem toho, už nejaký čas platí, že ak je potrebné taký nástroj vytvoriť, pokiaľ sa to týka napríklad statickej analýzy kódu a vynucovania pravidiel alebo automatickej modernizácie kódu z hľadiska rôznych čiastkových aspektov, tak existuje veľmi schodný spôsob, až možno komfortný spôsob, s použitím všetkého, čo prinesol clang, taký nástroj vytvoriť.
Ano, ten budget existuje. Jsou to ti nově příchozí, které by to v C++ nebavilo a v C už vůbec ne (C++ v kernelu ani není podporováno). Příkladem nového Rust kódu v kernelu je ovladač GPU v Apple Silicon, což je věc, která díky Rustu zabránila problémům s multithreadingem, kterého je v GPU driveru hodně, a jako driver by vám chyba shodila celý kernel, ne jen jednu aplikaci.
Problém je v tom, že si mnoho lidí myslí, že když máš C++ + spoustu nástrojů, kteří najdou spoustu chyb, že to je ekvivalentní tomu, když Rust nedovolí chyby.
Ve skutečnosti to co popisuješ, je zcela výstižné a odpovídá to céčkovskému uvažování.. V C++ je bezpečnost volitelná a velice pracná a neobvyklá. V Rustu je nebezbečnost volitelná a pracná a neobvyklá.
Třeba teďkon, když jsem si hrál si tím dynamickým načítáním knihoven v Rustu a používal tam unsafe() tak jsem měl takový svíravý pocit, a hlavou mi běželo, jak zabránit tomu, aby to v té knihovně spadlo, a zda to nejde nějak odchytit, aby to nesestřelilo i mou aplikaci, a...
Tento pocit C++ nemají. Protože je to pro ně standard. Vždycky může něco chcípnout. Jsou s tím smíření. A jediné co proti tomu mohou dělat (nutno poznamenat, že bez pocitu jistoty) je být dobří.
DLLka beru, sice jsem zkusil uvažovat, nakolik je to validní argument a nakolik opravdu potřebuji dynamické nahrávání modulů, ale nechť, uznávám pádnost.
"Co se týče samotných jazykových vlastností Rustu" - bylo tu už mnohokrát demonstrováno, že uživatelé nepochopili co chtějí. Rust aktivně brání konstrukcím, které by si stejně nechtěl používat, pokud by si byl dostatečně soudný. Zastánci C++ chtějí prodej heroinu, LSD, a kokainu na volném trhu s poznámkou v příbalovém letáku. Zastánci Rustu chtějí použití těchto drog jen licencovanými, proškolenými a registrovanými lékaři.
"Psát GUI aplikaci je taky pěkně na divoko ..." -- má zkušenost je opačná.