Code:
A da li zapravo C blista, jer te ne ograničava, nego vrši čak i custom alokaciju, po kakvim god hoćeš algoritmima, dok ti Rust ne da napraviš kružno pokazivanje?
Rust "blista" u kontekstu niske cene upravljanja resursima bez kompromisa u sigurnosti. Cena se plaća, samo na drugom mestu - između tastature i stolice :-).
Rust ne koristi reference counting, osim ako ne koristiš
https://doc.rust-lang.org/std/rc/struct.Rc.html ili slično, već postoji sistem "pravila" koje moraš da poštuješ. Pojednostavljeno, to su:
- Svaki objekat može biti pozajmljen samo jednom istovremeno za pisanje.
- Svaki objekat može biti pozajmljen neograničeno mnogo puta za čitanje.
- Nijedan objekat ne može biti istovremeno pozajmljen za pisanje i čitanje istovremeno.
To naravno spotiče programera da napiše kod kakav želi, i ograničava ga na "sigurnu" teritoriju. Na primer, ovo ne da ne dozvoljava
da napraviš dvostruko ulančanu listu na uobičajeni način (
https://rcoh.me/posts/rust-linked-list-basically-impossible/ - ako imaš A - B - C dvostruko ulančanu listu, čvorovi A i C moraju da budu vlasnici čvora B, a ne mogu istovremeno), nego ne dozvoljava ni jednostavne paradigme za koje ti kao programer znaš, ali kompajler ne može da dokaže da su ispravne:
Code:
if let Some(val) = map.get_mut(&id) { // Pozajmljivanje map za pisanje
/* ... */
} else {
map.insert(id, new_val); // map je već pozajmljena za pisanje na početku if statementa, ne možemo ovde da pišemo.
}
Rust tim radi na ovome, ovaj problem je već rešen, i videćemo šta će biti u narednih par godina:
https://github.com/rust-lang/rfcs/blob/master/text/2094-nll.md,
https://github.com/rust-lang/rust/issues/43234 (mislim da su već daleko odmakli od situacije od pre par godina kada sam poslednji put pisao Rust). Sličnih primera sigurno ima, ali ja ne mogu da ih se setim, jer sam upravo najviše problema imao sa ovim. Inače, non-lexical lifetime upravo rešava problem koji si naveo:
Code:
{
String str = new String("Pera");
System.Console.WriteLine(str); // nakon ovoga, str je uništen bez obzira na to šta sledi, ako ništa što sledi ne koristi str.
}
Citat:
Na kraju mi se najviše sviđa C - daje ti odrešene ruke da implementiraš šta hoćeš kako hoćeš. Može sve to i C++ uz nuđenje nekih dodatnih automatizacija, što je takođe dosta dobro.
Da, to i mene privlači ka C++-u, ali... "Kako hoćeš" ima velikih problema kada radiš u timu od nekoliko stotina ljudi na jednom projektu. Nijedna osoba nema pregled celokupnog projekta, niti predstavu o tome šta si želeo. Na primer, ukoliko pozivaš neku funkciju foo i proslediš svoj string, ne možeš znati da li će foo uzeti referencu na string, tj. možda znaš sada, ali ne znaš za par dana, kada neko izmeni foo(), zbog nečega potpuno drugog, ne osvrćući se na to što si napisao. Ili kada ti uradiš isto to, nekoliko meseci kasnije. Sigurnost se svodi na dobar code-review, dobre testove, dobro deljenje znanja, itd. U nekim oblastima (kada je sigurnost od najvišeg značaja, čak ispred produktivnosti i performansi) to može biti neprihvatljivo.
Što se tiče D programskog jezika - projekti koje sam okačio na kojima sam radio godinama su upravo pisani u D-u. Autori nisu za potcenjivanje, ali argumenti koje su naveli su... malo pristrasni :-). Svakako da su to prednosti, ali nijedna mana nije navedena...