Frustrace ze stavu mainstreamových programovacích jazyků

Aoidhghean

Re:výjimky
« Odpověď #60 kdy: 22. 08. 2017, 11:09:10 »
Velice děkuji všem řečníkům za tenhle rozbor "výjimek". Je to hrozně stará vesta, ale mému hovězímu mozku výjimky dlouhodobě "tak nějak nevyhovují" a nedocházejí. Teď dokážu ten pocit asi i definovat: vadí mi samotný princip, že se snažím oddělit místo zjištění chyby od místa, kde se na ni snažím nějak smysluplně reagovat. V mém přízemním pojetí místo zjištění chyby poskytuje maximum kontextu, potřebného k nějaké smysluplné reakci na vyskytnuvší se chybu. Mohu to zkusit znova, mohu si učinit specifickou poznámku pro nějaké následné zpracování, mohu inteligentně uklidit a nahlásit nějakou mírně abstrahovanou informaci o úroveň výš apod. Jasně, toto lze i s použitím výjimek. Jako výhoda výjimek bývá uváděna čistota kódu, nezapraseného ustavičným lokálním ošetřováním chybových stavů. Nojo, ale když ty chybové stavy řeším pak někde o kus dál všechny na jedné hromadě, oddělené od kontextu jejich vzniku, to má být přehledné a pochopitelné?

Mám pocit, že ať už to člověk píše "postaru" nebo s výjimkami, nakonec je to hlavně o sebekázni a pečlivosti - jak vysoko (daleko od místa vzniku) chybu zachytit a řešit, jak podrobně předem počítat s možností výskytu různých druhů chyb, jak moc "defenzivně" je vhodné programovat apod.
Výhoda výjimek je jen v tom, že umožňují "long jump". Nevýhoda je v tom, že jdou zneužít k simulaci longjmp. Nejlépe má výjimky udělané Swift, i když v knihovně to s nimi trochu přehnali.


Re:výjimky
« Odpověď #61 kdy: 22. 08. 2017, 11:18:17 »
Tohle ale není moc dobrý příklad použití výjimek. Když použijete výjimky správně, budete výjimku pořád ošetřovat v místě jejího vzniku, kde znáte kontext, a pokud se nepodaří ji na daném místě vyřešit, pošlete dál nějakou obecnější výjimku.
A taky je výhoda v tom, že člověk může na nějakém místě ošetřit jenom určitou třídu výjimek (např. ty souborové chyby) a ostatní pustit na vyšší vrstvu - přičemž je hnedka z kódu jasné, co pouští dál (třeba u Javy úplně explicitně). To se sice dá s návratovými kódy taky simulovat, ale je to krkolomnější, málo explicitní a většina jazyků neumí zkontrolovat, že bylo ošetřeno opravdu všechno, co může nastat (pokrytí celého výčtového typu kontrolují většinou jenom funkcionální jazyky).

JS

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #62 kdy: 22. 08. 2017, 13:06:02 »
Krome navratovych hodnot a vyjimek existuje jeste treti bezny mechanismus osetrovani chybovych stavu - error handlery. To ma treba Common Lisp ve forme signalu. (Bohuzel, moje oblibena kniha Code Complete na tenhle treti zpusob zapomina, za coz puvodne asi muze dost omezena implementace signal handleru v Unixu, ktera zpusobila, ze v C-like jazycich tato metoda neni prilis popularni.)

Z hlediska programatora jede v podstate vzdy o kompromis mezi temito tremi mechanismy. Vyjimky jsou lepsi nez navratove hodnoty, protoze umoznuji osetrit chybu na libovolne urovni. Error handlery jsou lepsi nez vyjimky, protoze neodvinou zasobnik a lokalni promenne. Navratove hodnoty jsou lepsi nez error handlery, protoze jsou podstatne jednodussi na pouzivani.

Ve funkcionalnim programovani se ty tri moznosti trochu stiraji do jednoho zpusobu (chyba jako navratova hodnota), protoze obvykle maji dostatecne moznosti abstrakce, takze umoznuji tak nejak emulovat vyhody ostatnich zpusobu.

Honza

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #63 kdy: 22. 08. 2017, 13:18:24 »
Error handlery jsou lepsi nez vyjimky, protoze neodvinou zasobnik a lokalni promenne.
Tohle ale neplatí ve všech programovacích jazycích! Víme? Ne všude se odvíjí celý zásobník, a můžeme tedy pokračovat i od místa, kde výjimka vznikla. O čemž si ta zbývající většina programovacích jazyků může nechat jen zdát.

JS

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #64 kdy: 22. 08. 2017, 13:46:20 »
Error handlery jsou lepsi nez vyjimky, protoze neodvinou zasobnik a lokalni promenne.
Tohle ale neplatí ve všech programovacích jazycích! Víme? Ne všude se odvíjí celý zásobník, a můžeme tedy pokračovat i od místa, kde výjimka vznikla. O čemž si ta zbývající většina programovacích jazyků může nechat jen zdát.

Ano, vime, tomu se rika error handler, a napsal jsem o tom predchozi prispevek. ;-)


Honza

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #65 kdy: 22. 08. 2017, 14:11:38 »
Error handlery jsou lepsi nez vyjimky, protoze neodvinou zasobnik a lokalni promenne.
Tohle ale neplatí ve všech programovacích jazycích! Víme? Ne všude se odvíjí celý zásobník, a můžeme tedy pokračovat i od místa, kde výjimka vznikla. O čemž si ta zbývající většina programovacích jazyků může nechat jen zdát.

Ano, vime, tomu se rika error handler, a napsal jsem o tom predchozi prispevek. ;-)
Dobře dobře, asi jsme si nerozumněli. Stejně tak by se dalo říct, že: error handler je VŽDY to místo kde se ošetřuje výjimka, ale co se děje se zásobníkem je věc jiná, a to je různé.

JS

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #66 kdy: 22. 08. 2017, 14:58:20 »
Error handlery jsou lepsi nez vyjimky, protoze neodvinou zasobnik a lokalni promenne.
Tohle ale neplatí ve všech programovacích jazycích! Víme? Ne všude se odvíjí celý zásobník, a můžeme tedy pokračovat i od místa, kde výjimka vznikla. O čemž si ta zbývající většina programovacích jazyků může nechat jen zdát.

Ano, vime, tomu se rika error handler, a napsal jsem o tom predchozi prispevek. ;-)
Dobře dobře, asi jsme si nerozumněli. Stejně tak by se dalo říct, že: error handler je VŽDY to místo kde se ošetřuje výjimka, ale co se děje se zásobníkem je věc jiná, a to je různé.

Nedalo by se to rict - error handler je rutina, ktera se vola, ne misto ve zdrojaku. A protoze je to rutina, ktera se vola, se zasobnikem (a tedy lokalnimi promennymi) se nic nedeje.

Aspon tak to funguje na te nejnizsi urovni, a na te nejnizsi urovni jsou skutecne tyto tri moznosti, jak se vyporadat s chybami. Muzes to samozrejme ruzne abstrahovat (jak to delaji treba funkcionalni jazyky, nebo dalsi jazyky, ktere abstrahuji samotny koncept zasobniku), ale to jen znamena, ze si s tim za tebe nejak poradi prekladac a vyuzije jednu z tech tri moznosti.

Honza

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #67 kdy: 22. 08. 2017, 15:34:02 »
Nedalo by se to rict - error handler je rutina, ktera se vola, ne misto ve zdrojaku. A protoze je to rutina, ktera se vola, se zasobnikem (a tedy lokalnimi promennymi) se nic nedeje.
Pokud to tedy není totéž, jako "exception handler", který si napíšu do zdrojáku, tak se ptám, jestli je to totéž, jako když vyhodím výjimku, která se zásobníkem také "nic nedělá"(?) A když se to jmenuje error handler, je to použitelné pouze pro chyby, nebo tím můžu signalizovat vyšší vrstvě třeba i průběh nějaké operace?
Potom by se to mělo jmenovat asi jinak.

JS

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #68 kdy: 22. 08. 2017, 16:14:27 »
Nedalo by se to rict - error handler je rutina, ktera se vola, ne misto ve zdrojaku. A protoze je to rutina, ktera se vola, se zasobnikem (a tedy lokalnimi promennymi) se nic nedeje.
Pokud to tedy není totéž, jako "exception handler", který si napíšu do zdrojáku, tak se ptám, jestli je to totéž, jako když vyhodím výjimku, která se zásobníkem také "nic nedělá"(?) A když se to jmenuje error handler, je to použitelné pouze pro chyby, nebo tím můžu signalizovat vyšší vrstvě třeba i průběh nějaké operace?
Potom by se to mělo jmenovat asi jinak.

O jakem jazyce mluvis, prosim te? Ano, nektere jazyky umoznuji definovat error handler ve zdrojaku, treba Common Lisp (nebo PL/I).

Podstatne je, ze to o cem mluvim, jsou tri zakladni zpusoby implementace osetreni chyb. Moznosti konkretniho jazyka pak mohou tem implementacim bud primo odpovidat, nebo od nich byt nejak abstrahovany. V jazycich nizsi urovne (tedy tak zhruba po Javu/C# vcetne) to vicemene primo odpovida.

fejnijf

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #69 kdy: 22. 08. 2017, 16:31:21 »
Nedalo by se to rict - error handler je rutina, ktera se vola, ne misto ve zdrojaku. A protoze je to rutina, ktera se vola, se zasobnikem (a tedy lokalnimi promennymi) se nic nedeje.
Pokud to tedy není totéž, jako "exception handler", který si napíšu do zdrojáku, tak se ptám, jestli je to totéž, jako když vyhodím výjimku, která se zásobníkem také "nic nedělá"(?) A když se to jmenuje error handler, je to použitelné pouze pro chyby, nebo tím můžu signalizovat vyšší vrstvě třeba i průběh nějaké operace?
Potom by se to mělo jmenovat asi jinak.
Když on je ty a ty jsi on a ty jsi ty, jsem já furt já? Kdo jí tohle kuře, co? Co se to sakra děje??

Honza

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #70 kdy: 22. 08. 2017, 17:02:43 »
Nedalo by se to rict - error handler je rutina, ktera se vola, ne misto ve zdrojaku. A protoze je to rutina, ktera se vola, se zasobnikem (a tedy lokalnimi promennymi) se nic nedeje.
Pokud to tedy není totéž, jako "exception handler", který si napíšu do zdrojáku, tak se ptám, jestli je to totéž, jako když vyhodím výjimku, která se zásobníkem také "nic nedělá"(?) A když se to jmenuje error handler, je to použitelné pouze pro chyby, nebo tím můžu signalizovat vyšší vrstvě třeba i průběh nějaké operace?
Potom by se to mělo jmenovat asi jinak.

O jakem jazyce mluvis, prosim te? Ano, nektere jazyky umoznuji definovat error handler ve zdrojaku, treba Common Lisp (nebo PL/I).

Podstatne je, ze to o cem mluvim, jsou tri zakladni zpusoby implementace osetreni chyb. Moznosti konkretniho jazyka pak mohou tem implementacim bud primo odpovidat, nebo od nich byt nejak abstrahovany. V jazycich nizsi urovne (tedy tak zhruba po Javu/C# vcetne) to vicemene primo odpovida.

Pro Lisp a Výjimky platí toto:
Citace
Transfer of Control to an Exit Point:
1) Intervening exit points are abandoned
...
Zdroj: http://www.lispworks.com/documentation/HyperSpec/Body/05_b.htm

Citace
In Common Lisp, there are functions throw and catch, but these are not related to the condition system.
Zdroj: https://rosettacode.org/wiki/Exceptions#Common_Lisp

Takže ano, error handler v Lispu je něco jiného než Výjimky. Ale říkají tomu jinak.

Už jsem si málem myslel, že to Lisp umí taky, ale neumí. Smalltalk to výjimkami umí - pokračovat tam, kde kde byla výjimka signalizována.

JS

Re:Frustrace ze stavu mainstreamových programovacích jazyků
« Odpověď #71 kdy: 22. 08. 2017, 18:03:27 »
Takže ano, error handler v Lispu je něco jiného než Výjimky. Ale říkají tomu jinak.

Ne uplne jinak - mas signal a k nemu error handler. Tahle terminologie pokud vim pochazi z operacnich systemu a saha minimalne nekam do zacatku 60. let. Ostatne muzes to videt i na Unixu, kde je bohuzel ta myslenka dost omezena (pouzitelnych signalu je jen hrstka). A z toho vyplyva neznalost te koncepce u Cckaru a Javistu.

Citace
Už jsem si málem myslel, že to Lisp umí taky, ale neumí. Smalltalk to výjimkami umí - pokračovat tam, kde kde byla výjimka signalizována.

To je mozne, Smalltalk neznam, ale rekl bych, ze v takovem pripade ten rozdil nedava moc smysl, protoze implementace Smalltalku nema nutne zasobnik. Ale vyjimky se treba sveho casu v C++ (a jak koukam do Wikipedie, tak asi i v Lispu, z ktereho ten koncept pochazi) implementovaly primo zmenou prislusneho ramce zasobniku.

Jelikoz je Lisp pomerne nizkourovnovy, tak ma jak vyjimky, tak signaly. (A k tomu samozrejme i vraceni navratovych hodnot - dokonce vice nez jedne.)