Těch jazyků, co se snaží nahradit C++ je spousta (Nim, Zig, Hylo, Vale, Scala Native, Cone, ...).
Rust patří spíš mezi ty komplikovanější. A paradoxně řada velice oblíbených knihoven obsahuje unsafe kód, který nebyl formálně verifikován a teoreticky může způsobit problémy jako v C++ (někdy i prakticky - např. Unsoundness in owning_ref).
> Těch jazyků, co se snaží nahradit C++ je spousta (Nim, Zig, Hylo, Vale, Scala Native, Cone, ...).
Zrovna Scala Native (ostatní neznám) se sice kompiluje do nativního kódu, ale má GC. Takže mi přijde jako trochu jiná kategorie než
> A paradoxně řada velice oblíbených knihoven obsahuje unsafe kód, který nebyl formálně verifikován a teoreticky může způsobit problémy jako v C++
To platí i pro Python, Ruby, server-side JS a (od oka méně často) pro Javu. Akorát tam nejde o unsafe blok, ale o nativní kód v nějakém unsafe jazyce. Samozřejmě se bude lišit frekvence.
Ne, pointa je množství unsafe snížit na naprosto nutné minimum (i když programů které unsafe nemají vůbec je dost). Kontrolovat pár unsafe bloků na soundness je rozhodně snazší než kontrolovat kvůli tomu celý program včetně ne jedné, dvou, ale všech závislostí.
A opět, i Unsafe v Rustu je pořád bezpečnější než to samé v C++.
Nikdy nezapomenu na situaci, kdy se v C++ upstream jedné námi linkované knihovny rozhodl v nové verzi zahodit thread safety. Nikdo si toho nevšiml, kompilace na nové verzi debianu proběhla v pohodě, pak nám to v produkci začalo padat. Debugging byla opravdu radost. V Rustu se taková věc prostě nezkompiluje.
31. 10. 2023, 19:24 editováno autorem komentáře
Tak on v podstatě každý program používá nějaký unsafe kód. I hello world v libovolném jazyce. Někdy je unsafe skryt v kompilátoru, někdy ve standardní knihovně, často v obojím.
Tím nechci říct, že na tom nezáleží. Lze se snažit množství unsafe kódu redukovat, a ten, co zůstane, co nejlépe prověřit. A Rust oproti Cčku nabízí zajímavý posun.
Příklad je internování (třeba stringů nebo složitějších struktur).
Strukturu, která se používá vícekrát, nahradím indexem do tabulky. A tyto indexy chci třídit podle hodnot, na které odkazují.
> To už bych raději implementovala funkci jako "order_with" nebo podobně.
To bych klidně udělal. Jenže třeba BTreeMap, BTreeSet a BinaryHeap nedovolují takovou funkci použít. A musíte je znovu implmentovat. Viz crate copse
Něco takového? https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=770005eaed00475037695723393eec07
Dá se to ještě zlepšit dalším kontejnerem a hozením BTreeSet - u do inner + nějaké pocné funkce na tvorbu, ale… Nevidím problém?
Obskurní možná, ale měla 11 milionů stažení, což není málo. A kde je záruka, že to nedělají ostatní knihovny s unsafe kódem? Bohužel i změna v safe části může ovlivnit chování unsafe části programu. Takže teoreticky by se při každém commitu měl reviewovat celý projekt.
Hlavní prodejní heslo Rustu je bezpečnost. Přičemž řada oblíbených knihoven si nevystačí s bezpečnou podmnožinou jazyka.
> Jazyky, které nezískaly momentum a nemají rozumnou komunitu a podporu, ale nejde srovnávat s Rustem.
Záleží, co hraje roli pro konkrétní projekt. Třeba Nim i Zig se používají v produkci a mají k dispozici i dost C a C++ knihoven.
Osobně si nechávám přes cargo-geiger vypsat knihovny s unsafe a dvakrát si rozmýšlím jestli konkrétní knihovnu vůbec použít.
I tak se ale bavíme o knihovně s nějakými unsafe bloky, která pořád těží třeba z borrow-checkeru (ten unsafe nevyřadí) a které můžou být teoreticky unsound. A v případě problému je hned jasné kde hledat.
V porovnání s knihovnou v C/C++, kde může být unsound naprosto cokoliv a má podstatně větší prostor k chybě vývojáře.
> A v případě problému je hned jasné kde hledat.
Ne úplně. Příčinnou může být chyba v safe kódu. Například invariant, který by měl platit, ale neplatí.
Cituji Rustonomicon:
> This program is now unsound, Safe Rust can cause Undefined Behavior, and yet we only modified safe code. This is the fundamental problem of safety: it's non-local. The soundness of our unsafe operations necessarily depends on the state established by otherwise "safe" operations.