Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Jiří Havel

Stran: 1 ... 11 12 [13] 14 15 ... 22
181
Vývoj / Re:Abstrakce u OOP
« kdy: 11. 06. 2020, 13:03:17 »
Mixiny dělají akorát bordel v kódu. Snadno se píší, ale blbě se čtou. Přitom se dají jednoduše nahradit kompozicí.
Mixiny jsou druh kompozice. Akorát na rozdíl od kompozice přes membery nebo privátní dědičnost se skládá i vnější rozhraní třídy.
Spousta jazyků neumí jednoduše vytáhnout rozhraní membera do rozhraní třídy, takže alternativa k mixinům je psaní boilerplate kódu. Ten boilerplate kód se možná snáze čte, ale zase hůř modifikuje. Úpravy boilerplate kódu bývají náchylné k chybám, protože je to mechanická dělničina.

182
Vývoj / Re:Abstrakce u OOP
« kdy: 11. 06. 2020, 12:52:53 »
Tak existuje klasické pravidlo, zda objekt IS nebo objekt HAS.

casto neni ani jedno, co treba mixiny? Je to dedeni, ale pouzivaji se treba pro pridavani atributu do trid.

pokusy o slovni popisy vyznamu kodu nefunguji.

Že mixin není ani IS ani HAS ještě neznamená, že slovní popisy nefungují. Mixin je něco, co přimixuju a co mohu poměrně svobodně přimixovávat právě bez ohledu na to, co objekt IS nebo HAS.

Slovni popisy nefunguji, protoze programy nepiseme v prirozenem jazyce.
Komentáře jsou psané přirozeným jazykem. Sémantika toho programovacího jazyka bývá taky popsaná přirozeným jazykem.
Troufnu si tvrdit, že veškeré nedostatky formálních jazyků flíkujeme právě tím přirozeným. Což je pro mně dostatečný důkaz toho, že slovní popisy fungují.

183
Vývoj / Re:Abstrakce u OOP
« kdy: 10. 06. 2020, 22:15:59 »
Tak C++ je vůbec divočina, tam je dědičnost tak mocná, že umožňuje psát higher kinded typy. Ne že by to tam bylo nějak zvlášť čitelné...
Jo, s čitelností je to horší. Šablony holt nebyly navržené pro tohle použití. Že jsou výpočetně úplné a co všechno se s nima dá udělat se zjistilo až dodatečně.

Naštěstí se spousta téhle divočiny dá udržet v implementaci knihoven. Samotné použití pak nevypadá až tak zle. A constexpr funkce a koncepty z C++20 tu čitelnost hodně zlepšují.

184
Vývoj / Re:Abstrakce u OOP
« kdy: 10. 06. 2020, 21:15:11 »
jak poznám, že tam patří?
Veřejnou dědičností se modelují vztahy is-a. O každém potomkovi by se mělo dát říct, že je zároveň předkem. Navíc to není podmínka postačující, ale jen nutná.
Takže do předka patří jen taková logika, kterou mají všichni potomci. Pokud dává smysl jen pro některé potomky, pak předek nejspíš není to pravé místo.

Příklad funkčnosti, která mi dává v předkovi smysl, je kontrola vstupů, návratových hodnot a invariantů.

Samozřejmě jako všechno u návrhu SW je to důsledné doporučení a nedá se tupě aplikovat vždycky a bez přemýšlení.

V poslední době se v některých jazycích rozšířili traity/mixiny, které jsou určeny právě na to reusable kódu. Protože sice do objektu přidávají logiku, kterou chceme, ale nepřidávají, že potomek JE předek.
Jop, tohle je dobrý příklad veřejné dědičnosti, která nemodeluje vztah JE. Typický je třeba Curously Recurring Template Pattern v C++ :
Kód: [Vybrat]
class Derived : public Base<Derived>
{
};
Předek není třída ale šablona, která potřebuje vědět typ potomka. Díky tomu se o vztahu JE vůbec nedá mluvit, protože ten předek sám o sobě není nějaká hotová věc.
Hodí se to třeba, pokud pro nějaká datová struktura potřebuje vestavěnou podporu ve vkládaných typech. Ta báze může třeba obsahovat ukazatele, aby se instance odvozené třídy daly strkat do spojového seznamu.

185
Vývoj / Re:Abstrakce u OOP
« kdy: 10. 06. 2020, 20:52:15 »
jak poznám, že tam patří?
Veřejnou dědičností se modelují vztahy is-a. O každém potomkovi by se mělo dát říct, že je zároveň předkem. Navíc to není podmínka postačující, ale jen nutná.
Takže do předka patří jen taková logika, kterou mají všichni potomci. Pokud dává smysl jen pro některé potomky, pak předek nejspíš není to pravé místo.

Příklad funkčnosti, která mi dává v předkovi smysl, je kontrola vstupů, návratových hodnot a invariantů.

Samozřejmě jako všechno u návrhu SW je to důsledné doporučení a nedá se tupě aplikovat vždycky a bez přemýšlení.

186
Ok, funguje. Ale hází stejný výsledek jako GCC i před tím, takže Clang je drobek přísnější :)
To není primárně o přísnosti. Jak GCC tak Clang při optimalizacích využívají nedefinované chování dost agresivně. V různých situacích se to může a nemusí projevit, protože jejich optimalizátory pracují každý trošku jinak. Výsledek může vypadat dost chaoticky. Například tu funkci můžou "rozbít" úpravy na úplně jiném místě v kódu.

Rozhodně bych se nespoléhal na to, že GCC (nebo i jakýkoliv jiný překladač) se bude kolem neinicializovaných proměnných chovat nějak příčetně. Že ta funkce vrátí nějaký binec je ještě celkem intuitivní chování, ale už jsem viděl i docela divoké věci.

187
Studium a uplatnění / Re:Má smysl se věnovat FPGA?
« kdy: 10. 04. 2020, 12:21:24 »
Akorát platově mi to moc nesedí. :) Vývojáři v FPGA na tom bývají o něco líp jak embeďáci, ale stejně jako oni se vždy víc nadřou za méně peněz než programátoři v Javě/Pythonu.
Ono je to IMO hlavně tím, že plat bývá nepřímo úměrný zajímavosti práce. Samozřejmě vocaď pocaď.

188
Studium a uplatnění / Re:Má smysl se věnovat FPGA?
« kdy: 09. 04. 2020, 15:50:46 »
O perspektivních aplikacích FPGA čtu od doby, co se zajímám o IT. V praxi se to většinou neuchytilo. Většinou se tím řeší nepodstatné mikrooptimalizace.
Vzhledem k tomu, jak je vývoj pro FPGA náročný a tím i drahý, to nejsou nepodstatné mikrooptimalizace. Spíš naprosto kritické mikrooptimalizace, bez kterých by se daná věc nedala při dostupném čase/napájení/rozměrech/... vůbec udělat.

Málokdo půjde cestou FPGA, pokud má na výběr. FPGA dává smysl jen u specializovaných malosériových zařízení. Z toho může plynout dojem, že se to v praxi většinou neuchytilo. Není a asi to ani nikdy nebude mainstreamová záležitost.

189
Vývoj / Re:Doporučte programovací jazyk pro Windows
« kdy: 03. 04. 2020, 21:47:12 »
To je oxymoron, kdyz chces mit vsechno zkontrolovane v dobe kompilace, nemuzes to pak vytvaret za chodu, a naopak. Pro statickou analyzu nepotrebujes staticke typy, na to ti staci typove anotace, ktere ma python nebo truescript.
Je nějaký principielní rozdíl mezi statickými typy a těmi typovými anotacemi? V obou případech jsou to překladačem vynucená omezení možných hodnot.
Citace
Vyhoda statickych typu je jina a imho jedina, umoznuje podstatne lepsi optimalizaci na urovni strojoveho kodu. Kdyz se ty kouzla ve statickych jazycich delaji, proc nemaji plnohodnotnou funkci eval (ci jeji ekvivalent, treba pythoni compile) nebo repl? Coz je dalsi z vyuziti schopnosti prace s dynamicky vytvarenym kodem.
Třeba takový Haskell (ghc) má plnotučný repl, eval a všechny tyhle radosti. Cerní C++ interpret ten repl zvládá taky bez problémů.

To, jestli má jazyk eval, repl a podobné věci není až tak závislé na statičnosti nebo dynamičnosti daného jazyka. Závisí to spíš na tom, jestli se programy v daném jazyce distribuují v podobě zdrojáků nebo jako nějaký bytecode či binárky. Jde jenom o tom, jestli se vyplatí k tomu programu přibalit řádově větší a složitější kompilátor/interpret. Nebo jestli tam ten kompilátor stejně přibalený být musí.

1) Z nechápavosti, ale tak ti prostě nejsou souzeny. Souhlas, Javascript není dobře navržený jazyk, když vznikal, byla to spíš legrace, nikdo s ním tak velké ambice neměl. Holt stane se, smutné je, že nikdo nepřišel s lepší náhradou nebo alespoň javascriptem 2, který by se zbavil té nesmyslné zátěže. Přitom by v prohlížeči mohl běžet pár let paralelně s tím stávajícím a bezbolestně převzít štafetu.
Omyl, JavaScript není vůbec navržený jazyk. Vznikl jako demíčko, které napsal jeden člověk za týden a shodou okolností se ujal jako standard. Proč nikdo nepřišel s lepší náhradou je IMO jasné. U webového jazyka je úplně jedno, jestli je statický, dynamický, takový nebo makový. Jediné relevantní kritérium je kompatibilita s tou hromadou existujícího JavaScriptu. Všechno ostatní jsou jen důsledky.
Citace
3) Původ není podstatný, podstatná je možnost modifikovat dynamicky a jednoduše běžící runtime. Testování je potřeba vždy, statické typy tě přece před překlepem nezachrání.
Možnost modifikovat runtime nevyplývá ze statičnosti/dynamičnosti ale z toho, jestli má ten jazyk vždycky přibalený kompilátor/interpret.
Testovat je třeba. Ale drtivá většina překlepů se ve statických jazycích chytne už při kompilaci, protože metody jako "SeParam" žádný interface nemá.
Citace
4) Jak bys v javě za běhu modifikoval třídu a všem stávajícím instancím změnil chování nějaké metody?
Javu moc dobře neznám. V C++ bych asi věděl. Přes věci jako dll injection se dají dělat zajímavé divočiny.
Daleko lepší nápad mi ale přijde, pokud má daný systém nějaké zotavení z pádu, kontrolovaně shodit celý proces a nahradit ho novou verzí.

190
Vývoj / Re:Doporučte programovací jazyk pro Windows
« kdy: 03. 04. 2020, 20:39:01 »
Nemám. Imho to nejde staticky myslícímu člověku racionálně vysvětlit. Můžeš to zkoušet používat a buď přijde aha efekt a nebo nepřijde. Kdysi na to téma měl přednášku na techtalku Niclas Nilsson https://www.se-radio.net/2007/03/episode-49-dynamic-languages-for-static-minds/ ale imho ti to nepomůže, protože to není otázkou nedostatku informací, ale změny myšlení, a to může přijít jen s vlastní zkušeností. Můžeš si zkusít přečíst pár knih na téma javascript design patterns, kde jsou kodifikovány některé způsoby využití, které by tě asi jinak nenapadly, ale jsem pesimista. Tak jako polovina čechů nepochopí, že demokracie je dobrá, imho nepochopí ani polovina programátorů, že dynamické jazyky jsou dobré. Starý struktury musí vymřít a to špatný nerozujný mládí s tím už takové problém nemá.
Sorry, ale podle čeho soudíš že dynamické jazyky nepoužívám? Dělal jsem ve Smalltalku a teď nejvíc v Lue. Oba mi v porovnání se zmiňovaným Javascriptem přijdou výrazně konzistentnější.

BTW, ten podcast mluví o věcech z nichž spousta je na dynamičnosti jazyka úplně nezávislá. Bloky a uzávěry, funkce co vrací funkce, Currying, nebo continuations se vyskytují třeba v Haskellu. Což je pro mně jakýsi vzor toho jak má vypadat dobrý statický typový systém.
Citace
Statické typy nejsou jenom o jejich deklaraci, ale o tom, že ti determinují, co můžeš za běhu s programem ještě dělat a co už ne. Zjednodušeně řečeno, statické jazyky rozlišují kód a data, dynamické nikoliv (byť míra implementace je různá).  V dynamickém jazyku můžeš kód používat stejně jako data. Což by ti mělo úplně měnit pohled na program a programování, má to řadu důsledků a možností, třeba javascriptové aplikaci můžeš nový kód posílat jako data a za běhu měnit její funkčnost. A ne jako nějakou nouzovou záležitost, kdy servr opravuje za běhu lokální na js založenou aplikaci, ale jako běžné chování. Staticky myslícím programátorům se z toho zvedá kufr, pro ně je to prasárna, všechno chtějí mít pevné, neměnné, prostě statické předem zkontrolované, dynamicky 'mutujíci se' program je pro ně představa z pekla. Přitom přesně takto webové aplikace fungují, nalinkovaný js do stránky není nic jiného než program poslaný jako data, s každou stránkou se mohou načíst jiné, z pohledu uživatele se to mění za běhu aplikace, dělat změny i za běhu interpretu (zjednodušuji, vím) je už jen drobné rozšíření tohoto konceptu. Nebo třeba autonomně za běhu programu se vytvářející stovky nových tříd/datových typů na základě obsahu příchozích dat, která jsou hodně variabilní (na to aby je programátor předem otypoval všechny ručně), ale mají své časté opakující se vzory, aby stálo za to jim přiřadit vlastní datové typy.
Opravdu mi browser servíruje dynamicky generované kusy javascriptu? Není to spíš tak, že dostávám předpřipravené kousky, které někdo odladil, otestoval, možná prohnal nějakým transpilerem, linterem a obfuskátorem? S důrazem hlavně na to testování, protože můj dojem z dynamických jazyků je, že důkladné pokrytí testy je jediný způsob, jak se z toho nezbláznit. A taky jak si být aspoň trochu jistý, že jsem vychytal aspoň překlepy.

Stejně by mi webserver mohl servírovat kousky java/.net bytekódu, nebo dokonce x86 binárky. A nebo reálněji třeba webassembly. Mimochodem i ten javascript, co dostávám, mohl vzniknout transpilací z nějakého statického jazyka. Jako příjemce by to pro mně neznamenalo žádný rozdíl.
Citace
To jenom pro představu možností. To že ty osobně nenarážíš na možnosti statických typů je proto, že myslíš staticky a nechceš proto po nich víc, než ti umožňují. Zkus ale nahradit javascript v prohlížeči nějakým statickým jazykem. Ne že by to nešlo, ale narazíš na řadu omezení a problémů, která to přinese. Ne že by to lidé nezkoušeli, kdo si pamatuje java applety? Jestli tohle ti neumožní alespoň vidět nové možnosti, které přináší dynamické jazyky, tak ti asi nic nepomůže. A pokud ano, tak chápeš nesmyslnost tvrzení, že dynamické jazyky jsou stejné jako statické, ale horší.
Jinak zbytek keců o tom že to staticky myslícímu člověku nejde vysvětlit, nebo že to buď vidím nebo mi nic nepomůže si vážně můžeš nechat. Mohl bych to jednoduše otočit stylem že dynamicky myslící člověk není schopný pobrat výhody statických jazyků. Přínos nula.

191
A ještě jedna věc. Ta moje připomínka vlastně není primárně o typech. Proto jsem tam psal o těch různých intech. Proměnná není primárně ukazatel. To už je implementační detail. Primární je lidsky čitelné jméno. A díky té recyklaci už ze jména není vidět rozdíl mezi stavy před a po. A ten rozdíl důležitý je, jinak bys tu transformaci nedělal.

192
Neni to zadny napor na hlavu, promenna je ukazatel na data a jedna se o stejna data, jen v jine forme. Jake optimalizace si dela prekladac me prakticky nezajima. Zkus to vnimat jako prechod na vyssi formu abstrakce nesvazanou s datovym typem. A je to abstrakce pro programatora, nikoliv pro prekladac. Vyvoj v it jde smerem, ze se stroje stale vic prizpusobuji lidskemu mysleni. Viz jak to zacalo, programovani ve strojovem kodu.
Ale ona to úplně stejná data nejsou. V podobě intu to má výrazně menší stavový prostor než ve formě stringu.

Pokud je to string na vstupu, pak je ten stavový prostor větší o nejrůznější chybný nebo útočný binec. Pokud ten rozdíl odignoruju, mám bezpečnostní díru.
Pokud je to string na výstupu, pak je ten stavový prostor větší o to, jak ten int chci vypsat. U intu těch možností moc není, ale u jiných typů ten stavový prostor bobtná dost zásadně.

Kdyby opravdu nezáleželo na datovém typu, tak to může zůstat jako int (nebo string). Ale ono je to z nějakého důvodu nutné převést. A ten důvod z té abstrakce prosakuje ven (leaky abstraction). Typ (ve formě množiny hodnot, které můžu čekat) tam stále je.

193
Vývoj / Re:Doporučte programovací jazyk pro Windows
« kdy: 03. 04. 2020, 16:22:19 »
Viz výše. Prostě nepoužívá a nedává ani žádný smysl, aby tomu tak bylo, že? A tohle tvrdí jinak určitě inteligentní člověk. Takhle ho používají jen ti, kdo s ním neumí, ti kdo ho nechápou, ti kdo ho vnímají jako zmrzačený statický jazyk (být rybou je nahouby, vždyť každý ví, že nemá nohy a proto se nemůže hýbat), kterému něco zásadního chybí. A používají ho většinou z donucení vnějších okolností. Dokud statické typy chápeš jako něco, co ti pomáhá a chybí, místo jako věc, která tě omezuje a která ti překáží, tak nechápeš dynamický jazyk. Jeden z důvodů nepocgopení je, že se statickým typům přisuzují vlastnosti, které jim nepřísluší, viz můj odkaz na staticky typovaný jazyk C. Místo k zamyšlení vedl k nadávkám, protože lidé se svého myšlení vzdávají neradi, je to dost nákladné.
Já jsem jeden z těch, co vnímají statické typy jako pomoc a občas mi zatraceně chybí. Takže bych to využil a zeptal se na nějaké bližší info. Máš nějaké materiály nebo příklady toho, jak má vypadat to přemýšlení, které využívá výhody dynamických jazyků? Něco co by mi ten jiný styl uvažování trochu osvětlilo?

Zatím veškerá omezení, která jsem kdy cítil vycházela spíš z nedokonalé implementace než ze statických typů jako takových. V jazycích s rozumnými generiky a typovou inferencí nemám pocit, že by mě typy nějak omezovaly v rozletu.

194
Naprosto nic nemam proti vystiznym identifikatorum, naopak! Ale identifikator ma popisovat obsah a ne datovy typ. Ten by mel jazyk nebo tooling resit extra. Jestli si pises el namisto element, nemam s tim problem, ale jakmile si nekdo pise predponu i jako integer nebo s jako string, je za tim zrejme neco podivneho.
Já bych tady přidal, že ten datový typ by měl co nejvíc vypovídat o tom obsahu. Pokud můžu různé věci reprezentovat různými typy, tak je to jen dobře. Nejde to samozřejmě vždycky, ale věci co mi hlídá překladač si nemusím hlídat já.

Nechat předpony pro věci, co překladač neohlídá, mi přijde hodně rozumné.

Tak protoze ja v Pythonu  cpu do jedne promenne ruzne typy, tak to nerozlisuju
Kód: [Vybrat]
cislo = '1'
cislo = int(cislo)
No tak tahle recyklace mi přijde jako zbytečný dodatečný nápor na hlavu. A to nejenom int+string ale třeba i recyklovat jednu proměnnou pro několik logicky různých intů. Už mi pro přemýšlení o obsahu nestačí jméno, ale musím tam zahrnout i místo.

Nevím jak v pythonu, ale moderní optimalizující překladače zlikvidují jakoukoliv takovouhle recyklaci jako jednu z prvních věcí, protože v SSA formě dostane každé přiřazení svou unikátní proměnnou.

195
windows.h je hnusný smrdutý výhonek pekla. A ta maďarská notace je ještě ta lepší část. Chápu historické důvody, které to způsobily, ale stejně to jen na zlost.

Proč se mi sakra moje metoda neslinkuje? Aha, protože se jmenuje "CreateFile" a někde se mi tam dostalo windows.h.
Proč mi sakra překladač vyhazuje takovou nesrozumitelnou chybu? Aha, já pojmenoval proměnnou "far" a někde se mi tam dostalo windows.h.

windows.h je dobré mít nepropustně zabalené a oddělené od zbytku kódu. A při údržbě doporučuju gumové rukavice a dvoumetrové bidlo. :D
A pokud to nejde, tak neincludovat windows.h přímo, ale přes vlastní header který #undefne všechny ty pasti.

Stran: 1 ... 11 12 [13] 14 15 ... 22