Super, že je ta kniha zdarma.
Nicméně taková úvaha. Kolik kompilátorů a pro kolik platforem podporuje tohle nové moderní C?
Jaká je výhoda používat tenhle nový moderní styl C, který podporuje jen pár překladačů (jen GCC a Clang??), vs jiný jazyk jako třeba Odin, Zig, C3, Jai nebo Rust, které mají jen jediný překladač, ale zatím nejsou tak zatížené zpětnou kompatibilitou?
Třeba C11 jako kompromis mi přijde dobré, případně C99. Podpora je široká, dokonce i pokud použijete GNU rozšíření (protože ne více než dekádu starý clang nebo GCC mají skoro všude). A od té doby mi přijdou ty praktické změny v jazyku fakt minimální a dá se bez toho obejít.
Myslím si, že i pro pisatele v C99 bude ta kniha pořád dobře použitelná, ale nemám ověřeno.
28. 8. 2025, 11:41 editováno autorem komentáře
Přesně jak říká Vláďa. Spousta z těch věcí je už v GCC a Clangu už teď. Jen s tím C11 bych rovnou šel do C17, což je takový bugfix pro C11.
Co se týče podpory, tak největší peklo je RHEL 8, ale v C17 se dá psát a v klidu se připravovat na C23 - spousta věcí se dá psát už jako "C23" s tím, že je pod tím schované nějaké makro, které vytahuje ven nějaký GNU atribut nebo __builtin, který se následně dostal do C23 jako součást jazyka. Ty nejdůležitější věci jsou v C11 (případně aspoň C99).
> Jakých pár překladačů, jakože těch plnohodnotných jsou desítky
Jaké desítky překladačů podporují většinu z C23?
AFAIK většina překladačů C23 plně nepodporuje, nejblíž je GCC. Clang méně. MSVC vůbec.
U C11 je situace lepší, ale třeba takové thready a atomics už některé kompilátory neumí (a v té knize se to učí, takže píšete pak kód, který ani některé nejnovější překladače nepřeloží).
A ptám se, proč není lepší psát rovnou jiný jazyk, když se omezíte na podmnožinu C, kterou třeba umí jen jeden nebo dva kompilátory?
> Treba protoze nekdo chce psat v C a nepovazuje ho za spatny jazyk?
Pokud to tak člověk vidí, pak jo.
> A ktery jiny "lepsi" jazyk ma aspon tri ruzne kompilatory aby byl v tomhle ohledu lepsi?
Ty, co jsem jmenoval nejsou v tomto ohledu lepší. Ale právě mi přišlo, že použitím vlastností z nejnovějších C standardů si člověk vlastně pohorší i u C. Už pak nemůže říct: "Můj program se přeloží všude". Takže tahle výhoda C pak padá.
viz co psal na začátku Vladimír Čunát v https://www.root.cz/zpravicky/vyslo-treti-vydani-knihy-modern-c/nazory/#o1225011
C99 (popř C11) s některými GCC extensions je velmi dobrá konzervativní volba, která v naprosto drtivé většině případů člověka prakticky neomezuje.
Céčko fakt není typický "moderní" jazyk v tom smyslu, kdy po každém vydání nové verze nikdo nechápe, jak vůbec mohl předtím fungovat.
Aktuálně PostgreSQL přechází z C99 na C11. Přechod je ale velice nenásilný a pozvolný. Sahá se jen na pár rutin nebo maker, které lze udělat v novějším Cčku přehledněji, elegantněji, kde lze využít nové statické kontroly. A i když se používá relativně starý standard, tak stejně se najdou chyby v překladačích v některých operacích - naposledy např. v clangu na applu (o to komplikovanější, že Apple má forknutý clang s vlastním verzováním).
Podle čeho soudíte? Třeba C11 a C17 jsou z velké části podporovány.
Stačí se podívat jakým stylem implementují věci z C: https://devblogs.microsoft.com/cppblog/c11-atomics-in-visual-studio-2022-version-17-5-preview-2/ a tady to i oficiálně přiznávají, že to tak dlouho bylo: https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/. Ostatně se tak ten compiler i jmenuje - Microsoft Visual C++. Ale uznávám, že jsem netušil, že už se to o něco zlepšilo a je to cca už tři roky použitelné včetně stdatomic.h. Naštěstí to už nemusím sledovat, protože jsme podporu pro Windows z BIND 9 prostě odstranili.
Krátce: Pokud vám všude stačí GCC, používejte to. Pokud potřebujete překladač který to neumí, zatím to nepoužívejte. Není co řešit.
Dlouze: Díváte se z pohledu uživatele hotového produktu. Nemáte myšlení člověka který se podílí na vývoji něčeho tak velkého jako je jazyk. A jazyk C je mnohem víc než jen univerzální programovací jazyk.
Céčko není vhodné pro nějaké malé domácí počítání. Ani pro základní výuku programování. Primárně je pro lidi, kteří umí dělat velké projekty s dlouhým životem, kteří by si uměli napsat vlastní překladač Céčka, vědí proč se to dělá tak jak se to dělá… takoví lidé vědí, co znamená vývoj softwaru. Ne vytvoření překladače, ale jeho průběžný mnohaletý vývoj. Dokážou ale pochopit víc: že se vyvíjí nejen překladače, ale že se vyvíjí i standard toho, jak má překladač dělat co dělá — a že to není totéž.
To co tady vidíte je jen malinkatý kousek mnohem většího procesu. Céčko se od doby prvního překladače změnilo zásadně moc. Ale trvalo to mnoho desítek let, týkalo se to mnoha lidí, bylo mnoho otázek k vyřešení… Toto nejsou změny jaké byly v minulosti, ale pouhá vylepšení. Přesto bude trvat dlouho, než to bude samozřejmost všude. Nevidíte začátek (proč tyto změny dát do standardu, co od toho chceme, první zkušební implementaci, komunikaci o tom jak to přesně má v novém standardu být, zkoušení jestli se nám to v praxi hodí takhle nebo to po prvních praktických zkušenostech chceme trochu jinak, předělávky, zkoušení…), nevidíte ani konec (samozřejmost kterou všichni běžně používají), vidíte vteřinu z dvouhodinového filmu. Vidíte okamžik, kdy se to už dá někde zkoušet a kdy je čas začít se to učit.
Vzhledem k rozšířenosti GCC už to může používat víc lidí než jen pár experimentátorů. Kdo programuje obyčejnou desktopovou aplikaci, nepotřebuje aby šla kompilovat i pro jednočip s 8 KB RAM — a je mu jedno jestli ten specializovaný překladač to neumí. Jazyk C není jen univerzální, má i velmi specifická nepřenosná použití. Céčko není jen o tom že půjde zkompilovat všechno všude.
Pokud vám GCC nestačí, nemůžete chtít novinky už teď. Pokud nutně potřebujete jiný z těch hlavních překladačů, počkejte až to bude umět a zatím se držte staršího standardu. Ať máte pro všechny vaše cílové platformy stejný způsob psaní. Opravdu tvoříte pro tolik platforem, že vám GCC nestačí a zároveň potřebujete být takhle napřed?
Pokud používáte hodně specializovaný překladač, který používá málo lidí, může to trvat dlouho a má smysl když budete aktivně řešit aby tam ta podpora byla (komunikace s prodejcem komerčního překladače, nebo vaše vlastní přispění do open source překladače). Kdo umí, udělá. My ostatní se jen svezeme s ním. Ale je dobré chápat, že to je živý vývoj. Že nevíme co ten jazyk má v budoucnu umět. Přicházíme na to průběžně.
> Nicméně taková úvaha. Kolik kompilátorů a pro kolik platforem podporuje tohle nové moderní C?
Všechny (oba) důležité :)
GCC: https://gcc.gnu.org/projects/c-status.html
Clang: https://clang.llvm.org/c_status.html
Já myslím, že je to docela na pohodu... a za pár let úplně.