🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Coroutines w (GNU) C

#310087
From: M.M.
Date: Wed, 29 Jan 2020 21:48
294 lines
15140 bytes
On Wednesday, January 29, 2020 at 8:26:51 PM UTC+1, heby wrote:
> On 29/01/2020 19:50, M.M. wrote:
> > Firma ma kilku pracowników którzy znają tylko C i mają doświadczenie w pisaniu
> > aplikacji w C. Przychodzi do firmy zamówienie na aplikację podobną do tych w
> > jakich mają doświadczenie i aplikacja nie jest kolosalnie duża. Mają do wyboru:
> > kurs C++ i tworzenie aplikacji w języku w którym nie mają doświadczenia albo
> > pisanie w C.
> 
> 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. Wszystko ma
swoje wady i zalety, nawet C++ ma wady względem C, a jako nadzbiór nie
powinien mieć wad. Koszt przeszkolenia jest nie do przeskoczenia. 

Dlatego ja się nie dam nabrać więcej na nowe super technologie. Programowało 
się kiedyś na kartach perforowanych, potem w kodzie binarnym, potem w asemblerach
gorszych, potem w lepszych, potem w makroaseblerach, w końcu w gorszych
językach wysokiego poziomu, w lepszych i w najlepszych... Nie zaprzeczam że
nastąpił rozwój technologii wytwarzania oprogramowania, ale po pierwsze nie
wierzę że ten rozwój nie wpadał i nie wpada w ślepe uliczki, 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?

Podobnie jest od jakiegoś czasu z językami programowania, języki rozbudowane i
dopracowane o milion procent, dają przyspieszenie procesu wytwarzania 
oprogramowania o kilka procent. A nakład środków na przeszkolenie personelu 
lub samego siebie jest tym większy, im język bardziej rozbudowany. Zmiana
technologii opłaca się dopiero na dłużą metę, do większych projektów.


> 
> > Przy okazji mam pytanie, od dawna się nie interesowałem: czy kompilator gcc i
> > jądro linuxa, x-server są nadal pisane w C?
> 
> gcc:
> 
> https://lwn.net/Articles/542457/
> 
> Kernel to problem białkowy. W zasadzie to problem jednego konkretnego 
> zbioru molekuł, ale ludzie i tak robią swoje:
> 
> https://pograph.wordpress.com/2009/04/05/porting-cpp-code-to-linux-kernel/
> 
> x-server nie wiem. Nie przypuszczam aby komukolawiek opłacało się to 
> przepisywać dla idei, to raczej kod muzealny.
> 
> >> Nikt w tym wątklu nie mówi o programowaniu pełną gębą z użyciem
> >> obiektowości.> 
> > Ale potocznie
> 
> 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 :) 
Napisałem o tym z jakim sposobami używania określenia 'programowanie w C++'
się spotkałem, dlatego żeby wiedzieć o czym rozmawiamy.

 
> >> 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?

> 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ą?




> >> I jakie przy okazji bugogenne. Gdzieś musisz mieć cast. Czy aby na pewno
> >> znasz wszystkie miejsca gdzie ten cast występuje? Wiesz już dlaczego
> >> ogólnie szablon jest lepszy niż void*? Podpowiem: bo wykrywa problem na
> >> kompilacji a nie runtime.
> > Ale zwykle nie ma rzeczy pod każdym względem lepszych. Szablon w C++ jest
> > dobry, bo kompilator pilnuje zgodności typów, bo można zrobić specjalizację,
> > można wygenerować wydajną wersję w zależności od parametrów szablonu. Mówią
> > że szablony są dobre bo się popełnia mniej błędów względem makrodefinicji.
> 
> Prawda.


> > Mnie bardzo dziwi taki sposób porównywania, dlaczego porównywać do czegoś co
> > powodowało (szczególnie u niedoświadczonych programistów) błędy wykrywalne
> > po dwóch dniach debugowania?
> 
> 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. 


> 
> > Szablony mają okropną składnię i podobno lepsza w
> > ogóle nie istnieje.
> 
> Lepsza pewnie istnieje, ale też składnia nie jest okropna.

No dobrze, ja nie lubię, ale kilku dyskutantów przed laty też mówiło że 
nie lubi.


> Serio, uważasz że:
> 
> 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. Miałem na myśli sytuacje
gdy jeden szablon jest parametryzowany kilkoma innymi szablonami i jeszcze
dziedziczy z innego szablonu. Potem gdzieś w klasie jakaś statyczna tablica,
wszystko w kilku wersjach zależne od kompilacji warunkowej... Naprawdę w
takich sytuacjach mocno tęsknię za minimalistycznym C++ albo za Javą, ale
cóż, przyznaję, że ani w Javie, ani w minimalistycznym C++ takiego efektu 
nie uzyskam. Natomiast nie przyznam że szablony stanowią elegancką i
przejrzystą składnię, sprzyjającą analizie kodu i sprzyjającą pisaniu kodu 
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*.


> > Osobiście wcale nie popełniam mniej błędów w szablonach niż
> > bez szablonów, właściwie to wielokrotne dziedziczenie z szablonów masakrycznie
> > komplikuje kod
> 
> 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. 
Ale pośrednie wielokrotnie dziedziczenie, typu X dziedziczy z Y, Y z Z, a Z 
może z kolejnych - to sytuacja częsta. 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.


> >, debugowanie takiego kodu jest trudniejsze niż zwykłego kodu.
> 
> 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? No i
szablony porównujesz to do makr i void* - czyli do czegoś najbardziej
błędogennego. Jeśli używam w pewien określony sposób szablonów, to też
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. 


> 
> > W
> > Javie (poprawcie mnie jeśli się mylę) chyba nie ma szablonów, a wskazywanie
> > typów przy kontenerach jest tylko dla kompilatora?
> 
> Java ma typy generyczne. Nie ma wprost łatwego przeniesienia na C++. 
> Głównie dlatego że typy w C++ są przeliczane na etapie kompilacji i 
> generują inne typy. To inna filozofia. Jaba zatrzymała się głównie na 
> vector< int >, C++ jest o eniony dalej, choć często eniony krzaków 
> dalej, przyznaje.
> 
> > Więc na void* też można.
> 
> To nie jest dyskucja czy można. Można uzyć popsutych korutyn. No 
> przecież jak się ma takąspecyfikację to nawet trzeba. Jak coś działa to 
> nie naprawiać. Lepse jest wrogiem dobrego. Itd itp bzdury.
> 
> Na void* nie można bo:
> a) generuje to więcej błedów runtime
> b) uniemożliwia skuteczne refaktoringi
> c) narzędzia do lintowania wybijaja sobie zęby
> d) narzędzia do statycznych analiz kodu są zagubione
> e) code review nie przejdzie

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ą.
Nigdy nie negowałem szablonów, ale też nigdy nie powiem, że brak
szablonów to strona czarna, a programowanie z szablonami to strona
biała. 


> Ale oczywisćie znam milion przykładów że można mimo to. To "można" to 
> kwesia zwykłej higieny. Można pisać na void* tak samo jak można mieszkać 
> przy wysypisku i udawać że to wiejskie zapachy.

Mam nadzieję że już jest zrozumiałe, iż nie namawiam nikogo do zrezygnowania z
szablonów, szczególnie używanych po bożemu, tylko zwracam uwagę na to, żeby
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ść.


> > Z
> > kolejnych wad szablonów, długi czas kompilacji gdy w programie jest bardzo
> > dużo szablonów.
> 
> 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ę (relatywnie) małego programiku, a
test często też trwa 30 sekund. Po prostu Ty używasz szablonów inaczej niż ja, i
odpisałeś ze swojej perspektywy. Ja jeśli sięgam po szablony to jest też
jakieś prawdopodobieństwo że chcę optymalizować kod, np. chcę wygenerować
skrojony sporawy kod na miarę konkretnego przypadku do rozwiązania.

 
> 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. 

> > 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ł?


> > 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.


> 
> > 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.

> 
> >, miałem
> > na komputerze 16MB pamięci RAM, 1GB na twardym dysku, procesor może 5tys razy
> > wolniejszy i działał tam niejeden graficzny system operacyjny, graficzne
> > środowisko programowania, a nawet program do grafiki trójwymiarowej.
> 
> 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* ?



> > Jakby to
> > było napisane w 'C++ pełną gębą', to nie wiem czy by działało nawet 5 lat
> > później - ale na pewno jakby już zaczęło działać to by działało lepiej i
> > szybciej byłoby rozwijane o nowe cechy.
> 
> 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, że każda konkretyzacja szablonu oznacza nie
tylko różny kod, ale nowy dodatkowy kod. Co nie znaczy, że nie można
używać szablonów tak, aby łatwo zrobić kilka eksperymentów i wybrać
wariant generujący najmniejszy kod. 


> No, ale wiadomo, 100x wolniejszy bo to C++. Dużo NOPów się wstawia na 
> złość tym wszystkim zaprzańcom.

Hmmmm a to zaprzańcy ;-)


Pozdrawiam
Technical Details
Message-ID: <35023603-9392-414e-9ad2-dfb5ddf4a850@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!aioe.org!peer03.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!g89no736184qtd.0!news-out.google.com!w29ni988qtc.0!nntp.google.com!g89no736180qtd.0!postnews.google.com!google-groups.googlegroups.com!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>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:a97:: with SMTP id v23mr1958642qkg.251.1580334523701;        Wed, 29 Jan 2020 13:48:43 -0800 (PST)
X-Received: by 2002:a05:6902:6a5:: with SMTP id j5mr1399441ybt.462.1580334523407; Wed, 29 Jan 2020 13:48:43 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!news.uzoreto.com!aioe.org!peer03.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!g89no736184qtd.0!news-out.google.com!w29ni988qtc.0!nntp.google.com!g89no736180qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Wed, 29 Jan 2020 13:48:43 -0800 (PST)
In-Reply-To: <r0sm9p$r2m$1@dont-email.me>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=178.37.229.117; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 178.37.229.117
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>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <35023603-9392-414e-9ad2-dfb5ddf4a850@googlegroups.com>
Subject: Re: Coroutines w (GNU) C
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Wed, 29 Jan 2020 21:48:43 +0000
X-Received-Bytes: 17982
X-Received-Body-CRC: 1792569669
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit