Hledat
Přihlásit se
  • Věda a technika
  • Herní doupě
  • Tipy pro PC
  • IT Byznys
  • Mobily
  • Počítače
  • Počítače
  • Témata
  • Poradna
  • Diskuzní fórum
  • Video
  • Bazar
  • Blogy
  • MĚŘENÍ RYCHLOSTI
  • RSS
  • Facebook Twitter Google+ YouTube
  • Hardware
  • Software
  • Počítače
  • Notebooky
  • Služby na webu
  • Apple
  • Google
  • Microsoft
  • Seznam
  • Tiskové zprávy
Další témata
  • Týden Živě
  • Zprávy Živě
  • Testy
  • Pitvy
Všechna videa
X

Doporučit článek

Vaše jméno:

Váš e-mail:

E-mail adresáta:

Komentář:

kontrolní kód

Odeslat

Blogy Živě » Linux zblízka

Linux zblízka

 

Různá rozšíření GCC

6. 10. 2010, uzivatel2

Vývojářský balík GCC se stal nejpopulárnějším nástrojem pro vývoj svobodného softwaru. Přes značnou oblibu GCC bohužel mnozí programátoři netuší, že GCC není “holou” implemetací obvyklých standardů. Software GCC nabízí desítky vlastních hodnotných vylepšení a rozšíření. Tento informativní příspěvek uvádí jen velmi nepatrný zlomek z této rozsáhlé problematiky.

Kraťoučký ilustrační příklad si můžete stáhnout z mých osobních stránek. Ukázkový zdrojový kód v Céčku demonstruje inicializaci polí rozsahem, atribut depreced, konstruktor, destruktor a makra like/unlike.

Rozšíření jazyka C

Především GCC přináší bohatší dialekt jazyka C :

  • nové zápisy inicializace :     GCC povoluje i konstrukce jako int pole[]={[0...499]=0,[500...999]=1};.
  • zobecnění chápání l-hodnot : Například (a ? b : c) = 5 je synonymem pro (a ? b = 5 : c = 5).
  • nové datové typy : Například povolení pole nulové délky.
  • atd. atd. atd.

Možnosti manipulace s řetězci skrze céčkovská makra a preprocesor zdaleka nelze srovnávat s nástroji jako třeba awk. Díky rozšířením GCC lze navrhnout makra, která generují nevalidní c kód, ale kterým GCC rozumí. Tím se zvyšuje použitelnost preprocesoru.

Z hlediska psaní generických maker má mimořádnou důležitost nadstandardní operátor “typové reflexe” typeof a typedef. Například kernel definuje následující makro.

Komentář : Uložení vyčíslení výrazů x a y je nutném, aby nedocházelo k nežádoucímu vícenásobnému vyhodnocení v situacích jako max(i++,j). Třetí řádek nijak výsledný program neovlivňuje. Účel přiřazení spočívá ve výpisu varování při porovnávání různých typů. Podobného “zbytečného” kódu, který při chybných úpravách vyvolává chyby při překladu, je v jádru velké množství. Uvedené makro naleznete na tomto místě zdrojového kódu. Odkazovaný soubor je dobrou ukázkou i na další GCC “speciality”.

Atributy

Kromě vylepšení normy jazyka C se zavádí i speciální syntax pro GCC rozšíření, která nejsou vázána pouze na jeden jazyk. Příkladem jsou atributy, kterých existuje několik desítek. Některé speciální atributy nemají smysl pro některé architektury a jazyky, kde jsou logicky nedostupné.

Příklad atributů constructor a destructor : Systémová platforma GNU rozeznává CTOR a DTOR sekce. Jednotlivé konstruktorové CTOR sekce se vykonávají hned po zavedení (linkování) do paměti; tedy před vstupem do hlavní funkce main. Naopak destruktorové DTOR sekce se vykonávají po skončení kódu programu těsně před uvolněním paměti. Příslušné atributy jsou pojmenovány přirozeně constructor a destructor. Pomocí jiných atributů lze rozhodnout, ve které sekci bude symbol umístěn, definovat symbol jako weak… (V článku jsem naznačil návrh “C makroviru”, který se vkládá jako makro s infikovaným standardním hlavičkovým souborem, a vzniklá binárka na neinfikovaném počítači původní makro zkopíruje do místního standardního hlavičkového souboru. Trikovou “injektáž” nakaženého kódu by šlo snadno provést přímočaře s pomocí CTOR sekce.)

Asi nejčastěji používané atributy předávají uživateli různá upozornění, která vypisuje kompilátor. Například při překladu zdrojového kódu s atributem deprecated je uživatel upozorněn, že zdrojový kód využívá v budoucnu nepodporovaný (zavržený) zdrojový kód.

“Vestavěné operátory” __builtin_neco

Dále GCC nabízí “vestavěné operátory” __builtin_neco, jejichž počet se pohybuje opět v desítkách. Tyto operátory sdělují překladači poznatky o kódu, které jsou využívány například k optimalizaci. Příkladem může být __builtin_expect, který sděluje jaká hodnota výrazu je nejpravděpodobnější. Popularitě se těší takto definovaná makra #define likely(x) __builtin_expect(!!(x), 1) a #define unlikely(x) __builtin_expect(!!(x), 0), která se využívají ve vysoce promyšleném kódu (jádro Linux) k optimalizaci větvení if a dalších podmíněných skoků.

Pochopitelně úroveň optimalizace lze upravit parametry kompilace jako -O3, Os, -fprofile-generate apod.; o tomto tématu pojedná dřívější článek.

Závěr

Rozšíření GCC se mimořádně hodí k psaní vysoce vysoce optimalizovatelného, multiplatformního systémového softwaru apod. Bez znalosti těchto rozšíření může být obdobný zdrojový kód nečitelný. Zdrojový kód “pro GCC” pochopitelně nelze v nekompatibilních překladačích zkompilovat.

Štítky: profesionální aplikace, Seriál : Za tajemstvím kompilace


Publikováno v rubrice Nezařazené. Reakce v diskuzi lze sledovat prostřednictvím RSS 2.0. Odkazování není povoleno.

« GNU social - nástupce Diaspory
Státní distribuce Linuxu »
 

Komentáře v diskuzi

1.  wdolek(195.39.100.xxx)   6. 10. 2010, 11:30

joj, co je tohle za prasecinku? “(a ? b : c) = 5″, “(a ? b = 5 : c = 5)”… na kazdem kroku je do programatoru vstepovano, ze kod musi byt srozumitelny a “selfdocumented”. tohle kdybych nekde nasel, sel bych seknout autora pres prsty :D

2.  uzivatel2(ověřeno)   6. 10. 2010, 12:06

re 1: Zobecněná l-hodnota může ve vzácných komplikovaných situacích zvýšit čitelnost kódu. Nejedná se o věc, která by byla běžně používaná.

Kde je vštěpováno, že kód by měl být “selfdocumented”? Psaní “selfdocumented” kódu má význam pouze u víceméně mechanického kódování jednoduchých algoritmů, což na druhou stranu tvoří většinu pracovní náplně běžného programátora. Tzv. “selfdocumented” kód je nesmysl v případě pokročilejší optimalizace složitých algoritmů, spolupráce velkého množství osob, odborné terminologie (dlouhé “selfdocumented” pojmenování proměných), specializovaného zakázkově vyvíjeného softwaru (programátor nerozumí technickým detailům), dlouhých matematických výpočtů…

3.  wdolek(195.39.100.xxx)   6. 10. 2010, 12:38

“Tzv. “selfdocumented” kód je nesmysl v případě pokročilejší optimalizace složitých algoritmů, spolupráce velkého množství osob, odborné terminologie (dlouhé “selfdocumented” pojmenování proměných), specializovaného zakázkově vyvíjeného softwaru (programátor nerozumí technickým detailům), dlouhých matematických výpočtů…”

> optimalizace složitých algoritmů
zrovna tam by kod mel byt jasny a citelny - nedopustit, ze nekdo kdo ke kodu prijde po nas na to bude koukat jako na magickou kupu znaku (a to muze znat problematiku na jednicku, - proste to ve spatne napsanem kodu neuvidi)

> spolupráce velkého množství osob
prave v momente, kdy se na aplikaci podili vice lidi naraz, je citelnost kodu jeste dulezitejsi nez kdykoliv predtim (obcas se mi dostane do rukou vec, o ktere si asi autor ani nemyslel, ze to bude “cist” nekdo jiny… z takovych zdrojaku se mi chce casto brecet)

jsem toho nazoru, ze kod musi! byt citelny at uz jde o “hello world” nebo nejaky omni-algoritmus pro vypocet … ja nevim ceho.

4.  uzivatel2(ověřeno)   6. 10. 2010, 14:16

re 3: Nemluvím o lidech, kteří neumějí pořádně programovat. Mluvím programátorech, kteří umějí programovat příliš dobře, a jejich řešení nelze zapsat “jasně a čitelně”. Například pokud zlepší algoritmus několika goto skoky apod., výsledný kód bude potřebovat okomentovat a zdokumentovat. Většina programátorů se však zabývá nenáročným kódováním a může si dovolit psát “selfdocumented” zdrojáky.

Znáte nějaký “selfdocumented” projekt, který by soustavně vyvíjelo více -minimálně několik desítek- lidí? Takovéto projekty vyžadují rozsáhlé komentáře a dokumentaci. (Tato dokumentace obvykle zavádí jednotný styl kódování a minimální rozsah a náležitosti komentářů.)

5.  Martin(193.200.150.xxx)   8. 10. 2010, 16:29

Tohle

(a ? b : c) = 5

jsi vůbec neměl zmiňovat, to je nic než zvěrstvo a spíše nám řekni, kdy se autoři GCC konečně rozhoupají zaimplementovat try/finally. (Případné báchorky o tom že try/finally není potřeba mě nezajímají).

6.  uzivatel2(ověřeno)   8. 10. 2010, 16:54

re 5: GCC (=GNU Compiler Collection) rozhodně není programovací jazyk. U podporovaných programovacích jazyků, jejichž návrh obsahuje try/catch/finally, GCC samozřejmě toto implementuje. Váš požadavek nechápu.

7.  quaker66(213.191.105.xxx)   11. 10. 2010, 14:32

@5 - vyjímky jsou součástí C++, tím pádem samozřejmě jsou v g++. Stejně tak třeba dědičnost struktur.

8.  quaker66(213.191.105.xxx)   11. 10. 2010, 14:36

btw. používat speciální rozšíření gcc je svým způsobem prasárna, pokud má být výsledný kód multiplatformní. Samozřejmě tohle jde ošetřit pomocí #if defined(__APPLE__), #ifdef WIN32 atd ale to je zbytečná komplikace, nejlepší je psát kód přesně tak, aby byl validní podle určitého standardu (jak pro C tak pro C++)

9.  Jan(86.61.140.xxx)   11. 10. 2010, 16:09

Kód by měl být samo dokumentující vždy. Jediné, kdy se to dá oželet je při optimalizaci algoritmů, pokud to zvyšuje rychlost(rozvinutí cyklů, použití bitových operací atd.). Zrovna příklad (a ? b : c) = 5 ke zrychlení nevede zato to rapidně snižuje čitelnost kódu. Překladači nedávám nic navíc než kdybych napsal if-then-else.
>Mluvím programátorech, kteří umějí programovat příliš dobře, a jejich řešení nelze zapsat “jasně a čitelně”.
Programátor který neumí řešení zapsat jasně a čitelně programovat neumí. Programování je mechanická činnost kdy formalizuju nějakou myšlenku/posloupnost příkazů. To že to není umění pro pár vyvolených už lidé vědí víc než 30 let a proto vznikly obory jako softwarové inženýrství.

10.  uzivatel2(ověřeno)   11. 10. 2010, 18:32

re 9: Výraz (a ? b : c) = 5 je jen jeden příklad použití generalizace l-hodnoty. Zobecněných l-hodnot umožňuje navrhnout zajímavá makra, která usnadní kódování a zpřehlední kód. Což ale neznamená, že by programátor měl místo (a ? b = 5 : (c = 5)) používat (a ? b : c) = 5, který podle vás snižuje čitelnost kódu.

>>Programování je mechanická činnost kdy formalizuju nějakou myšlenku/posloupnost příkazů.

Mluvíte jen o mechanickém kódování, kdy lze psát “jasně a čitelně” (viz můj předchozí komentář 2). Mluvil jsem o dobrých programátorech, kteří jsou schopni přijít s netradičním algoritmem, vylepšením, trikem apod. Tito programátoři nepíší “jasně a čitelně”, protože přichází s chytrým neotřelým přístupem (nikoli proto že to neumí). Drtivá většina programátorů však těchto intelektuálních výkonů není schopna a věnuje se jen mechanickému kódování, které umožňuje psát “jasně a čitelně”.

11.  Jan(86.61.140.xxx)   11. 10. 2010, 19:02

Já bych to napsal takto, je to stejně rychlé(generuje to stejný syntaktický strom) a o mnoho čitelnější.

if(a)
b=5;
else
c=5;

Kromě toho to rozhodně není makro, protože vyhodnocení výrazu nejde provést v době překladu. A vše co je tady http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Lvalues.html mi pořád připadá jako obfuskace kódu abych mohl napsat víc řádků do jednoho.
>Tito programátoři nepíší “jasně a čitelně”, protože přichází s chytrým neotřelým přístupem…
Tito programátoři jsou mýtem vytvořeným v dřevních dobách (60.-70. léta). Takový způsob vývoje je dlouhodobě neudržitelný. Vždy se i ta nová myšlenka dá napsat srozumitelně až na případy, které jsem zmínil v minulém komentáři(optimalizace, ale to není nová myšlenka, pouze specializace algoritmu).

12.  uzivatel2(ověřeno)   12. 10. 2010, 06:51

re 11: Netvrdil jsem, že jde o makro! Tvrdím, že zobecnění lhodnoty se ve (vzácných) případech hodí k definovaní maker. Jednoduchý příklad:
#define neco (a ? b : c)
díky tomuto makru můžeme psát přehledné výrazy jako neco = 5 apod. Bez zobecněných lhodnot by makro šlo také napsat, ale bylo by nepřehledné.

Přidat komentář

*
Opište prosím text z obrázku.
Anti-Spam Image


Aktuální články a bleskovky

Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Brýle Google Glass jsou patentované
Brýle Google Glass jsou patentované
Ifttt.com: Propojte a automatizujte svůj internet
Ifttt.com: Propojte a automatizujte svůj internet
Nejlepší programy pro práci s Wi-Fi
Nejlepší programy pro práci s Wi-Fi



Linux zblízka využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články a komentáře


  • Seznam odkazů

    • Kontakt na autora blogu
    • Moje články pro LE
    • Různé přílohy k blogu
    • Stránky autora blogu
  • Poslední příspěvky

    • Chystá se revoluce v hraní her?
    • Kontroverze okolo Křišťálové lupy
    • Deset největších open source inovací
    • Nová “daň” za software
    • Má smysl kupovat TV tuner?
    • Zvýšila se v Linuxu spotřeba?
    • Porušování GPL licence ve světě Androidu
    • Je bezplatnost Linuxu výhodou?
    • Potřebujeme nová uživatelská rozhraní?
    • Podvod s hlasováním v přímém přenosu
    • Facebook není zadarmo
    • Nápad na startup
    • Co hrají linuxáci?
    • Nová cloudová platforma OpenShift
    • Kvalitní linuxové antiviry pro desktop ve skutečnosti neexistují
  • Administrace

    • Přihlásit se

1210_Computer.png

Časopis Computer

  • Nakupujte v zahraničí
  • Test 7 čteček elektronických knih
  • Technologie: nové standardy digitálního vysílání
  • Přehled cloudových uložišť
  • Poradíme s výběrem kamery na dovolenou

Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN


Video Živě

Bluetooth stojánky pro Android: Philips AS111, AS141 a AS351
Ifttt.com -- založení úkolu
Zprávy Živě - 12. května 2012
iPad docky Logitech AV Stand a Logitech Speaker Stand

další videa »






Mladá Fronta a.s. Mladá Fronta a.s.
Tiráž | Autoři | Připomínky | Odběr novinek | RSS | Textová verze
Copyright 2000–2012 Mladá fronta a.s. | Inzerce: onlinesales@mf.cz | Kontakt na redakci | Návštěvnost měří NetMonitor