Article View: pl.comp.os.linux.programowanie
Article #60134Re: Jak zrobić program obliczający dużą silnię?
From: Marcin 'Qrczak' Kowalczyk
Date: Wed, 02 Nov 2005 20:45
Date: Wed, 02 Nov 2005 20:45
58 lines
4731 bytes
4731 bytes
Maciej Sobczak <no.spam@no.spam.com> writes:
> Czy obejmowałaby też etykiety (gdybyś je miał)?
Semantyka goto poza najprostszymi przypadkami jest niejasna,
niejednoznaczna. Jeśli skok jest na zewnątrz, to nie wiadomo, do
której instancji zewnętrznego kodu skoczyć; pojawia się też znowu
sprawa try...finally. Jeśli skok jest w przód lub do wewnątrz, to jest
jeszcze gorzej, bo wykonywanie kodu zaczynając od środka może w ogóle
nie mieć sensu. Skok do lokalnej funkcji nie ma sensu już zupełnie,
bo nie wiadomo, skąd ta funkcja miałaby być wołana.
Goto gwałci semantykę poszczególnych konstrukcji językowych jeszcze
bardziej niż break, który pozwala skoczyć tylko na zewnątrz.
Goto jest kompatybilne tylko z językami, w których wszystkie
konstrukcje, przez które chcemy przeskakiwać, są wbudowane w język
i dzięki temu można im określić semantykę przeskakiwania (w różnych
kierunkach).
Nie mogę więc powiedzieć, co by było przy goto, bo ono jest
niekompatybilne z moim modelem.
>> Musi być coś zamiast finally, żeby język był praktyczny.
>
> Oczywiście, tylko że ja na to patrzę odwrotnie (i historycznie chyba
> mam rację): to właśnie finally jest "czymś zamiast". Z takimi
> efektami, jak wspomniałeś.
Co uznajesz za podstawową konstrukcję tego rodzaju?
Ponieważ mój model uwzględnia asynchroniczne sygnały, większość użyć
unwind-protect i try...finally w niewystarczający sposób opisuje, od
którego momentu zacząć pilnowanie wychodzenia z zakresu. Dlatego moja
konstrukcja składa się z trzech kawałków: pobranie zasobu (albo zmiana
stanu), część główna i zwolnienie zasobu (albo przywrócenie stanu).
Składnia using w C# jest do tego odpowiednia. Tyle tylko, że
zwolnienie zasobu jest ustalone na sztywno jako wołanie metody
Dispose; to jest sensownym zachowaniem domyślnym, ale jeśli jedynym,
to zmusza do tworzenia sztucznych bytów. Semantyka using w C# nie
uwzględnia co prawda asynchronicznych sygnałów, ale można by ją
poprawić i prawie nikt by nie zauważył zmiany.
RAII w C++ ma ten sam problem, co wołanie zawsze metody Dispose:
zmusza do opisania zasobu albo stanu klasą z konstruktorami
i destruktorem. Poza tym jest dobre; co prawda też nie uwzględnia
asynchronicznych sygnałów, ale w C++ i tak trzeba je obsługiwać
inaczej niż ja to robię, więc w kontekście C++ to nie szkodzi.
Składnia RAII pasuje prawie tylko do C++, bo większość innych
języków nie umieszcza obiektów w zmiennych ani nie ma rozbudowanego
mechanizmu określania sposobu kończenia życia obiektów wraz
z podobiektami.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID:
<87k6fqeq35.fsf@qrnik.zagroda>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<djfrn5$i55$1@nemesis.news.tpi.pl> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda> <djq3rj$4fm$1@sunnews.cern.ch> <87y84fz1bn.fsf@qrnik.zagroda> <djqg9q$1sg$1@sunnews.cern.ch> <87ll0ezpyl.fsf@qrnik.zagroda> <djsle0$q36$1@sunnews.cern.ch> <877jbx7q2t.fsf@qrnik.zagroda> <dk4n41$aue$1@sunnews.cern.ch> <87vezdanl0.fsf@qrnik.zagroda> <dk9su1$6su$1@sunnews.cern.ch>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Jak zrobić program
obliczający dużą silnię?
Date: Wed, 02 Nov 2005 21:45:34 +0100
Organization: Klub Nieszkodliwych Manjaków
Lines: 58
Message-ID: <87k6fqeq35.fsf@qrnik.zagroda>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda> <djq3rj$4fm$1@sunnews.cern.ch> <87y84fz1bn.fsf@qrnik.zagroda> <djqg9q$1sg$1@sunnews.cern.ch> <87ll0ezpyl.fsf@qrnik.zagroda> <djsle0$q36$1@sunnews.cern.ch> <877jbx7q2t.fsf@qrnik.zagroda> <dk4n41$aue$1@sunnews.cern.ch> <87vezdanl0.fsf@qrnik.zagroda> <dk9su1$6su$1@sunnews.cern.ch>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1130964380 28568 217.96.225.87 (2 Nov 2005 20:46:20 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Wed, 2 Nov 2005 20:46:20 +0000 (UTC)
X-Face: .B/ouEO}=VFkSJWE}s0@!:diHI.Z,<Ilt`:~@*]7rnn^K_y"XV8AXf^E)x*|3yVg:$FCq0Y )iGn@Z[SOA<+p}TkAv'Lzu$w{z2?F);0Xt>`m}AqK#Vjuscq(Vf1B}H[)v\9tBN}>AdP,QSRbhO]=v 3?;I+cN/Z0HKPm_Eg99/pFrU!WfpjgQ!z":>A~qt0^4):0-UuPB(6^>j!mN$)RIb)rRhXeK:+MLPW[ RVb7Kepvby-ww6_zci7Yy_@IrWW
User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)
Cancel-Lock: sha1:K+uBG+/3EtdNsEZ/JQ48jmGuSvY=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit