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

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #120 kdy: 21. 03. 2016, 19:04:53 »
aby člověk programoval na nějaké profi úrovni FP, tak musí umět nejspíš category theory, jinak je to patlal. Přičemž ale IMO na 90% kódu knihoven, které člověk v haskellu používá, nepotřebuje znát v podstatě žádnou category theory (resp. potřebuje znát, jak to funguje prakticky, nikoliv tu teorii za tím).
To si jenom zboj opět honí triko, můžeš to s klidem ignorovat :)
Tak jsem teď shodou okolností narazil na krásný popis toho, co se tady marně snažím vyjádřit roky :)

https://youtu.be/oYk8CKH7OhE?t=25m40s

Citace
It's a crazy way to teach ... adition. There's a reason we don't take that road. Maybe that road works for some percentage of people who are learning but for [...] let's say 95% of people, saying "two" is a better explanation.

- když už ne celou přednášku, určitě stojí za to si pustit aspoň kousek před a po téhle pasáži, kde povídá o tom, jak zbytečný strašák jsou monády - když to stačí ukázat na konkrétním příkladě a srozumitelně pojmenovat ("andThen").

...a za úplně excelentní považuju odpověď na otázku z publika: "no ale jak pojmenuješ ten obecný koncept?!" - "No, monády. Protože pokud mluvím o obecném konceptu, tak to jsou monády. [Ale ne každého to zajímá]"

Celkově ta přednáška je věnovaná tomu, proč je FP pro lidi odstrašující. A je fakt výborná.

P.S. Evana Czaplickiho snad nikdo za lopatu považovat nebude :) i když... tady je všechno možný :)


v

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #121 kdy: 21. 03. 2016, 20:29:59 »
aby člověk programoval na nějaké profi úrovni FP, tak musí umět nejspíš category theory, jinak je to patlal. Přičemž ale IMO na 90% kódu knihoven, které člověk v haskellu používá, nepotřebuje znát v podstatě žádnou category theory (resp. potřebuje znát, jak to funguje prakticky, nikoliv tu teorii za tím).
To si jenom zboj opět honí triko, můžeš to s klidem ignorovat :)
Tak jsem teď shodou okolností narazil na krásný popis toho, co se tady marně snažím vyjádřit roky :)

https://youtu.be/oYk8CKH7OhE?t=25m40s

Citace
It's a crazy way to teach ... adition. There's a reason we don't take that road. Maybe that road works for some percentage of people who are learning but for [...] let's say 95% of people, saying "two" is a better explanation.

- když už ne celou přednášku, určitě stojí za to si pustit aspoň kousek před a po téhle pasáži, kde povídá o tom, jak zbytečný strašák jsou monády - když to stačí ukázat na konkrétním příkladě a srozumitelně pojmenovat ("andThen").

...a za úplně excelentní považuju odpověď na otázku z publika: "no ale jak pojmenuješ ten obecný koncept?!" - "No, monády. Protože pokud mluvím o obecném konceptu, tak to jsou monády. [Ale ne každého to zajímá]"

Celkově ta přednáška je věnovaná tomu, proč je FP pro lidi odstrašující. A je fakt výborná.

P.S. Evana Czaplickiho snad nikdo za lopatu považovat nebude :) i když... tady je všechno možný :)
já ho za lopatu nemám (prakticky netuším kdo to je), ale IMHO mele blbosti, ty analogie jsou chybné

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #122 kdy: 21. 03. 2016, 21:51:58 »
já ho za lopatu nemám (prakticky netuším kdo to je), ale IMHO mele blbosti, ty analogie jsou chybné
Je to autor Elmu. http://elm-lang.org/

alex

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #123 kdy: 22. 03. 2016, 06:36:19 »
Důvod je jediný, paralelizace výpočtu, OOP je "prostorová" modularizace, FP je "časová" modularizace. U FP blackboxujete výpočet v čase. Nevíte kdy se tak stane, víte, že to nic dalšího neovlivní, takže do ukončení výpočtu je to, jako by výpočet uvnitř funkce neprobíhal. Z hlediska výsledku se provádí výpočet jakoby najednou, až jsou všechny dílčí výsledky k dispozici. Funkci můžete použít, aniž byste myslel na její implementaci, použijete rovnou výsledek.
To jsou tak obecné řeči, že se na to snad ani nedá rozumně reagovat.

Nicméně: základní rozdíl mezi OOP (v dnešním pojetí) a FP je v tom, že v FP si nemůžu zapamatovat referenci na něco s měnitelným stavem. Pokud v OOP předám objektu O1 nějakou referenci na objekt O2, tak si nikdy nemůžu být jistý, že si ji O1 nezapamatoval a že nebude stav O2 měnit kdykoli v budoucnu, typicky v situaci, kdy to vůbec nečekám. V (čistém) FP tohle není možné. Tím se OOP (a do nějaké míry i kód založený na aktorech) stává nepřehlednou sítí odkazů, o které nejsem schopný nic moc říct. Oproti tomu o (čistém) FP programu jsem schopný říct hodně.

Oproti aktorovému programování má (dnešní, reálné) OOP ještě tu nevýhodu, že prasácky do kódu může vlézt kdykoliv jakékoliv vlákno. Proto je OOP ještě větší maglajz.

Takže bych to z hlediska nějaké přehlednosti uspořádal asi takhle: čisté FP > aktory > OOP
Varující je, že čisté FP se prakticky nepoužívá, znamená to, že se prosadí něco co se bude nazývat FP, ale FP to nebude, imutable objekty v FP padnou jako koncept do pěti let, po jejím masovém rozšíření.

Wirthovy snahy vybudovat jazyk, který by svou konstrukcí vedl k přehlednému programování v praxi taky vzaly za své, přehledné programování je výsledkem vnitřní disciplíny, ne jazyka, který používáte.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #124 kdy: 22. 03. 2016, 11:55:05 »
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?
Nesouhlasím.

Na složitý datový model je funkcionální jazyk naprosto vyhovující. (Zda Rust, je spíše otázka stability jeho samotného, než toho, že je funkcionální.)

Dokonce jsem nabyl dojmu, že objektové programování (tak jak jej známe) a dědičnost nejsou nijak zvláště užitečné, a neosvědčilo se to.

To soudím na základě zkušeností z projektů různých úrovní složitosti i různého skillu vývojářů, ke kterými jsem kdy přišel. Ono samozřejmě vytvářet nový projekt od základu je něco jiného. Tam je to fuk, protože si všechno pamatujete. Ale přijít k existujícímu projektu a zorientovat se v tom... OOP není nutně špatné, ale výceúrovňová dědičnost vysloveně zatemňuje.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #125 kdy: 22. 03. 2016, 11:56:45 »
Wirthovy snahy vybudovat jazyk, který by svou konstrukcí vedl k přehlednému programování v praxi taky vzaly za své, přehledné programování je výsledkem vnitřní disciplíny, ne jazyka, který používáte.
A není to poněkud škoda?

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #126 kdy: 22. 03. 2016, 12:08:56 »
Varující je, že čisté FP se prakticky nepoužívá
To video, co jsem odkazoval výš, se právě docela detailně zabývá tím, proč to tak je (podle řečníka). A ve spoustě věcí má podle mě pravdu. Jakmile normální programátor uvidí někde napsáno "IO monády", tak zavře uši a nic už vědět nechce. Kdyby viděl "print x `andThen` print y", nemá problém. Čisté FP jazyky doteď žily/žijí převážně v akademickém prostředí a z toho vychází i všechna ta kultura a texty kolem toho. Nejlíp to vyjadřuje okřídlené:

Citace
Haskell gets some resistance due to the complexity of using monads to control side effects. Wadler tries to appease critics by explaining that "a monad is a monoid in the category of endofunctors, what's the problem?"

Navíc je myslím dobrý si uvědomit, že FP nutně neznamená pure&lazy. Erlang je sympatický jazyk, kde se na mikroúrovni používá docela pěkné FP, které ale není ani pure, ani lazy, ani silně typované (v obvyklém slova smyslu), takže většina té bižuterie z Haskellu tam není potřeba. Totéž F#, Scala (nakolik můžu posoudit, detailně je neznám). Je to kompromis, kterým se jazyk připraví o některé sympatické vlastnosti a garance, ale použitelnost (pro "obyčejné" programátory) je podstatně vyšší. A touhle cestou se nejspíš půjde, na čemž nevidím nic špatného. Jazyky, které dělají dobře promyšlené, teoreticky vyfutrované kompromisy, bývají fajn. To ale není případ OOP, které udělalo kompromis z technického (implementačního), ne designového důvodu.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #127 kdy: 22. 03. 2016, 12:42:41 »
Důvod je jediný, paralelizace výpočtu, OOP je "prostorová" modularizace, FP je "časová" modularizace. U FP blackboxujete výpočet v čase. Nevíte kdy se tak stane, víte, že to nic dalšího neovlivní, takže do ukončení výpočtu je to, jako by výpočet uvnitř funkce neprobíhal. Z hlediska výsledku se provádí výpočet jakoby najednou, až jsou všechny dílčí výsledky k dispozici. Funkci můžete použít, aniž byste myslel na její implementaci, použijete rovnou výsledek.
To jsou tak obecné řeči, že se na to snad ani nedá rozumně reagovat.

Nicméně: základní rozdíl mezi OOP (v dnešním pojetí) a FP je v tom, že v FP si nemůžu zapamatovat referenci na něco s měnitelným stavem. Pokud v OOP předám objektu O1 nějakou referenci na objekt O2, tak si nikdy nemůžu být jistý, že si ji O1 nezapamatoval a že nebude stav O2 měnit kdykoli v budoucnu, typicky v situaci, kdy to vůbec nečekám. V (čistém) FP tohle není možné. Tím se OOP (a do nějaké míry i kód založený na aktorech) stává nepřehlednou sítí odkazů, o které nejsem schopný nic moc říct. Oproti tomu o (čistém) FP programu jsem schopný říct hodně.

Oproti aktorovému programování má (dnešní, reálné) OOP ještě tu nevýhodu, že prasácky do kódu může vlézt kdykoliv jakékoliv vlákno. Proto je OOP ještě větší maglajz.

Takže bych to z hlediska nějaké přehlednosti uspořádal asi takhle: čisté FP > aktory > OOP
Varující je, že čisté FP se prakticky nepoužívá, znamená to, že se prosadí něco co se bude nazývat FP, ale FP to nebude, imutable objekty v FP padnou jako koncept do pěti let, po jejím masovém rozšíření.


Nejspíš ze stejného důvodu, proč se prakticky nepoužívá čisté logické programování. Nehodí se na vše, procedurálně se často píše lépe.

v

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #128 kdy: 22. 03. 2016, 12:56:37 »
Varující je, že čisté FP se prakticky nepoužívá
Jakmile normální programátor uvidí někde napsáno "IO monády", tak zavře uši a nic už vědět nechce.
jakýkoliv normální profesionál když vidí někde "nová technologie", tak zavře uši a nic už vědět nechce, s terminologií to nemá nic společného

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #129 kdy: 22. 03. 2016, 12:59:18 »
Nejspíš ze stejného důvodu, proč se prakticky nepoužívá čisté logické programování. Nehodí se na vše, procedurálně se často píše lépe.
Ale už se tak dobře nečte.

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #130 kdy: 22. 03. 2016, 13:11:46 »
jakýkoliv normální profesionál když vidí někde "nová technologie", tak zavře uši a nic už vědět nechce, s terminologií to nemá nic společného
No, frontenďáci jsou celí říční, aby měli každej týdej úplně novej make systém a co 14 dní jinej framework. Ale je samozřejmě otázka, jestli jsou frontenďáci "normální profesionálové" ;)

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #131 kdy: 22. 03. 2016, 13:28:02 »
jakýkoliv normální profesionál když vidí někde "nová technologie", tak zavře uši a nic už vědět nechce, s terminologií to nemá nic společného
No, frontenďáci jsou celí říční, aby měli každej týdej úplně novej make systém a co 14 dní jinej framework. Ale je samozřejmě otázka, jestli jsou frontenďáci "normální profesionálové" ;)

To je asi dost ovlivnene tim, ze ti, kteri meni frameworky ob tyden, jsou zaroven ti, kteri jsou vic videt a slyset. Cekal bych, ze "ticha vetsina" porad bastli neco v jquery.

v

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #132 kdy: 22. 03. 2016, 13:47:08 »
jakýkoliv normální profesionál když vidí někde "nová technologie", tak zavře uši a nic už vědět nechce, s terminologií to nemá nic společného
No, frontenďáci jsou celí říční, aby měli každej týdej úplně novej make systém a co 14 dní jinej framework. Ale je samozřejmě otázka, jestli jsou frontenďáci "normální profesionálové" ;)
taky záleží jestli tou technologií tady je framework nebo javascript

alex

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #133 kdy: 23. 03. 2016, 06:39:54 »
Wirthovy snahy vybudovat jazyk, který by svou konstrukcí vedl k přehlednému programování v praxi taky vzaly za své, přehledné programování je výsledkem vnitřní disciplíny, ne jazyka, který používáte.
A není to poněkud škoda?
Není to škoda. Reálný svět je dokonalý takový jaký je. Proto neumožňuje reálnou existenci podobných projektů.


alex

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #134 kdy: 23. 03. 2016, 06:50:22 »
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?
Nesouhlasím.

Na složitý datový model je funkcionální jazyk naprosto vyhovující. (Zda Rust, je spíše otázka stability jeho samotného, než toho, že je funkcionální.)

Dokonce jsem nabyl dojmu, že objektové programování (tak jak jej známe) a dědičnost nejsou nijak zvláště užitečné, a neosvědčilo se to.

To soudím na základě zkušeností z projektů různých úrovní složitosti i různého skillu vývojářů, ke kterými jsem kdy přišel. Ono samozřejmě vytvářet nový projekt od základu je něco jiného. Tam je to fuk, protože si všechno pamatujete. Ale přijít k existujícímu projektu a zorientovat se v tom... OOP není nutně špatné, ale výceúrovňová dědičnost vysloveně zatemňuje.

Jestli to nebude tím, že v FP se vytváří výhradně nové projekty a vše je nové, svěží a čisté. Po pár letech provozu projektu to takové nebude. Jinak FP taky obsahuje dědičnost, negativní důsledky dědičnosti v FP představuje použití funkce uvnitř funkce. Změní-li se chování té vnitřní funkce rozhodí to ne zcela odvoditelným způsobem chování jiných funkcí. Což taky zatemňuje. Závislosti mezi funkcemi jsou taky časem hodně složité a dostatečně temné.