Article View: pl.comp.lang.c
Article #267843Re: Ciemna strona C++
From: Sebastian Kaliszewski
Date: Thu, 29 Nov 2007 12:43
Date: Thu, 29 Nov 2007 12:43
301 lines
13525 bytes
13525 bytes
Sektor van Skijlen wrote: >>>>[ o listach] >>>> >>>> >>>>>>, jest lepiej >>>>>>wpasowana do języka >>>>> >>>>>Nie wydaje mi się, że lepiej. >>> >>>>LOL, W pythonie lista ma reprezentację w samej składni. >>> >>>I to ma niby świadczyć o lepszym wpasowaniu do języka? > >>Ddaj do tego for, składnię dla splajsów, itd... > > ... która dobrze prezentuje się w tutorialach, ale w praktyce nie ma > różnicy, czy ten lukier składniowy jest, czy nie? Lukier skłądniowy toi jest właśnie element "wpasowania do języka" >>>WSZYSTKIE języki skryptowe mają takie właśnie "wsparcie językowe" do tzw. >>>list, bo jest to w tych językach podstawowy i niemalże jedyny zbiornik. > >>Nie jedyny. Tu masz jeszcze tuple, słownik i zbiór -- czyli cały podstawowy >>zestaw. W bibliotece masz jesczcze następne (np talię). > > Ach i och. Perl i Tcl jako tuple wykorzystują ten swój podstawowy zbiornik, > zwany (akurat w obu) listą. Och i ach. Python nie. >>Tylko czemu interfejs jest tak parszywie niejednolity? begin/end to trochę mało. > > Jak to niejednolity! Jest cholernie jednolity. Ależ skąd. Jednolite w miarę są pary vector i deque, map i multimap oraz set i multiset. map wyłazi zupełnie z jej iteracją po parach. list jest w ogóle w poprzek, itd... O jakiś spójnych gwarancjach już lepiej nie myśleć. > Do tego stopnia, że nie da się > zrobić standard-conformant listy jednokierunkowej (pojedynczo wiązanej), a > niektóre ciołki (jak np. autor języka D) nie rozumie, dlaczego do sprawdzania > czy string jest pusty trzeba robić if ( s.enpty() ), zamiast normalnie > if ( s.size() ). To dlaczego dla sprawdzenia czy w mapie jest klucz trzeba robić m.count(keyVal) zamiast m.has_key(keyVal)? Dlaczego "niektóre ciołki" takie jak członkowie komitetu nie rozumieją? >>>Poza tym nie wiem, dlaczego właściwie uważasz, że vector jest bardziej >>>uniwersalny, niż list. To prawda, że vector nadaje się do tzw. "większości >>>zastosowań", ale ma jedną bardzo paskudną wadę: unieważnienie iteratorów >>>następuje tam po każdej modyfikacji liczebności zbiornika. > >>Po każdej po której zmienia się capacity. capacity zaś zmienia się tylko >>czasami. > > Weź ty się z łaski swojej nie ośmieszaj, dobrze? sam się ośmieszasz. Te gwarancje są po to, by można było określone konstrukcje wykonać. > Gdybyś mi zrobił kod, w którym w jakikolwiek sposób polegasz na stabilności > wartości iteratorów do wektora po DOWOLNEJ modyfikacji tego wektora to razem z > tym kodem odesłałbym cię na zieloną trawkę. Czyli nie umiesz się nawet tą przyszywaną tablicą twojego języka posłużyć. >>>Miałem właśnie >>>ostatnio taki przypadek, że musiałem trzymać iteratory do elementów, żeby je >>>móc szybko usuwać. > >>To możesz trzymać indeksy elementów i usuwac po begin()+index. > > A, jasne, oczywiście! Usunięcie elementu ze środka też oczywiście nie zmieni > mi względnego położenia obiektów od tego miejsca w dal. > > Czy ty na prawdę tak na siłę chcesz coś udowodnić, że aż nie omieszkasz się > kompromitować? Akurat usuwanie z vectora można robić jadąc od rbegin do rend i robiąc zwykłe erase. To jest gwarantowane przez język. Tyle że jest to mało wydajne i nie ma nic wspólnego z szybkim usuwaniem. Szybkie usuwanie ze środka i vector nie idą w parze -- jak chciałes to pożenić to sam się ośmieszasz. >>>Podpowiesz mi może, jakiego rozwiązania powinienem użyć w Pythonie? > >>wbudowanej listy albo deque -- zależnie co robisz. > > Szczegółowo proszę - jak mogę przechowywać wartość, która będzie mi określała > pozycję elementu w zbiorniku i dopóki ten element będzie w zbiorniku, nie > zmieni się nigdy po jakiejkolwiek modyfikacji tego zbiornika. Zmieniasz wymagania. PRzy takich użyj słownika i już. A jak chcesz ni po dowolnej tylko przy usuwaniu i możesz mieć dla tego usuwania określoną kolejność to usuwaj od końca i odwołuj się po indeksach (tak samo zrób w C++). > Jak już dyskutujemy, to dyskutujmy konkretnie - jeśli masz jakieś sensowne > zarzuty, to je poprzyj. Na razie uciekasz w kąt. Narazie to ty jesteś nikonkretny. >>>>>Wieź mi tu nie zalatuj przykładami kodu powstałymi w czasie kiedy Python był >>>>>co najwyżej w umyśle GvR. >>> >>>>Języki bezpieczne znane są od ponad 45 lat. Języki w których nie ma >>>>podstawoych dziur w systemie typów były popularne już blisko 40 lat temu sic(!). >>> >>>A są nadal? > >>Ze dwa się ostały. Czasem pod smutowaną postacią, ale są. > > No więc czym przepraszam chcesz uzasadnić twierdzenia, jakoby bezpiecznych > języków ktokolwiek potrzebował? > > >>>Powiedz, o które języki ci chodzi, to będziemy przynajmniej wiedzieli, na czym >>>stoimy. > > >>Pascal, Algol68, Lisp. > > > Pascal? Bezpieczny? Chyba jaja sobie robisz. Nie robię. Bezpieczna implementacja Pascala jest możliwa i jest naturalna. W odróżnieniu od bezpiecznej implementacji C czy C++. >>Co do przykładu -- na sieci pełno. > > To znajdź i wklej - dopóki tego nie zrobisz, dla mnie bredzisz od rzeczy. Nie jestem proxy do google. Oczywistości szukaj sobie sam. >>>Co nazywasz "resztą świata" - Javę, czy Lispa? > >>Javę, Smalltalka, skryptowce, itd... > > Javę, powiadasz? Tam, gdzie mapa nazywa się Map, a strumień Stream? > > Smalltalk to dla ciebie jest licząca się reszta świata? > Skryptowce, wśród których masz Tcl-a z Tablicą, Perla z Haszem i Pythona ze > Słownikiem? Masz jeszcze coś takiego jak ogólnie przyjętą nomenklaturę, reprezentowaną w literaturze. Tu jest słownik lub tablica asocjacyjna, tablica dynamiczna itd. >>>>>>>Doświadczeni, czy Legacy people(tm)? Jak mnie nauka Haskella idzie >>>>>>>opornie, to nie narzekam, że język jest do bani. >>>>>> >>>>>>Haskell jest bardzo dobrze przemyślany, ale wymaga zupełnie innego >>>>>>"mind-set" niż języki imperatywne. C++ jest po prostu nieprzemyślany. >>>>> >>>>>A może jest tak, że rzeczy proste robi się w nim w dziwny sposób, a rzeczy >>>>>dziwne w prosty sposób. Jakoś nie widzę różnicy pomiędzy komplikacją >>>>>szablonów i Haskella. >>> >>>>Haskell jest starannie przemyślany i ma ogromną wyrażalność. Szablony nie są >>>>ani przemyślane anie nie da się w nich sensownie wyrazić żadnej konkretnej >>>>złożoności -- trzeba stanąć na głowie żeby zrealizować zwykły warunek. >>> >>> >>>>Szablony były zresztą (czasami panicznie) łatane. Stąd takie dziwności jak >>>>Koenig lookup, SFiNaE itd. >>> >>>Koenig lookup jest tylko uporządkowaniem spraw, > >>Których nikt za wczasu nie przemyślał. > > Możliwe, ale nie sądzę, żeby się to dało zrobić w jakikolwiek sposób inaczej. Dałoby się, gdyby całość zaprojektowano a nie zrodzono z chaosu. Jak są idiotyzmy w stylu vector<bool> to być może nie bardzo da się inaczej, by to jeszcze było używalne jakkolwiek. >>>a SFiNaE było od samego >>>początku podstawą funkcjonowania szablonów w C++. > >>I wszelakich tricków na nich opartych. Ale od początku to toto nie było. >>Zobacz takie MSVC 5.0 -- tu np. nie działało. > > Oczywiście, że działało (jeśli oczywiście mówimy o M$VC 5.0 + SP2, które > obsługiwało np. przestrzenie nazw). Oczywiście, że nie działało. Namespejsy do nie świniae. >>>Można oczywiście kwestionować sensowność "ograniczania przez użycie" oraz >>>sensowność sposobu pracy komitetu, który wysysa sobie z palca reguły języka, >>>do których potem producenci kompilatorów muszą wyharatać implementacje (bo >>>jakby goście wcześniej zauważyli te spaghetti-messages, to może losy wzorców >>>potoczyłyby się inaczej). Ale na ówczesny stan wiedzy rozwiązanie wydawało się >>>najlepsze. > >>Wydawało? Czy się raczej wyłoniło się z chaosu (poprzedzających implementacji). > > Z tego, co BS napisał w "DAEC++", rozważano wiele możliwości, jeśli chodzi o > sprawdzanie dopasowania wzorców. Okazało się, że takie będzie najmniej > kłopotliwe. W zastanej sytuacji chaosu istniejących implementacji. >>>Właśnie ostatnio się o tym przekonałem. Java, jako jedyny język z grupy >>>Java/C#/C++, posiada ścisłe wyjątki. >> >>[...] >> >>>I to jest ficzer, który mocno utrudnia życie, nie sądzę żeby przyczyniał się >>>do zwiększenia jakości developmentu, a zmienić go już nie będzie można. A do >>>wzorców w C++ definiowanie ograniczeń dodać można. >>> >>>I która z tych pomyłek jest bardziej spektakularna? > > >>Ze specyfikacjami wyjąytków to jest tak, że zwalono je zarówno w C++ jak i w >>Javie, przy czym statyka Javowa lepiej pasuje do C++ a dynamika z C++ do Javy. > > Wyjątki są dynamiczne, czy tego chcesz, czy nie. Ale ich specyfikacje mogą być mniej lub bardziej dynamiczne. Pytanie tylko, na ile chcemy > mieć do nich statyczne wsparcie, bo trzeba sobie zdawać sprawę z tego, że > wszelkie statyczne wsparcie to potencjalne utrudnienia dla użytkownika. > > Poza tym, Java nie jest wcale taka znów dynamiczna. Nie widzę w tym względzie > żadnych większych różnic od C++. C++ (zwłaszcza modern) dużą większy nacisk kłądzie na statyzm. A specyfikacje wyjątków są nie z tego ni z owego sprawdzane dynamicznie. Za to Java w której jest istotny odsetek elementów dynamicznych ma nagle statyczną kontrolę wyjątków. Jakby było odwrotnie to byłoby lepiej, co nie znaczy że byłoby dobrze :) > Cóż, trudno mi się nie zgodzić :) > > Ale linuxowe implementacje akurat takich problemów nie mają (na szczęście, bo > inaczej to nie wiem, gdzie bym tą aplikację uruchomił!). Linuksowe jak najbardziej mają sporo problemów. Zwłaszcza jak gdzieś jeszcze uchował się system sprzed NPTL. > Myślałem nawet, żeby podesłać tą moją aplikację ludziom od Cygwina, żeby sobie > poprawili - ale niestety o uwolnieniu tego kodu to trzeba by ewentualnie > później pomyśleć, bo na razie niestety nie ja jestem jego właścicielem. A nie da się wyekstachować/zsyntetyzować tylko przykładu demonstrującego kaszanę? >>Ani o tym ani o tym. Chodzi o to, by błędy wykonania były "contained". Niech >>sobie będzie abort, wyjątek, cokolwiek, ale niech po pierwsze będzie a po >>drugie niech będzie tylko to (a nie losowa poprawka do przetwarzanych danych). > > Dobrze, nawet się zgadzam. To teraz przystaw to do praktycznych możliwości > realizacji powyższych założeń. > > Jeśli chodzi np. o odwołanie się do zerowego wskaźnika, to masz tu dwie > możliwości: albo w języku sprawdzasz wskaźnik przed każdym odwołaniem > (usuwając jedynie zbędne sprawdzenia, gdy jest to bezużyteczne), albo > posiadasz platformę wirtualną, na której uruchamiany jest program, i która to > platforma sama posiada odpowiednie właściwości pozwalające na wygenerowanie > wyjątku w takim przypadku. W obu przypadkach mamy do czynienia z dodatkowym > narzutem, który jest tylko czasem akceptowalny. W większości systemów nie embedded masz tą wirtualizację daną z góry i nie masz wyboru. > Wątki po prostu powinny pracować na niezależnych danych. Wtedy mogą być równie dobrze procesami. Tzn. niech mają osobną przestrzeń adresową i już. [...] > Mało co prawda napisałem w życiu aplikacji z użyciem wątków, ale jak na razie > zawsze obchodziłem się bez muteksów. Używałem jedynie volatile. Rozumiem, że chodzi o volatile z Dżawy, nie to cóś z C/C++. pzdr \SK
Technical Details
Message-ID:
<fimb7n$80v$1@bozon2.softax.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!bozon.softax.com.pl!not-for-mailReferences:
<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> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!bozon.softax.com.pl!not-for-mail From: Sebastian Kaliszewski <s@get.it.off.to.reply.informa.pl> Newsgroups: pl.comp.lang.c Subject: Re: Ciemna strona C++ Date: Thu, 29 Nov 2007 13:43:43 +0100 Organization: Softax news server Lines: 301 Message-ID: <fimb7n$80v$1@bozon2.softax.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> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl> NNTP-Posting-Host: 83.18.189.42 Mime-Version: 1.0 X-Trace: atlantis.news.tpi.pl 1196339826 6059 83.18.189.42 (29 Nov 2007 12:37:06 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Thu, 29 Nov 2007 12:37:06 +0000 (UTC) User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050322) X-Accept-Language: en-us, en In-Reply-To: <fi9ckc$2u5$1@kujawiak.man.lodz.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit