Lassan pontot teszek ennek a szálnak a végére. :)
> > Optional típus pl. nincs a C-ben, C++-ban (stl) már van. Enélkül, vagy ilyesmi nélkül fordítási időben nem derül ki, hogy kiolvashatok-e egy pointert, vagy érvénytelen.
> Lehet, de megkerülni azt is meg lehet.
Miről is vitázunk ebben a pontban? hg2ecz írta:
- C-nél adatcsatornában jön a NULL pointer is vissza. Pici figyelmetlenség és kész a biztonsági rés. Rust: if let Some(a) = akarmi(x,y) { ... }
azaz a Rust kivédi. Fordításkor, típusosság alapján, mivel az Option<T> nem kompatibilis a T-vel. Nem tudom, mire gondoltál, hogy megkerülni hogyan lehet. Ezt egy kósza unsafe kulcsszóval sem tudod megkerülni, csak ha refaktorálod a kódot, és mindenhol átírod a referenciákat pointerekre, meg ami még ezzel jár. De ezt már nagyon kell akarni. A lényeg az, hogy a könnyen elkövethető, nehezen debugolható, akár adatvesztést is okozó problémákat ki tudjuk szűrni.
> Nem regiszterekre gondoltam, egy egyszerű allokált terület túlcímzésére pl. olyan pedig alkalmazásfejlesztésnél is előfordul, nem csak C nyelvben.
Ezért van Rustban bounds checking.
> ha a programozó hülye, akkor unsafe és pointer és ugyanott vagyunk, mint C-nél, have a segfault.
Könnyű mondani, hogy „a programozó hülye”, de nem. Nem mindegy, hogy nehezen észrevehető hibáról beszélünk, vagy fordítva: nehezen elkövethetőkről. Mégegyszer: a statisztikák szerint a bugok nagy része memóriakezelési hiba. A nehezen észrevehető.
> C-ben minden pointer "shared", hiszen a process a saját címterében oda nyúlkál, ahova akar.
Kommunikációs elcsúszást érzékelek. Hol runtime automata felszabadításról beszélünk, hol statikus (compile time) lifetime-ellenőrzésről.
C-ben egyébként minden pointer shared az adat elérésére (bár inkább az adatra szokták ilyenkor mondani, hogy „shared”), és egyik sem rendelkezik shared ownership-pel. Shared pointer alatt leggyakrabban az utóbbit értjük.
> A fentebbi példához már kőkemény heurisztika kéne. 100%-os védelem nincs.
Igen, lassú is a fordító. De ezekre az esetekre is van 100%-os védelem. Még egyszer: ahol kell annotálni, és nem teszem, ott max. compile error történhet, hibás kód generálása nem.