🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #60145

Re: Pogaduchy o językach (było coś o dużej silni)

#60145
From: Maciej Sobczak
Date: Sat, 05 Nov 2005 19:11
176 lines
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!news
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>

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