Je jazyk C skutočne ťažký?

Wasper

  • ***
  • 185
    • Zobrazit profil
    • E-mail
Re:Je jazyk C skutočne ťažký?
« Odpověď #15 kdy: 02. 06. 2025, 17:27:44 »
Ale zkusenost me rika, ze to pro lidi odchovane v Pythonu je tezky krok na pochopeni. A prijde me to zvlastni, protoze clovek nemuze byt dobry programator, dokud nema predstavu jak pocitac pracuje s pameti a jake ma dusledky co naprogramuje.
Bingo. Za me by clovek mel zacit nekde nizko, i kdyz v budoucnu planuje pracovat v nejakem vyssim jazyku, presne ze zminenych duvodu - kdyz uz jednou clovek vi, co je dole, tak mnohem lepe vyuzije vyhod vyssiho jazyka, ktery spoustu prace udela za nej (prestoze ta prace tam porad je, jen skryta, a ve vysledku se na vypocetni slozitosti muze nehezky projevit).
...tezko na cvicisti, lehko na bojisti

Jen co mi na Cecku vzdycky prudilo (nevim, jestli to nejak novejsi norma uz neresi, na veci, co delam ted jsem to uz nepotreboval), byla/je nekompletnost bitovych operaci, kdyz si clovek zvykne na bitove rotace bez/s Carry flagem, resp xchg, tak vyjadrit to prenostielne v cecku je drbani se levou zadni za uchem (pripadne v makru), spojene s virou v prekladac, ze pri optimalizaci z toho sloziteho vyrazu pochopi, ktere 2 instrukce to ma vygenerovat.


Re:Je jazyk C skutočne ťažký?
« Odpověď #16 kdy: 02. 06. 2025, 17:43:47 »
Jen co mi na Cecku vzdycky prudilo (nevim, jestli to nejak novejsi norma uz neresi, na veci, co delam ted jsem to uz nepotreboval), byla/je nekompletnost bitovych operaci, kdyz si clovek zvykne na bitove rotace bez/s Carry flagem, resp xchg, tak vyjadrit to prenostielne v cecku je drbani se levou zadni za uchem (pripadne v makru), spojene s virou v prekladac, ze pri optimalizaci z toho sloziteho vyrazu pochopi, ktere 2 instrukce to ma vygenerovat.
Right shift je v C minové pole. Standard říká, že right shift na signed integeru je implementation defined, což znamená, že se překladač může rozhodnout, jestli vygeneruje logical nebo aritmetic right shift. Jaké to má důsledky, je celkem jasné, může to dávat různé výsledky na různých platformách (dokonce i různé výsledky na stejné platformě, pokud se překladač rozhodne udělat nějakou optimalizaci). Opravené je to až v C++20, kde je jasně definované, že je to arithmetic right shift. Nevím o tom, že by to bylo opravené v nějaké C normě, tam je to AFAIK pořád implementation defined.

Ink

  • *****
  • 686
    • Zobrazit profil
    • E-mail
Re:Je jazyk C skutočne ťažký?
« Odpověď #17 kdy: 02. 06. 2025, 18:20:56 »
Ani ne tak těžký, jako čím dál víc zbytečný.

RDa

  • *****
  • 2 999
    • Zobrazit profil
    • E-mail
Re:Je jazyk C skutočne ťažký?
« Odpověď #18 kdy: 02. 06. 2025, 19:20:25 »
... má jen minimum datových typů ...

Pokud se týče základních datových typů, tak bych naopak řekl, že jako snad jediný jazyk (kromě assembleru) poskytuje kompletní množinu různě dlouhých integerů se znaménkem nebo bez (a floaty a pointery). Sice se integer typy divně jmenují (char, short, long, long long) takže si je lidi někdy pro lepší přehlednost přejmenovávají na něco jako u16, nebo s32...  ale těch pár jiných jazyků, které, jsem potkal, mě většinou tlačilo nějak do kouta stylem "tumáš nějaký integer a neotravuj s detailismem". Na to navazují bit-banging operace AND, OR, XOR, NOT.


Nepojmenovavaji.. jsou jiz pojmenovana - vhodnym standardem - ktery zaruci ze na vsech platformach se to bude chovat stejne.

Kód: [Vybrat]
#include <stdint.h>https://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html


Jako druhy problem ktery clovek pak ma - je udelat prenositelny printf() formatovaci retezec :)

Re:Je jazyk C skutočne ťažký?
« Odpověď #19 kdy: 03. 06. 2025, 01:04:11 »
Na nějaké halucinace v chování shiftu jsem narazil v implementaci CRC v modbusové knihovně (mé vlastní). To CRC jsem si někde "půjčil" - a přestože GCC na x86 mi to dlouhá léta chroupalo správně, tak GCC na ARMu dávalo nesprávný součet. Přisuzoval jsem to nějakému rozdílu v inicializaci defaultních hodnot bitů v registrech mezi platformami nebo co... v zásadě mi stačilo ty operace pečlivěji (explicitněji) uzávorkovat a otypovat, a začalo se to chovat na obou platformách stejně...

Jojo, printf... různé verze a varianty format stringu se navzájem liší v drobných nuancích...
Na druhou stranu jsem zaznamenal, že jak C++ zamlada prudilo "všichni musí používat iostream a jeho C++ manipulátory, na printf() zapomeňte", tak později tenhle fundamentalismus trochu vyvanul a printf() se dále používá jako legitimní funkce pro vkládání proměnných do textového řetězce...


oss

  • ****
  • 257
    • Zobrazit profil
    • E-mail
Re:Je jazyk C skutočne ťažký?
« Odpověď #20 kdy: 03. 06. 2025, 07:48:52 »
Ani ne tak těžký, jako čím dál víc zbytečný.

Zatial neviem o jazyku, ktory by ho nahradil.

jjrsk

  • *****
  • 784
    • Zobrazit profil
Re:Je jazyk C skutočne ťažký?
« Odpověď #21 kdy: 03. 06. 2025, 08:43:19 »
Ccko, narozdil od mnoha vsemoznych frikulinksych kravovin, po kterych za par let pes nestekne, dela presne to, co napises. Takze se ti nestane, ze napises radek a vygeneruje se z toho GB binarky.

Re:Je jazyk C skutočne ťažký?
« Odpověď #22 kdy: 03. 06. 2025, 08:58:04 »
Ccko, narozdil od mnoha vsemoznych frikulinksych kravovin, po kterych za par let pes nestekne, dela presne to, co napises. Takze se ti nestane, ze napises radek a vygeneruje se z toho GB binarky.

ja mam taky rad c, ale pro rychlejsi vyvoj pouzivam go, ktery povazuju za jeho potomka.
v praci jsem nucen pouzivat c++, ktere mi prijde zase silene rozsahle a jeho potomek je rust, se kterym si taky hraju, ale nepripada mi takovy pohodovy jako go.

Ink

  • *****
  • 686
    • Zobrazit profil
    • E-mail
Re:Je jazyk C skutočne ťažký?
« Odpověď #23 kdy: 03. 06. 2025, 09:11:53 »
Ani ne tak těžký, jako čím dál víc zbytečný.

Zatial neviem o jazyku, ktory by ho nahradil.

Vždy a všude? Zatím možná není. Ale že čím dál víc projektů, které nahrazují původní věci psané v C. A je tu Zig a někdo nedávno vzpomínal nějaké C3 - to by mohly být přímé náhrady, když už někomu nesedí třeba Rust ani C++. Že C bude čím dál víc legacy, považuju za nevyhnutelné.

Re:Je jazyk C skutočne ťažký?
« Odpověď #24 kdy: 03. 06. 2025, 09:19:26 »
Ccko, narozdil od mnoha vsemoznych frikulinksych kravovin, po kterych za par let pes nestekne, dela presne to, co napises.
Zkus si domácí úkol, když napíšu tohle, bude výsledek -1, nebo 2147483647, nebo ještě něco úplně jiného?
Kód: [Vybrat]
printf("%d\n", -1 >> 1);

Re:Je jazyk C skutočne ťažký?
« Odpověď #25 kdy: 03. 06. 2025, 10:07:21 »
Zkus si domácí úkol, když napíšu tohle, bude výsledek -1, nebo 2147483647, nebo ještě něco úplně jiného?
Kód: [Vybrat]
printf("%d\n", -1 >> 1);

Tohle je prasana. Nikdo kdo ma praxi v C by tohle nenapsal. Spravne je to
Kód: [Vybrat]
printf("%d\n", ((int)-1) >> 1);

vrit

Re:Je jazyk C skutočne ťažký?
« Odpověď #26 kdy: 03. 06. 2025, 10:34:57 »
Zkus si domácí úkol, když napíšu tohle, bude výsledek -1, nebo 2147483647, nebo ještě něco úplně jiného?
Kód: [Vybrat]
printf("%d\n", -1 >> 1);

Tohle je prasana. Nikdo kdo ma praxi v C by tohle nenapsal. Spravne je to
Kód: [Vybrat]
printf("%d\n", ((int)-1) >> 1);

nesmysl, obe dve verze jsou naprosto totozne protoze
Kód: [Vybrat]
-1 a
Kód: [Vybrat]
((int) -1) je jedno a uplne to same. V C je numericky literal by default typu int.

C zachovava pri rotaci znamenko protoze rotace je provadena na znamenkovem typu, dela tedy tzv. aritmeticky bit shift.

Pokud by clovek chtel klasicky bit shift musi naopak prevest hodnotu na unsigned integer kde se nepracuje se znamenkem - a provest rotaci na nem.

Kód: [Vybrat]
printf("%d\n", -1 >> 1);
printf("%u\n", ((unsigned)-1) >> 1);

A taky zkuseny C programator by nepouzil -1 ale bud konstantu z <limits.h> a nebo
Kód: [Vybrat]
~0, ponevadz
Kód: [Vybrat]
-1 dava same jednicky jen na architekturach kde jsou zaporna cisla implementovana pomoci dvojkoveho doplnku, coz nemusi byt vsude. Existuji architektury, ktere zaporna cisla implementuji jinak.

Kód: [Vybrat]
~0 funguje vzdy a vsude.

Takze C dela presne to co ma a jestli nekdo tvrdi neco jineho, je to pouze jeho neznalost.

Re:Je jazyk C skutočne ťažký?
« Odpověď #27 kdy: 03. 06. 2025, 10:36:40 »
Ccko, narozdil od mnoha vsemoznych frikulinksych kravovin, po kterych za par let pes nestekne, dela presne to, co napises.
Zkus si domácí úkol, když napíšu tohle, bude výsledek -1, nebo 2147483647, nebo ještě něco úplně jiného?
Kód: [Vybrat]
printf("%d\n", -1 >> 1);

Podle specifikace C23 bude výsledek záviset na implementaci (část 6.5.8):

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a
signed type and a nonnegative value, the value of the result is the integral part of the quotient of
E1/2E2 . If E1 has a signed type and a negative value, the resulting value is implementation-defined


Nicméně u většiny ostatních jazyků to vlastně ani nevíte, protože žádnou specifikaci nemají.
« Poslední změna: 03. 06. 2025, 10:46:24 od Radek Miček »

vrit

Re:Je jazyk C skutočne ťažký?
« Odpověď #28 kdy: 03. 06. 2025, 10:41:05 »
Jako druhy problem ktery clovek pak ma - je udelat prenositelny printf() formatovaci retezec :)

Jestli nekdo nezna, tak to tu poslu, je na to header
Kód: [Vybrat]
<inttypes.h>
Kód: [Vybrat]
#include <stdio.h>
#include <inttypes.h>

int main()
{
    int8_t var_int8 = -42;
    uint8_t var_uint8 = 42;
    int16_t var_int16 = -1600;
    uint16_t var_uint16 = 1600;
    int32_t var_int32 = -32000;
    uint32_t var_uint32 = 32000;
    int64_t var_int64 = -123456789012345;
    uint64_t var_uint64 = 123456789012345;

    printf("var_int8  : %" PRId8 "\n", var_int8);
    printf("var_uint8 : %" PRIu8 "\n", var_uint8);
    printf("var_int16 : %" PRId16 "\n", var_int16);
    printf("var_uint16: %" PRIu16 "\n", var_uint16);
    printf("var_int32 : %" PRId32 "\n", var_int32);
    printf("var_uint32: %" PRIu32 "\n", var_uint32);
    printf("var_int64 : %" PRId64 "\n", var_int64);
    printf("var_uint64: %" PRIu64 "\n", var_uint64);

    return 0;
}

https://pubs.opengroup.org/onlinepubs/009695399/basedefs/inttypes.h.html
« Poslední změna: 03. 06. 2025, 10:43:11 od vrit »

Re:Je jazyk C skutočne ťažký?
« Odpověď #29 kdy: 03. 06. 2025, 10:41:25 »
Ahoj, moja otázka je veľmi jednoduchá. Je jazyk C skutočne ťažký alebo to je iba môj osobný dojem?
C je jednoduchoučký jazyk, ve kterém je zatraceně těžké programovat ;)

Je jednoduchý, protože je to jazyk z kompilátorové doby kamenné. To, co umí a co tedy musí umět překladač je osekané na naprosté minimum. Proto má každý krumpl překladač Cčka. Napsat základní překladač je fakt jednoduché.

Z toho plyne první peklo. Překladač neudělá skoro nic. Všechno je na tobě jako programátorovi. Včetně tupé mechanické dělničiny, kterou my lidi umíme podstatně hůř než stroje. Takže nám to dýl trvá, zato tam nasekáme kopec zbytečných chyb. ;)

Druhé peklo je v tom, že i to co umí je plné (z dnešního pohledu) zbytečných komplikací a pastí. Jeden příklad za všechny:
- Jako programátor máš za úkol zajisti aby ti sečtení intů nikdy nepřeteklo. Jinak je to undefined behavior a můžou se dít fakt divné věci. Už jsi někdy krokoval časoprostorovou anomálii?
- Dostaneš nulovou podporu pro to, abys to zajistil. Jazyk C je high level assembler, ve kterém není add with carry. Schválně si to zkuste ve standardním C napsat. Ano, asi tak všechny překladače pro to mají nějakou intrinsiku, páč se bez toho funguje fakt blbě.

Z toho plyne jeden zajímavý praktický důsledek. Nikdo nepíše v C. Vždycky je to nějaký dialekt, protože bez nadstandardních rozšíření se v tom jazyce nedá fungovat. A samozřejmě, že mezi těmi dialekty jsou občas dost zásadní rozdíly.
« Poslední změna: 03. 06. 2025, 10:43:39 od Jiří Havel »