Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Jiří Havel

Stran: 1 2 [3] 4 5 ... 27
31
Vývoj / Re:If bez curly brackets?
« kdy: 20. 06. 2025, 06:13:19 »
Tolik závorek často nemívám ani v celé funkci, přestože je povinně používám. Možná to bylo způsobeno zbytečně hluboko zanořenými podmínkami.
Dost často jsem tuhle prasárnu viděl v případě, že se autor kódu slepě držel zásady že goto je fuj.

Jak už tu zaznělo výše,  typicky ve funkcích, které mají několik málo rozdílných clean-upů je to naprosto legální praktika, která právě vnořená ifová pekla eliminuje.

Místo goto používám return.
Což jde dobře v jazycích, které mají defer/destruktory či něco podobného. Jak je třeba před každým z mnoha returnů udělat úklid, tak to začíná být nepohodlné a náchylné k opomenutí.

32
Vývoj / Re:If bez curly brackets?
« kdy: 19. 06. 2025, 15:59:05 »
A bol som šokovaný, že je zástancom (nielen) if-ov bez curly brackets. Ja som si myslel a dúfal, že táto diskusia je už mŕtva, pochovaná a zabudnutá minimálne od roku 2014.
A co na to říká samotný odkazovaný článek?
Citace
Maybe the coding style contributed to this by allowing ifs without braces, but one can have incorrect indentation with braces too, so that doesn't seem terribly convincing to me.
Jo jo, mrtvá, pochovaná a zapomenutá ::)

33
Hardware / Re:USB-C zdroj pro tři notebooky zároveň
« kdy: 17. 06. 2025, 14:35:26 »
Ty tomu ale vubec nerozumis. Ty tlacis tak akorat konektor do diry. To je vse. Proud se nikam netlaci, protoze to je zavisla hodnota na rezistanci spotrebice do ktere privadis napeti viz ohmuv zakon. Tak si ho nastuduj protoze fyzika neni politika. Tj. pokud nevis tak budes akorat za hlupaka.
A víš o tom, že u skutečných zdrojů závisí napětí na proudu, který se odebírá? Nebo že jsou i nelineární zátěže jejichž odpor závisí na napětí nebo proudu? Takže s tou závislou hodnotou to není tak jednoduché?

Jakékoliv "tlačení" nebo "cucání" je neformální zjednodušení. Takže bych byl opatrný s tím, kdo je tady za hlupáka. ;)

34
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 15. 06. 2025, 12:37:30 »
Na rozdíl třeba od C, které má jenom režim "pras jak umíš".
Při práci v C taky fungujou příčetnějí režimy, které krotí ty nejprasáčtějí praktiky. Jen nejsou nijak vynucené jazykem, takže to hlídají lintery, code review a podobně.

35
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 13. 06. 2025, 11:21:18 »
Nedefinované chování umožňuje primitivní operace pokrýt jednou CPU intrukcí. Když bude definované všechno, na každou prkotinu bude knihovní funkce, která bude emulovat operátor přesně každý bit výsledku.

Teď jde použít oboje - rychlý operátor s nejistým chováním, nebo si zavolat funkci a mít výsledek pomalu, ale precizně.
Na tohle by bohatě stačilo implementačně definované chování (jako je třeba u signed dělení). Rozdíl oproti UB je velký :
- To chování se vždycky stane. Překladač nemůže předpokládat, že daná situace ve validním kódu nesmí nastat. Takže opravdu vygeneruje odpovídající CPU instrukce.
- Překladač/platforma musí zdokumentovat, jak se ta operace bude chovat.

Ve výsledku mám jednu CPU instrukci a žádné démony z nosa. :)

36
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 13. 06. 2025, 09:29:14 »
Raději nedefinované chování, než za každou cenu vymýšlet konkrétní chování, jež nemusí být intuitivní.
Tady nastává jeden praktický problém. Konkrétní chování programu, když to UB přece jenom nastane, dokáže tu neintuitivnost dotáhnout do netušených extrémů.

UB umožňuje autorům překladače doplnit tam nějaké příčetné chování. Ale když to neudělají, tak je to strašná past.

37
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 12. 06. 2025, 16:04:50 »
Co s tím? Vyřeší se to tak, že se RAM zadefinuje od adresy 1 a adresa 0 se ignoruje, abychom se vyhnuli problémům s dereferencí null pointeru. Přijdeme o jeden bajt RAM na mikrokontroléru, ale to je nízká cena za vyřešení problémů s adresou 0 a undefined behavior.
Jo, no naprosto geniální tah. Třeba v případě, že takovej Atmel tam má namapovanej jeden registr je to dobrý fundamentalistický přístup do něj prostě nešahat...
Pragmatický přístup je samozřejmě ten, že se pro některé platformy to nedefinované chování dodefinuje. Přece jenom standard C od tohohle dává ruce pryč a dovoluje naprosto cokoliv.

A důsledek je samozřejmě ten, že něco co embedáci u sebe normálně dělají, je na jiné platfomě recept na katastrofu. Může nastat něco co ani nepřipomíná předpokládaný segfault při přístupu na adresu 0.

38
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 12. 06. 2025, 14:28:54 »
BTW, ještě se tu neobjevil Preprocessor iceberg :
https://jadlevesque.github.io/PPMP-Iceberg/

39
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 12. 06. 2025, 12:44:40 »
Hosi, nepresvedcili jste me. To ze je C nizkourovnovy jazyk, je jasne. Ale proc bych mel psat
a << -1 To je jasny, ze je to undefined behaviour.
O takovém shiftu tady celou dobu nebyla řeč. Mluvilo se o :
Kód: [Vybrat]
a >> 1
kde a je signed integer.

40
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 14:34:31 »
> Ono existuje?

Aha, takže tu na viac ako stovke príspevkov komunikujeme o niečom, čo neexistuje? To je naozaj zvláštne. UB je jednoducho formálny koncept a ako taký celkom určite existuje. Je to zjednodušujúci pojem používaný v odbornej komunikácii na popis toho, čo sa deje v programe, keď je jeho zdrojový kód mimo rámec definovaný sémantikou jazyka.

> UB se přece nikdy neděje.

Skúste vo svojej úvahe použiť definíciu nedefinovaného správania tak ako bola pôvodne myslená.

> Občas mám pocit, že samotná slova jako "chování", "způsobuje" a podobné zastírají podstatu UB

Ten pojem sa vám môže nepáčiť, môžete proti tomu protestovať, ale to je asi tak všetko, čo s tým môžete robiť. Odborná komunita sa jednoducho pred desiatkami rokov zhodla na tom, že sa tento pojem bude používať a tak sa používa. Paradoxne väčšina ľudí nechce v komunikácii uvádzať úplnú výstižnú definíciu a radšej používa zaužívaný zjednodušujúci pojem.

Mne osobne sa tiež nepáči slovo vlákno, ale chápem, že je ten pojem zaužívaný.
Jo, vyjádřil jsem se asi dost nešikovně. Chtěl jsem zdůraznit že zákeřnost UB je v tom, že to není jen nějaká implementačně závislá akce, která se provede místo toho UB.

Že UB znamená, že tahle situace ve validním programu nesmí nastat. A překladač na tom staví a propaguje to i na okolní kód. Takže vygenerovaný kód s tímhle stavem vůbec nepočítá a můžou se dít fakt divné věci.

Citace
> mindfuck

??
Zažil jsem fakt divoké věci. Co se dělo vůbec nepřipomínalo zdroják a navíc to divné chování nebylo vůbec omezení na místo toho UB.

41
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 11:51:04 »
No blbě. Pokud to vaše platforma potřebuje, tak vám musí dát nějaký nestandardní způsob jak to udělat. Standardní C to neumí (pokud teda NULL odpovídá adrese 0, to taky nemusí platit).
Nesmysl. Standardní C to umí a vždy se to dělalo přes pointer, pokud jste někdy viděl nějakou knihovnu pro mikrokontroléry, tak tam se nastavují registry takto běžně, třeba AVR.
Fakt byste se měl podívat, co umí standardní C a co je nadstandardní rozšíření vašeho GCC dialektu.

Dost z toho, co jste tady napsal dělá jen GCC, protože to vůbec není součástí standardního C.

42
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 11:15:44 »
Na adresu 0 zapsat jde, pokud tam je mapována stránka.
V assembleru jo. Ale v C (bez nějakých nadstandardních flagů) to nesmíš. Takže ten vygenerovaný kód občas vypadá dost překvapivě.

43
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 10:44:41 »
A jak zapíšu do registru který je na adrese 0x00000000
Nezapíšeš. Protože gcc ti na tohle, v závislosti na optimalizacích, verzi překladače a fázi měsíce vygeneruje ud2 isntrukci. A proč? Protože může, je to undefined behavior, norma takové chování povoluje.

https://godbolt.org/z/bGqsEqsYc
Tohle je ještě dobrý. Crash by člověk tak nějak čekal.
Lepší je, když to přiřazení překladač využije jako informaci, že ten pointer nemůže být NULL.
A ještě lepší je čtení, které pak třeba může taky zmizet.  :o
https://godbolt.org/z/qxKhYThY6

44
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 10:18:58 »
A jak zapíšu do registru který je na adrese 0x00000000, nebo jak si přečtu kam ukazuje reset vektor, kdyby mi to kompilátor nedovolil? Proč by mi to neměl dovolit?
No blbě. Pokud to vaše platforma potřebuje, tak vám musí dát nějaký nestandardní způsob jak to udělat. Standardní C to neumí (pokud teda NULL odpovídá adrese 0, to taky nemusí platit).
Citace
Správný postup je nedovolit přetečení a ohandlovat ho:
Správný postup je napsat všechno bez chyb. Jenže my lidi to jaksi neumíme. A proto tu řešíme co mi jazyk udělá, když se seknu a něco neohandlím.

45
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 08:43:39 »
Tady prezentovaná zásadní výhoda C - výkon a přímé napojení na hw - je i jeho zásadní nevýhodou. Překladač nemá dost informací o vysokoúrovňovém záměru a nemůže tudíž aplikovat všechny optimalizace a kontroly.
S tím přímým napojením na hw je to taky zajímavé. Ono je to spíš nadstandardní rozšíření různých dialektů, než něco ze standardního C.

Standardní C vám dlouho nedalo ani add with carry.
A díky strict aliasingu je v něm prakticky neimplementovatelné třeba rychlé memcpy.


Ono existuje? UB se přece nikdy neděje. Ty jako programátor ses o to přece postaral a překladač ti v tom bezmezně věří.  8)

Občas mám pocit, že samotná slova jako "chování", "způsobuje" a podobné zastírají podstatu UB a proč je to občas takový mindfuck. Ta představa, že to UB něco dělá, je svým způsobem strašně špatně.

To už celkom preháňate, nemyslíte? Alebo je to tak, že by ste si to mali do študovať?
Proč přeháním? UB stojí na tom, že nesmí nastat. Validní C programy neobsahují UB. Programátor má za úkol zajistit aby k němu nemohlo dojít.
Dereference NULL je UB -> když dereferencuju pointer, tak optimalizátor ví, že nikdy nemůže být NULL a může tuhle informaci využít jak uzná za vhodné.
Nebo třeba funkce
Kód: [Vybrat]
bool test(int x)
{
  return x+1 > x
}
říká dvě věci :
1) + nikdy nepřeteče, takže test vždycky vrátí true. Takže z toho může optimalizátor udělat return true.
2) x nikdy nebude INT_MAX (protože by + přeteklo). Takže optimalizátor může tuhle informaci propagovat výš. Občas to může dotéct až překvapivě daleko.

Jen jsem se snažil trošku nezvyklým způsobem vystihnout tu neintuitivnost celého UB.

Stran: 1 2 [3] 4 5 ... 27