> Igen. Kérdés, hogy ha elfelejted, a fordító szól-e.
> > Annak a nyelvhez nincs köze, az a fordító függvénye.
Van, ami a fordító függvénye, és van, amihez nyelvi elem kell. 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.
> > De legyen az a szabály, hogy „alkalmazásba nem írunk unsafe-et”.
> Igen, így kezdődik az ideologizálás. Ennyi erővel C-ben is lehet "szabályokat" hozni.
Ez nem ugyanolyan, mint pl. a „minden pointert ellenőrizzünk, hogy NULL-e”.
Ez egy egyszerű szabály, és még egyszer: alkalmazást lehet írni safe (alapértelmezett) módban. Driver-re meg nincs az a programnyelv, ami felelősséget tudna vállalni pl. azért, hogy melyik memóriacímre milyen regiszter van map-elve. Szóval elkerülhetetlen az unsafe, mint nyelvi elem - alkalmazásfejlesztésnél meg tökéletesen elkerülhető.
Amúgy safe módban nem tudsz pointert dereferálni. Anélkül meg ugye nem sok értelme van pointert használni. Tehát úgyis mindenhova referenciát teszünk, ahol raw hivatkozás kell. A referenciákra pedig semmi engedményt nem tesz az unsafe (talán a pointer derefen kívül nincs is más hatása...). Szóval ritka, hogy véletlenül becsúszik egy unsafe. Általában csak komolyabb refaktorálással tudnád elrontani a programot, lényegében azt már akarni kell.
Más kérdés, hogy volt már bukta abból, hogy programot a kezdetektől unsafe blokkokkal írtak tele. Ez nyilván nem a nyelv hibája.
> > C-ben csak a lehetőségünk van meg, hogy lock-oljunk. Ha elfelejtjük, az undefined behaviour.
> Ez nem mond ellent annak, amit mondtam. A C a lehetőségek nyelve. Az öntökönlövésre is, de másra is.
Ez nem mond ellent annak, amit mondtam. A Rust is a lehetőségek nyelve. Az öntökönlövésre kevésbé, másra inkább. :)
> > A felszabadítást igen, a referenciák (ha vannak raw referenciák) lifetime-ellenőrzését nemigen. Szintén undefined behaviour-t szűrünk ki ezzel, ráadásul olyat, ami a jelenlegi bugok elég nagy részét képezik.
> Ez implementáció kérdése. Le lehet implementálni C-ben és egyéb nyelvekben is. A Rust akkor ezt itt default runtime szinten támogatja, ennyi a különbség.
- C-ben nem lehet implementálni pl. shared pointert, mert nincs destruktor. (Állítólag GC lib létezik, most nem nézek utána, de tutira veszem, hogy nem teljesen automata).
- De azért hangsúlyoztam, hogy raw referenciák, mert nem smartpointerről beszélek (futásidejű mechanizmusokkal (bár olyan is van) ), hanem fordítási idejű ellenőrzésről, ehhez pedig kell a nyelv támogatása. Sok esetben külön magyarázat nélkül is látja, hogy mit engedhet meg, de vannak kivételek, ilyenkor magyarázni kell neki, különben túl szigorú, mert hibát nem engedhet meg. Hát pl. az ilyenek miatt nehezebb kicsit belejönni. De bele lehet. :)