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
Blogy Živě » Linux zblízka

Linux zblízka

 

Příspěvky se štítkem „Seriál : Za tajemstvím kompilace“

Různá rozšíření GCC

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.


6. 10. 2010 | uzivatel2 | 12

Optimalizace v GCC

Předinstalovaný kompilátor GCC nabízí mnoho různých voleb. V dnešním příspěvku vysvětlím volby související s optimalizací a provedu jednoduchý test jejich účinnosti.

Teorie

Co lze obecně optimalizovat?:

  • rychlost
  • paměťovou náročnost
  • velikost zkompilovaného (strojového) kódu
  • další parametry (např. množství diskových operací)

Tyto optimalizace mohou být protichůdné. Například optimalizace rychlosti může směřovat k zvětšení zkompilovaného programu. GCC umožňuje zadat volby pro optimalizaci rychlosti (přepínače O0 až O3) a velikosti programu (přepínač Os).

Od optimalizace pochopitelně nelze očekávat, že odstraní důsledky špatného návrhu algoritmu, nebo jiné “zázraky”. Ostatně očividně problém dokonalé optimalizace kódu není ani algoritmicky řešitelný a ani algoritmus s nejlepší asymptotickou časovou (nebo paměťovou) složitostí nemusí vůbec existovat. Možná je výraznou překážkou při konstrukci kompilátoru i úroveň současného teoretického poznání, kdy nejsou známy odpovědi ani na základní otázky.

Volba úrovně optimalizace odpovídá spuštění celé série poměrně nezávislých jednoduchých optimalizací. Může jít například o optimalizaci skoků a větvení, vyčíslení známých výrazů, optimalizace aritmetických výrazů (např. místo a+a+a+a použít 4*a), vhodnou volbu obsahu registrů, rozepsání cyklů se známým nízkým počtem průchodů (např. f();f();f(); místo trojnásobného volání funkce ve for cyklu)…

Výsledkem je logicky ekvivalentní kód. Při použití více vláken, sdílené paměti, asynchronních událostech atd. však “nevinné” přehazování instrukcí může být nekorektní. Tato problematika je širší, protože obdobné optimalizace se provádí samovolně i při běhu programu na úrovni CPU.

Vlastní test

Neumím psát velké množství neoptimálního kódu :) Proto jsem s pomocí Eclipse (přehled jiných prostředí viz předminulý článek) napsal jednoduchý prográmek (zdrojový kód okolo sto řádků), který vygeneroval náhodný zdrojový kód v C o délce cca 15000 řádků obsahující různé aritmetické operace, for cykly a větvení if. Následuje ukázka kódu generátoru:

System.out.print(“pole[" + r.nextInt(pocet_prvku) + "]–;\n“);//dekrementace
}
if (nahodny == 5){//prirazeni
System.out.print(“pole[" +  r.nextInt(pocet_prvku) + "] = pole[" +  r.nextInt(pocet_prvku) + "];\n“);
}
if (nahodny == 6){//konstanta
System.out.print(“pole[" + r.nextInt(pocet_prvku) + "] = 10;\n“);
}
}
public static void for_cyklus1(){
System.out.print(“for (j” + zanoreni + “  = (pole[" + r.nextInt(pocet_prvku) + "] + “ +
“pole[" + r.nextInt(pocet_prvku) + "]) % 30 + 4″ +

A dále následuje ukázka malé části vygenerovaného C kódu:

for (j1  = (pole[1] + pole[9] + 5) % 30 + 4; j1 > 0; j1– ){
pole[5] %= 10;
pole[3] += 10;
if (pole[5] > pole[9]) pole[5] = pole[9];
}
pole[6] += 10;
pole[1] = pole[2];

Potřebné zdrojové kódy naleznete v přílohách blogu uložených na stránkách autora. Přílohy se schodují s přílohami k příspěvku Srovnání GCC a LLVM.

Výsledky testu

doba kompilace[s] velikost programu[kB] délka běhu programu[s]
gcc -Os 23.250 95.8 8.718
gcc -O0 10.441 265.8 3.037
gcc -O1 20.622 135.8 1.725
gcc -O2 30.641 135.8 1.647
gcc -O3 38.624 135.6 1.566

Profiler

Tzv. profiler statisticky zpracovává různé poznatky získané při běhu profilovaného programu. Tato pomůcka zeefektivňuje plánování vývoje, protože víme na, která místa v kódu se soustředit. Dokonce profiler umožňuje bez teoretické přípravy správně vybrat mezi více algoritmy a může částečně eliminovat nutnost kompilace mnoha verzí a následných benchmarků.

Příklad : Náš program obsahuje řádek if (test_neoptimalnosti()) optimalizuj_datove_struktury();. Když profiler zjistí, že tato podmínka je téměř vždy splněna, bude možná lepší bez testování rovnou zavolat funkci optimalizuj_datove_struktury(). V případě, že není podmínka splněna téměř nikdy, bude možná lepší řádek úplně vypustit. atd.

GCC nemá při kompilaci podobnou statistiku. S poznatky z profileru by optimalizace mohla zohledňovat i např. pravděpodobnosti průchodu jednotlivými větvemi. (Poznámka : Nadstandardní rozšíření některých překladačů mohou umožnit programátorovi tyto poznatky vyjádřit. Může jít např. o vestavěné makro označující, že určitá podmínka bude téměř vždy splněna.)

Řešením je kompilace s direktivou -fprofile-generate. Spuštěním získaného programu se provede profilování a zápisu statistiky do zvláštních souborů. Při následné kompilaci s direktivou -fprofile-use jsou tyto údaje využity. V testovaném případě první kompilace trvala 45.546s a druhá 41.020s. Výsledený program (152.9kB) měl dobu běhu 1.357s, což je zlepšení o téměř 15% oproti pouhé kompilaci s volbou -O3.

Ilustrující příklad optimalizace : Mějme dva algoritmy realizující stejný výpočet:

d = a + b;
e = d + c;
if (e == 0) funkce(d);
else funkce(b + c);

a tentýž výpočet :

d = b+ c;
e = d + a;
if (e != 0) funkce(d);
else funkce(a + b);

Pokud je součet a+b+c téměř vždy nula, je vhodnější zvolit první algoritmus. Tím se téměř vždy ušetří zbytečné sčítání a+b. V opačném případě je lepší volit druhý algoritmus, který naopak šetří před zbytečným sčítáním b+c.

Upozornění : Běžné desktopové aplikace jsou zpomalovány diskovými operacemi apod., jejichž náročnost nesouvisí s optimalizacemi při kompilaci vlastní aplikace.


25. 5. 2010 | uzivatel2 | 9

Co potřebuji pro vývoj v Linuxu?

Integrovaná vývojová prostředí

Obvykle programátor většinu pracovního času věnuje kódování, debugování a testování. Tyto činnosti zefektivňuje použití specializovaných prostředí IDE(integrated development environment). Co by mělo pořádné IDE obsahovat? :

  • podporu pro zvolený programovací jazyk :-)
  • automatickou kontrolu syntaktických chyb, inteligentní našeptávač kódu
  • nástroje pro kompilaci, spouštění, debugování a profilování
  • dokumentaci a nápovědu
  • návrháře grafického uživatelského rozhraní
  • možnost refaktorovat kód
  • podporu používání verzovacích systémů
  • nástroje pro práci s komentářem a vytváření dokumentace
  • a spoustu dalších věcí

Známá IDE

Anjuta : Toto prostředí se soustředí na jazyky C/C++ a desktop GNOME.

Code::Blocks - multiplatformní IDE zaměřené na C/C++.

Vim a Emacs : Tyto dva “ultimativní” textové editory lze bez nadsázky rozšířit až na plnohodnotná vývojová prostředí.

Glade Interface Designer : Tento populární grafický návrhář asistuje při vytváření užitelského rozhraní pro GTK+ a GNOME. V součinnosti s dalším softwarem (např. Vim) de facto vytvoří základ IDE.

KDevelop : KDevelop podporuje velké množství jazyků a těší se značné popularitě nejen mezi příznivci desktopu KDE.

MonoDevelop : MonoDevelop je hlavním nástrojem pro C# (platforma Mono).

Qt Creator : QtCreator je výrobcem doporučený nástroj pro toolkit Qt.

Prostředí běžící v Java virtual machine :

  • Eclipse : Eclipse není jen o vývoji pro Javu, ale jde také o framework pro vytváření IDE (nové pohledy, perspektivy) nad společným grafickým/uživatelským základem. Ve výsledku máme spoustu různě zaměřeného softwaru s více méně jednotným ovládáním. Můžeme se tak vyvíjet v běžných programovacích jazycích (Java, C/C++, PHP…), soustředit na gridy (g-Eclipse), vytvářet RIA Aplikace a webdesign (Aptana), zpracovávat statistická data technikami data miningu (Knime)…
  • NetBeans : něco jako Eclipse

Další pomůcky pro vyšší efektivitu

Verzovací systém : Verzovací systémy uchovávají různé verze souborů a projektů, čímž usnadňují spolupráci více pracovníků, získání přehledu o postupu vývoje, odstranění úprav, které se neosvědčily… Velké popularitě se těší Git, CVS, Bazaar, Mercurial, SVN… Jednotlivé systémy se mohou výrazně lišit svou filozofií a tak třeba GIT se hodí k jiným projektům než CVS.

Štítkovací systém (např. cTags) :  Tento jednoduchý prográmek označuje konkrétní místa v projektu okomentovanými štítky.

Cokoli jiného : Můžete využít analogie neelektronických postupů jako lepící papírky typu post-it (KNotes), skicák (Xournal)… Můžete si také rozvrhnout pořadí jednotlivých úkonů (planner), psát si poznámky (Tomboy/Gnote), vést osobní wiki systém (Zim), kreslit vývojové diagramy (Kivio)…

Běžné utility a předinstalované příslušenství

I běžné distribuce Linuxu se hodí pro začínající programátory, protože instalace obsahuje množství předinstalovaných a nastavených programátorských nástrojů.  Ostatně některá z výše jmenovaných IDE jsou pouze grafickými nadstavbami standardních nástrojů. Co například obsahuje většina distribucí? :

  • Manuálové stránky : Pozor, manuálové stránky jsou roztříděné do několika sekcí. Třeba heslo open zpracovává více sekcí (stránky man 1 open, man 2 open, man 3 open a man 4 open pojednávají o různých tématech). Některé sekce často v základní instalaci chybí nebo jsou neúplné.
  • GNU/GCC (kompilátory pro mnoho jazyků, debuger gdb…), Binutils (různé utility pro práci s objektovými soubory apod.), Automake (automatizace překladu), DDD (populární debuger)
  • připravené základní hlavičkové soubory
  • rozsáhlé možnosti snadného získávání podrobných informací o procesech, vytížení zdrojů, stavu systému…
  • Bash : Jednoduché shellové skripty dokáží automaticky provádět celé baterie benchmarků za různých velmi specifických podmínek. Můžete například přes noc otestovat vyvíjený server za pomoci skriptem generovaného realistického síťového provozu, můžete simulovat různé výpadky (např. nečekané odpojení zařízení)…
  • Perl : další předinstalovaný skriptovací jazyk
  • velmi flexibilní jazyk Python, který se často vyučuje v úvodních kurzech programování.

Další zajímavý software se dá snadno doinstalovat. :

  • další sekce manuálových stránek a další dokumentace (např. DevHelp),
  • další systémové utility (např. cpulimit), Valgrind, Electric fence, strace…,
  • různé vývojářské “dev balíčky”

V Linuxu programátor může si ušít podobné utility přímo na míru s pomocí systémového volání ptrace nebo úpravy jádra (např. v případě potřeby zavedení/smazání naprogramovaného jaderného modulu)…

Další počítač

Pokud při vývoji ladíte rozsáhlejší kód, který vyžaduje spouštění s právy superuživatele root (nebo jádro), je záhodno toto provádět ve virtualizovaném systému. Metody virtualizace dále umožňují například rychlé opakování testů ve více operačních systémech…

Starší počítač usnadní odhad minimálních požadavků na hardware. (Při své práci takto nyní používám sestavu uvedenou v článku Test Ubuntu na vyřazeném počítači.)

Další potřebné nástroje

S další případnými navazující úkoly pomůže opět specializovaný software. Například při optimalizaci mnoha parametrů algoritmu může soubory naměřených dat o chování programu zpracovat některý ze statistických systémů (R, Octave, Weka…).

Související článek : Webdesign s open source nástroji


15. 5. 2010 | uzivatel2 | 27

Starší příspěvky »

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