Z toho jsem teda dosti zmateny...
1) K cemu je alokace na halde, kdyz se objekt po skonceni stackframu dealokuje? Nebo po zkopirovani "ukazatele" nekam vem uz dealokace neprobehne? To mi tam chybi zminene... Pokud to tak je, tak se vlastne objekty na halde vytvari jakoby v implicitne pouzitem shared_ptr?
2) Doted jsem si myslel, ze Rust dela silny type-checking. Jak je tedy mozne ulozit hodnotu typu Box<Complex> do promenne typu Complex? Nebo se dela nejaky autounboxing/implicitni konverze jako v Jave u "Primitivnich" typu?
3) Mluvit o tom, ze Drop je ekvivalent destruktoru, by asi vyzadovalo trochu hlubsi analyzu. Pokud mam tridni hierarchii, tak destruktor (narozdil od vsech ostatnich virtualnich metod) vola pro vsechny nadrazene datove typy automaticky. Pokud je metoda drop() jen virtualni metodou jako kazda jina, pak by bylo nutne volat vzdycky na konci super::drop(), ne?
Mozna velka cast meho nepochopeni prameni z toho, ze nemam v krvi model vlastnictvi objektu a podobne Rustoviny, ale rad bych si to ujasnil.
Pokusím se odpovědět podle toho, co jsem o Rustu nasbíral z předchozích článků, snad správně:
1. Mohu ho například přesunout jinam, třeba dovnitř jiného objektu, který jsem dostal parametrem.
2. Vypadá to na unboxing. (Jak to krásně sedí k typu Box…)
3. Good point, taky by mě to zajímalo.
Jen si nejsem úplně jist s obecným tvrzením „Pokud mam tridni hierarchii, tak destruktor (narozdil od vsech ostatnich virtualnich metod) vola pro vsechny nadrazene datove typy automaticky.“ – znám jazyky, které mají třídní hierarchii, ale destruktor je metoda jako každá jiná, a tedy volání nadřazených destruktorů není automatické.
Rustovina vlastnictví objektu, může být zajímavé, je to takový přirozený kompromis mezi neměnným objektem, kdy se pro výsledek jakékoliv operace alokuje nový objekt, a odkazu, kdy se paměť nerealokuje, ale zase objekt může měnit něco mimo zorné pole programátora. Vlastnictví zabraňuje přístupu k objektu ostatním a zároveň umožňuje a zjednodušuje efektivní správu paměti. Že to nenapadlo už někoho dříve, kdo to vymyslel, byl génius.
Dlouhe zimni vecery mame nabiledni, a proto s radosti odkazu na (extremne) dlouhe a (extremne) zajimave cteni: http://joeduffyblog.com/2016/11/30/15-years-of-concurrency/ . Ten pan pise o tom, jak v Microsoft Research cca 10 vyvijeli OS a programovaci jazyk uplne od piky, neomezeni jakoukoli zpetnou kompatibilitou a zazitymi vzorci. Bohuzel to pred par lety hodil Microsoft k ledu, ale poznatky, ke kterym dospeli, jsou jak z rise pohadek =) A Rust se u nich inspiroval hodne (nebo oni ke konci projektu u Rustu, to nevim :) ).
Kazdopadne vlastnictvi objektu tam trochu odlisnym zpusobem resili taky.
Dobré otázky! Zkusím odpovědět, snad to bude dávat smysl:
1) Box je zcela nejjednodušší způsob alokace paměti na heapu, proto jsem ho dneska použil, ale pro bod 1 se hodí Rc (jen pro jedno vlákno) či Arc (pro sdílení mezi více vlákny), možná i Weak, ne Box (viz příště). Rc je vlastně velmi jednoduchá podoba GC s počítáním referencí, dtto Arc, který však dělá inkrementaci/dekrementaci atomicky a tedy potenciálně zdržuje.
2) to není zcela přesně vlastnost jazyka (nějaká "magie" v sémantice), ale existuje trait Deref, který je implementován mj. i Boxem (ale i zmíněným Rc) - https://doc.rust-lang.org/stable/std/ops/trait.Deref.html
3) v Rustu se po zavolani drop() daného typu rekurzivně volá drop pro všechny atributy (pokud to má význam). Třídní hiearchii, resp. to co si pod tím názvem představujeme my Javisti/C++saři apod, tu Rust nemá :-) [se všemi z toho plynoucími důsledky, ale to je asi věcí zvyku]
Já taky děkuju, protože přesně tyto otázky mě napadaly zpočátku taky (Rust je v tomto hodně odlišný), ale po nějaké době, kdy si člověk říká W.F???, to nakonec docvakne :-) Zrovna u té alokace na haldě se totiž spojuje hned několik konceptů - typový systém, správa paměti, trait deref a hlavně ownership.