Article View: pl.comp.os.linux.programowanie
Article #60145Re: Pogaduchy o językach (było coś o dużej silni)
From: Maciej Sobczak
Date: Sat, 05 Nov 2005 19:11
Date: Sat, 05 Nov 2005 19:11
176 lines
8778 bytes
8778 bytes
Marcin 'Qrczak' Kowalczyk wrote:
>>>Ty uwzględniasz
>>>tylko tę łatwiejszą część.
>>
>>Bo tylko ta część ma dla mnie sens.
>
> Śmieszne. W źródle na pierwszy rzut oka w ogóle nie widać, które są
> które. Ten podział jest sztuczny, związany z implementacją, a nie
> z tym, co programista chce wyrazić. One są bardzo sensowne, tylko Twój
> ulubiony C++ nie umie ich oferować.
Kwestia punktu siedzenia:
> [...] przy innym języku i innym
> stylu programowania [...]
Właśnie. To co programista chce wyrazić wynika przede wszystkim ze stylu
programowania. Jeżeli w stylu X nie ma miejsca na konstrukcję Y, to jej
brak w języku Z nie jest ani defektem ani nawet problemem, jeżeli Z
służy do X. Powtórzę po raz n-ty: Twój styl i konstrukcje, których
używasz, nie są uniwersalnie dobre. Fajnie, że istnieją języki, które to
wspierają (na pewno Ci raźniej ;) ), ale nie oczekuj, że "docelowo"
wszyscy na to polecą. Różni ludzie mają różne cele.
(W tym kontekście nie ma znaczenia, czy C++ jest "mój ulubiony", czy nie.)
>>>C++ samo się na to skazało przez nieuwzględnienie odśmiecania
>>>i przez przymusowe niszczenie obiektów zawartych w zmiennych
>>>lokalnych, nawet jeśli będą jeszcze potrzebne.
>>
>>Jeśli będą jeszcze potrzebne, to znaczy, że nie są lokalne.
>
> Nazwy, przez które odwołujemy się do tych obiektów, są lokalne,
> bo nie są globalne. Same obiekty nie potrzebują cechy lokalności
> na poziomie języka.
Owszem, potrzebują, bo lokalność pozwala określić też czas życia
obiektu. Nazwa obiektu to pikuś - jej lokalność jest fajna, bo nie
zaśmieca globalnej przestrzeni nazw, ale gdyby tylko o to chodziło, to
nie byłoby o co się spierać. Czas życia obiektu jest czymś, co jest dla
mnie kluczowe i pojęcie lokalnoci obiektu związuję z czasem życia a nie
z widocznością w takim czy innym zasięgu.
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ę.
>>Dostęp do obiektów na zewnątrz funkcji lokalnej mógłby mieć różne
>>formy (przez wartość, przez referencję)
>
> Wystarczy tylko przez referencję. Dostęp przez wartość jest
> szczególnym przypadkiem dostępu przez referencję, bo to po prostu
> dostęp do innego obiektu, do kopii tego pierwszego.
OK. Wymaga to jednak dodatkowej składni (trzeba coś zrobić, żeby
stworzyć kopię).
>>i być rozwiązywany w różnym czasie (przy definicji funkcji lub przy
>>jej aplikacji).
>
> Wystarczy tylko przy definicji. Rozwiązywanie dostępu przy aplikacji
> jest szczególnym przypadkiem dostępu przy definicji, kiedy to zmienna,
> przez którą odwołujemy się do tego obiektu, implementuje dynamiczne
> wiązanie
OK. Ponownie wymaga to dodatkowej składni.
Tak czy inaczej z Twoich "szczególnych" przypadków jednego tematu robią
się trzy różne składnie.
>>Już takie pobieżne rozpatrzenie tematu daje 3 sensowne możliwości
>>(wartość/kopia ewaluowana w czasie definicji, wartość/kopia
>>ewaluowana w czasie aplikacji, referencja).
>
> Poproszę tylko trzecią wersję, resztę sobie z niej sam zrobię w razie
> potrzeby.
OK. Podobnie, ja (gdybym miał lambdy takie jak zaproponowałem), przy
użyciu binderów, mógłbym sobie zrobić "dostęp" z funkcji lokalnych do
zmiennych na zewnątrz:
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
}
Funkcja bind bierze obiekt funkcyjny (tutaj lambdę z jednym parametrem)
i obiekt local_object, oraz zwraca nowy obiekt funkcyjny o zredukowanej
arności. Na końcu jest aplikacja wynikowego obiektu funkcyjnego, ale
można by go też przekazać gdzie indziej.
Oczywiście, można też tak:
void (int i) { cout << i; } (local_object);
ale nie o to mi tutaj chodzi - binder pozwala stworzyć funkcję
*bezparametrową*, która ma "dostęp" do local_object, bez zakłocania jego
czasu życia.
Spodziewam się, że local_object jest kopiowany w momencie utworzenia
obiektu z bindera. Zamiast int być też shared_ptr albo inny twór, jeśli
komuś zależy na przedłużeniu czasu życia obiektu poza zakres, gdzie był
stworzony.
*Nie ma* tu formalnie dostępu z funkcji lokalnej do obiektów na
zewnątrz. Całość jest niewątpliwie dłuższa, niż np.:
void foo()
{
int local_object;
void () { cout << local_object; } ();
}
ale właśnie wolę przy takich rzeczach mieć więcej rzeczy zrobionych jawnie.
Oczywiście, local_object ma *skończyć życie* przy wyjściu z foo(). Nie
ma prawa żyć dłużej, niż trwa wykonywanie foo().
> Z tego, że niektórzy wciąż się łudzą, że w C++ da się to zrobić, nie
> wynika, że to prawda. Wymagałoby to zbyt dużego odejścia od założeń C++
I właśnie tu robisz błąd, bo nie zauważasz, że to jest sprawa względna.
Prawdą jest, że Twój model (w odróżnieniu od tego, co pokazałem wyżej)
wymaga "dużego odejścia od *założeń* C++". Można z tego wyciągnąć dwa
różne wnioski:
1. Założenia C++ są do bani, bo nie pasują do Twojego ulubionego modelu.
2. Twój ulubiony model jest do bani, bo nie pasuje do założeń C++ (i np.
Ady i całej masy języków, które przyjęły podobne założenia).
Akurat przyjąłeś wersję 1.
Powiem po raz (n+1)-szy: Twój model nie jest uniwersalny i nie trafia w
oczekiwania *wszystkich* programistów.
>>Pytanie, czy to jest potrzebne. Nie w sensie teoretycznym
>>(czyli: mamy paru gości, którzy się świetnie bawią i piszą na ten
>>temat artykuły), ale praktycznym (czyli: używamy tego w realnych
>>projektach, z realnymi procesami i standardami kodowania).
>
> Co to znaczy "potrzebne"? Nie jest niezbędne. Jest przydatne.
> Jak to zwykle z konstrukcjami językowymi bywa.
Większa część Perla składa się z rzeczy, które ktoś uznał za przydatne. :)
>>>Model C++ jest zakonserwowany w C++, a poza tym martwy
>
>>Ada ma taki sam model.
> I te języki powinny pozostać do specjalizowanych zastosowań: mocno
> ograniczonych zasobów i hard real time wymagań, kiedy nie możemy sobie
> pozwolić na luksusy wygodnych konstrukcji, tylko musimy pilnować
> zasobów zużywanych przez każdą operację.
Nie. To nie ma związku z zasobami, tylko z tym, jakie pojęcia związujesz
z koncepcją obiektu. Ja z koncepcją obiektu związuję pojęcie czasu
życia. Nie interesują mnie tricki, przy których miałbym w tym temacie
jakieś wątpliwości.
Taki styl.
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<dkj057$2bj$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.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> <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> <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>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.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: Sat, 05 Nov 2005 20:11:33 +0100 Organization: CERN - European Laboratory for Particle Physics Lines: 176 Message-ID: <dkj057$2bj$1@sunnews.cern.ch> References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <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> NNTP-Posting-Host: lxplus064.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1131217895 2419 (None) 137.138.4.161 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: <87ek5wt6iw.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit