teach an old C new tricks
-
[Computers]
-
Ik kom net op dit artikel over Coroutines in C en het zit boordevol met lekkere low-level programmeer-juweeltjes. Dat alles om iets ontzettend handigs te implementeren: coroutines die ik het beste ken als Python-generators (niet te verwarren).
Van een geniale onduidelijkheid is bijvoorbeeld Duff's device hieronder:
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while ((count -= 8) > 0);
}
Daarna wordt het alleen maar erger. Uiteindelijk volgen er een bijzonder vies stel macro's die er met GOTO
's en statische variabelen voor zorgen dat je na return
door kunt gaan in die functie waar je was gebleven.
Ooit iemand C ouderwets horen noemen?
-
-
Geplaatst door alper at 2005-03-11 22:02
| Geef commentaar (4)
| Trackbacks (0)
Opmerkingen
Re: teach an old C new tricks
lol; even terug denken naar de tijd dat ik alles in assembler progde. Toen gebruikte ik dit soort grapjes bijzonder vaak (hell, je hebt alleen maar JMP en CALL, en je raakt gewend om ze allebei zo weinig mogelijk te gebruiken, maar als het moet, dan maar de JMP, die is korter en sneller).
Die truuk werkt dus niet in java (even gecheckt); zo mag je switch statements dus niet gebruiken. Het concept van een 'static' function variable bestaat ook niet (moet je een attribute voor bouwen, kan dus wel). GOTOs heb je ook al niet.
Het kan ik java met PipedInputStream en PipedOutputStream maar dan heb je eigenlijk 2 threads nodig en dit is toch een inferieure oplossing.
Geplaatst door:
Reinier Zwitserloot
op March 12,2005 17:44
Re: teach an old C new tricks
Nou ja gewoon channels gebruiken toch? Dan heb je geen threads meer nodig.
Geplaatst door:
Alper
op March 12,2005 18:16
Re: teach an old C new tricks
Channels? Blijft lelijke code. Je MOET die state aanhouden. Stel:
FF, 4 gieg, 0. Dus: genereer 4 miljard nullen. Dat kan niet in een keer; je MOET bewaren. Channels hebben niet de mogelijkheid om een methode aan te roepen om het af te handelen, dus, dan hang je.
Ik heb wel een oplossing bedacht, met java 1.5 (met Roel):
public @Statesave(static=0) int decode(InputStream)
{
}
Die @Statesave bestaat niet, maar die kun je wel maken. Dan moet je dus zelf een soortement van code preprocessor (APT, zoek maar op, niet die van debian, maar de annotation processing tool) schrijven die voor elke methode met de Statesave annotation een hele vieze hack doet. Zeg maar wat die c #defines doen.
Lijkt me een leuk oefen projectje om APT te leren.
--Reinier en Roel
Geplaatst door:
Reinier Zwitserloot
op March 13,2005 00:38
Re: teach an old C new tricks
Dat probleem moet je me nog maar een keer in het echt uitleggen.
Ik heb ff vlug naar apt gekeken, en idd het lijkt me een feestje. Is het al makkelijk te gebruiken samen met Eclipse, of duurt dat nog even?
Geplaatst door:
Alper
op March 13,2005 01:24
- Trackbacks
Er is geen trackback.
lol; even terug denken naar de tijd dat ik alles in assembler progde. Toen gebruikte ik dit soort grapjes bijzonder vaak (hell, je hebt alleen maar JMP en CALL, en je raakt gewend om ze allebei zo weinig mogelijk te gebruiken, maar als het moet, dan maar de JMP, die is korter en sneller).
Die truuk werkt dus niet in java (even gecheckt); zo mag je switch statements dus niet gebruiken. Het concept van een 'static' function variable bestaat ook niet (moet je een attribute voor bouwen, kan dus wel). GOTOs heb je ook al niet.
Het kan ik java met PipedInputStream en PipedOutputStream maar dan heb je eigenlijk 2 threads nodig en dit is toch een inferieure oplossing.