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 ... 25
16
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 11. 06. 2025, 01:45:58 »
Nejde iba o jeden operátor. Hlavný problém je to, že ľudia nechápu, čo je to nedefinované správanie, prečo existuje, čo spôsobuje a kam až siahajú jeho účinky.
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ě.

17
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 17:32:21 »
Je sranda když si někdo stežuje na "undefined behaviour", ale přitom píše kód stylem "wishful programming", kdy něco očekává - že jazyk by se měl chovat tak nebo onak a je to chyba jazyka když tomu tak není.

Tak na jednu stranu je špatně undefined behaviour a na druhou stranu defined behaviour, kde -1 se převede na unsigned a pak porovná, je taky špatně. Tak už si vyberte :)
Ano špatně je nedefinované i blbě definované chování.  Zkuste chvíli psát v třeba assembleru. Nepotkal jsem žádný jazyk, který by blbé inty dokázal zkomplikovat tak, jako to udělalo C.

18
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 17:25:19 »
A ještě si musí všimnout, že se mu signed a unsigned potkaly. Stačí aby to x nebylo deklarované hned vedle toho ifu a je to.

Ne, on by si neměl všimnout. On jde něco porovnávát, tak musí vědět co jde porovnávat. Nemůžu přece něco porovnávat pokud nevím jakého to je datového typu a tedy s čím to můžu (kompatibilní datové typy) porovnat. Jak můžu bez těchto informací vůbec jít něco porovnávat?
Víte co mě zaráží? Že si nějaký vývojář ani po 17 letech neuvědomuje, jak jednoduché je udělat chybu. Že my lidi udržíme v hlavě najednou jen cca 10 věcí. A každá věc, co za nás nehlídá překladač a musíme ji hlídat my nám z té konečné mentální kapacity užírá.
Citace
Citace
Nějaký důvod tam bude, když MSVC i clang mlčí jak partizáni. A i gcc potřebuje -Wall, jinak drží hubu.

U jiných věcí mi překladače nadávají daleko ochotněji. Tenhle warning z nich člověk musí spíš páčit.
Warning na to ale je - na všechny porovnání signed a unsigned proměnných/konstant dostaneš warning. Critical mission politika v tomto ohledu je zastaralá, asi vychází z dob kdy kompilátory toto hlásit neuměly, nebo nevím proč raději nepoužít warningy a místo toho všude rvát inty, kde zase mohou vznikat jiné chyby které by s unsigned nebyly.
Je v jen v jednom ze tří nejpoužívanějších překladačů. A ani v něm není zapnutý by default. Takový warning spíš není než je.

19
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 16:42:53 »
princip minimálního překvapení je v C plně implementován a jmenuje se unsigned int - ten jsem ve své praxi vždy použil a nikdy jsem překvapen nebyl
Kód: [Vybrat]
unsigned x = 1;
if ( x < -1 )
  printf( "Co se sakra děje?" );
Unsigned v C(++) má vestavěné tak zákeřné překvápko, že je v některých mission critical systémech kompletně zakázaný. :)

A kde je jaké překvápko? Překvapen může být akorát zase jenom ten kdo něco předpokládá. Ten kdo zná pořadí operátorů a implicitní konverze datových typů tak v tom má jasno.
A ještě si musí všimnout, že se mu signed a unsigned potkaly. Stačí aby to x nebylo deklarované hned vedle toho ifu a je to.
Citace
Jinak tady není důvod aby to překladač nepodchytil:
Citace
547818386/source.c:6:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if ( x < -1 )
            ^
Nějaký důvod tam bude, když MSVC i clang mlčí jak partizáni. A i gcc potřebuje -Wall, jinak drží hubu.

U jiných věcí mi překladače nadávají daleko ochotněji. Tenhle warning z nich člověk musí spíš páčit.

20
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 16:05:08 »
princip minimálního překvapení je v C plně implementován a jmenuje se unsigned int - ten jsem ve své praxi vždy použil a nikdy jsem překvapen nebyl
Kód: [Vybrat]
unsigned x = 1;
if ( x < -1 )
  printf( "Co se sakra děje?" );
Unsigned v C(++) má vestavěné tak zákeřné překvápko, že je v některých mission critical systémech kompletně zakázaný. :)

21
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 15:33:00 »
Vyumelkovany proto, ze se cela diskuze toci jenom kolem jednoho undefined signed arithmetic shiftu. O nejakem podelanem shiftu ten jazyk vubec neni.
Jop, C není o jednom podělaném shiftu.

Ale tahle diskuze je o tom jestli je C těžké. A to, že tu můžeme takhle složitě rozebírat chování jednoho podělaného shiftu, tu obtížnost ilustruje naprosto dokonale.

22
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 10. 06. 2025, 15:25:35 »
Vědět, že je operátor >> implementation defined (většina lidí to neví a předpokládá, že se jedná o aritmetický shift).

Pak by si asi měli přečíst dokumentaci. Stejně tak by někdo mohl říct, že v Rustu většina lidí neví, že chování + závisí na tom, jestli kompilujete Debug nebo Release. Nebo v C#, že se chování ToUpper a ToLower řídí aktuálním locale a někdy můžete dostat fakt nečekané výsledky. Nebo v Gleamu, dělení 0 vrací 0, není to chyba. A takových situací jsou hromady ať už jste v Rustu, C, C++, Go nebo F#. Je lepší nepředpokládat a přečíst si dokumentaci.

Přesně tak. Znalost jazyka je nutná pro každý jazyk. A řeči typu "jazyk neděla co chci" = jen lenost si ho nastudovat. Každý jazyk se musí nastudovat, i ty moderní. Jestli to je někomu bližší, a snažší uchopit, tak budiž, ale ve výsledku je potřeba to nastudovat a tomu se člověk nevyhne ani v tom Rustu, ani C#. Každý jazyk má svá specifika a toto jsou dobré příklady že i v jiných jazycích se lze lehce střelit do nohy.
Pamatuju si, že velice podobnou argumentaci jsem četl i v diskuzi pod jedním legendárním Javascriptovým WTF. Tam se potkaly cca 3 perfektně zdokumentované konverze a výsledkem byl totálně nepochopitelný mindfuck.  8)

A proto máme i věci jako "princip minimálního překvapení", protože každá drobnost kterou neodhadneme a musíme ji nastudovat z dokumentace nám bere čas a mentální kapacitu.

23
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 09. 06. 2025, 07:37:31 »
Jestli tady ještě OP čte, tak za mě pro učení C je ideální Arduino. Člověka potěší i ta rozblikaná LEDka. Také je to low level, a vyšší jazyky se tam nevejdou, takže C je rozumná volba. Rozblikaný kurzor v terminálu nemá takové kouzlo.
Poslat něco po sériové lince, přerušení, atd.
Pak se dá třeba na ESP napsat hloupý HTTP server.

Nepíše sa pre Arduino v C++ náhodou?

hodinky, holinky... typickej arduinista
Tak ono C++ podědilo většinu chuťovek z C. Některé se podařilo trochu učesat a jiným zase C++ umožnilo rozvinout svůj destruktivní potenciál. :)

24
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 08. 06. 2025, 16:55:11 »
V C jsem naposled programoval na VS, ale jestli tohle kompilátor přeloží na nekonečnou smyčku i s warningem, tak to jsou cunata.

A ten side effect je popsány ve specifikaci?
Tam je problém, že ten kus kódu nemá žádné správné chování.

Norma C říká, že když jako programátor dopustíš, aby ti kdekoliv v kódu přetekl int, tak dává od celého tvého programu ruce pryč.

Překladače se snaží obvykle udělat něco příčetného, ale ne vždycky se to dá.

25
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 08. 06. 2025, 11:13:42 »
V každém případě moderní překladač důrazně upozorní, že je něco jinak, a je na vývojáři aby napsal kód bez warningu. V Postgresu kód s warningem nemá šanci se dostat do upstreamu, a co jsem se jako vývojář naučil, že warning v Cčku není něco, nad čím by se dalo mávnout rukou.
Warning řeší jen malou část poblému. Warning uvidíš jen v případě, kdy překladač může ověřit, že k signed overflow dojde, tozn. jedná se o konstanty známe v době překladu. V případě, kdy se sčítají dva integery a jejich hodnota není známa v době překladu, tak nikde žádný warning nebude, ale pořád je to undefined behavior a pořád se může stát v runtime cokoliv. C překladač má "volnost" vygenerovat kód, který bude řešit signed oveflow v runtime např. vynulováním proměnné, nebo to může být overflow s wrap, nebo taky může klidně zavolat exit... Všechno je legální.
Ano, např :
Kód: [Vybrat]
bool test(int i)
{
    return i+1 > i;
}
se zoptimalizuje na return true a to bez jakéhokoliv warningu.

26
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 08. 06. 2025, 01:51:13 »
Ccko, narozdil od mnoha vsemoznych frikulinksych kravovin, po kterych za par let pes nestekne, dela presne to, co napises.
Jenže pokud nejsi velmi zkušený programátor, tak to znamená, že to velmi často dělá něco jiného, než chceš.

Nerozumim. Muzes dat nejaky priklad? Proc by mel delat _velmi casto_ neco jineho nez chci, kdyz ten jazyk je jednoduchy?
Tak schválně, co dělá tenhle nevinně vypadající kus kódu :
Kód: [Vybrat]
    for (int i = 0; i < 4; ++i)
        printf( "%d\n", i*1000000000 );

Odpověď zní že se může stát úplně cokoliv. :o V závislosti na platformě, překladači, náladě nosních démonů a fázi měsíce třeba :
- Vypíše to 4 čísla, které by člověk čekal. (obvykle debug, nebo staré překladače)
- Přeloží se to na nekonečnou smyčku. (novější překladače s optimalizacema)
- Vyoptimalizuje se to do pryč a vezme to ssebou půl programu. (pro tenhle konkrétní kód jsem to teda nepozoroval, ale je to legální a zažil jsem něco dost podobného)

Zkus tohle chování vysvětlit. Pokud možno _jednoduše_, když je C jednoduchý jazyk.  8)

27
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 04. 06. 2025, 06:27:26 »
Já bych tomu třeba říkal polovičatost.
Zbrane nebo obsluhy? :)

Ale skutečnost, že nechává signed jako nedefinované mi přijde polovičaté. To máš stejné, jako kdyby byla nedefinovaná třeba konstrukce for jenom kůli tomu, že nějaký obskurní procesor nemá loopy. To není neznalost. To je jednoznačně  chyba na straně C. Nemá to zkoušet vůbec rozlišovat signed a unsigned, a pak bych to bral. Takhle říká, že si to bere na starost, a přitom kecá.

Jeden z důvodů, co jsem slyšel, je možnost více optimalizovat. Kompilátor může například předpokládat, že když k intu přičtete kladnou konstantu, tak výsledek bude vždy větší, než původní hodnota.

Za cenu toho, že to občas bude počítat blbosti. Optimalizace jak stehno.
Já bych se toho samotného nedefinovaného chování zastal. Ono to umožňuje i řešit přetečení jako tvrdou chybu (-ftrapv). Přiznejme si, že při přetečení i v jiných jazycích obvykle nechceme wrap, ale je to něco co jsme neplánovali.

Ale tady zase nastupuje ta zmiňovaná polovičatost. Protože C nám nedává funkce pro ty výjimečné případy, kdy potřebujeme ten wrap.

28
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 03. 06. 2025, 14:53:05 »
A tvoje "normalni jazyky" umi bezet na procesorech ktere mohou mit tyto ruzne interpretace signed cisel?
A potřebují to? Nebo jsou to jen zkamenělé pozůstatky muzejního hardwaru?

Vzhledem k tomu, že to nové normy vyrazily (v  rámci možností zpětné kompatibility), je odpověď celkem jasná.

Všechno tohle už je jen technický dluh, který dělá Cčko složitějším.

29
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 03. 06. 2025, 14:34:34 »
A co na to tazatel? Jak moc mu tohle přijde jednoduché? ;)

Tak co je uvnitr je podle me fuk, pro tazatele dulezite, ze takto to muze zavolat:

Kód: [Vybrat]
int result;
if(add_will_overflow(0x90000000, 0x900000000, &result))
{
    // handle overflow
}
Jenže zavolat ji může jen když ji má. Jak nemá C23 tak tuhle funkci mu napíše jen C expert. A i to aby vůbec věděl, kdy tuhle funkci bude potřebovat, je zapotřebí nepříjemně mnoho znalostí.
 
Jde mi o to, že v C má i jednoduché počítání s intama spoustu překvapení. Není to jen tohle nedefinované chování. Jsou to i sequence pointy. To, že asociativita operátorů neříká nic o pořadí v jakém se vyhodnocuje složitější výraz. a můžu pokračovat. Jak v assembleru tak ve vysokoúrovňových jazycích jsou inty podstatně jednodušší než v C.

Základní věci jsou zbytečně (z dnešního pohledu) komplikované a složitější tam nejsou vůbec.

30
Vývoj / Re:Je jazyk C skutočne ťažký?
« kdy: 03. 06. 2025, 12:59:44 »
Ale moznost jak detekovat preteceni v C existuje, clovek si muze lehce napsat funkci ktera mu rekne jestli vysledek scitani pretece nebo ne.
Oki, ukážeš mi jak lehce napsat takovou funkci pro signed inty?

Ve většině jazyků je definované, co se při přetečení signed intu stane. Když vím, že mi to při přetečení wrapne, tak se taková funkce dá opravdu relativně lehce napsat.

Kód: [Vybrat]
bool add_will_overflow(int a, int b, int *result)
{
    if (((b > 0) && (a > INT_MAX - b)) ||   // positive overflow
        ((b < 0) && (a < INT_MIN - b)))     // negative overflow
        return true;

    *result = a + b;
    return false;                       // no overflow
}
Supr, tohle vypadá že je i správně. :)

A co na to tazatel? Jak moc mu tohle přijde jednoduché? ;)

Stran: 1 [2] 3 4 ... 25