🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Coroutines w (GNU) C

#310089
From: heby
Date: Wed, 29 Jan 2020 22:41
318 lines
15377 bytes
On 29/01/2020 22:48, M.M. wrote:
>> A jak im pewnego dnia podmienisz gcc na g++ to co się stanie? A jak
>> pewnego dnia dorzucisz im do kodu class scoped_interrupt_disable to co
>> się stanie? Wybuchnie im? Odmówią pracy bo niekoszerne? Do spowiedzi pójdą?
> Nie wiem co się stanie. Prosiłeś o przykład, więc podałem.

Ten przykład nie tłumaczy problemów w C++ tylko w białku.

> Wszystko ma
> swoje wady i zalety, nawet C++ ma wady względem C

W sensie że jest bardziej restrykcyjny? Słyszałme kiedyś że to wada. Do 
dzisiaj nie wiem dlaczego.

>, a jako nadzbiór nie
> powinien mieć wad. Koszt przeszkolenia jest nie do przeskoczenia.

Napisałem Ci że nic nie musisz szkolić poza "chłopaki, od dzisiaj w 
każdym przerwaniu na arma na początku ma stać scoped_interrupt_disable 
sid(); i h...". A jak któryś podskoczy to w łeb. Koniec szkolenia. Po 
roku nie dadzą sobie tego siła odebrać.

> nastąpił rozwój technologii wytwarzania oprogramowania, ale po pierwsze nie
> wierzę że ten rozwój nie wpadał i nie wpada w ślepe uliczki

Kiedyś ludzie uważali BCPL za spełenienie marzeń. Sam się kompiluje, 
można zrobić bootstrap na dziwnym systemie, architektura wręcz zdjęta z 
tablicy uczelni, *uproszczona* składnia.

I wiesz co, trafiłem kiedyś przez zupełny przypadek na kolesia który nie 
dość że pisał jeszcze koło 2000 roku w tym cudzie to jeszcze przez 
nastepne 10 lat miał do niego straszny sentyment.

Widzisz, to co piszesz to białko.

Mam takie a takie doświadczenia, widziałem to i tamto, wnioskuje z tego 
to i owo.

A na koniec okazuje się że programy w C++ nie dość że są czytelniejsze 
od tych w C, to często są szybsze, łatwiejsze w analizie i refaktoringu.

Tylko że białko. Białko wie lepiej, szczególnie jak się na czymś nie zna.

No więc dowiedziałem się że C to gówno. BCPL był lepszy.

Białko ...

>, a po drugie,
> jest takie prawo w ekonomii którego nazwy już nie pamiętam, ale mówi ono o
> tym, że od pewnego momentu trzeba niewspółmiernie dużo pracy włożyć w
> udoskonalanie, aby uzyskać minimalnie lepsze efekty. Jak myślisz, ile pracy
> trzeba włożyć, żeby przyspieszyć trabanta rozpędzający, a ile, aby
> przyspieszyć najszybszy samochód na świecie i tym samym pobić rekord prędkości?

To teraz z tej analogi zrób casta na konkret.

To jaki język jest tym najszybszy na świecie?

Rust chyba obecnie jest na karuzeli terndów?

I co to ma w ogóle do dyskusji o tym że zmiana z gcc na g++ dodaje od 
razu za darmo masę możliwosci które w C wymagają pisania kwadratowych kół?

>> Czyli mówisz o czymś innym niż ja. Spieraj się więc z kimś innym.
> Spokojnie, ja jeszcze nie jestem pewny o co się spieramy :)

Podobno o wyższość C++ nad C i odwrotnie.

Tylko że ja się o to nie spieram. Ja tylko protestuje przeciwko 
bredzeniu o tym że zmiana z gcc na g++ jest niemozliwa, bezsensowna i 
korutyny nie muszą mieć stosu a programiści muszą się szkolić z używania 
prymitywnego RAII.

> Napisałem o tym z jakim sposobami używania określenia 'programowanie w C++'

Wieć programowanie w C++ to programowanie z dowolnym ficzerem dostępnym 
w g++ a niedostepnym w gcc. Na przykłd z użyciem RAII, które to jest 
swoją drogą krytycznie potrzebne w embedded i jednoczesnie skandalicznie 
olewane przez embedded. Bo kwadratowe koła łatwiej się produkuje niż 
kupuje okrągłe.

>>>> W ogóle nie ma tutaj obiektowości poza użyciem jej w celu
>>>> obsługi *ewentualnych* szablonów, bo tak to się robi w C++.
>>> Nie rozumiem.
>> Użycie składni obiektowej (struct/class) nie oznacza że używa się
>> obiektowości.
> Dlaczego?

Bo obiektowośc wymaga *OBIEKTÓW* a nie klas.

>> Składnia ta bowiem przydaje się w szablonach, jest wręcz
>> podstawą pisania z użyciem generycznych typów w C++. Nie mających nic
>> wspólnego z programowaniem obiektowym.
> Chyba nadal nie rozumiem. A jakie wnioski z tego płyną?

Że traits< int >::max to nie jest programowanie obiektowe, natomiast to 
jest programowanie w C++.

I tego faktu nie zmienia to że gdzieś w nagłówku jest [...] class traits 
[...].

"class" mogło by się nazywać "type" i być może tą prostą sztuczką ludzie 
przestali by bredzić że używanie klas w C++ to pisanie obiektowe.

>> Mam buga który ukrywał się w void* przed ponad 10 lat. Przed oczami
>> doświadczonych programistów. Jedyny powód że udało się go znaleźć to
>> *przypadek*.
> A ja zapewne mam niejeden taki błąd w szablonach.

Nie, znalezienie bładu w szablonach który ujawnia się w runtime jest 
naprawdę wyższą szkoła jazdy. Zrobienie błedu w void* który ujawnia się 
w runtime to trywializm.

Szablony powodują że błedy w runtime stają się sporadyczne. Przenoszone 
są na kompilacje.

Wiadomo, nie każdy potrafi czytać komunikaty błędów. Ale naprawdę od 
kilkudziesiąciu lat jest coraz lepiej z jakością błedów. Proponuje 
zobaczyć co wyświetla clang w przypadku błedów kompilacji. Jest bardzo, 
bardzo dobrze.

>> traits< int >::max
>> to jakaś okropna składnia? Nie czerpiesz aby przypadkiem wiedzy o
>> szablonach z jakiś grup anonimowych pisaczy w c?
> Racja, takie proste przypadki są bardzo przejrzyste.

I w tym momencie zamieniasz gcc na g++. Znalazłeś jeden powód aby użyć 
C++ to go używasz, jest za darmo.

> Miałem na myśli sytuacje
> gdy jeden szablon jest parametryzowany kilkoma innymi szablonami

Poniżej promila z promila zastosowań szablonów wymaga takich wygibasów.

Dam przykład: boost::spirit.

To jest bardzo skomplikowana bibliteka na bardzo pokręcoanych szblonach.

Ale dla user końcowego jest wręcz bajecznie prosta.

Te szablony w szablonach to taka Baba Jaga dla niegrzecznych 
programistów C. Straszy się nią i jak widać skutecznie.

> takich sytuacjach mocno tęsknię za minimalistycznym C++ albo za Javą

Prawie cały boost to ukrycie skomplikowanych szablonów za bajecznie 
prostymi interfejsami.

Pewnie, możesz zobaczyć boost::mpl czy fusion i pokazać mi przykłady 
gdzie jest cieżko.

Ale oni naprawdę się napracowali aby to całe mpl było *bajecznie* proste 
po stronie usera mimo komplikacji w środku.

Najwyczajniej, powtarzasz mity. C++ moze byc skomplikowany. Ale boost 
pokazał że ta komplikacja nie musi przeciekać do usera.

> pozbawionego błędów. Tak się mówi że szablony stanowią antidotum na błędy, bo
> porównuje się je zwykle do najbardziej błędogennych konstrukcji języka, jak
> wlaśnie do makr, albo do rzutowania na void*.

Stanowią warstwę chroniącą przed pewną klasą problemów. Akurat tych 
upierdliwych, bo w runtime.

Stanowią jeszcze wiell innych rzeczy, ale void* nie jest alternatywą dla 
szablnów. Za void* nie ma żadnych sensownych argumentów.

>> Całe szczęscie wielokrotne dziedzidzenie szablonów występuje głównie w
>> bajkach i ksiązeczkach dla niegrzecznych programistów c.
> Wielokrotnie w sensie że jedna klasa (szablon) dziedziczy z bezpośrednio z
> kilku to owszem rzadko spotykana konstrukcja i niekoniecznie zalecana.

Myśle że 90% konstrukcji z boosta jest trywialna.

> Ale pośrednie wielokrotnie dziedziczenie, typu X dziedziczy z Y, Y z Z, a Z
> może z kolejnych - to sytuacja częsta.

Prawie nie spotykana w kodzie usera. Używa się jej w booscie czy stl, 
ale mechanizmy widoczne jako API są strywialziowane.

> Gdy każde jeszcze ma jakieś parametry i
> typy - to naprawdę zazwyczaj dostawałem oczopląsu gdy analizowałem swój własny
> kod po krótkim czasie. Myślę że każdy programista uznałby za łatwiejszy w
> analizie kod np. Javy.

Więc masz kiepskie doświadczenia wynikające z kiespkiego doboru przykładów.

>> Robie to codziennie od kilkudziesięciu lat i cieżko mi się zgodzić.
> Może zwykle używasz szablonów po bożemu, a nie do optymalizacji kodu?

Używam C++. W tym szablonów. Szablony są od dziesiątek lat coraz lepiej 
wspierane przez kompialtory (komunikaty błedów) i debuggery (pokazywanie 
zawartości). Nijak nie wiem czemu foo<int> miało by być bardzie 
skomplikowane do debugu. Jedyna przeszkoda to czasem dłuższe nazwy 
typów. Tylko że tam się zagląda raz na rok.

Znowu deminizujesz. Debug kodu z szblonami wyglada tsak samo jak w C. No 
może przesadzam: w C używając void* jesteś w d... od razu.

> nie mam z nimi problemów. Ale gdy np. cały algorytm genetyczny parametryzuję
> kilkoma klasami, to nawet nie mam wsparcia ze strony edytora, bo
> edytor nie wie jakie metody będą miał parametry.

Masz zły edytor.

> To wszystko prawda, choć z review to zależy gdzie :-) Nie chciałem
> absolutnie powiedzieć, że macie olać szablony i wrócić do void*.
> Chciałem powiedzieć, że jeśli sobie radzono bez szablonów i system
> operacyjny z GUI działał na 16MB RAM i pentium I 160MHz - to nie
> ulegajmy złudzeniu, że te szablony aż tak niesłychanie dużo wnoszą.

Znowu to samo.

Mam młotek, ale lepiej wbijać gwoździe lutownicą.

Mam szablony, ale przecież void* to tylko kilka wad z którymi da sie żyć.

Ja rozumiem jeszcze jak by za używanie szblonów trzeba było płacić.

Ale są za friko.

To PO CO ich nie uzywać?

> nie traktować szablonów jako czegoś dzięki czemu technologia wytwarzania
> oprogramowania przyspieszyła o kiladziesiąt procent, bo bez szablonów była
> już całkiem szybkim samochodem, który trudo przyspieszać w nieskończoność.

Szablony rozwiazują dobrze kreśloną klasę problemów z jakością kodu.

W C nie ma nic co mogło by to zastapić poza modlitwą.

>> Jesteś nastepnym developerem w tej dyskusji z Atari 65XE jako ciągłą
>> integracją?
> Nie, po prostu czasami mam w kodzie nasrana pełno szablonów, jeden szablon
> jest parametryzowany innymi, te inne też są parametryzowane jeszcze innymi, a
> niektóre są w kilku wersjach. Jeśli zmieniam warunki kompilacji warunkowej to
> muszę czekać 30 sekund na pełną rekompilację

Przyznam że "pełna rekompilacja" to zjawisko niepotykane przy prawidłowo 
opisanym projekcie.

Jesteś pewien że masz wszystko dobrze że masz potrzebę pełnej rekompilacji?

>> Pracuje na *zaje...e* ogromnej bazie kodu w C++. Kompilacja najdłuższego
>> i najbardziej popieprzonego pliku (zawiera głównie boost::spirit)
>> napisanego z palca trwa coś pod 3 sek. Uwierz mi, to jest makabrycznie
>> dużo zaawansowanego C++ i *tylko* 3 sekundy. Czy już umarłeś z nudów?
> Ja przed chwilą dodałem do kompilacji -DOPCJA_X i czekałem na pełną
> kompilację z 30 sekund na dwóch rdzeniach. Jak jeszcze jest pomiędzy
> kompilacją -fprofile-generate i -fprofile-use to czekam 2 minuty aby
> zrobić 30 sekundowy test.

Czyli to nie jest noramlna praca w programowanie. To wyjątek, kiedy 
robisz redefinicję.

Masz kiepski przypadek, przypuszczalnie jest on na tyle specyficzny że 
nie powinien być uważany za reprezentacyjny.

>>> Kolejna wada, trzeba udostępnić kod źródłowy gdy się
>>> udostępnia bibliotekę napisaną w postaci szablonów.
>> Brednia.
> To chętnie się dowiem dlaczego, myślałem że szablony to nagłówki niezbędne
> do wygenerowania konkretnej wersji kodu, jak to udostępnić w wersji
> binarnej bez źródeł?

usenet to za mało aby to opisać bo zależy od sytuacji.

Kod nie musi akceptować *dowonych* szablonów na przykład. I biblioteka 
udostępnia impelemntcje dla tych kilku przypadków.

Mniej wiecej to to samo co biblioteka w C. Masz funckje przyjmującą inty 
i floaty. To samo w C++, możesz podać szablon z intem i floatem.

To jeden z przykładów że *NIE* musisz *zawsze* udostępniać kodu 
szablonowego.

>>> Następna wada, kompilatory
>>> czasami wskazują błąd daleko od jego wystąpienia.
>> Brednia w 99% wypadków.
> U mnie w około 30% przypadków jest to prawda.

Użyj clanga.

>>> Podsumowując, kiedyś szablonów używano rzadko albo w ogóle nie używano
>> Podobnie jak z papierem toaletowym.
> Tylko że papier toaletowy nie ma nic wspólnego z programowaniem, a (nie)używanie
> szablonów ma sporo.

Z faktu że ktoś kiedyś robił kupę bez papieru nie wynika że papier jest 
zbędny obecnie.

Najzwyczajniej kiedyś go nie było.

Podobnie jak kiedyś nie było C++.

>> Na patrz, a ja miałem Amigę z 2MB pamięci chip i na tej konfiguracji
>> poganiałem SaSC w trybie C++ pisząc obiektowe programy GUIowe. Może to
>> czary?
> Może czary, a może to (w jakimś stopniu) dzięki void* ?

Nie, C++ z szablonami. SaSC miał translator z C++ na generowany C.

Stawiam wniosek: obecnie rozpasanie programów nie ma *NIC* wspoónego z 
wyborem języka C czy C++. Ma związek jedynie z kiepskimi programistami, 
przyrostem danych i rozbudową OSów.

>> A po chwili się budzisz i okazuje się że ten sam program kompilowalny w
>> C i C++ generuje dokładnie taki sam kod asemblerowy.
> Przecież to jest oczywiste

Nie jest. Dla znacznej częsci wyznawców C, bazujących na opiniach z 
facebooka świat wygląda tak że "C++ dużo zajmuje". Ta taka kolejna 
teoria spiskowa obok antyszczepionkowców i niejedzących.

>, że każda konkretyzacja szablonu oznacza nie
> tylko różny kod, ale nowy dodatkowy kod.

Nie. Tak. Zależy.
Technical Details
Message-ID: <r0t1ne$3re$1@dont-email.me>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
References: <4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <20200128233003.4bf9d9eb@mateusz> <1a207604-09fa-43f2-8d0a-e3ff51b183f4@googlegroups.com> <r0sf4i$d46$1@dont-email.me> <c9ada043-010e-41c1-8362-385fcab97fbb@googlegroups.com> <r0sm9p$r2m$1@dont-email.me> <35023603-9392-414e-9ad2-dfb5ddf4a850@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
From: heby <heby@poczta.onet.pl>
Newsgroups: pl.comp.lang.c
Subject: Re: Coroutines w (GNU) C
Date: Wed, 29 Jan 2020 23:41:51 +0100
Organization: A noiseless patient Spider
Lines: 319
Message-ID: <r0t1ne$3re$1@dont-email.me>
References: <4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <20200128233003.4bf9d9eb@mateusz> <1a207604-09fa-43f2-8d0a-e3ff51b183f4@googlegroups.com> <r0sf4i$d46$1@dont-email.me> <c9ada043-010e-41c1-8362-385fcab97fbb@googlegroups.com> <r0sm9p$r2m$1@dont-email.me> <35023603-9392-414e-9ad2-dfb5ddf4a850@googlegroups.com>
Mime-Version: 1.0
Injection-Date: Wed, 29 Jan 2020 22:41:51 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="139efa17e3b50ff7a55c5d56671ca15d"; logging-data="3950"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+2C/79S/BkR/jaHk5Hlnny"
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1
Cancel-Lock: sha1:Y0QryznJ4qZQPmuuPLmBJTQwVjI=
In-Reply-To: <35023603-9392-414e-9ad2-dfb5ddf4a850@googlegroups.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit