Article View: pl.comp.os.linux.programowanie
Article #60149Re: Pogaduchy o językach (było coś o dużej silni)
From: Maciej Sobczak
Date: Mon, 07 Nov 2005 07:36
Date: Mon, 07 Nov 2005 07:36
119 lines
6507 bytes
6507 bytes
Marcin 'Qrczak' Kowalczyk wrote:
>>>Same obiekty nie potrzebują cechy lokalności
>>>na poziomie języka.
>>
>>Owszem, potrzebują, bo lokalność pozwala określić też czas życia
>>obiektu.
>
> Gdyby tylko pozwalała, to byłby mały problem, ale w C++ ona do tego
> zmusza.
Tego właśnie oczekuję. W przypadku gdy tego nie oczekuję używam pamięci
dynamicznej i (sprytnych) wskaźników. Wtedy wskaźniki są lokalne i mają
czas życia sterowany zakresem, ale czas życia właściwego obiektu jest
sterowany dowolnie, przez odpowiedni schemat użycia wskaźników (to samo
w Adzie).
> Przez to nawet gdybyśmy trzymali obiekt za wskaźnik, to
> lokalna funkcja nie mogłaby odwoływać się do tej samej zmiennej
> wskaźnikowej po zakończeniu zewnętrznej funkcji, bo destrukcja
> wskaźnika, choć w praktyce nic nie robi, powoduje, że zmiennej
> nie wolno już używać.
Lokalna funkcja może bezpieczenie używać *kopii* wskaźnika. Oryginał
może być zniszczony.
>>Często korzystam z obiektów tymczasowych, które nazwy nie mają a
>>mimo to polegam (!) na gwarancjach, które daje mi język w temacie
>>czasu ich życia. Bez takich gwarancji pewnych rzeczy w ogóle nie
>>mógłbym wyrazić tak, jak chcę.
>
> Ja takich obiektów używam nieporównywalnie rzadziej niż lokalnych
> funkcji; w ogóle nie przypominam sobie przypadków, kiedy obiekt
> o destruktorze zwalniającym coś więcej niż pamięć miałby nie mieć
> nazwy.
Destruktor nie musi "zwalniać", żeby jego istnienie miało sens. Czasami
używam destruktorów do wykonania konrektnych zadań, które ze zwalnianiem
czegokolwiek nie mają nic wspólnego.
Faktem jest, że nie jest to ich typowe zastosowanie. Bardziej typowe są
obiekty lokalne, które coś robią - otwierają i zamykają okna na ekranie,
otwierają i zamykają pliki, połączenia do baz danych, sterują
transakcjami, mrugają lampką, itd.
>>void foo()
>>{
>> int local_object;
>>
>> bind(
>> void (int i) { cout << i; }, // lambda z jednym parametrem
>> local_object // dowiązanie local_object do i
>> )(); // aplikacja obiektu funkcyjnego
>>}
>
> To się nie skaluje do większych przykładów. Listowanie zmiennych
> wolnych każdej lokalnej funkcji będzie przykre.
I bardzo dobrze! O to właśnie chodzi, dokładnie tak samo jak z
reinterpret_cast, static_cast, itd. - one też się nie "skalują" do
większych przykładów. To *ma* wystawać z kodu i być widoczne. A w
sytuacji, gdy programista zrobi potwora na 20 takich zmiennych, to ma
być wskazówką, że robi coś podejrzanego, bo np. usiłuje stworzyć kod
zupełnie pozbawiony struktury. Jeżeli sam nie ma hamulców, to może
chociaż dostanie po łapach podczas code review od kogoś, kto to będzie
musiał przeczytać i zrozumieć. Ukrywanie takich rzeczy pod niejawną
składnią to nie jest żaden ficzer.
Nie twierdzę, że takie zastosowania są definitywnie złe - dlatego
chciałbym mieć w C++ lambdy takie, jak pokazałem (podobnie, jak chcę
mieć reinterpret_cast). Ale chcę, żeby takie rzeczy były jawne.
> Przykład. Oryginalna funkcja z mojego kompilatora
[...]
To jakieś nowe rozszerzenie Perla? :)
> Spróbowałem przetłumaczyć to
> na C++.
Jestem zdumiony, że Ci się chciało. Podziwiam, ale nawet po dłuższym
przyglądaniu się nie jestem w stanie takiej sieczki prześledzić.
[sieczka ciach]
> Fajne, nie?
Super. I co to pokazuje?
1. Samochód nie działa jako łódź podwodna.
2. Samochód nie nadaje się do pokonania trasy Kraków-Gdańsk, bo akurat
uparłeś się pokonać tą trasę łodzią podwodną (pomijam przeszkody typu
zapory).
Problem z tym przykładem polega na tym, że usiłujesz swój model wyrazić
w C++ - koncentrujesz się na środkach a nie na celach. Gdybyś
koncentrował się na celach, to zauważyłbyś, że wiele kompilatorów i
translatorów było pisanych w C++ (i w czymkolwiek innym) i nikt takiej
sieczki tam nie napisał (pomijając to, że w C++ nie ma lambdy).
>>Oczywiście, local_object ma *skończyć życie* przy wyjściu z foo().
>>Nie ma prawa żyć dłużej, niż trwa wykonywanie foo().
>
> Wolę mieć tutaj wybór.
Ja ten wybór wyrażam przez rozróżnienie pomiędzy obiektem lokalnym a
lokalnym wskaźnikiem do obiektu (to samo tak samo w Adzie).
>>Twój model nie jest uniwersalny i nie trafia
>>w oczekiwania *wszystkich* programistów.
>
> Ależ temu nie zaprzeczam. A do mnie nie trafia model C++.
I to jest zupełnie inne stwierdzenie, niż to, że model C++ jest martwy.
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<dkn05f$91f$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!irazu.switch.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!newsReferences:
<djfrn5$i55$1@nemesis.news.tpi.pl> <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> <87k6fqeq35.fsf@qrnik.zagroda> <dkcps0$2vq$1@sunnews.cern.ch> <slrndmk3v4.p01.jajcus@serwis2.beta> <dkd731$2u6$1@sunnews.cern.ch> <87psphsc6n.fsf@qrnik.zagroda> <dkf5da$d8g$1@sunnews.cern.ch> <87mzkk8xc0.fsf@qrnik.zagroda> <dkfmp9$msh$1@sunnews.cern.ch> <87ek5wt6iw.fsf@qrnik.zagroda> <dkj057$2bj$1@sunnews.cern.ch> <87mzkihhww.fsf@qrnik.zagroda>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!irazu.switch.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!news From: Maciej Sobczak <no.spam@no.spam.com> Newsgroups: pl.comp.os.linux.programowanie Subject: Re: Pogaduchy o językach (było coś o dużej silni) Date: Mon, 07 Nov 2005 08:36:16 +0100 Organization: CERN - European Laboratory for Particle Physics Lines: 119 Message-ID: <dkn05f$91f$1@sunnews.cern.ch> References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <87k6fqeq35.fsf@qrnik.zagroda> <dkcps0$2vq$1@sunnews.cern.ch> <slrndmk3v4.p01.jajcus@serwis2.beta> <dkd731$2u6$1@sunnews.cern.ch> <87psphsc6n.fsf@qrnik.zagroda> <dkf5da$d8g$1@sunnews.cern.ch> <87mzkk8xc0.fsf@qrnik.zagroda> <dkfmp9$msh$1@sunnews.cern.ch> <87ek5wt6iw.fsf@qrnik.zagroda> <dkj057$2bj$1@sunnews.cern.ch> <87mzkihhww.fsf@qrnik.zagroda> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1131348975 9263 (None) 137.138.37.241 X-Complaints-To: news@sunnews.cern.ch User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Red Hat/1.7.12-1.1.3.2.SL3 X-Accept-Language: en-us, en In-Reply-To: <87mzkihhww.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit