Portál AbcLinuxu, 30. dubna 2025 12:07
Takový drobný rant programátora, co dělá na Darling (vizte předchozí zápisek).
Čím dál víc narážím na to, že u glibc jsou to pěkní "cochcáci". Neboli MY říkáme, jak to bude (a POSIX nám může zadek políbit) a vy ostatní se přizpůsobujte.
Na OS X se používá rozšíření jazyka C nazvané Blocks, na Linuxu jej podporuje zejména Clang. Zapnutí podpory Blocks znamená, že přibudou určitá vyhrazená klíčová slova, mezi nimi je i __block. Ejhle, v tu ránu vám padne kompilace, protože v glibc z nějakého důvodu mají nutkání pojmenovávat argumenty se dvěma podtržítky na začátku a __block tam zrovna je.
Myslíte si, že v deklaraci na názvu nesejde a a) by tam tedy být nemusel nebo b) by se to mohlo jmenovat jinak a bylo by to fuk, takže je snadno přesvědčíte, aby to opravili? Na*rat! Doporučené řešení: přidat do kompilátoru nástroj, co si bude hlavičky sám přepisovat.
Chcete pojmenovat svou proměnnou neškodným názvem major? Máte smůlu, glibc má takhle pojmenované makro a prostě se to měnit nebude. Musíte si to sami #undefnout nebo pojmenovat proměnnou jinak. Na major a minor tu máme právo jen my.
Očekáváte, že se API bude chovat v souladu s POSIXem? Prdlajs! My žádný POSIXy poslouchat nebudeme. Tady je to po našem. Přenositelnost my ass.
Tak nevím, je to mnou?
Tiskni
Sdílej:
A teď si představ, že by skupina javistů začala trvat na tom, že se jejich proměnná prostě _bude_ jmenovat enum. Říkám skupina, protože nástupci Ulricha nejsou o moc lepší.V C tato situace nemuze nastat, protoze pridani noveho klicoveho slova vyzaduje include hlavicky. Pokud by v C nebylo enum a pridali by ho, musel byste si pro jeho pouziti naincludovat stdenum, takze stary kod vam to nerozbije.
Strange, I never saw your name on my paycheck. Since if that's not the case you cannot order me around.
Na blogu o přechodu Debianu na eglibc jsou pěkné odkazy.
To myslíte vážně? Všude se najdou lidé, se kterými je - slušně řečeno - poněkud obtížná komunikace. Ale nevěřím, že by tam takoví byli všichni.To se mu vážně divíte? Z poslední doby např. Gnome Bug 680118 - pokud vidím správně, "angažují" se tři vývojáři, všichni z RedHatu, jedno tydýt větší než druhý. A to bych neměl zapomenout na patrně "nejslavnější" případ - Are you autistic or just a cunt? - RedHatu trvalo přes dva roky, než dotyčného konečně vyrazili.
A to bych neměl zapomenout na patrně "nejslavnější" případ - Are you autistic or just a cunt? - RedHatu trvalo přes dva roky, než dotyčného konečně vyrazili.Wow, tak to je hardcore.
Co to je za picuse, si stezuje, ze ho nekdo nazve picou, kdyz si ocividne dela picu ze vsech okolo. Spis je smutny, ze si v RH nedokazou pohlidat lidi co tam pracujou.
ale je přinejmenším zvláštní, že jako assignee za celou dobu nenapsal jediný komentář…To je celkem pochopitelné vzhledem k tomu, že pan Nasrat ten bug zdělil až poté, co pan Píča (coby původní assignee) nuceně RH opustil a stačil mezitím jakožto "maintainer" uvést RPM do takového stavu, že se z toho několik let vzpamatovávali.
_GNU_SOURCE
, což zanese namespace nekontrolovatelnou spoustou balastu, a konečně (3) typická Ulrichovina (ale ono POSIXové aio je ve většině implementací stejně dost nanic, tak na tom příliš nesejde).
ale ono POSIXové aio je ve většině implementací stejně dost nanic, tak na tom příliš nesejdeI ta jaderná v (Free)BSD?
Forkněte to glibc už někdoMůžeš začít :).
Na OS X se používá rozšíření jazyka C nazvané Blocks, na Linuxu jej podporuje zejména Clang. Zapnutí podpory Blocks znamená, že přibudou určitá vyhrazená klíčová slova, mezi nimi je i __block.V odkazovaném bugreportu je i návod, jak to obejít, který je jednodušší než fork knihovny.
Chcete pojmenovat svou proměnnou neškodným názvem major? Máte smůlu, glibc má takhle pojmenované makro a prostě se to měnit nebude. Musíte si to sami #undefnout nebo pojmenovat proměnnou jinak. Na major a minor tu máme právo jen my.Jeden undef taky nikoho nezabije. Klidně by se to mohlo řešit v rámci výše uvedeného.
Očekáváte, že se API bude chovat v souladu s POSIXem?Vzhledem ke stavu POSIXu to až tak 100% neočekávám :). U tohoto konkrétního příkladu jsi zapomněl napsat, v čem je problém.
Tak nevím, je to mnou?Z velké části ano :).
V odkazovaném bugreportu je i návod, jak to obejít, který je jednodušší než fork knihovny.Není lepší se konfliktům názvů vyhýbat, tím spíš jsou-li tak zbytečné.
Jeden undef taky nikoho nezabije. Klidně by se to mohlo řešit v rámci výše uvedeného.Jenže to je prasárna. Že něco musím všelijak obcházet mi nepřijde u komponenty jako (g)libc normální.
Vzhledem ke stavu POSIXu to až tak 100% neočekávám. U tohoto konkrétního příkladu jsi zapomněl napsat, v čem je problém.Stačí se podívat do mailu, na který Ulrich reagoval. Jedna věc je být nekompatibilní, druhá věc je být nekompatibilní a stát si za tím. Ostatně takových věcí má Ulrich na svědomí víc, jako předpoklady, že /bin/sh je Bash a další perly.
Není lepší se konfliktům názvů vyhýbat, tím spíš jsou-li tak zbytečné.Je. Nicméně pokud vidím blogpost na tohle téma, tak očekávám, že uvidím taky upřímnou aktuální snahu o nápravu.
Jenže to je prasárna. Že něco musím všelijak obcházet mi nepřijde u komponenty jako (g)libc normální.Prasárna to je, jen mi přišlo, že to popisuješ fatálnější, než to je. Já teda mám osobně pocit, že v GLIBC narážím na závažnější nedostatky, než na které narážíš ty, ale to samozřejmě záleží na úhlu pohledu.
Stačí se podívat do mailu, na který Ulrich reagoval.Jako jo. Ale jak už psal Martin, Ulrich nemá v současné době na GLIBC zas až tak zásadní vliv, takže bych se tím, co k tomu napsal, až tak moc nezabýval.
Je. Nicméně pokud vidím blogpost na tohle téma, tak očekávám, že uvidím taky upřímnou aktuální snahu o nápravu.Právo commitovat do glibc nemám a správci změnu nechtěji, pod ten bug jsem psal. V eglibc to je opravené, tzn. patch na to existuje. Co mám asi tak dělat?
Ale jak už psal Martin, Ulrich nemá v současné době na GLIBC zas až tak zásadní vliv, takže bych se tím, co k tomu napsal, až tak moc nezabýval.To bude mít očividně smysl, až glibc nebude pod kontrolou Red Hatu. Současní zaměstnanci RH se sami odkazují na komentáře Ulricha, takže je to evidentně "firemní linka" a ne jen jeden výjimečný sprosťák.
Právo commitovat do glibc nemámSám jsi tady pana Jirsáka upozorňoval, že mít na něco technická práva ještě neznamená, že se mají používat v rozporu z pravidly, takže by ti to asi stejně nepomoholo.
V eglibc to je opravené, tzn. patch na to existuje. Co mám asi tak dělat?Tvůj post vyznává tak trochu jako „hater“ článek a komentáře v diskuzích tomu vcelku odpovídají.
To bude mít očividně smysl, až glibc nebude pod kontrolou Red Hatu.Takže to už asi nemá smysl, až dodělám články pro fedora.cz, abych se znovu pouštěl do něčeho pro Abclinuxu, když jsem teďka součástí té špatné firmy, která kazí celý ten open source :).
Současní zaměstnanci RH se sami odkazují na komentáře UlrichaVěci se často nemění ze dne na den :).
takže je to evidentně "firemní linka" a ne jen jeden výjimečný sprosťák.No je to velmi jednoduché. Buď chci, aby mi někdo pomohl, nebo chci všechny bez rozdílu poslat do háje. Mně se stává, že to se svojí snahou trochu přepísknu, ale fakt se snažím být konstruktivní. Každopádně je dobře, že jsi na problémy upozornil i tady.
Mně se stává, že to se svojí snahou trochu přepísknu, ale fakt se snažím být konstruktivní.Zrovna tenhle tvůj komentář je úžasnou ukázkou konstruktivity.
A ty pravdivé vysvětlení používáš jako odrazový můstek pro osobní útok?Asi jsem se spletl. Měl jsem za to, že jsem tu někde u tebe zahlédl osobní útok vůči všem mým novým kolegům a mně bez rozdílu. A z nějakého důvodu jsem měl pocit, že ti píšu přátelskou reakci. Tedy promiň.
Jeden undef taky nikoho nezabije. Klidně by se to mohlo řešit v rámci výše uvedeného.Zabije, a sice v situaci, kdy píšeš header pro knihovnu. Nějaký uživatel tvý knihovny může chtít i _GNU_SOURCE... Ten tě pak bude obviňovat, že mu undefuješ makra.
Mně to připadá dost jednoznačné:
— All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
…
No other identifiers are reserved. If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.
V sekci 7.1.4 nevidím nic, co by umožňovalo používat vyhrazená jména jako parametry funkcí.
A v annexu J.2 je pak explicitně:
The behavior is undefined in the following circumstances:
…
— The program declares or defines a reserved identifier, other than as allowed by 7.1.4 (7.1.3).
Viz též např. poznámku pod čarou v sekci 6.4.2.2:
Since the name__func__
is reserved for any use by the implementation (7.1.3), if any other identifier is explicitly declared using the name__func__
, the behavior is undefined.
…always reserved for any use.
Jenze toto je omezeni pro uzivatelsky program a ne libc.
A kde konkrétně se to tam píše? Já tam nic takového neviděl.
__block
jako s _Block
. Obojí jsou identifikátory rezervované pro implementaci. Ale máte pravdu, že _Block
by lépe odpovídalo tradici zavedené v C99 a C11.
Jednak to není píčovina, ale z hlediska jazyka C/ObjC užitečná věc, co je teď v nějaké podobě i v C++11.otázka názoru, kterou tady nemá smysl rozebírat
A jednak tu nejde o padnutí na prdel, ale o princip, že by se v glibc měli snažit o pokud možno nejvyšší kompatibilitu.hm, a proč se o tu "kompatibilitu" (uvozovky!) v glibc snažit musí a v Applu nemusí? co je tohle za princip?
Kdyby se __block jmenovalo něco důležitého (třeba funkce), tak jejich postoj pochopím. Ale trvat na konfliktech i přesto, že by ničemu neublížilo to pojmenovat jinak (a nezainteresované by to neovlivnilo), to je debilita hodná velkých korporací, ale nikoliv open source projektu.ano, jistě, je to debilita hodná velké korporace Applu - ještě jednou, proč to má přejměnovat glibc, proč to nepřejmenuje Apple?
A vůbec, když už tomu tak rozumíte, jak to teda ti debilové měli pojmenovat?_Block, uz jsem to tu psal ;)
Jinak Apple je to úplně jedno, protože "překvapivě" se na Darwinu glibc nepoužívá a obecně Blocks nejsou něco, co by mimo Applí systémy bylo rozšířené. Navíc chtít přejmenovat keyword kvůli tomu, že si tak někdo pojmenoval argument, by mohl chtít jenom blázenhm, a nedá se náhodou přesně ta samá argumentace použít i na opačnou stranu? když se na Darwinu glibc nepoužívá, proč by glibc nemělo být úplně jedno, jak se u Applu co jmenuje? chtít přejmenovat argument v libc kvůli tomu, že si tak někdo pojmenoval keyword, by mohl jen blázen, ne?
ano, jistě, je to debilita hodná velké korporace Applu - ještě jednou, proč to má přejměnovat glibc, proč to nepřejmenuje Apple?Protože pojmenovávat argument vyhrazeným jménem je naprostá kravina? Kdyby to byla funkce, makro, nebo nějaký typedef, tak bych to bral. Ale argument!? To, že to asi nebude úplně košer dokazuje i to, že i pro gcc se musí hlavičkové soubory zpracovat pomocí fixincludes.
Protože pojmenovávat argument vyhrazeným jménem je naprostá kravina?Kravina možná, naprostá ne :) Je to snaha autorů libc nekolidovat s čímkoliv, co kdo nadefinuje mimo libc. Kdyby argument pojmenovali "block", header file by se rozbil, kdyby si program, který ho includuje, nadefinoval své vlastní makro "block", což podle normy smí udělat. Jiná věc samozřejmě je, že kdo definuje takhle genericky pojmenovaná makra, neměl by se divit, že tím něco rozbije. A jako že rozbije: stačí includovat headery od libovolné jiné knihovny. Osobně si myslím, že snažit se v headerech zabraňovat kolizím tímto způsobem je boj s větrnými mlýny, který nelze vyhrát, a že je tedy lepší headery psát přímočaře a spoléhat na programátora, že blbosti s makry vyvádět nebude. Ale chápu, že zrovna v tomto případě mohou mít správci glibc jiný názor.
Je to snaha autorů libc nekolidovat s čímkoliv, co kdo nadefinuje mimo libc. Kdyby argument pojmenovali "block", header file by se rozbil, kdyby si program, který ho includuje, nadefinoval své vlastní makro "block", což podle normy smí udělat.OK, tohle beru. Pak by asi nebylo od věci použít jméno __glibc_block, protože tam by kolize hrozit už opravdu neměla.
Osobně si myslím, že snažit se v headerech zabraňovat kolizím tímto způsobem je boj s větrnými mlýny, který nelze vyhrát, a že je tedy lepší headery psát přímočaře a spoléhat na programátora, že blbosti s makry vyvádět nebude.+1, případně by imho bylo nejlepší ten argument v headeru vůbec nepojmenovávat, stejně pokud někdo chce vědět, k čemu ten argument je, koukne se do dokumentace.
#define KEYWORDS K(if) K(then) K(else) K(begin) K(end)
#define K(x) KEYWORD_##x,
enum keywords { KEYWORDS };
#undef K
#define K(x) [KEYWORD_##x] = #x,
const char * const keyword_names[] = { KEYWORDS };
#undef K
GCC does not inline any functions when not optimizing unless you specify the `always_inline' attribute for the function, like this...Hm, to vysvětluje, proč se to inline bez optimalizace nekonalo. Přijde mi to trošku nelogické, gcc optimalizace chápu jako něco, o co se překladač snaží sám, naopak keyword inline jako něco, co si přeje programátor a proto není důvod, aby se to s vyplou optimalizací neprovedlo, ale budiž. Situace, kdyby programátor nechtěl gcc optimalizace, ale chtěl inline funkce a proto je inline keyword na nic a musí je přepsat do maker asi normálně nenastává.
Překlad bez optimalizací se snaží především být rychlý a generovat co nejdebugovatelnější kód.Ted me s tim GCC docela nastvalo. Bez optimalizaci neprovadi ani prevod tail-callu na smycky, takze jsem si mohl vybrat, budto mit blbe debugovatelny kod, nebo kod, ktery pada kvuli malemu zasobniku.
man gcc
keyword inline jako něco, co si přeje programátor... a co pro prekladac neni zavazne. Stejne jako treba keyword register.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.