Rust vs. C++ (funkcionální vs. OOP)

bjarne

Rust vs. C++ (funkcionální vs. OOP)
« kdy: 12. 03. 2016, 12:08:15 »
Tak jsem přemýšlel, jak bych mohl svoji aplikaci v C++ přepsat do Rustu a došel jsem k závěru, že to nepůjde. Rust se mi líbí, ale ta absence OOP (třídy, dědičnost) se prostě nedá nějak normálně nahradit. Rust a podobné jazyky jsou asi skvělé pro aplikace s jednoduchým datovým modelem, ale pro složitější model, zejména když je přirozené uvažovat značně ve smyslu dědičnosti a strom dědičnosti je poměrně hluboký, tak tam nastáva u jazyků jako Rust dost problém. Pamatuju se na podobnou diskuzi, kde někdo psal, že OOP není přirozené pro naše myšlení, ale já jsem opačného názoru. Když přemýšlím nad tím, jak vytvořit abstrakci něčeho, tak přemýšlím nad chováním a nad vlastnostmi - v řeči OOP je to něco třída,  chování vyjádřeno metodami a vlastnosti pomocí datových členů.

Dám případ ze svoji aplikace:

Mám třády ApplicationElement, UIElement, GenericStack, PartStack, kdy následující třída vždy dědí z předchozí.
V C++ žádný problém, ale v Rustu bych musel vše řešit buď kompozicí nebo traity.
U kompozice bych pak musel psát něco jako partStack.genericStack.uiElement.applicationElement pokud bych chtěl volat něco z implementace ApplicationElement a traitu je zase šílenost pro každou strukturu imlementovat všechny ty traity.

Evidentně dědičnost nějak rozumně nahradit nejde a jestli ano, tak za cenu flexibility => ve výsledku nemá cenu na něco se složitým datovým modelem používat funkcionální jazyk tohohle typu. Souhlasíte?




uetoyo

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #1 kdy: 12. 03. 2016, 13:37:07 »
Přečti si něco o FP: http://bartoszmilewski.com/

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #2 kdy: 12. 03. 2016, 14:20:35 »
Evidentně dědičnost nějak rozumně nahradit nejde a jestli ano, tak za cenu flexibility => ve výsledku nemá cenu na něco se složitým datovým modelem používat funkcionální jazyk tohohle typu. Souhlasíte?
Nahradit nejde, ale s flexibilitou to nijak nesouvisí. Lepší je používat protokoly a je implementující třídy nebo struktury (podobně jako v Go nebo Swiftu). Rust podrobně neznám, tak nevím, nakolik umožňuje podobné paradigma.

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #3 kdy: 12. 03. 2016, 14:51:21 »
když je přirozené uvažovat značně ve smyslu dědičnosti a strom dědičnosti je poměrně hluboký, tak tam nastáva u jazyků jako Rust dost problém.

Ano, absence dědičnosti nebo podobného mechanismu je problém.

Před 18 dny bylo nicméně přijato RFC: impl specialization #1210, jenž tento problém pomůže vyřešit.

G

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #4 kdy: 12. 03. 2016, 15:02:10 »
Do rust jazyka bych nic neprepisoval, prvni stabilni verze se objevila v teprve v minulem roce a nezda se ze si je autor jisty co vlastne chce. Je velke riziko, ze se jazyk bude jeste menit a tvoje otazky chapu. Neni to zkratka domyslene ...

Na druhou stranu c++ neni oop jazyk, je implementovana pouze omezena podmnozina oop. Treba clos v common lispu je mnohem silnejsi ... oop podle me nesouvisi jestli je jazyk imperativni nebo funkcionalni.


Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #5 kdy: 12. 03. 2016, 16:14:52 »
Citace
Je velke riziko, ze se jazyk bude jeste menit a tvoje otazky chapu. Neni to zkratka domyslene ...

Většina nových verzí obsahuje zpětně nekompatibilní změny.

tomaszav

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #6 kdy: 13. 03. 2016, 09:41:18 »
Dedicnost je zlo. Vetsina pouziti vychazi z toho ze se ti tsk nekdo proste naucil.

Pokud nekdo podedi vic nez jednou, mel by se nad sebou vazne zamyslet.

bjarne

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #7 kdy: 13. 03. 2016, 10:34:08 »
Dedicnost je zlo. Vetsina pouziti vychazi z toho ze se ti tsk nekdo proste naucil.

Pokud nekdo podedi vic nez jednou, mel by se nad sebou vazne zamyslet.

To je pěkná kravina.

bjarne

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #8 kdy: 13. 03. 2016, 10:34:33 »
když je přirozené uvažovat značně ve smyslu dědičnosti a strom dědičnosti je poměrně hluboký, tak tam nastáva u jazyků jako Rust dost problém.

Ano, absence dědičnosti nebo podobného mechanismu je problém.

Před 18 dny bylo nicméně přijato RFC: impl specialization #1210, jenž tento problém pomůže vyřešit.

super, kouknu na to, díky

pavlix

  • ****
  • 253
    • Zobrazit profil
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #9 kdy: 13. 03. 2016, 11:33:42 »
Rust neumím. Ale píšu dost věcí v céčku a když se bavám s vývojáři, co používají C++, tak mi přijde, že mají tendenci jeho vlastnosti přeceňovat. Céčko je maximálně flexibilní a udělá se v něm cokoliv, na co je v C++ syntaktický cukr, i na co není. Předpokládám, že to v Rustu půjde zrovnatak, ale není mi úplně jasné, co všechno půjde dělat bezpečným způsobem. Takže bude potřeba neporovnávat schopnosti jazyků, ale spíše vlastnosti best practices těch jazyků. Další věc je, že mnozí céčkaři zvládají normálně psát kód a přitom udržovat kompatibilitu API/ABI, zatímco v C++ nevím o nikom, kdo by vůbec vědě, jak se to dělá. Taky v C++ projektech (například squid) narážím na velmi kryptické chyby týkající se volání destruktorů.

http://www.abclinuxu.cz/blog/pavlix/2016/2/abi-kompatibilita

bjarne

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #10 kdy: 13. 03. 2016, 12:25:19 »
Rust neumím. Ale píšu dost věcí v céčku a když se bavám s vývojáři, co používají C++, tak mi přijde, že mají tendenci jeho vlastnosti přeceňovat. Céčko je maximálně flexibilní a udělá se v něm cokoliv, na co je v C++ syntaktický cukr, i na co není. Předpokládám, že to v Rustu půjde zrovnatak, ale není mi úplně jasné, co všechno půjde dělat bezpečným způsobem. Takže bude potřeba neporovnávat schopnosti jazyků, ale spíše vlastnosti best practices těch jazyků. Další věc je, že mnozí céčkaři zvládají normálně psát kód a přitom udržovat kompatibilitu API/ABI, zatímco v C++ nevím o nikom, kdo by vůbec vědě, jak se to dělá. Taky v C++ projektech (například squid) narážím na velmi kryptické chyby týkající se volání destruktorů.

http://www.abclinuxu.cz/blog/pavlix/2016/2/abi-kompatibilita

Jo tak v C++ je těch problému s ABI kompatibilitou daleko víc a je to hlavně kvůli virtuálním metodám. Např. přidám novou virtuální metodu do rodičovské třídy a už jsem v zadeli, protože se mi změní indexy virtuálních metod v TVM.
Taková funny věc v C++ je třeba to, že když člověk volá virtuální metodu v konstruktoru, tak to může, ale i nemusí fungovat, podle toho jestli už je nastaven správný ukazatel na TVM. Kvůli takovým věcem by se vyplatilo switchnout na jiný jazyk kompilovaný do nativního kódu a nemající GC (v podstatě asi jediná možnost je právě Rust).
Já mám ale problém s tím, za jakou cenu budu nahrazovat tu dědičnost pomocí jiných vlastností nějakého jazyka. Řekl bych, že je tady prostor pro jazyk typu něco mezi C++ a Rustem.

javaman

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #11 kdy: 13. 03. 2016, 12:40:44 »
Přesně tak, je čas na Javu.

bjarne

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #12 kdy: 13. 03. 2016, 13:41:43 »
Přesně tak, je čas na Javu.

Klidně, jen kdyby tam nebyl GC a overhead s voláním C funkcí. Jazyk jako takový se mi líbí.

fedorac

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #13 kdy: 13. 03. 2016, 13:44:04 »
uz je nove tisicileti.
Golang

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #14 kdy: 13. 03. 2016, 13:59:35 »
uz je nove tisicileti.
Golang

Go nemá generika (nebo šablony) - patří spíše do minulého tisíciletí. V tomto ohledu bylo C++ dál než Go už v roce 1990.