🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #267745

Re: Ciemna strona C++

#267745
From: Seweryn Habdank-Wojewódzki
Date: Mon, 12 Nov 2007 22:28
257 lines
10805 bytes
Witam

Sebastian Kaliszewski wrote:

> Witam
> 
> Seweryn Habdank-Wojewódzki wrote:
>> Czemu zawsze kłócimy się o to samo?
> 
> Fatum? ;)

No to mamy pecha :-D.
 
>> W Pythonie są jedyne słuszne rozwiązania np. jedyna słuszna lista i
>> nie płaczesz?
> 
> W Pythonie mam rozwiązania bardziej elastyczne.

A jaka niby elastyczność jest zaimplementowana w Pythonowej liście?

>> A w ogóle pokaż mi co w Pythonie jest tym Testamentem? W
>> itertoolsach są różne rzeczy ale testamentu nie widzę, sama lista też nie
>> ma testamentu?
> 
> W Pythonie iterator zna blisko obiekt iterowany i nie ma invalidacji
> iteratorów. W Pythonie nie ma też problemu z przedwczesną śmiercią obiektu
> iterowanego (dzięki GC).

Przedwczesną, co to niby znaczy? Jak masz kontener i zanim związany
iterator, to możesz tak jak w metodzie erase dla listy, zwrócić wskaźnik na
następny element.

Natomiast *dokładnie* to co zrobiłeś w testamencie nie widzę w Pythonie, ale
pewnie słabo patrzę.
 
> Coś mi się zdaje, że zapomniałeś o której stornie pisałeś.

Cały czas pisze o 47.
 
> Włąmy to są przede wszystkim na domowe pecety, chodzące pod kontrolą softu
> pewnego dużego producenta pisanego głównie w C i C++.

Rozumiem że mówisz o UNIX np: Linux, Solaris, AIX czy HP-UX prawda? ;-)

>>>>Tak. A i tak kolesie pokroju Pana F. nie używają jej -- przykład tablica
>>>>obiektów typu foo rzutowana na bar*.
>>>
>>>To czemu język na to pozwala?
>> 
>> A Python pozwala kasować metody, czemu?
> 
> Bo jest dynamiczny.
> 
>> Czemu nie ma sekcji prywatnej w klasach?
> 
> Została uznana za zbędną w języku o filozofii jaką reprezentuje Python
> 
>> Czy python zakłada dobrą wolę kodera? Słusznie.
> 
> Tak.
> 
>> C++ zakłada, że języka używa wykształcony koder, a nie gamoń.
> 
> C++ zakłada, że koder zna wszystkie pułapki.

NIE. To co Pokazał Pan F. nie jest w duchu C++. Jedynym częstym błędem
popełnianym w C/C++ to jest ufność, że znamy długość tablicy.

To jest jedyny naturalny błąd. Reszta błędów wynika albo z syfiastego stylu
kodowania np. szkoła Pana F., albo niedouczenia n00by używają char *
zamiast stringa. Podkreślam n00by, bo w tych przypadkach użycie char *
wynika nie z celowego sposobu kodowania, ale z faktu, że ktoś kiedyś kupił
książkę do C coś przeczytał, nie przeczytał, że C ma specjalne utilki do
pracy na char * i teraz robi w kodzie dziwy nad dziwami.

Kolejny błąd n00by to jest bałaganiarstwo w rzutowaniach. Raz używa typu
size_t, drugi raz int, innym razem long, a jeszcze innym unsigned short.

A błędy pokazywane przez Pana F nie pochodzą z kursu dla n00bów, to są
bardzo wysublimowane i spreparowane przykładziki.

> MPL to jest nadużycie przypadkowej Turing-completeness szablonów. Jest
> więc dziwne w użyciu a rzucane błędy kompilatora są "zabawne". No i
> zobaczyć build aplikacji trwający 3 dni -- bezcenne :)

Prosiłem o przykład. 

Podałeś, że 3 linie kompilują się 1 dzień, teraz mówisz o trzech dniach,
rozumiem, że mowa o 9 liniach. Jednak nie pokazałeś ich.
 
>>>Ale nie wszędzie kod najbardziej oczywisty jest kodem niebezpiecznym i
>>>niestylowym. To jest domena C++.
>> 
>> Zapewne. To niech lewary nie piszą w C++! Nie wszyscy maja maturę, nie
>> wszyscy kończą studia, nie wszyscy muszą pisać w C++.
>> Nikomu nie każe pisać w C++.
> 
> Ale przez te wszystkie nieoczywiste drogi, nawet nie-lewary popełniają,
> często bardzo poważne a zarazem trudne do znalezienia, błędy.

Zgadza się. Chociaż dokładnie to samo czuję pisząc w Pythonie (zapewne nie
spełniam poprzednika implikacji -- jestem PyLewar :-) )

Ot takie "specjalistyczne" sprawy związane z użyciem range vs. xrange.
Używając range szybko giniesz. Jest adnotacja, że by używać xrange. To samo
jest w C++. Czegoś używasz, bo wydaje się być naturalne, ale adnotacja w
książce wskazuje jaka powinna być droga.
 
>>>>Jeśli gdzieś są takie zwyczaje to
>>>>kończy się to na posiadaniu GC.
>>>
>>>I dobrze. GC znane jest od ponad 40 lat.
>> 
>> To nie jest odpowiedź na moje pytanie.
> 
> Problem własności rozwiązauje się właśnie za pomocą GC, lub reference
> countingu.

No więc w C++ będziesz miał smart_ptr, na razie są one w boost (i nie tylko
np. g++ ma już w sobie mocną wersję tr1).

>>>>To jest właśnie poziom haków Pana F.
>>>
>>>Nie, pan F. pokazuje rzeczywiste przypadki rzeczywistych kardynalnych
>>>błędów projektu samego języka, a to jest pokazanie nadużycia mechanizmu
>>>skąd inąd przydatnego.
>> 
>> Ach tak. A może skądinąd rzutowania rodem z C też są czasem przydatne?
> 
> Rzutpowania rodem z C nic ciekawego nie wnoszą.

Właśnie to jest ustalane w innym wątku. Mnie osobiście np. niejawne
konwersje denerwują, ale to jest domena kompilatora, aby rzucał
ostrzeżenia/błędy przy ewidentnie niewłaściwych rzutowaniach.

A czy w noszą, czy nie. To nie wiem. np. przesyłanie danych binarnych, tak
właśnie robisz. 

Bardzo mi się podoba implementacja tego typu rzutowań w Pythonie (moduł
fpconst). Tam jest typowe rodem z C wpakowywanie danych binarnych.
I nie mówię tego z przekąsem, bo moduł właśnie dzięki takiemu sposobowi
podejścia do kodowania jest prosto napisany i działa bardzo dobrze.
 
>>>>Zrobić coś nie całkiem tak, jak to się powinno robić, a potem gadać o
>>>>wadach.
>>>
>>>Co jest niecałkiem tak? UB, gdy masz głupi, prosty błąd użycia iteratora?
>> 
>> Wskaźnik to nie iterator. Tam przede wszystkim pojawia się paskudne
>> rzutowanie na bar.
> 
> Zapomniałeś o którym slajdzie pisałeś.

Cały czas piszę o 47. Ten slajd jest dla mnie szczytem hakerstwa (w sensie
lokalnego maksimum w obrębie slajdów Pana F.).
 
>>>Przykazywany jest wskaźnik na obiekt klasy pochodnej do funkcji
>>>oczekującej wskaźnika na obiekt klasy bazowej -- to jest *standardowe*
>>>użycie polimorfizmu. To, że funkcja oczekuje przekazania tablicy, tylko
>>>przygłupi, kulawy język nie miesza tablice ze wskaźnikami to jest to co
>>>jest.
>> 
>> To jest spadek z C.
> 
> skoro tak, to należało wprowadzić odpowiednie dynamiczne mechanizmy
> pilnowania porządku. A nie zbyć sprawę UBekiem.

Tego nie potrafię ocenić z punktu widzenia języka, który powstał w
latach '80, wtedy języki w ogóle oferowały mnóstwo ficzerów, w
szczególności Python miał stabilną wersję i C++ miał dobry wzorzec
do "skopiowania". 
 
> 1. Wektor oznacza adresowanie pośrenie, tablica niekoniecznie (albo w
> najgorszym przypadku wzgłedem stosu) -- procesory OOO obsługują tablice
> nieco szybciej.

OK. Ale nie w kontekście tego przykładu o którym pisze Pan F.

> 2. Jeśli weźmiesz mechanizmy dynamiczne, to tu masz kolejne, poważne
> spowolnienie, w dodatku algorytm zmniejszania rozmiaru jest arbitralny

A tablice to sobie możesz zmniejsza?

> (a co jest dobre do wszystkiego nie jest dobre w niczym).

Rozumiem, że mówisz o liście w Pythonie.

> Jak w Śmieciuchu zastąpiłem vector włąsną klasą to miałem zysk wydajności
> ok 30%.

Rozumiem. A w Pythonie też zastępujesz listę swoim wydajniejeszym kodem? Czy
może jest tak, że język nie ułatwia takich manewrów i lepiej nie
kombinować?

> Przykładziki pokazują problemy a nie styl kodowania mający na celu te
> problem obchodzić.

Nie. Przykładzik pokazuje kod, którego nigdy żaden n00by nie napisze.
To są hakerskie triki. Jeszcze raz podkreślam przykład na stronie 47 jest
extra dziwny. Żaden n00by w C++ tak kodu nie napisze -- pomijam n00by C
piszący w C++.
 
>>>Mamy język w którym są tablice, ale nie można ich używać, tylko jakiś
>>>cięzkich typów bibliotecznych, bo język jest spieprzony. To są Jaja na
>>>Resorach(tm).
>> 
>> Tak. Jaja na resorach. Zrób sobie statystykę ile ludzi używa surowych
>> tablic w innych językach?
> 
> W tych dobrych? Tylko perwerci nie używają.

A jaką to niby tablice ma Python? Ma bardzo zaawansowaną listę/deque.
Java ma tablice C# ma tablice i tam ludzie i tak wolą kontenery. W J
chociażby dlatego, że interfejsy kontenerów są wspólne.
 
> A od kiedy uważam J za dobry język? Toż to przerośnięte, ciężkie krówsko,
> typowy overdesign.

Ach! Dawno nie słyszałem takiego określenia. Poproszę jeszcze o jakiś
przymiot na C# i może jakiś na Haskella. 

Będę miał kolekcję pejoratywów na języki kompilowalne :-D -- do użycia w
następnych flejmach.
 
>> No to mnie pouczyłeś. Np. takie numpy jest napisane oczywiście w
>> Pythonie ;-).
> 
> Chodzi o to, że Python nie cierpi tak jak C++ z powodu śmieci z C.

Cierpi, czy nie cierpi to jest kwestia tego jak elegancko śmieci są upchane
pod dywan.

>>>Kod w C często jest kodem w C++.
>> 
>> To jest wina edukacji i legacy people.
> 
> Ależ skąd. Wiele programów w C to programy zarazem w C++.

Rozumiem. Ale jak piszesz od początku w C++, to kod jest mocno inny niż w
typowym C.
 
>>>>>>Mi to w ogóle ten kod nie działa, a jak go poprawiłem to mi działa
>>>>>>dobrze.
>>>>>
>>>>>Taaaak??!?!?!? O, to ciekawe!

Jeszcze raz napiszę. Kod pierwotnie poprawiłem przy użyciu bar** i
polimorfizmu dynamicznego.

Później użyłem jednego szablonu i też kod działa, przy niskim poziomie
dynamizmu.

Pozdrawiam.

-- 
|\/\/|   Seweryn Habdank-Wojewódzki
 \/\/
Technical Details
Message-ID: <fhaj8u$e02$1@news.vectranet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.vectranet.pl!not-for-mail
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.vectranet.pl!not-for-mail
From: Seweryn Habdank-Wojewódzki <shw_mail@wp.pl>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Mon, 12 Nov 2007 23:28:34 +0100
Organization: VectraNET - http://www.vectranet.pl
Lines: 258
Message-ID: <fhaj8u$e02$1@news.vectranet.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl>
Reply-To: shw_mail@wp.pl
NNTP-Posting-Host: 078088193244.osw.vectranet.pl
Mime-Version: 1.0
X-Trace: news.vectranet.pl 1194905694 14338 78.88.193.244 (12 Nov 2007 22:14:54 GMT)
X-Complaints-To: usenet@news.vectranet.pl
NNTP-Posting-Date: Mon, 12 Nov 2007 22:14:54 +0000 (UTC)
User-Agent: KNode/0.10.5
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit