znaczacy > comp.lang.* > comp.lang.c

Maciek Godek (24.01.2020, 13:44)
Je?li by to kogo? interesowa?o, to dzi? "wymy?li?em" prosty sposób na implementacj? "coroutines" w C.

Pomys? opiera si? na rozszerzeniu kompilatora GCC pozwalaj?cym na przechowywanie etykiet dla goto w zmiennych, i mo?liwo?ci skakania do tych zmiennych:



Interfejs jest taki, ?e na pocz?tku funkcji musimy wywo?a? makro

COROUTINE_START()

i dalej mo?emy u?y?

COROUTINE_RETURN(warto??)

co zadzia?a jak normalne wyj?cie z funkcji, albo

COROUTINE_YIELD(warto??)

co spowoduje przerwanie egzekucji funkcji, przy czym kolejne wywo?anie
funkcji spowoduje jej kontynuowanie za ostatnio wykonanym wyra?eniem COROUTINE_YIELD.

Na przyk?ad kod mo?e wygl?da? tak:

int coroutine() {
COROUTINE_START();

printf("started\n");
COROUTINE_YIELD(1);

printf("stage 1\n");
COROUTINE_YIELD(2);

printf("stage 2"\n");
COROUTINE_YIELD(3);

printf("finishing\n");
COROUTINE_RETURN(4);
}

Drobny problem jest z przekazywaniem parametrów: je?eli chcemy, ?eby warto?ci argumentów by?y przechowywane mi?dzywywo?aniami, to musimy je zapisywa? w zmiennych statycznych.

Implementacja sk?ada si? z nieco ponad 20 linii kodu:

#define COROUTINE_START() \
static void *coroutine_continuation = \
&&coroutine_start; \
goto *coroutine_continuation; \
coroutine_start: \
do {} while(0)
#define COROUTINE_RESTART \
coroutine_continuation = &&coroutine_start

#define COROUTINE_RETURN(...) \
COROUTINE_RESTART; return __VA_ARGS__

#define _COROUTINE_LABEL(line) coroutine_##line
#define COROUTINE_LABEL(line) _COROUTINE_LABEL(line)

#define COROUTINE_YIELD(...) \
coroutine_continuation = \
&&COROUTINE_LABEL(__LINE__); \
return __VA_ARGS__; \
COROUTINE_LABEL(__LINE__): \
do {} while(0)
Borneq (24.01.2020, 21:43)
On 1/24/20 12:44 PM, Maciek Godek wrote:
> Je?li by to kogo? interesowa?o, to dzi? "wymy?li?em" prosty sposób na implementacj? "coroutines" w C.

A nie znane z C : setjmp/longjmp?
Maciek Godek (24.01.2020, 23:26)
W dniu pi?tek, 24 stycznia 2020 20:44:01 UTC+1 u?ytkownik Borneq napisa?:
> On 1/24/20 12:44 PM, Maciek Godek wrote:
> > Je?li by to kogo? interesowa?o, to dzi? "wymy?li?em" prosty sposób na implementacj? "coroutines" w C.

> A nie znane z C : setjmp/longjmp?


Kiedy? dla zabawy napisa?em sobie implementacj? w?tków w oparciu o setjmp.h:



Ale to jest w moim odczuciu raczej ci??ki mechanizm (podobnie
jak call/cc w Scheme) i raczej wol? go nie u?ywa? w produkcyjnym kodzie.

Natomiast je?eli idzie o powy?sz? implementacj? coroutines, to jest
bardzo prosta, i chocia? jest par? sposobów, na jakie mo?na j? ?le u?y?
(np. zmienne automatyczne b?d? mia?y w po przywróceniu sterowania
nieokre?lone warto?ci, i mo?na omy?kowo napisa? "return" zamiast
COROUTINE_RETURN), to ogólnie wydaje si? raczej spolegliwym mechanizmem.

Zreszt? moja intencja u?ycia jest w?a?nie taka, ?eby sobie przy ich
pomocy robi? "takie jakby w?tki" w kodzie opartym na przerwaniach..
Borneq (26.01.2020, 08:21)
On 1/24/20 10:26 PM, Maciek Godek wrote:
> Zreszt? moja intencja u?ycia jest w?a?nie taka, ?eby sobie przy ich
> pomocy robi? "takie jakby w?tki" w kodzie opartym na przerwaniach.


G?ównym problemem przy w?tkach a nawet coroutinach jest oddzielny stos
dla ka?dego w?ókna, gdzie mo?e by? wo?ana funkcja rekurencyjna.
heby (26.01.2020, 16:43)
On 24/01/2020 12:44, Maciek Godek wrote:
> Je?li by to kogo? interesowa?o, to dzi? "wymy?li?em" prosty sposób na implementacj? "coroutines" w C.


Maciek Godek (26.01.2020, 21:00)
W dniu niedziela, 26 stycznia 2020 15:43:22 UTC+1 u?ytkownik heby napisa?:
> On 24/01/2020 12:44, Maciek Godek wrote:
> > Je?li by to kogo? interesowa?o, to dzi? "wymy?li?em" prosty sposób na implementacj? "coroutines" w C.

>


?
heby (26.01.2020, 21:44)
On 26/01/2020 20:00, Maciek Godek wrote:
>>

> ?


Nie wiem o co pytasz bo się nie dosłał tekst pytania, ale odpowiem w ciemno:

Nie ma sensu pisać czegoś co już jest, w dodatku boostowe coroutines
używają boost::context, a te znowu ośmielają się twierdzić że:

Maciek Godek (27.01.2020, 08:53)
W dniu niedziela, 26 stycznia 2020 20:44:16 UTC+1 użytkownik heby napisał:
> On 26/01/2020 20:00, Maciek Godek wrote:
> >>

> > ?

> Nie wiem o co pytasz bo się nie dosłał tekst pytania, ale odpowiem w ciemno:
> Nie ma sensu pisać czegoś co już jest


To jest dla C++.
C++20 ma mieć coroutines w standardzie (a Microsoft Visual C++ wspierajuż od jakiegoś czasu, tak że efektywnie można sobie pisać C# w C++ np. na UWP)

Moje rozwiÄ…zanie jest dla C.
heby (27.01.2020, 20:11)
On 27/01/2020 07:53, Maciek Godek wrote:
> Moje rozwi?zanie jest dla C.


A po co? W systemach gdzie si? przydaje na 100% jest C++. W 99.9%
wypadków wystarczy zamieni? gcc na g++.

Po co komu coroutines w C skor? s?/b?d? w C++?
Maciek Godek (27.01.2020, 21:24)
W dniu poniedzia?ek, 27 stycznia 2020 19:12:00 UTC+1 u?ytkownik heby napisa?:
> On 27/01/2020 07:53, Maciek Godek wrote:
> > Moje rozwi?zanie jest dla C.

> A po co?


Konkretnie dlatego, ?e rozwijam system w j?zyku C, i potrzebuj? mechanizmu dla j?zyka C.

> W systemach gdzie si? przydaje na 100% jest C++. W 99.9%
> wypadków wystarczy zamieni? gcc na g++.


Tak. Mo?na te? np. osadzi? interpreter Lua, który te? wspiera coroutines.
Albo zmieni? prac?.

> Po co komu coroutines w C skor? s?/b?d? w C++?


To teraz powiedz mi:
- czy powinienem teraz korzysta? z coroutines ze standardu, któryjeszcze nie zosta? zatwierdzony, czy mo?e raczej wzi??teraz boosta, a pó?niej usuwa? zale?no?ci i refaktoryzowa? do standardu?

- w jaki sposób te korutyny s? w boo?cie albo w standardzie zaimplementowane? Czy potrafisz z ca?? pewno?ci? powiedzie?, ?e nie b?dzie problemu ze wznawianiem ich w interrupt handlerach na ARMach?

Czy mo?e potrzebuj? nada? im jaki? magiczny atrybut w rodzaju "nothrow", ?eby mie? pewno??, ?e to zadzia?a dla mojego use case'u?

Bo u mnie to jest 20 linijek bardzo prostego kodu.
heby (27.01.2020, 21:51)
On 27/01/2020 20:24, Maciek Godek wrote:
> Konkretnie dlatego, ?e rozwijam system w j?zyku C, i potrzebuj? mechanizmu dla j?zyka C.


I dlaczego nie mo?esz uzy kompilatora C++? To kwestie religijne?

>> W systemach gdzie si? przydaje na 100% jest C++. W 99.9%
>> wypadków wystarczy zamieni? gcc na g++.

> Tak. Mo?na te? np. osadzi? interpreter Lua, który te? wspiera coroutines.


Nie, poniewa zmiana z gcc na g++ to jaki 10 sekund, a zmiana na Lua to
od kilku do kilkuset godzin i zerowy sens.

>> Po co komu coroutines w C skor? s?/b?d? w C++?

> To teraz powiedz mi:
> - czy powinienem teraz korzysta? z coroutines ze standardu, który jeszcze nie zosta? zatwierdzony, czy mo?e raczej wzi?? teraz boosta, a pó?niej usuwa? zale?no?ci i refaktoryzowa? do standardu?


U?y? boosta, dorobi? abstrakcj? i zrefaktoryzowa? jak b?dzie po co za
kilka lat.

> - w jaki sposób te korutyny s? w boo?cie albo w standardzie zaimplementowane? Czy potrafisz z ca?? pewno?ci? powiedzie?, ?e nie b?dzie problemu ze wznawianiem ich w interrupt handlerach na ARMach?


"[...] Pomys? opiera si? na rozszerzeniu kompilatora GCC [...]"

Czy potrafisz z ca?? pewno?ci? wskaza? sensown? zalet? side effects
jakiej? implementacji vs szeroko u?ywana bibliteka ktorej spore
fragmenty l?duj? co jaki? czas w standardzie?

Jeste? pewny ?e ktokolwiek b?dzie uzywa? *KORUTYN* w handlerach przerwa?
na ARMie czy innym 6502? ?artujesz, powiedz prosz?.

> Czy mo?e potrzebuj? nada? im jaki? magiczny atrybut w rodzaju "nothrow", ?eby mie? pewno??, ?e to zadzia?a dla mojego use case'u?


Dlaczego masz nadawa? nothrow? Jak exception spadnie na dno stosu to w
dowolnej implementacji dziej? si? interesujace rzeczy.

A ju? najbardziej interesujace rzeczy dziej? si? jak ten exception jest
wywo?any z Twojego C...

> Bo u mnie to jest 20 linijek bardzo prostego kodu.


Bazuj?cego feature jakiego? kompilatora o niejasnej przysz?osci i
przeno?no?ci.
Maciek Godek (27.01.2020, 22:32)
W dniu poniedzia?ek, 27 stycznia 2020 20:51:25 UTC+1 u?ytkownik heby napisa?:
> On 27/01/2020 20:24, Maciek Godek wrote:
> > Konkretnie dlatego, ?e rozwijam system w j?zyku C, i potrzebuj? mechanizmu dla j?zyka C.

> I dlaczego nie mo?esz uzy kompilatora C++?


Mam wiele powodów. Ale nie tego dotyczy ten w?tek.

> >> W systemach gdzie si? przydaje na 100% jest C++. W 99.9%
> >> wypadków wystarczy zamieni? gcc na g++.

> > Tak. Mo?na te? np. osadzi? interpreter Lua, który te? wspiera coroutines.

> Nie, poniewa zmiana z gcc na g++ to jaki 10 sekund, a zmiana na Lua to
> od kilku do kilkuset godzin i zerowy sens.


Zmiana na g++ to te? zerowy sens. Pomijaj?c jeszcze t? kwesti?, ?e trzeba go jeszcze najpierw zainstalowa?. A pó?niej jeszcze zainstalowa? boosta.
I to u ka?dego developera, który pracuje nad tym projektem.
?eby u?ywa? ficzeru, którego zaimplementowanie zajmuje 20 linijek w C. I to w dodatku implementacji, co do której nie wiem, czy nie b?dzie z ni? problemu w kontek?cie, w którym chc? go u?y?. I to po to, ?eby pó?niej refaktoryzowa? kod, kiedy ficzer wejdzie do standardu. O ile oczywi?cie komitet nie zmieni go na tyle, ?e przestanie si? nadawa? do moich zastosowa?.

Dzi?ki, ale nie, dzi?ki.

> >> Po co komu coroutines w C skor? s?/b?d? w C++?

> > To teraz powiedz mi:
> > - czy powinienem teraz korzysta? z coroutines ze standardu, który jeszcze nie zosta? zatwierdzony, czy mo?e raczej wzi?? teraz boosta, a pó?niej usuwa? zale?no?ci irefaktoryzowa? do standardu?

> U?y? boosta, dorobi? abstrakcj? i zrefaktoryzowa? jak b?dzie po co za
> kilka lat.


"Dorobi? abstrakcj?"?

A nie mog? od razu u?y? docelowego rozwi?zania?

To jest 20 linijek kodu.

A boost ma... no, ile linijek?

> > - w jaki sposób te korutyny s? w boo?cie albo w standardzie zaimplementowane? Czy potrafisz z ca?? pewno?ci? powiedzie?, ?e nie b?dzie problemu ze wznawianiem ich w interrupt handlerach na ARMach?

> "[...] Pomys? opiera si? na rozszerzeniu kompilatora GCC [...]"
> Czy potrafisz z ca?? pewno?ci? wskaza? sensown? zalet? side effects
> jakiej? implementacji vs szeroko u?ywana bibliteka ktorej spore
> fragmenty l?duj? co jaki? czas w standardzie?


Projekt, nad którym pracuj?, i tak korzysta ju? z tego kompilatora i jego ró?nych rozszerze?.

I to nie jest "side effect", tylko udokumentowane rozszerzenie j?zyka.
I to nie jest "jaka? implementacja", tylko jedna z najcz??ciej u?ywanych implementacji.

> Jeste? pewny ?e ktokolwiek b?dzie uzywa? *KORUTYN* w handlerach przerwa?
> na ARMie czy innym 6502? ?artujesz, powiedz prosz?.


No, ja b?d?. W?a?ciwie to g?ównie po to opracowa?em ten mechanizm.
?eby móc sobie pisa? w?tki na przerwaniach. Wi?cej na ten temat pisa?em na comp.lang.c.
Widzisz w tym jaki? problem?

> > Czy mo?e potrzebuj? nada? im jaki? magiczny atrybutw rodzaju "nothrow", ?eby mie? pewno??, ?e to zadzia?a dla mojego use case'u?

> Dlaczego masz nadawa? nothrow? Jak exception spadnie na dno stosu tow
> dowolnej implementacji dziej? si? interesujace rzeczy.


Rzecz w tym, ?e zarówno wyj?tki, jak i korutyny s? mechanizmem transferu sterowania. Nie do ko?ca rozumiem, jak dzia?aj? w?tki w C++, ani tym bardziej jak dzia?aj? korutyny wC++.

Co wi?cej, nie interesuje mnie to do tego stopnia, ?ebym chcia? po?wi?ca? czas na uczenie si? tego i analiz? wszystkich sytuacji, w których co? mo?e pój?? nie tak.

A Ty w dalszym ci?gu nie odpowiedzia?e? mi na moje pytanie. Czy b?dzie problem ze wznawianiem tych korutyn w przerwaniach, czy nieb?dzie?

> A ju? najbardziej interesujace rzeczy dziej? si? jak ten exception jest
> wywo?any z Twojego C...


Có?. Rzecz wygl?da tak, ?e zarówno w?tki, jaki korutyny, to mechanizmy kontroli sterowania. By?bym wr?cz zaskoczony, gdyby okaza?o si?, ?e te dwa mechanizmy w standardzie C++20 nie b?d? wchodzi?y sobie w parad?, i trzeba b?dzie czeka? do C++32, a? to naprawi?. Takie historie przecie? ju? by?y. Cho?by z "range based for", na któr? trzeba by?o czeka? kilkana?cie lat, a jak ju? dodali, to okaza?o si?, ?e jest skopana.

> > Bo u mnie to jest 20 linijek bardzo prostego kodu.

> Bazuj?cego feature jakiego? kompilatora o niejasnej przysz?osci i
> przeno?no?ci.


Tzn. GCC jest "jakim? kompilatorem o niejasnej przysz?o?ci iprzeno?no?ci"?

GCC jest, przede wszystkim, szeroko u?ywanym kompilatorem o otwartych ?ród?ach i bogatej dokumentacji, z du?ym wsparciem ze strony przemys?u hardware'owego.
heby (27.01.2020, 23:10)
On 27/01/2020 21:32, Maciek Godek wrote:
>> I dlaczego nie mo?esz uzy kompilatora C++?

> Mam wiele powodów. Ale nie tego dotyczy ten w?tek.


Rozumiem, wi?c to kwestie religijne jednak.

>> Nie, poniewa zmiana z gcc na g++ to jaki 10 sekund, a zmiana na Lua to
>> od kilku do kilkuset godzin i zerowy sens.

> Zmiana na g++ to te? zerowy sens.


Wr?cz przeciwnie. To troche jak zamiana ?opaty na kopark?. Te? sensu
brak jak si? kopie dziur? pod kwiatek. Tylko po co wtedy komu korutyny.

> Pomijaj?c jeszcze t? kwesti?, ?e trzeba go jeszcze najpierw zainstalowa?.


To faktycznie showstopper.

> A pó?niej jeszcze zainstalowa? boosta.


A to ju? overkill. Ze dwa polecenia w konsoli to o trzy za du?o.

> I to u ka?dego developera, który pracuje nad tym projektem.


Nie do ogarni?cia przez IT ani tym bardziej developerów, oni si? gubi?
przy byle pingu a co dopiero apt-geta u?y?.

>> U?y? boosta, dorobi? abstrakcj? i zrefaktoryzowa? jak b?dzie po co za
>> kilka lat.

> "Dorobi? abstrakcj?"?


Chyba nie podziewasz si? ?e kto? b?dzie chcia? u?ywa? niestandardowych
makr wprost w kodzie w których a? roi si? od ?miesznych problemów z
okolic "zapomia?em doda? makra _START i wylatuje"?

> A nie mog? od razu u?y? docelowego rozwi?zania?


Mo?esz. Ale boost::context/coroutine nie jest jeszcze "docelowy".
Dlatego owija si? w to abstrakcj? i izoluje granic? refaktoringu.

> To jest 20 linijek kodu.
> A boost ma... no, ile linijek?


Biliard. W sumie bez znaczenia. U mnie to i tak jeden #include.

>> Czy potrafisz z ca?? pewno?ci? wskaza? sensown? zalet? side effects
>> jakiej? implementacji vs szeroko u?ywana bibliteka ktorej spore
>> fragmenty l?duj? co jaki? czas w standardzie?

> Projekt, nad którym pracuj?, i tak korzysta ju? z tego kompilatora i jego ró?nych rozszerze?.


I dlaczego tym rozszerzeniem kompilatora nia ma by? g++/boost? Znowu
religia?

> I to nie jest "side effect", tylko udokumentowane rozszerzenie j?zyka.


Ja mówie o "[...]?eby warto?ci argumentów by?y przechowywane mi?dzy
wywo?aniami, to musimy je zapisywa? w zmiennych statycznych.[...]".

No to si? kto? by zdziwi? w handlerze przerwania ARMa ?e mu si? jakie?
zmienne statyczne nadpisuj? w s?siednim przerwaniu z s?siedniego przerwania.

>> Jeste? pewny ?e ktokolwiek b?dzie uzywa? *KORUTYN* w handlerach przerwa?
>> na ARMie czy innym 6502? ?artujesz, powiedz prosz?.

> No, ja b?d?. W?a?ciwie to g?ównie po to opracowa?em ten mechanizm.


A po co w przerwaniu korutyny? Impelemntujesz maszyn? stanów? Korutyny
s? potrzebne kiedy algorytm jest z?o?ony i nie da si? go sp?aszczy? bez
po?wi?cenia czytelno?ci. Masz a? tak z?o?one algorytmy w przerwaniach?
Jeste? pewny ?e nie da si? ich wyrzuci? poza przerwania?

> ?eby móc sobie pisa? w?tki na przerwaniach.


OK, oczywis?ie sprawdzi?e? overheat prze?aczanai stosów i zapisywania
kontekstu rejestrów?

Zaryzykuje: a sprawdzi?e? co oferuje FreeRTOS?

> Wi?cej na ten temat pisa?em na comp.lang.c.
> Widzisz w tym jaki? problem?


W zasadzie tak: przerwania, jak to przerwania, powinny by? szybkie.
Korutyn bym tam nie wsadza?. Szczególnei takich z okolic "workaround
przez zmienne statyczne".

> Rzecz w tym, ?e zarówno wyj?tki, jak i korutyny s? mechanizmem transferu sterowania. Nie do ko?ca rozumiem, jak dzia?aj? w?tki w C++, ani tym bardziej jak dzia?aj? korutyny w C++.


Korutyny w c++ dzia?aja tak samo jak cooperative mutitasking w C.
Zapami?tuje si? stos, rejestry i przepina na inny "fiber". Wsio.
Technologia z lat 70 gdzie? chyba.

> Co wi?cej, nie interesuje mnie to do tego stopnia, ?ebym chcia? po?wi?ca? czas na uczenie si? tego i analiz? wszystkich sytuacji, w których co? mo?e pój?? nie tak.


Ale? niestety musisz. Przez ten kod na statycznych zmiennych jeste?
zmuszony do analizy i to choelrnie cie?kiej bo masz praktycznie
preemptive multitasking, w przerwaniach. Albo ciezka analiza albo game over.

> A Ty w dalszym ci?gu nie odpowiedzia?e? mi na moje pytanie. Czy b?dzie problem ze wznawianiem tych korutyn w przerwaniach, czy nie b?dzie?


Oczywiscie ?e odpowied? zale?y od zabyt du?ej liczby czynników aby mia?a
sens. Ale poniewa? mam pod r?k? fusy: masz problem z przekazywaniem
warto?ci pomi?dzy wywo?aniami i sugerujesz zmienne statyczne i pracujesz
z przerwaniami. Co mo?e pój?? ?le?

>> Bazuj?cego feature jakiego? kompilatora o niejasnej przysz?osci i
>> przeno?no?ci.

> Tzn. GCC jest "jakim? kompilatorem o niejasnej przysz?o?ci i przeno?no?ci"?


Feature tego kompilatora jest o niejasnej przysz?o?ci.

PS. Ma?a uwaga: coroutines wymagaj? *czego?* ze stosem. kopiowania,
podmieniania, czegokolwiek. To jest ten brakuj?cy ficzer w implementacji.
Maciek Godek (28.01.2020, 00:17)
W dniu poniedzia?ek, 27 stycznia 2020 22:10:25 UTC+1 u?ytkownik heby napisa?:
> On 27/01/2020 21:32, Maciek Godek wrote:
> >> I dlaczego nie mo?esz uzy kompilatora C++?

> > Mam wiele powodów. Ale nie tego dotyczy ten w?tek.

> Rozumiem, wi?c to kwestie religijne jednak.


Wygl?da na to, ?e dla Ciebie tak.

> Wr?cz przeciwnie. To troche jak zamiana ?opaty na kopark?.Te? sensu
> brak jak si? kopie dziur? pod kwiatek. Tylko po co wtedy komu korutyny.
> To faktycznie showstopper.
> A to ju? overkill. Ze dwa polecenia w konsoli to o trzy za du?o..
> Nie do ogarni?cia przez IT ani tym bardziej developerów, oni si? gubi?
> przy byle pingu a co dopiero apt-geta u?y?.


Jaki? czas temu pracowa?em przy projekcie, do którego u?ywali?my jakiego? samsungowego odpowiednika Raspberry.
By?o tam zalecenie zwi?zane z tym, w jaki sposób wgrywa? obrazy linuksa na pendrajwa. Samsung dawa? link do aplikacji na Windowsa, która to robi?a.
Aplikacja zajmowa?a ok. 3 gigabajty, bo interfejs by? wykonany w Atomie czy jakim? innym web kicie.
Program dd zajmuje u mnie pod Linuxem 75 kilobajtów, i nie zu?ywawi?cej ramu, ni? potrzeba.

Innym razem zajmowa?em si? ewaluacj? androidowych NDKów.. Wtedy si? dowiedzia?em, ?e do rozpakowania ?róde? potrzeba 100GB, a do zbudowania kolejnych 250GB.

Nie jest trudno dodawa? niepotrzebne zale?no?ci.

Ale dla mnie nic z tego nie wynika. Powiem wi?cej. Uwa?am, ?e to g?upie.

> >> U?y? boosta, dorobi? abstrakcj? i zrefaktoryzowa? jak b?dzie po co za
> >> kilka lat.

> > "Dorobi? abstrakcj?"?

> Chyba nie podziewasz si? ?e kto? b?dzie chcia? u?ywa? niestandardowych
> makr wprost w kodzie w których a? roi si? od ?miesznych problemów z
> okolic "zapomia?em doda? makra _START i wylatuje"?


?
Jak nie dodasz makra _START, to si? nie skompiluje.

> > A nie mog? od razu u?y? docelowego rozwi?zania?

> Mo?esz. Ale boost::context/coroutine nie jest jeszcze "docelowy".
> Dlatego owija si? w to abstrakcj? i izoluje granic? refaktoringu.


No to dzi?ki. Te Twoje rady s? coraz lepsze.
> > To jest 20 linijek kodu.
> > A boost ma... no, ile linijek?

> Biliard. W sumie bez znaczenia. U mnie to i tak jeden #include.


A o ile wyd?u?a czas kompilacji?

> >> Czy potrafisz z ca?? pewno?ci? wskaza? sensown? zalet? side effects
> >> jakiej? implementacji vs szeroko u?ywana bibliteka ktorej spore
> >> fragmenty l?duj? co jaki? czas w standardzie?

> > Projekt, nad którym pracuj?, i tak korzysta ju? z tego kompilatora i jego ró?nych rozszerze?.

> I dlaczego tym rozszerzeniem kompilatora nia ma by? g++/boost? Znowu
> religia?


Jak na razie nasza rozmowa wygl?da tak, ?e Ty sobie u?ywasz jakiej? technologii, i ja sobie u?ywam innej technologii, i wygl?da na to, ?e z jakich? wzgl?dów Tobie strasznie przeszkadza to, ?e nie u?ywam tej technologii, której Ty u?ywasz.

Nie wiem, dlaczego to dla Ciebie tak wielki problem.

C++a zdarza mi si? u?ywa?, i nigdy nie sprawia mi to frajdy.Zawsze jest co?, z czym musz? si? u?era? z powodujakich? debilnych nalecia?o?ci historycznych albo innych. Interfejsy z STL za ka?dym razem wprowadzaj? mnie w b??d.. A rozmowy z entuzjastami C++ s? zawsze intelektualnie rozczarowuj?ce.

Swego czasu spisa?em zbiór zagadnie?, przy pracy nad którymi C++ bardziej mi przeszkadza?, ni? pomaga?. Znajduje si? tutaj:



Czasem, kiedy w odpowiedzi na moje ró?ne krytyki C++ pojawiaj? si? gorliwi wyznawcy, którzy przekonuj? mnie, ?e "chuja si? znam", odsy?am ich do tej listy problemów.

Wtedy albo znikaj?, albo mówi?, ?e nie maj? czasu na takie rzeczy, albo, ?e nie czuj? potrzeby, ?eby nikomu cokolwiek udowadnia?. W ka?dym razie ?aden jeszcze nie zaproponowa? jakiegokolwiek rozwi?zania któregokolwiek z tych problemów.

Je?eli lubisz C++, to sobie w nim programuj. Ja go nie lubi?, i mam dobre powody do tego, ?eby go nie lubi?. Je?eli Ty jeste? w nim produktywny, u?ywaj go. Ja w swoim ?yciu widzia?em projekty, które grz?z?y tylko od tego, ?e kto? na pocz?tku podj?? decyzj? o u?yciu tego w?a?nie j?zyka.
(Nota bene, widzia?em je w?a?nie w tej firmie, w którejpracujesz)

I je?eli Ty masz ochot? dostraja? si? do tempa pracy komitetu standaryzacyjnego C++, to to jest Twoja sprawa. Ja mam inne pomys?y na korzystanie ze swojego ?ycia, i wol? korzysta? z rozwi?za?, które rozumiem, i które dzia?aj? ju? teraz.

> > I to nie jest "side effect", tylko udokumentowane rozszerzenie j?zyka.

> Ja mówie o "[...]?eby warto?ci argumentów by?y przechowywane mi?dzy
> wywo?aniami, to musimy je zapisywa? w zmiennych statycznych.[....]".
> No to si? kto? by zdziwi? w handlerze przerwania ARMa ?e mu si? jakie?
> zmienne statyczne nadpisuj? w s?siednim przerwaniu z s?siedniego przerwania.


A dlaczego mia?oby si? tak dzia??

> A po co w przerwaniu korutyny? Impelemntujesz maszyn? stanów? Korutyny
> s? potrzebne kiedy algorytm jest z?o?ony i nie da si?go sp?aszczy? bez
> po?wi?cenia czytelno?ci. Masz a? tak z?o?one algorytmy w przerwaniach?
> Jeste? pewny ?e nie da si? ich wyrzuci? poza przerwania?


Wszystko si? da.
Kwestia tego, czy warto.

> > ?eby móc sobie pisa? w?tki na przerwaniach.

> OK, oczywis?ie sprawdzi?e? overheat prze?aczanai stosów i zapisywania
> kontekstu rejestrów?


Jakiego prze??czania stosów? Tutaj tego nie ma. Jest jedna zmienna przechowuj?ca adres etykiety. Analiza tych 20 linijek naprawd? nie jest trudna.

> Zaryzykuje: a sprawdzi?e? co oferuje FreeRTOS?


Oczywi?cie. Mam dobre powody, dla których stosuj? w?a?nie to rozwi?zanie, które stosuj?.

> > Wi?cej na ten temat pisa?em na comp.lang.c.
> > Widzisz w tym jaki? problem?

> W zasadzie tak: przerwania, jak to przerwania, powinny by? szybkie.
> Korutyn bym tam nie wsadza?. Szczególnei takich z okolic "workaround
> przez zmienne statyczne".


Jaki "workaround"?

> > A Ty w dalszym ci?gu nie odpowiedzia?e? mi na moje pytanie. Czy b?dzie problem ze wznawianiem tych korutyn w przerwaniach, czynie b?dzie?

> Oczywiscie ?e odpowied? zale?y od zabyt du?ej liczby czynników aby mia?a
> sens. Ale poniewa? mam pod r?k? fusy: masz problem z przekazywaniem
> warto?ci pomi?dzy wywo?aniami i sugerujesz zmienne statyczne i pracujesz
> z przerwaniami. Co mo?e pój?? ?le?


A w czym to przeszkadza? Je?eli chc? si? komunikowa? z przerwania z innymi komponentami systemu, to musz? u?y? zmiennej globalnej. Zmienna statyczna to to samo, tyle ?e komunikuj? si? jedynie z innymi fragmentami korutyny.

Jedyny potencjalny problem jest taki, ?e kto? u?yje zmiennejautomatycznej zamiast statycznej. Jestem ?wiadomy tego problemu, i dlatego napisa?em o nim w pierwszym po?cie.

> >> Bazuj?cego feature jakiego? kompilatora o niejasnej przysz?osci i
> >> przeno?no?ci.

> > Tzn. GCC jest "jakim? kompilatorem o niejasnej przysz?o?ci i przeno?no?ci"?

> Feature tego kompilatora jest o niejasnej przysz?o?ci.


Mog? ?atwo t? przysz?o?? przewidzie?: pozostanie w GCC na zawsze.

> PS. Ma?a uwaga: coroutines wymagaj? *czego?* ze stosem. kopiowania,
> podmieniania, czegokolwiek. To jest ten brakuj?cy ficzer w implementacji.


Korutyny wymagaj? mo?liwo?ci wznawiania kontekstu wykonawczego.
heby (28.01.2020, 23:37)
On 27/01/2020 23:17, Maciek Godek wrote:
> Jaki? czas temu pracowa?em przy projekcie [...]


Czyli jednak religia. Co? z okolic "C++ zajmuje du?o" i jaki? inny tego
typu krap którego pe?no na necie.

> Nie jest trudno dodawa? niepotrzebne zale?no?ci.


Wiadomo. Najlepiej wynajdywa? kwadratowe ko?a. Nie przejmuj si?, ca?e
embedded tak robi; widzia?em, liczone w tysi?ce, procedury zamiany inta
na tekst. Po?owa z bugami. A co dopiero coroutines.

>> Biliard. W sumie bez znaczenia. U mnie to i tak jeden #include.

> A o ile wyd?u?a czas kompilacji?


Dopad?a Cie reglamentacja czasu kompilacji? Masz ograniczenie na
produkcje promieniowania termicznego w procesach kompilacji wynikaj?ce z
troski o polsk? energetyk?? Kompilujesz ca?os? za ka?dym razem? Widzisz
ró?nic? pomiedzy 10ms vs 20ms?

> ?e Ty sobie u?ywasz jakiej? technologii, i ja sobie u?ywam innej technologii


Kilka kiepskich makr cie?ko nazwa? technologi?.

>, i wygl?da na to, ?e z jakich? wzgl?dów Tobie strasznie przeszkadza to, ?e nie u?ywam tej technologii, której Ty u?ywasz.


Mi nie przeszkadza bo nie u?ywam popsutych makr które rozwi?zuj? jaki?
problem generujac inny problem. Przestrzegam innych.

> Nie wiem, dlaczego to dla Ciebie tak wielki problem.


To w ogóle nie jest problem. ?wiat z ut?sknieniem czeka na nast?pny
zbiór makr rozwi?zuj?cych problemy które nie istniej? gdzie indziej.

> A rozmowy z entuzjastami C++ s? zawsze intelektualnie rozczarowuj?ce.


Ostro :D

>


Masz prawo do zdania odmiennego od reszty ?wiata.

> Czasem, kiedy w odpowiedzi na moje ró?ne krytyki C++ pojawiaj? si? gorliwi wyznawcy, którzy przekonuj? mnie, ?e "chuja si? znam", odsy?am ich do tej listy problemów.


Ca?o?? tego blogowego wpisu by?a C++ vs inne j?zyki. A tu rozmawiamy C++
vs C. Musia?em wiec przegapi? t? "list?" która ma odniesienie do naszej
dyskusji.

Nikt tutaj nie przekna Cie do pisania w C++ bo wcale nie musisz. Skoro
piszesz programy u?ywaj?c muzealnych technik zamiast wspania?ego
scheme/lispa to mo?esz miec "jakie? powody". Ja tylko zwracam uwag? ?e
zamiana technologii na C++ i pisanie dalej w C z ma?ymi wstawkami w C++
nikomu dupy nie urwa?o cho? nie jednego pewnie zmusi?o do spowiedzi i
pokuty w lokalnej grupie wyznaniowej.

> W ka?dym razie ?aden jeszcze nie zaproponowa? jakiegokolwiek rozwi?zania któregokolwiek z tych problemów.


Zabawne bo ja w?asnie zaproponowa?em. Zmie? na C++, u?yj
boost::coroutine. Potem dorzuci?e? ?e to arm i przerwania. Skoro tak to:
nie uzywaj coroutines, u?yj FreeRTOSa gdzie coroutines dostaniesz jako
cooperative multitasking. Albo nawet preemptive jak trzeba. Przy okazji
za friko dostaniesz rozwi?zanie drobnostek takich jak "komunikowanie si?
przerwa? przez zmienne globlane" itp detale

> Ja go nie lubi?, i mam dobre powody do tego, ?eby go nie lubi?.


Nie, masz tylko ideologi? i religi?. Tak jak dekarze który nie u?ywaj?
m?otków bo nie lubi?. Lutownic? te? si? da wbija? gwo?dzie w pap?,
dziadek tak robi?.

> Ja w swoim ?yciu widzia?em projekty, które grz?z?y tylko od tego, ?e kto? na pocz?tku podj?? decyzj? o u?yciu tego w?a?nie j?zyka.
> (Nota bene, widzia?em je w?a?nie w tej firmie, w której pracujesz)


To musia?a by? inna firma. Nic si? nie zgadza.

> I je?eli Ty masz ochot? dostraja? si? do tempa pracy komitetu standaryzacyjnego C++, to to jest Twoja sprawa. Ja mam inne pomys?y na korzystanie ze swojego ?ycia, i wol? korzysta? z rozwi?za?, które rozumiem, i które dzia?aj? ju? teraz.


Ale one nie dzia?aj?. Dostarczy?e? popsut? bibliotek? do coroutines
która ma rozwi?zywa? problemy które rozwi?zuje si? inaczej.

>> No to si? kto? by zdziwi? w handlerze przerwania ARMa ?e mu si? jakie?
>> zmienne statyczne nadpisuj? w s?siednim przerwaniu z s?siedniego przerwania.

> A dlaczego mia?oby si? tak dzia??


Bo przerwania, bywa, przychodz? za szybko. Szczególnie jak si? w nich
robi zb?dn? algorytmik?. Bywa ?e przychodz? *za* szybko.

> Kwestia tego, czy warto.


Nie warto. Pisanie na zmiennych statycznych/globalnych jest hardkorowe i
tak robi? Prawdziwi Programi?ci.

>>> ?eby móc sobie pisa? w?tki na przerwaniach.

>> OK, oczywis?ie sprawdzi?e? overheat prze?aczanai stosów i zapisywania
>> kontekstu rejestrów?

> Jakiego prze??czania stosów?


Tak dzia?aj? coroutines w C/C++ bo w tym j?zyku stos jest elementem
kontekstu wykonywania kodu.

> Tutaj tego nie ma.


I dlatego nie masz tak naprawd? coroutines. Masz popsut? bibliotek? do
rozwi?zywania absurdalnie nik?ego zakresu problemów w porównaniu do
prawdziwych coroutines. Nie wykluczam ?e wystarczaj?c? do "przerwania w
ARMie" aczkolwiek dalej jestem zaszokowany ile si? w tym przerwaniu musi
dzia? ?e a? trzeba na pomoc wo?a? preprocesor ...

>> Zaryzykuje: a sprawdzi?e? co oferuje FreeRTOS?

> Oczywi?cie. Mam dobre powody, dla których stosuj? w?a?nie to rozwi?zanie, które stosuj?.


Masz dobre powody aby nie u?ywa? C++ i FreeRTOSa. Poza religi? nie znam
sensownych, "blog" nie pomóg? w ich identyfikacji. Co robi?...

>> W zasadzie tak: przerwania, jak to przerwania, powinny by? szybkie.
>> Korutyn bym tam nie wsadza?. Szczególnei takich z okolic "workaround
>> przez zmienne statyczne".

> Jaki "workaround"?


Niemo?no?? u?ywania stosu. To ogranicza zastosowanie do marginalnej
ilosci przypadków, w dodatku prawdopodobnie rozwi?zywalnych ?adniej
switch/case.

>> Oczywiscie ?e odpowied? zale?y od zabyt du?ej liczby czynników aby mia?a
>> sens. Ale poniewa? mam pod r?k? fusy: masz problem z przekazywaniem
>> warto?ci pomi?dzy wywo?aniami i sugerujesz zmienne statyczne i pracujesz
>> z przerwaniami. Co mo?e pój?? ?le?

> A w czym to przeszkadza?


W niczym. Przy bardzo du?ej uwadze, wyszarpaniu sobie ?y? i g?ebokiej
modlitwie masz szans? napisa? ca?y program na side effectach przez
zmienne globalne i mo?e nawet cudem zadzia?a. W ko?cu jako? te programy
w BASICu na 8-bit pisali.

>Je?eli chc? si? komunikowa? z przerwania z innymi komponentami systemu, to musz? u?y? zmiennej globalnej.


To inny przypadek.

> Zmienna statyczna to to samo, tyle ?e komunikuj? si? jedynie z innymi fragmentami korutyny.


Ale prawdziwe korutyny *NIE* ograniczaj? u?ywania stosu. U?ywasz i
dzia?a tak jak si? spodziewasz.

> Jedyny potencjalny problem jest taki, ?e kto? u?yje zmiennej automatycznej zamiast statycznej. Jestem ?wiadomy tego problemu, i dlatego napisa?em o nim w pierwszym po?cie.


To nie jest jaki?tam problemik. To dyskwalifikacja bo w ?rodku tych
korutyn nie dzia?a nawet prymitywny C. To nie s? coroutines, to tylko
kilka jumpów o fancy nazwach.

>> PS. Ma?a uwaga: coroutines wymagaj? *czego?* ze stosem. kopiowania,
>> podmieniania, czegokolwiek. To jest ten brakuj?cy ficzer w implementacji.

> Korutyny wymagaj? mo?liwo?ci wznawiania kontekstu wykonawczego.


Który w j?zyku C wymaga stosu. Stos jest cz?sci? kontekstu. Nie masz w
korutynie przechowania pe?nego kontekstu, nie masz korutyn tylko jakie?
jumpy którym bli?ej do asemblera ni? C.

PS. Podpowiem Ci: Twój pomys? da si? rozwi?za? kilkoma makrami i
ukrytymi w nich "switch/case" bez u?ywania magicznych ficzerów
kompilatora. Te? tym sposobem da si? osi?gn?? "korutyn?" bez zmiennych
automatycznych. I te? w kilku linijkach. I te? kompletnie bez sensu w
prawdziwych zastosowaniach. Bo tak naprawd? to jest tylko popsuta
maszyna stanów. A nie coroutine.

Podobne w±tki