Article View: pl.comp.programming
Article #205302Re: Co sie tu dzieje?...
From: Andrzej Jarzabek
Date: Mon, 29 Apr 2013 15:32
Date: Mon, 29 Apr 2013 15:32
180 lines
10779 bytes
10779 bytes
On Apr 29, 2:32 pm, Edek <edek.pienkow...@gmail.com> wrote:
> Dnia Mon, 29 Apr 2013 04:29:20 -0700 po głębokim namyśle Andrzej Jarzabek
> rzekł:
>
> > No ale wyjątki (takie jak w Javie czy C++) nie służą do powiadamniania
> > procesów. Jeśli trzeba powiadomić procesy, to kod, który to robi możesz
> > mieć w catch.
>
> Tylko że to jest strasznie niewygodne.
Tak samo niewygodne, jak zwracanie z funkcji pary (wynik, błąd).
> Działa ok w c++ dla prostych
> rzeczy, typu odczytaj dokument z bazki, przetwórz, zapisz, ale mając
> nie jeden wątek tylko masę i bilioteki w setkach tysięcy linii kodu
> nawet RAII robi się kłopotliwe gdy dołączona jest reakcja
> zewnętrznych systemów.
W ramach tego, że w C++ nie masz wbudowanych mechanizmów takich jak
channel i goroutine, nie jest to bardziej kłopotliwe niż rozwiązanie
bez wyjątków.
A że zamiast goroutines używasz bibliotek dających ci patterny takie
jak futures, to jest to zdecydowanie mniej kłopotliwe, bo owe
biblioteki zapewniają ci propagację wyjątków przez granicę wątku.
> Dopiero małe goroutines z mniejszym stosem są światełkiem
> w tunelu. Zamiast olbrzymiego stosu przez który leci wyjątek ma
> się niewielkie procedury połączone kanałami. Widzę, że niedługo
> powiemy, że BASIC też działał.
Nic ci to nie zmienia, nadal musisz ten błąd obsłużyć. W Erlangu
różnicę masz faktycznie o tyle, że piszesz programy w ten sposób, że
każdy błąd powoduje ubicie "procesu", który możesz potem albo
automatycznie restartować, albo czekać na interwencję operatora, który
może dojść do tego co się stało i naprawić błąd - włącznie z
poprawieniem błędnego kodu i uruchomieniem go bez zatrzymywania
systemu.
> > recover i jak dla mnie są to po prostu wyjątki, tylko troszeczkę inaczej
> > zrobione. Z tego co przeczytałem jest to ficzer dodany do języka w
> > późniejszym etapie i sądzę, że narzekanie, że nie ma wyjątków raczej
> > pochodzi z czasu, kiedy nie było.
>
> Hmm. Ja żyję tu i teraz, ale może źle robię ;)
I narzekasz, że Go nie ma wyjątków?
> > Jeśli chodzi o to, co panic/recover wnoszą do rozproszonej architektury,
> > to przykro mi, ale nie widzę różnicy. W dodatku z wykorzytsaniem w
> > kontekście współieżności nie wydają się wnosić zbyt wiele w stosunku do
> > wyjątków, bo z tego co wyczytałem to wyjście z goroutine w stanie
> > spanikowanym wywala cały program.
>
> Tu nie ma żadenj różnicy, wyjątki też trzeba łapać. Mi nie jest przykro
> że rozmówca się nie zgadza, wręcz przeciwnie.
Mi jest przykro, że nie widzę różnicy, a nie, że się nie zgadzasz.
Bałem się po prostu, że oślepłem, więc z ulgą przyjmuję do wiadomości,
że różnicy nie ma.
> > Interesującą różnicą między tradycyjnymi wyjątkami a panic/recover jest
> > "dynamiczny" charakter tych drugich. Jak rozumiem defer/recover można
> > rejestrować np. warunkowo w klauzuli if. Czy to dobrze czy źle,
> > nie mam szczególnie zdania: widzę potencjalne problemy z czytelnością,
> > łatwością wnioskowania p programie, wykrywaniem błędów i refaktoryzacją,
> > w dodatku "tradycyjne" podejście oparte o zakresy wydaje mi się
> > elegantsze. Być może natomiast panic/defer/recover mają jakieś ciekawe
> > idiomatyczne sposoby stosowania, które może nawet jeszcze nie są
> > odkryte. Po prostu nie wiem.
>
> Może najpierw "doczytam i wiem" a potem sugerowanie problemów? Podobny
> cleanup stosuje się w C, tylko bez automatycznego zwijania stosu. Z tymi
> znienawidzonymi goto.
No więc otóż również uważam, że C jest kiepskim językiem, w którym
brak sensownych rozwiązań jest przyczyną dużej ilości problemów.
> > Niepokojące natomiast są argumenty ze strony projektantów języka typu
> > "tak, wiemy, że (cośtam w) panic/recover jest kijowe. Specjalnie
> > zrobiliśmy kijowe, żebyście nie używali panic."
>
> No tak, bo panic to wszyscy lubią. Ech... . Go ma taką filozofię:
> pozwlamy pisać ryzykowny kod, ale oferujemy bezpieczne metody
> pisania.
Nie ma nic szczególnie bezpiecznego w tym, co oni proponują zamiast.
Odpowiednikiem rzucenia wyjątku i nie złapania go jest coś takiego:
foo, err := getFoo(bla)
bar, err := makeBar(foo)
Tak, oczywiście, taki mechanizm i taka konwencja są krokiem do przodu
w stosunku do tego, co jest w C, ale nad wyjątkami nie widzę żadnej
przewagi.
> > Ach, ale akurat to, czy wyjątki są dobre, czy niedobre to jest oddzielny
> > temat od tego, czy sprzątanie zasobów przez finally jest dobre czy
> > niedobre. Są języki, które mają inne rozwiązania rtego problemu, i nawet
> > w samej Javie da się stworzyć (i tworzy się)
> > odpowiednie wrappery.
>
> Ja podałęm konkretny przykład i nic nie mówiłem o tym, czy finally
> jest "dobre" czy "niedobre". Mając RAII używa się RAII, mając finally
> używa się finally, mając goto w C używa się goto. Mówimy o braku
> wyjątków w Go i z czym to się je w porównaniu do innych języków.
Ale twój argument dotyczył tego, że defer jest lepsze od sprzątania
zasobów niż finally. Może i jest, ale to nie jest argument za tym, że
bez wyjątków lepiej, bo przecież istnieje wiele mechanizmów językowych
do sprzątania zasobów lepszych niż finally.
W Groovy na ten przykład, który ma dokładnie takie same wyjątki jak
Java, problem zamykania pliku można załatwić w ten sposób:
myFile.withWriter { writer ->
zapisuj_do_pliku_używając writer
}
> > Takie rozwiązanie, jak daje ci go, czyli złapać wyjątek w wątku, który
> > go rzucił i przekazać jako wynic coroutine to z grubsza tak samo możesz
> > zrobić w C++ przy pomocy future, try/catch, i pair.
>
> Ano nie. To znaczy da się, ale praktyka zupełnie inaczej wygląda.
Praktyka jest taka, że się używa wyjątków, bo tak lepiej.
> W BASICu też się da pisać.
Ale nie da się uzyskać praktycznie tego samego rezultatu.
> > [...]
> > No więc dokładnie w taką stronę, w jaką mu exception handler każe
> > polecieć. Dokładnie tak jak z panic w Go.
>
> Ano nie. Chociażby kod podzielnoy jest na goroutines, a nie na
> jeden monolityczny wątek ze stoma ramkami stosu.
Ale dlaczego monolitycznego? Wątki masz takie, jakie sobie napiszesz.
Dokładnie tak samo, jak rozumiem, jak goroutines - będzie ich tyle i
takie duże, jak sobie programista podzieli program. Mylę się?
> To inna architektura,
> trzeba przekazać informację o błędzie przez channele a nie tylko w górę
> stosu.
I czym to się różni od programu wielowątkowego w C++?
> Panic nie jest "dokładnie tak samo", tylko właśnie "zupełnie
> inaczej", choć ma wspólne cechy, bo służy do tego samego celu.
Jest dokładnie tak samo, z dokładnością do duperel. Tak samo jak
wyjątek przerywa wykonanie bieżącej funkcji i zwija stos tak długo, aż
nie trafi na handlera. Różnica jest taka, że handlery można sobie
dynamicznie rejestrować, co z pewnością może być przyczyną wielu
radosnych błędów, ale czy ma jakieś praktyczne zastosowania?
> > Po przyjrzeniu się wygląda trochę tak, jakby w Go interfejsy dawały
> > generyczność - przynajmniej taką jak w Javie, a może nawet trochę
> > mocniejszą. Nie mam racji?
>
> Oj, j.w., doczytajmy może najpierw. Bo ja już nie wiem, czy brakuje
> generyków czy są generyki, zdecydujmy się na zajęcie jakiejś
> pozycji w argumentacji, pogubiłem się ;)
Moja pozycja jest taka: w językach statycznie typowanych generyki w
takiej czy innej formie są przydatne. Również, a może nawet przede
wszystkim przy pisaniu złożonych systemów serwerowych, również w
przypadku, kiedy są one współbieżne czy rozproszone.
W temacie czy Go ma generyki, wyjątki i tak dalej nie mam żadnego
szczególnego stanowiska - tak czy inaczej raczej używać nie będę. Na
podstawie tego, co widzę pobieżnie się przyglądając, Go ma wyjątki i
generyki. Jeśli chcesz mi wyłumaczyć, dlaczego panic/recover nie są
wyjątkami w takim sensie, jak exceptions z Javy czy C++, albo dlaczego
interfejsy nie są typami generycznymi w takim sensie, jak w Javowych
generics, to chętnie przeczytam i ewentualnie podyskutuję. Nie chce ci
się - też dobrze, możemy w takim razie chyba zakończyć dyskusję na
tym, że nasza rozbieżność zdań co do przydatności generyków i wyjątków
bierze się stąd, że inaczej rozumiemy te pojęcia.
Technical Details
Message-ID:
<bd0831b9-2287-4ac7-9b4f-13b1a933741e@o19g2000vbm.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.glorb.com!s14no812979qam.0!news-out.google.com!ef9ni28916qab.0!nntp.google.com!s14no812978qam.0!postnews.google.com!o19g2000vbm.googlegroups.com!not-for-mailReferences:
<3rrbn85nv2btd2954n8msmp3ca02fbhljd@4ax.com> <cj6dn8tqjh1b88pb9etke84tilc2qtftbf@4ax.com> <9318dafe-e85c-4ebd-905b-2628ad89160f@googlegroups.com> <5oldn8913m5ov0ukr3coij9efbls7r41st@4ax.com> <6944983c-9c87-4618-94ce-30a83e5c12a7@googlegroups.com> <klcnu3$d98$1@somewhere.invalid> <84396146-1604-45f3-8d5a-e61fbdbe827e@googlegroups.com> <77ef23cf-b20c-47fd-ac81-03d5b1558bce@r7g2000vbw.googlegroups.com> <kle28d$iv$1@mx1.internetia.pl> <59792813-18e9-4d7d-b9f5-519786719e48@s4g2000vbr.googlegroups.com> <klec7k$iv$2@mx1.internetia.pl> <klf36m$6e0$1@somewhere.invalid> <klgghb$79t$3@mx1.internetia.pl> <klhl6o$cnr$1@somewhere.invalid> <klhq1c$ehd$3@mx1.internetia.pl> <kljrr4$fu5$1@somewhere.invalid> <klk9q7$q9d$1@mx1.internetia.pl> <6cde8286-5e8c-4004-9e06-cd0355272efe@a14g2000vbm.googlegroups.com> <kllspv$ooe$2@mx1.internetia.pl>Show Full Headers
Complete Article Headers
X-Received: by 10.224.88.200 with SMTP id b8mr41193437qam.8.1367249536557; Mon, 29 Apr 2013 08:32:16 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.182.246.106 with SMTP id xv10mr80582obc.14.1367249536528; Mon, 29 Apr 2013 08:32:16 -0700 (PDT) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.glorb.com!s14no812979qam.0!news-out.google.com!ef9ni28916qab.0!nntp.google.com!s14no812978qam.0!postnews.google.com!o19g2000vbm.googlegroups.com!not-for-mail Newsgroups: pl.comp.programming Date: Mon, 29 Apr 2013 08:32:16 -0700 (PDT) Complaints-To: groups-abuse@google.com Injection-Info: o19g2000vbm.googlegroups.com; posting-host=80.254.146.36; posting-account=jr5y-woAAAAWidgVjrSJ6j8m650CTb-v NNTP-Posting-Host: 80.254.146.36 References: <3rrbn85nv2btd2954n8msmp3ca02fbhljd@4ax.com> <cj6dn8tqjh1b88pb9etke84tilc2qtftbf@4ax.com> <9318dafe-e85c-4ebd-905b-2628ad89160f@googlegroups.com> <5oldn8913m5ov0ukr3coij9efbls7r41st@4ax.com> <6944983c-9c87-4618-94ce-30a83e5c12a7@googlegroups.com> <klcnu3$d98$1@somewhere.invalid> <84396146-1604-45f3-8d5a-e61fbdbe827e@googlegroups.com> <77ef23cf-b20c-47fd-ac81-03d5b1558bce@r7g2000vbw.googlegroups.com> <kle28d$iv$1@mx1.internetia.pl> <59792813-18e9-4d7d-b9f5-519786719e48@s4g2000vbr.googlegroups.com> <klec7k$iv$2@mx1.internetia.pl> <klf36m$6e0$1@somewhere.invalid> <klgghb$79t$3@mx1.internetia.pl> <klhl6o$cnr$1@somewhere.invalid> <klhq1c$ehd$3@mx1.internetia.pl> <kljrr4$fu5$1@somewhere.invalid> <klk9q7$q9d$1@mx1.internetia.pl> <6cde8286-5e8c-4004-9e06-cd0355272efe@a14g2000vbm.googlegroups.com> <kllspv$ooe$2@mx1.internetia.pl> User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31,gzip(gfe) Message-ID: <bd0831b9-2287-4ac7-9b4f-13b1a933741e@o19g2000vbm.googlegroups.com> Subject: Re: Co sie tu dzieje?... From: Andrzej Jarzabek <andrzej.jarzabek@gmail.com> Injection-Date: Mon, 29 Apr 2013 15:32:16 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit