Vybrané metody ladění kódu
|
|
- Otto Mach
- před 6 lety
- Počet zobrazení:
Transkript
1 Teorie programovacích jazyků (TJD) Vybrané metody ladění kódu Seminární práce Jakub Křoustek 2009/2010
2 Abstrakt Tento text byl vytvořen jako seminární práce v rámci předmětu Teorie programovacích jazyků. Práce prezentuje existující metody ladění kódu, zaměřuje se při tom především na ladění na úrovni zdrojového kódu. Cílem je seznámit čtenáře s touto problematikou a nastínit techniky používané pro vytvoření takového nástroje. Klíčová slova Ladění kódu, ladicí nástroj, překladač, linker, programovací jazyk, ladicí informace, COFF, DWARF, bod přerušení, krokování, mapování instrukcí, stack unwinding, tabulka symbolů, optimalizace, VLIW.
3 Obsah OBSAH Obsah Úvod Proces překladu kódu Ladění kódu pomocí ladicích nástrojů Princip Typy ladicích nástrojů Vlastnosti symbolického ladicího nástroje Existující ladicí nástroje Tvorba ladicího nástroje Koncept Formát ladicích informací Mapování kódu na zdrojové soubory Krokování programu a body přerušení Typy bodů přerušení Nastavení bodu přerušení Krokování Zjišťování stavu zásobníku Zobrazení hodnot proměnných Ladění optimalizovaného kódu Základní typy optimalizací Architektury zaměřené na vysokou míru paralelismu Závěr Literatura TJD Teorie programovacích jazyků 3
4 Úvod 1 ÚVOD Jestliže ladění je procesem odstraňování softwarových chyb, pak programování musí být procesem jejich vytváření. Edsger Dijkstra Společně se vznikem prvních programovacích jazyků se projevila i potřeba ladit programy pomocí nich vytvářené. Tato myšlenka se ukázala být správná, jelikož s rostoucí velikostí programu rapidně stoupá šance na výskyt chyby. Zpočátku bylo ladění kódu realizováno pouze pomocí instrumentace programu (tj. doplnění programu o kontrolní výpisy). Postupně se ale z ladění kódu stal metodický proces hledání a odstraňování chyb v počítačových programech, jenž je v současnosti již nedílnou součástí softwarového inženýrství. S rostoucí složitostí softwaru i výpočetních systémů vzniklo mnoho metod a nástrojů pro jejich ladění. Jednotlivé druhy ladicích nástrojů můžeme dělit podle úrovní, na které se zaměřují. Můžeme například nalézt nástroje analyzující program staticky (buď jeho binární formu, nebo zdrojový kód), nástroje kontrolující korektní alokaci paměti a přístup k ní a dále tzv. debugger 1. Jde o nástroj sloužící pro ladění programů za jejich běhu, který dokáže poskytovat informace o aktuálním stavu programu i systému, na kterém je program vykonáván. Právě posledně jmenovaným nástrojem se zabývá tato práce, konkrétně se jedná o variantu ladění na úrovni zdrojového kódu. V následujících kapitolách budou popsány jednotlivé varianty nástroje a jeho požadované vlastnosti. Detailněji budou probrány principy a algoritmy použité při jeho implementaci a rovněž budou specifikovány podpůrné prostředky pro jeho funkčnost. Na závěr budou diskutovány problémy související s laděním optimalizovaného kódu. Tato práce je inspirována knihou How Debuggers Work Algorithms, Data Structures, and Architecture od B. J. Rosenberga [Ros96]. 1 V dalším textu budeme místo slova debugger používat jeho český ekvivalent ladicí nástroj. TJD Teorie programovacích jazyků 4
5 Proces překladu kódu 2 PROCES PŘEKLADU KÓDU Proces ladění kódu úzce souvisí s oblastmi programovacích jazyků a překladačů. Z důvodu pozdějšího odkazování na tyto souvislosti je vhodné na tomto místě uvést některé základní pojmy. Proces překladu programů z lidsky čitelného kódu ve vyšším programovacím jazyce do binárního, strojově zpracovatelného kódu je poměrně komplexní. Lze ho chápat jako několika úrovňovou transformaci zdrojového kódu do nižších forem reprezentace, kdy při každém kroku transformace dochází ke ztrátě informací o původní podobě kódu. Výsledkem překladu je typicky sekvence instrukcí z instrukční sady cílového procesoru. Tyto instrukce jsou oproti původním příkazům programovacího jazyka značně jednoduché. Z pohledu procesoru tak dochází k abstrakci informace o původně použitém programovacím jazyku, jelikož procesor dokáže vykonávat stále jenom svou instrukční sadu, bez ohledu na původní jazyk. Proces překladu ilustruje [Obrázek 1], detailnější popis je k nalezení v [ALSU06]. vnitřní kód optimalizovaný vnitřní kód zdrojový kód programu Přední část (front-end) Optimalizace (middle-end) Výstupní část (back-end) lexikální, syntaktická a sémantická analýza pomocné informace (jména proměnných, čísla řádek, ) transformace kódu na cílovou platformu strojový kód programu ladicí informace OBRÁZEK 1 OBECNÁ STRUKTURA PŘEKLADAČE Při lexikální a syntaktické analýze vstupního zdrojového kódu programu jsou o něm překladačem získávány dodatečné informace, jako jsou jména proměnných, čísla řádků s deklaracemi a použitími proměnných a funkcí atd. Sémantická analýza tyto znalosti dále rozšiřuje o informace o datových typech proměnných či argumentech funkcí. Tyto informace mohou být použity při generování ladicích informací, jež poté poslouží při ladění programu. Na generátory ladicích informací jsou kladeny následující požadavky: TJD Teorie programovacích jazyků 5
6 Proces překladu kódu 1) Generování ladicích informací musí ovlivnit vlastní překlad jenom minimálně. 2) Ladicí informace musí korespondovat s vygenerovaným kódem. 3) Formát ladicích informací musí dodržovat zvolený standard (DWARF, STABS atd.) tak, aby byla zajištěna kompatibilita s existujícími ladicími nástroji. Části překladače, které kód optimalizují a transformují do strojového kódu, generování ladicích informací naopak komplikují, protože v ladicích informacích pak vznikají nekonzistence, které ne vždy lze vyřešit. To je konflikt s výše uvedeným požadavkem (2). U některých překladačů se při explicitním zapnutí generování ladicích informací nekonzistentní optimalizace vypínají, viz např. *LLVM10+. Vypínání optimalizací by se ale mělo dít pouze v krajních případech, neboť se tím značně ovlivňuje funkčnost překladače, což je ve sporu s požadavkem (1). Formát a typy ladicích informací budou detailněji popsány v dalších kapitolách. TJD Teorie programovacích jazyků 6
7 Ladění kódu pomocí ladicích nástrojů 3 LADĚNÍ KÓDU POMOCÍ LADICÍCH NÁSTROJŮ 3.1 PRINCIP Základ slova debugger pochází z anglického bug, což je možné přeložit jako brouk. Brouk, přesněji řečeno mol, který vletěl do jednoho relé počítače Mark II, byl také první zdokumentovanou chybou při vykonávání programu [Wiki01]. Proces vyčištění relé dal vzniknout slovu debuggování. Stalo se tak v roce Více o historii ladění kódu je k nalezení v *Hay93+. Během let dostal pojem debugger více sofistikovaný význam a v současnosti pod tímto názvem chápeme ladicí nástroj, který slouží k hledání, izolování a odstranění chyb v softwarových programech za jejich běhu. Liší se tak tedy od jiných ladicích technik jako je instrumentace kódu, post-mortem analýzy, profilování či kontroly přístupu k paměti. Jde o poměrně složitý nástroj, který k ladění programu potřebuje dodatečné (ladicí) informace vzniklé při speciálním způsobu překladu programu. Dále je často silně závislý na operačním systému, na kterém laděný program běží. Tento ladicí nástroj kontroluje laděný program po celou dobu jeho vykonávání a umožňuje vykonávání na kterémkoliv místě přerušit. To se děje za pomoci tzv. bodů přerušení (anglicky breakpoint). Vykonávání může být rovněž prováděno v několika módech, například krokováním po příkazech či spuštěním až do dalšího přerušení. Uživateli musejí být při ladění zprostředkovány informace o dynamickém chování laděného programu, jako pozice v kódu, stavy proměnných či paměti. Tyto informace pak slouží jednak k pochopení samotného programu, tak k detekci chyb. Při ladění a testování kódu je důležité dodržovat tzv. Heisenbergův princip [Gra83]. Tato poučka říká, že při ladění uživatelského programu nesmí dojít k ovlivnění jeho chování ladicím nástrojem. V praxi je však Heisenbergův princip často porušován, jelikož není vždy možné zcela izolovat ladicí nástroj od laděného programu. Už jenom fakt, že ladicí nástroj je nahrán do stejné paměti jako analyzovaný program, či že je vykonáván stejným operačním systémem, může způsobit změnu chování programu. Stejně tak každá chyba vyvolaná ladicím nástrojem nebo i jen jeho nepřesnost, může způsobit značný zmatek. Může totiž dojít ke špatné interpretaci chyby a uživatel může nabýt dojmu, že chyba je v laděném programu. Proto by měla být bezchybnost ladicího nástroje zaručena. TJD Teorie programovacích jazyků 7
8 Ladění kódu pomocí ladicích nástrojů 3.2 TYPY LADICÍCH NÁSTROJŮ Existuje několik typů ladicích nástrojů, v závislosti na zvoleném typu úrovně ladění. Ladění jádra (kernel debugging). Tento typ slouží pro ladění jader operačních systémů či ovladačů pro ně. Oproti dále zmíněným typům probíhá ladění na jiném stroji, než na kterém běží laděný operační systém. Hovoříme pak o vzdáleném ladění. Stroj, na kterém běží ladicí nástroj, vzdáleně sleduje stavy laděného systému a ten také pomocí komunikačního protokolu řídí. To vyžaduje speciální verzi operačního systému, kdy jeho výrobce musí vytvořit verzi s ladicími informacemi a pouze omezeně optimalizovanou. Ladění na úrovni strojového kódu (machine-level debugging). Ladění na úrovni strojového kódu je vhodné tam, kde nejsme schopni získat pro laděný program ladicí informace ani původní zdrojový kód. Jsme tak omezení pouze na nejnižší úroveň reprezentace kódu, která je platformě závislá. Zobrazení kódu typicky usnadňuje zabudovaný zpětný assembler (disassembler), jenž převede strojový kód do jazyka symbolických instrukcí (více o tomto tématu je k nalezení v [Kro07]). Tím uživatel získá představu o podobě původního kódu, byť na takto nízké úrovni, i když zdrojové kódy nemá k dispozici. Uživatel tedy musí znát instrukční sadu konkrétního procesoru a jeho zdroje (registry, paměťovou hierarchii, způsob implementace zásobníku atd.). Kvůli absenci ladicích informací není možné zobrazovat údaje o hodnotě proměnných, graf toku řízení ani další užitečné informace. Výhodou je, že na této úrovni jde ladit každá aplikace pro danou platformu. Ladicí nástroje na úrovni strojového kódu jsou také nejčastěji používány v tzv. reverzním inženýrství, které může sloužit pro takové zkoumání či transformování programu, které nebylo jeho autorem původně zamýšleno. Ladění na úrovni zdrojového kódu, či také symbolické ladění (source-level symbolic debugging). Ladění na úrovni zdrojového kódu je velice intuitivní způsob ladění uživatelských programů. Tento způsob poskytuje model prezentující provádění na úrovni implementačního jazyka. Uživatel tak získává iluzi, že jeho program je prováděn po příkazech z tohoto jazyka a nikoliv jako sekvence instrukcí konkrétního procesoru. Ladění tímto způsobem se ukázalo být jako nejefektivnější a proto je tato technika používána nejčastěji. Touto variantou se bude zabývat následující text. 3.3 VLASTNOSTI SYMBOLICKÉHO LADICÍHO NÁSTROJE Ladění programu za jeho běhu nemusí být pro uživatele jednoduchý úkol. Při ladění totiž potřebuje mít přehled o aktuálním stavu programu i hostujícího stroje. Z toho důvodu musí ladicí nástroj poskytovat komplexní kontextové informace o programu. Dobrý ladicí nástroj TJD Teorie programovacích jazyků 8
9 Ladění kódu pomocí ladicích nástrojů by se měl řídit mottem, že uživatel potřebuje znát tolik informací, kolik jich je jenom možné získat. Mezi tyto informace patří následující položky: Pozice ve zdrojovém kódu. Zjištění aktuální lokace v původním zdrojovém programu je nejzákladnější vlastností při symbolickém ladění. Uživatel pohledem do zdrojového kódu získá informaci o aktuální pozici běhu programu. Téměř každý ladicí nástroj dokáže zvýraznit aktuální řádek v rámci zdrojového kódu, ty lepší pak i detailnější části, jako jsou konkrétní výrazy. Stav zásobníku (stack backtrace). Jde o druhou nejdůležitější informaci při ladění na této úrovni. Pomocí pozice ve zdrojovém kódu dokážeme zjistit, v jaké části kódu se aktuálně program nachází. Pomocí stavu zásobníku dokážeme rozpoznat, jak se program do této části dostal. Většina běžných architektur totiž ukládá při volání funkcí návratové adresy na zásobník. Při vícenásobném zanoření tak můžeme sledovat hierarchii volání funkcí zpětným průchodem přes vrchol zásobníku. Krom toho můžeme zjišťovat i s jakými argumenty byly funkce volány (rovněž typicky ukládané na zásobník). Hodnoty proměnných. Sledování hodnot uživatelských proměnných je užitečná informace například při ladění nekritických chyb (chyba o jedničku, špatná inicializace proměnné apod.). Oproti ladění na úrovni strojového kódu získává uživatel přímo hodnoty mapované na původní názvy proměnných a nemusí jejich hodnoty zdlouhavě hledat. Informace o jednotlivých vláknech programu. U více-vláknových aplikací musí ladicí nástroj udržovat i informace o stavu jednotlivých vláken. Stejně tak u víceprocesových aplikací je nutné brát v potaz (kvůli mezi-procesové komunikaci) kontext ostatních procesů, tedy nejenom těch vytvořených laděným programem. Stav procesoru. Při ladění na úrovni zdrojového kódu je uživatel zpravidla oproštěn od nutnosti sledovat stav hostujícího stroje, ale i tato možnost může být užitečná. Tímto způsobem lze zjistit hodnoty registrů procesoru, obsah paměti či aktuálně zpracovávaný strojový kód. Nejde tedy o nic jiného, než o informace poskytované ladicími nástroji na úrovni strojového kódu. Můžeme tedy říci, že ladění na úrovni zdrojového kódu je jeho nadstavbou. Velice užitečným rozšířením ladicích nástrojů je i jejich integrace do vývojového prostředí (IDE). Vývojář tak může svůj program ladit ve stejném prostředí, ve kterém ho vyvíjí. Existují samozřejmě i ladicí nástroje pracující v příkazové řádce, ty jsou pro zkušenější uživatele rychleji ovladatelné, na druhou stranu ale ztrácejí možnost interaktivně opravovat chyby ve zdrojovém kódu. TJD Teorie programovacích jazyků 9
10 Ladění kódu pomocí ladicích nástrojů 3.4 EXISTUJÍCÍ LADICÍ NÁSTROJE Ladicí nástroj může být přímo implementován v programovacím prostředí (např. Microsoft Visual Studio) nebo existovat jako separátní aplikace (např. SoftICE). Mezi nejznámější ladicí nástroje patří: GDB a DDD. GNU Debugger a jeho grafická nadstavba DDD. GDB samotné pracuje pouze v příkazové řádce, DDD přidává vstřícnější uživatelské rozhraní. GDB pracuje s mnoha programovacími jazyky, např. C, C++, Ada, Fortran, podporuje přes dvě desítky architektur procesorů a jako první debugger podporoval vzdálené ladění (remote debugging). Od roku 2009 je podporována funkce zpětného ladění (reverse debugging). Jedná se o možnost zpětného krokování již vykonaných instrukcí. Microsoft Visual Studio Debugger. Tento ladicí nástroj je součástí každé verze vývojového prostředí Visual Studio.NET. Funkčně vychází z aplikace CodeView, což byl textový nástroj v prostředí Microsoft Visual C++. Je stabilní, rychlý a jednoduchý na použití. Záporem je neschopnost ladit jaderné funkce operačního systému. WinDbg. Další ladicí nástroj od firmy Microsoft. Je určen pouze pro Microsoft Windows. Jedná se o víceúčelový nástroj, který je schopen mimo jiné i ladit ovladače či jaderné služby operačního systému na bázi Windows NT. Využívá se také při zkoumání pádů operačního systému. SoftICE. Jde o velice účinný ladicí nástroj, který pracuje na nejnižší vrstvě operačního systému. V roce 1987 vytvořila společnost Numera první verzi, vyvíjen byl bezmála 20 let až do roku 2006, kdy byl jeho další vývoj pozastaven. SoftICE pracuje pod operačním systémem Microsoft Windows (dříve také pod Microsoft MS-DOS) a je určen především pro ladění ovladačů hardwarových zařízení, ale díky svým vlastnostem je používán i pro ladění ostatních programů či v reverzním inženýrství. OllyDbg. OllyDbg je rychlý ladicí nástroj pro operační systém Microsoft Windows, jenž je distribuován jako freeware. Mnohdy se používá jako alternativa k SoftICE. Díky obrovské uživatelské základně pro tento program existuje nepřeberné množství rozšíření a vylepšení. TJD Teorie programovacích jazyků 10
11 Tvorba ladicího nástroje 4 TVORBA LADICÍHO NÁSTROJE Ačkoliv je využití ladicího nástroje při vývoji softwaru kritické, metodika jeho tvorby není zdaleka tak dobře zdokumentována jako je tomu například u překladačů. Tento fakt je zarážející, jelikož čas strávený laděním programu je mnohonásobně vyšší než čas potřebný pro jeho překlad. Složitost návrhu ladicího nástroje spočívá především v silné závislosti na hostujícím operačním systému, bez jehož pomoci je ladění prakticky nemožné 2. V této kapitole bude uveden koncept symbolického ladicího nástroje, některé algoritmy pro dosažení požadované funkcionality a dále způsob reprezentace ladicích informací. Popisovaný nástroj bude chápán jako obecný, tedy nebude zaměřen na konkrétní jazyk ani architekturu. 4.1 KONCEPT Obecnou strukturu ladicího nástroje zachycuje *Obrázek 2]. Ladicí nástroj může pracovat ve dvou režimech v režimu příkazové řádky a v režimu s grafickým uživatelským rozhraním (GUI). Vlastní jádro zůstává stejné, u nástrojů s grafickým rozhraním je navíc nutné ošetřit přijímání událostí od operačního systému a jejich zpracování. Ladicí nástroj se pak typicky skládá ze dvou vláken jedno řídí laděný program, druhé reaguje na události a vykresluje grafické uživatelské rozhraní. Samotné grafické rozhraní slouží pro vizualizaci údajů definovaných v kapitole 3.3 (údaje o stavu programu, pozice ve zdrojovém kódu apod.). O úroveň níže pod uživatelským rozhraním se nachází vlastní jádro nástroje. Jedná se o část, která se stará o poskytování údajů, které zobrazuje uživatelské rozhraní. Hlavně ale tato vrstva řídí samotné ladění programu. Program, který chceme ladit, je z pohledu operačního systému procesem. Při začátku ladění máme možnost buďto vytvořit nový proces nebo ladit proces již existující (tzv. připojení k procesu). Po skončení ladění musí ladicí nástroj nově vytvořené procesy odstranit. Jádro je dále zodpovědné za přístup k ladicím informacím, krokování programu a nastavování a kontrolování bodů přerušení. Body přerušení mohou být podmíněné (viz dále), z toho důvodu musí jádro umět vyhodnocovat výrazy v definovaném jazyce. Jde buďto o jednoduchý jazyk k tomu účelu navržený, či o stejný jazyk jakým byl vytvořen laděný program. 2 Existují ale i metody, jak ladicí nástroj závislosti na hostujícím operačním systému zbavit. Jedním z možných řešení je emulace celé platformy. Laděný program pak běží v rámci platformě nezávislého simulátoru. TJD Teorie programovacích jazyků 11
12 Tvorba ladicího nástroje Pro přístup k procesu je nutná interakce mezi jádrem ladicího nástroje a operačním systémem. K tomu slouží mezivrstva komunikující s operačním systémem podle standardního rozhraní (API). Dále je mezivrstva používána pro zjišťování stavu procesoru a také se pomocí ní oznamuje stav laděného programu. OBRÁZEK 2 - TYPICKÁ ARCHITEKTURA LADICÍHO NÁSTROJE NA ÚROVNI ZDROJOVÉHO KÓDU [ROS96]. 4.2 FORMÁT LADICÍCH INFORMACÍ V kapitole 2 byly nastíněny pomocné údaje získané překladačem při generování strojové reprezentace programu. Tyto údaje mohou být uloženy jako ladicí informace a následně pak použity při ladění. Souhrnně jde o tyto údaje: Názvy a typy proměnných a jejich umístění v paměti. Názvy a typy funkcí a jejich parametrů a jejich umístění v paměti. Jména souborů se zdrojovými kódy a čísla řádků odpovídající dílčím úsekům kódu. TJD Teorie programovacích jazyků 12
13 Tvorba ladicího nástroje Informace potřebné k vytvoření stavu zásobníku (stack backtrace). Informace o expandovaných makrech. Je úkolem ladicího nástroje tyto informace načíst a při ladění vhodně využít. Formát ani způsob uložení ladicích informací není jednotný a existuje hned několik běžně používaných standardů. Pro způsob uložení existují dvě možnosti uložení ladicích informací odděleně od programu nebo společně s kódem do jednoho souboru. První možností je uložení informací odděleně od programu, viz [Obrázek 3]. Překladač tedy vytvoří soubor se strojovým kódem programu a navíc i soubor s ladicími informacemi. Vzájemně jsou na sebe vázány jménem a cestou odpovídajícího souboru. Tento styl je používán především společností Microsoft v jejím PDB (dříve DBG) ladicím formátu. soubor1.c soubor2.c překladač soubor1.o program.exe soubor1.dbg soubor2.o program.dbg soubor2.dbg sestavující program (linker) OBRÁZEK 3 GENEROVÁNÍ LADICÍCH INFORMACÍ ODDĚLENĚ OD PROGRAMU Ladicí informace jsou uloženy společně s programem v jednom souboru, viz [Obrázek 4]. Výhodou je zjednodušení distribuce aplikací, kdy není nutné přikládat soubor s ladicími informacemi. Ty jsou v tomto případě uloženy jako jedna či více speciálních sekcí programu. Toto řešení je nejčastější, používají ho formáty STABS, COFF či DWARF. soubor1.c soubor1.o kód ladicí informace program.exe soubor2.c soubor2.o kód ladicí informace překladač sestavující program (linker) kód ladicí informace OBRÁZEK 4 GENEROVÁNÍ LADICÍCH INFORMACÍ DO SPOLEČNÉHO SOUBORU TJD Teorie programovacích jazyků 13
14 Tvorba ladicího nástroje Mezi nejběžněji používané ladicí formáty patří: STABS (Symbol TABle Strings). Pojmenování vychází z konceptu ukládání ladicích informací. Ty jsou kódovány a ukládány jako řetězce v tabulce symbolů. Vzhledem k rostoucímu množství ukládaných informací se toto řešení stalo neefektivním. Formát STABS byl nejprve používaný v UNIXovém a.out objektovém formátu, později si tento formát převzaly a modifikovaly některé společnosti (např. Sun Microsystems). Nevýhodou je i fakt, že pro tento formát neexistuje žádný standard. Ukázka ladicí informace z tabulky symbolů, která charakterizuje funkci main:.stabs "main:f1", 36, 0, 0, _main COFF (Common Object File Format). COFF je standardem objektového souboru, tedy nejenom ladicích informací v něm obsažených. Díky podpoře pojmenovaných sekcí může takový objektový soubor obsahovat ladicí informace i v jiném než COFF standardu (např. STABS či DWARF), což může být matoucí. Existuje několik verzí tohoto formátu: XCOFF (pro architekturu IBM RS/6000), ECOFF (architektury MIPS a Alpha) či PE-COFF (pro platformu Windows). Ladicí informace jsou ukládány jako binární data v sekcích se speciálními jmény. Například ve formátu PE-COFF můžeme nalézt následující sekce s ladicími informacemi:.debug$t sekce s informacemi o datových typech.debug$s sekce s informacemi o symbolech Informace o mapování kódu na řádky zdrojového kódu jsou ve formátu COFF uloženy v globální tabulce, ve formátu PE-COFF je pro jejich uložení využit vlastní formát CodeView (později CV4). PDB (Program DataBase). Jde o formát společnosti Microsoft, který je využíván většinou jejích překladačů. Ladicí informace jsou ukládány v externím souboru. Formát PDB je proprietární a zpracování takových souborů je tedy možné jen za pomoci poskytované mezivrstvy nazvané Debugging Tools for Windows. DWARF (Debugging With Attributed Record Formats). Historie formátu DWARF sahá až do roku 1980, kdy byl formát navržen pro ladění programů v jazyce C na systému UNIX. První verze specifikace vznikla až v roce 1989, v současnosti je před dokončením její čtvrtá verze [FSG06]. TJD Teorie programovacích jazyků 14
15 Tvorba ladicího nástroje DWARF není závislý na programovacím jazyku, operačním systému ani architektuře procesoru. Nejčastěji je však spojován s objektovým formátem ELF. Je běžně používaným standardem (nativní formát llvm, podpora v gcc a gdb atd.). Formát dokáže mimo jiné uložit informace o datových typech a jménech proměnných, typy a argumenty funkcí, adresy symbolů v paměti, informace o uživatelských datových typech, popis zásobníku, ABI (Application binary interface) atd. Oproti ostatním zvládá jemnější určování pozice v souboru, kdy kromě čísla řádku obsahuje i informaci o číslu sloupce [Eag07]. Některé další rozdíly oproti formátu COFF jsou k nalezení v [Dar05]. DWARF ladicí informace jsou ukládány do pojmenovaných sekcí s předdefinovaným významem (prefix.debug_ ). Od verze DWARF 2 se provádí komprese ladicích informací. Děje se tak pomocí používání zkratek (sekce.debug_abbreviations), formátem (U)LEB128 pro uložení čísel na minimálním počtu bitů a pomocí programů v bajtkódu pro generování tabulek informací. Ukázka některých sekcí:.debug_info sekce s vlastními ladicími informacemi.debug_abbrev sekce se zkratkami používanými v.debug_info.debug_line sekce s informacemi o číslech řádků.debug_ranges sekce s informacemi o mapování symbolů do paměti 4.3 MAPOVÁNÍ KÓDU NA ZDROJOVÉ SOUBORY Jak bylo již řečeno, úkolem překladače je transformovat zdrojový kód do strojového, který bude proveden přímo na hardwarové platformě. Mapování strojového kódu zpět do zdrojového není pro ladicí nástroj triviální úloha. Bez podpory na úrovni překladače (při generování ladicích informací) není možné informace o mapování dodatečně získat. V nejjednodušší formě si můžeme tyto informace představit jako tabulku se třemi sloupci fyzickou adresou kódu v programu, názvem souboru se zdrojovým kódem a číslem řádku v souboru. Při nastavení bodu přerušení na některý řádek zdrojového kódu se pak zjistí odpovídající fyzická adresa. Toto je případ ladicího formátu COFF. S tím, jak překladače optimalizují kód programu, může dojít k posunu instrukcí či k jejich odstranění. Kód pro daný příkaz zdrojového kódu nemusí být uložen sekvenčně, ale proloženě s instrukcemi pro jiné příkazy. Tento jev je typický pro architektury s vysokou úrovní paralelismu v rámci instrukcí (např. VLIW). Proto je vhodné do tabulky s čísly řádků uložit i informaci, zda se nejedná o začátek či konec kódu daného příkazu (tzv. prolog a epilog). Ladicí nástroj pak nemusí prohledávat celou tabulku a zjišťovat, zda neexistuje ještě TJD Teorie programovacích jazyků 15
16 Tvorba ladicího nástroje jiná instrukce patřící k aktuálnímu příkazu. Další užitečnou informací je uchovávání čísla sloupce ve zdrojovém kódu. Tato informace dokáže zjemnit určení pozice až na úroveň výrazů či operátorů v rámci složitějších příkazů 3. Mezi další informace patří kupříkladu identifikace základních bloků či určení instrukční sady instrukce (u architektur s více instrukčními sadami jako je MIPS, ARM či Intel Itanium). Ukázka těchto informací ve formátu DWARF: adresa soubor řádek sloupec příkaz blok konec epil. prol. ISA 0x0 xyz.c 42 2 ano ne ne ne ano ARM 0x9 xyz.c 44 2 ano ne ne ne ne ARM 0x2c abc.c 10 4 ano ano ne ne ano Thumb 4.4 KROKOVÁNÍ PROGRAMU A BODY PŘERUŠENÍ Po úspěšném napojení na proces laděného programu je možno začít ovlivňovat jeho běh. Nejzákladnějším principem je používání bodů přerušení (breakpoint). Ty mohou sloužit pro krokování po instrukcích, pro zastavení programu na uživatelem zvoleném místě či pro podmíněné řízení toku programu. Body přerušení mohou být vkládány na úrovni zdrojového kódu (typicky na řádek ve zvoleném souboru) nebo na adresy strojových instrukcí. Prvně zmíněný typ může znamenat nastavení bodů přerušení na více fyzických adres (např. inline funkce v jazyce C, šablony v C++ atd.). Může ale nastat i opačný případ, kdy se více vysokoúrovňových bodů přerušení namapuje na jednu fyzickou adresu. Vztah mezi nimi je tedy obecně N:M. Jakmile uživatel nastaví body přerušení, je možno program spustit. Spuštění může proběhnout dvěma způsoby buďto plnou rychlostí (až do dosažení bodu přerušení) nebo provedení jednoho kroku TYPY BODŮ PŘERUŠENÍ Podle vlastností či způsobu použití rozlišujeme celou řadu bodů přerušení. Výčet těch nejdůležitějších následuje, další typy jsou k dohledání v [Wil10] a [Ros96]. Logické a fyzické. Logický bod přerušení je více abstraktní a určuje, na kterém řádku a v kterém souboru zdrojového kódu (případně symbolické jméno návěští či funkce) se má přerušení provést. Mohou rovněž obsahovat aktivační podmínku, za které se přerušení vykoná (př. počet průchodů, příznak, že je bod aktivní apod.). Struktura pro uložení těchto bo- 3 Ač jsou ladicí formáty na uložení této informace připraveny, podpora pro její generování na straně současných překladačů je spíše sporadická. TJD Teorie programovacích jazyků 16
17 Tvorba ladicího nástroje dů je poměrně triviální, obsahuje informace o řádku a zdrojovém souboru, případně adrese zvoleného symbolu z tabulky symbolů v objektovém souboru programu. Fyzický bod představuje reprezentaci přerušení ve strojovém kódu laděného programu, vytvořenou nejčastěji pomocí substituce některé instrukce za speciální instrukci přerušení. Každý fyzický bod má svou adresu, zálohu originální instrukce před nahrazením a počet logických bodů přerušení, které na něj odkazují. Pro rychlejší kontrolu dosažení přerušení obsahují struktury i seznam všech odpovídajících logických bodů. Dočasné, trvalé a interní. Dělení závisí na uchování bodu přerušení po jeho dosažení. Dočasné body se po prvním dosažení zruší, trvalé v programu zůstávají i nadále. Někdy je také možné specifikovat, po kolikátém dosažení se přerušení vykoná. To je vhodné například při ladění cyklů. Interní body přerušení jsou důležité pro správnou funkčnost krokování programu (např. krokování po instrukcích či krokování přes funkce), ale pro uživatele jsou skryté. Interní body jsou často zároveň dočasné, což je určeno atributem ve struktuře logického bodu přerušení. Datové (data breakpoint, watchpoint). Datové body přerušení jsou používány pro odhalení chyb způsobených neočekávanou hodnotou proměnných. K přerušení dochází pouze v tom případě, kdy je detekován přístup (případně i modifikace) k některým zdrojům procesoru. Může se například jednat o zápis určité hodnoty do paměti na požadované adrese. Výběr zdroje i kontrolované hodnoty je definován uživatelským výrazem. Hardwarová podpora (kontrola adres či stránkování) je téměř nezbytná, protože kontrola na úrovni ladicího nástroje by běh programu výrazně zpomalovala. Body přerušení lze využít i tak, že při jejich aktivaci se neprovede přerušení, ale obecně jakákoliv uživatelem definovaná akce. Příkladem může být instrumentace kódu, kdy se na zvolených místech vypíší informace o stavu programu, nebo se bude zaznamenávat počet průchodů přes toto místo. V kombinaci s aktivačními podmínkami je možné program odladit bez nutnosti rekompilace, změny se ovšem neuloží do spustitelného souboru NASTAVENÍ BODU PŘERUŠENÍ Při nastavení bodu přerušení se postupuje tak, že podle zvolené lokace bodu přerušení se nejprve vytvoří logický bod, obsahující informace o pozici v souboru. Ten se pak bude odkazovat na fyzický bod přerušení, jenž představuje fyzickou adresu v programu. Při vložení bodu přerušení do programu pak ladicí nástroj získá od operačního systému instrukci na požadované adrese a tu uloží do struktury fyzického bodu přerušení. Následně operačnímu systému místo ní pošle instrukci, která vyvolá zastavení laděného programu a předání řízení ladicímu nástroji. Ten po přijetí řízení obnoví původní instrukci tak, aby v toku řízení bezpro- TJD Teorie programovacích jazyků 17
18 Tvorba ladicího nástroje středně následovala, a odpovídajícím způsobem dekrementuje programový čítač. Více ilustruje algoritmus nastavení bodu přerušení ve zdrojovém kódu: Vstup: Výstup: Postup: Jméno souboru a číslo řádky, kde má být běh programu přerušen. Fyzická adresa bodu přerušení nebo indikace chyby. Mapování jména souboru a čísla řádky na fyzickou adresu pomocí tabulky symbolů a logických a fyzických bodů přerušení. 1) Získání tabulky symbolů pro zvolený soubor a mapování řádků na instrukce z ladicích informací. Výpis chyby pokud tyto informace nejsou k dispozici. 2) Vytvoření struktury nového logického bodu přerušení, která bude obsahovat informace z části 1). 3) Vytvoření struktury (či inkrementace počítadla) fyzického bodu přerušení, na který se bude odkazovat logický bod z části 2). 4) Získání instrukce na požadované adrese a její záloha ve struktuře fyzického bodu přerušení. 5) Nahrazení instrukce v programu na této adrese za instrukci vyvolávající přerušení. Operační systém pro nastavení i detekování bodu přerušení potřebuje podporu na úrovni hardwaru. Ta může být realizována několika způsoby: Speciální instrukce. Tato varianta je nejčastější. V instrukční sadě je vyčleněna speciální instrukce sloužící k vyvolání přerušení operačního systému za účelem ladění. Příkladem je instrukce INT3 u architektur Intel x86 a AMD64, BREAK u architektury MIPS či BPT u procesorů Alpha. Neplatná instrukce. U jiných architektur (např. PowerPC) neexistuje speciální instrukce používaná pro nastavení bodu přerušení, místo toho se použije instrukce s neplatným operačním kódem. Instrukční dekodér procesoru musí s touto variantou počítat. Hardwarové body přerušení. Jde o jiný přístup než dvě předchozí metody. Procesor v tomto případě obsahuje tzv. ladicí registry, jejichž hodnoty nastavuje ladicí nástroj na adresy požadovaných bodů přerušení. V každém cyklu je pak jejich hodnota komparována s programovým čítačem, a pokud hodnota souhlasí, tak je vyvoláno přerušení. Odpadá tak potřeba modifikovat program. Příkladem jsou architektury Intel x86 (registry DR0-DR3 a řídicí registr DR7) a AMD64. TJD Teorie programovacích jazyků 18
19 Tvorba ladicího nástroje KROKOVÁNÍ Při vyvolání přerušení za běhu programu se ladicí nástroj pokusí podle hodnoty programového čítače najít fyzický bod přerušení. V odpovídající struktuře se zjistí logický bod přerušení a následně se ověří splnění případné podmínky aktivace. První bod přerušení, který má splněny aktivační podmínky, se použije pro zobrazení lokace ve zdrojovém kódu. To se děje pomocí algoritmu aktivace bodu přerušení: Vstup: Výstup: Postup: Oznámení operačního systému o zastavení laděného programu na určité adrese. Zastavení či pokračování běhu laděného programu v závislosti na postupu níže. Mapování fyzických adres na jména souborů a čísla řádků pomocí struktur logických a fyzických bodů přerušení. 1) Prohledání seznamu logických bodů přerušení podle zjištěné adresy přerušení (logických bodů může být i více). 2) Vyhodnocení případných podmínek aktivace u všech logických bodů přerušení zjištěných v části 1). 3) Pokud podmínka aktivace není splněna, pak je tento bod přerušení ignorován. Pokud podmínka splněna je, případně pokud je bod nepodmíněný, pak ho zařaď do finálního seznamu. 4) Jestliže je finální seznam neprázdný, pak bude laděný program zastaven. 5) Jinak bude laděný program pokračovat. Díky bodům přerušení jsme také schopni provádět vykonávání programu v krocích. Krokování můžeme rozdělit podle způsobu vykonávání funkcí a procedur na dvě varianty: krokování s vnořením (step into) a krokování bez vnoření (step over). Krokování s vnořením probíhá včetně krokování v rámci volaných funkcí, kdežto u krokování bez vnoření se tělo funkce provede bez krokování a program je přerušen až po jejím vykonání. Obě funkce navíc mohou být používány jak na úrovni příkazů tak instrukcí. Funkce krokování s vnořením na úrovni příkazů je ve skutečnosti realizována pomocí ladění na úrovni instrukcí. Je však na ladicím nástroji, aby skutečný stav běhu uživateli abstrahoval do formy zdrojového kódu. To se děje pomocí hledání lokace ve zdrojovém kódu, který bude vykonán jako další. Pokud interní ukazatel není nastaven na aktuální místo zastavení a současně reprezentuje první instrukci nějakého řádku, algoritmus končí a vrátí tento řádek. V opačném případě se ukazatel inkrementuje a pokračuje se další instrukcí (u skokových instrukcí se ukazatel nastaví na adresu cíle). Tento algoritmus se opakuje v cyklu. Na TJD Teorie programovacích jazyků 19
20 Tvorba ladicího nástroje řádek vrácený tímto algoritmem je poté vložen dočasný bod přerušení a program pokračuje až do jeho vykonání. Krokování bez zanoření funguje obdobně, pouze s tím rozdílem, že instrukce typu volání (CALL) se provedou a přerušení se umístí až za bezprostředně následující instrukci, případně na instrukci ležící na návratové adrese volání. Tedy místo, aby se krokovalo uvnitř volání, se volání vykoná celé a krokování pokračuje až za ním. Dalším typem krokování je běh do konce funkce (step out). Běh pokračuje až na konec právě krokované funkce a zastaví se při návratu této funkce. Pokud je aktuální pozice v hlavní funkci programu, pak program doběhne a ukončí se. Princip vložení přerušení spočívá v načtení návratové adresy ze zásobníku a umístění interního bodu přerušení na tuto adresu. Krokování po instrukcích je výrazně jednoduší než krokování po příkazech, protože není potřeba znát mapování instrukcí na zdrojový kód. Rovněž vztah mezi fyzickými logickými body přerušení se změní na 1:1 a jejich dělení pak ztrácí smysl. Při vykonávání laděného programu se provede pouze jedna instrukce a okamžitě dojde k předání řízení zpět ladicímu nástroji. Tohoto chování lze docílit buďto opakovaným manuálním vkládáním bodů přerušení na následující instrukci, případně za pomoci hardwarového krokování, kdy tuto činnost vykonává procesor. 4.5 ZJIŠŤOVÁNÍ STAVU ZÁSOBNÍKU Programový zásobník je struktura podporovaná hardwarem, operačním systémem i překladačem. Procesor obsahuje v registrové sadě ukazatel na zásobník (stack pointer) a v instrukční sadě instrukce pro práci se zásobníkem (např. typické instrukce PUSH a POP). Speciální instrukcí je volání funkce (CALL). V tomto případě se na zásobník ukládá návratová adresa a podle volací konvence i funkční argumenty. V rámci funkce se často na zásobníku také ukládají lokální proměnné a kopie hodnot registrů. V průběhu vykonávání programu dochází k zanořování funkcí a tím pádem k tvorbě rámců na zásobníku. Rámec představuje souvislý sled dat na zásobníku, související s voláním konkrétní funkce (tedy návratová adresa, argumenty, lokální proměnné a kopie registrů). Více ilustruje [Obrázek 5]. TJD Teorie programovacích jazyků 20
21 Tvorba ladicího nástroje int main(...){ foo(...);... } int foo (...){ bar(...);... } int bar (...){... } main() main foo() foo() foo bar() bar() stack pointer báze zásobníku rámec 0 návratová adresa volání foo() rámec 1 návratová adresa volání bar() rámec 2 vrchol zásobníku 0x4000 0x3F10 OBRÁZEK 5 - UKÁZKA TVORBY RÁMCŮ NA ZÁSOBNÍKU (ROSTOUCÍHO SMĚREM DOLŮ) Jak bylo již uvedeno, při ladění potřebujeme kromě informace o pozici v programu znát i způsob, jakým jsme se do ní dostali, tj. zjištění posloupnosti rámců. K tomu se používá algoritmus stack unwinding 4. Zjednodušená verze algoritmu bez obnovování uložených registrů (předpokládejme, že zásobník roste směrem dolů): Vstup: Výstup: Postup: Aktuální stav registrů a programového čítače. Seznam rámců na zásobníku. Procházení posloupností ukazatelů na rámce na zásobníku. 1) Nechť Z a F jsou hodnoty ukazatele na zásobník, resp. ukazatele na rámec. Dále nechť P je aktuální hodnota programového čítače. 2) Výpis informací o rámci na základě hodnot Z, F a P. 3) Jestliže F je větší nebo rovno adrese báze zásobníku, zastav. (Analyzujeme pouze laděný program, ne podrobnosti o jeho spuštění). 4) Nechť S se rovná hodnotě F inkrementované o velikost ukazatele. (Získání návratové adresy funkce). 5) Nechť P se rovná hodnotě na adrese udané pomocí S. 6) Inkrementujme hodnotu S o velikost ukazatele. (Nyní S obsahuje adresu následující funkce). 7) Nahraďme F za ukazatel uložený na adrese F. 8) Opakování od části 2). 4 Do češtiny se tento výraz nepřekládá. Přibližný překlad by mohl znít odvíjení zásobníku. TJD Teorie programovacích jazyků 21
22 Tvorba ladicího nástroje 4.6 ZOBRAZENÍ HODNOT PROMĚNNÝCH Pro zobrazení hodnot proměnných laděného programu je nutné znát jejich jména a fyzická umístění. Jména proměnných se zjišťují z tabulky symbolů, což je struktura obsažená v objektovém souboru. Fyzické umístění proměnné může být například v paměti (globální proměnné), na zásobníku (lokální proměnné či argumenty funkcí), případně v registrech (při optimalizaci kódu překladači). Typ fyzického umístění je, podobně jako informace o mapování instrukcí na řádky, umístěn v ladicích informacích. Při zjišťování jmen proměnných musí ladicí nástroj rozpoznat aktuální kontext programu a jemu se přizpůsobit. Není například možné vypsat hodnoty všech proměnných z tabulky symbolů, protože mnohé z nich jsou lokální a v danou chvíli nemusejí být definované. Stejné tak při rekurzivním volání funkce je nutné zobrazovat více proměnných se stejným jménem odděleně, v závislosti na úrovni zanoření. Nepřímo se zobrazením hodnot proměnných souvisí i datové body přerušení. Pokud je takový bod nastaven na lokální proměnnou, ladicí nástroj musí zajistit, že program jím nebude přerušen mimo funkci, kde je proměnná definována, například změnou hodnoty jiné proměnné, která je mapována na stejné místo v paměti. Řešením je například deaktivace bodu přerušení při opuštění dané funkce. TJD Teorie programovacích jazyků 22
23 Ladění optimalizovaného kódu 5 LADĚNÍ OPTIMALIZOVANÉHO KÓDU Optimalizace a transformace kódu jsou prováděny překladačem z důvodu snížení času potřebného pro vykonání programu, případně pro snížení jeho velikosti. Mnoho optimalizačních metod je založeno na přeskupení či eliminaci kódu (např. optimalizace peephole, rozgenerování inline funkcí či eliminace mrtvého kódu). Optimalizace není v praxi realizována jako jedna ucelená fáze, ale jedná se o celou sérii transformací, které probíhají ve všech fázích překladu a nezřídka se provádí i v průběhu generování ladicích informací. Pokud se během optimalizace změní kód a překladač náležitým způsobem nemodifikuje vygenerované ladicí informace, tak dojde ke vzniku nekonzistence s kódem programu. To způsobí při ladění v lepším případě chybu, v horším to povede k chybné interpretaci výsledků ladění. Je tedy nutné, aby překladač ladicí informace opravil, případně alespoň zanechal ladicímu nástroji zprávu, že úsek kódu byl optimalizován. Může vyvstat otázka, proč se vůbec zabývat laděním optimalizovaného kódu, když tradiční paradigma ladicího procesu nařizuje optimalizace při ladění vypnout. Důvody jsou dva. Prvním je urychlení aplikace i při ladění. Pokud ladíme výpočetně náročný program, je vhodné co nejvíce urychlit části kódu, které nejsou předmětem odlaďování. Výpočetní náročnost je navíc umocněna režií ladicího nástroje. Optimalizace programu je tedy prospěšná pro zkrácení doby vykonávání laděného programu. Druhým důvodem je snaha ověřit funkčnost a výkonnost optimalizovaného programu. Předpokládá se, že finální verze programu bude optimalizována. Uživatel by tedy měl být schopen ladit finální verzi svého programu. 5.1 ZÁKLADNÍ TYPY OPTIMALIZACÍ V literatuře o překladačích byla oblast optimalizací detailně popsána, proto bude následovat jenom krátký výčet těch metod, které ladění kódu značně komplikují. Informace o dalších metodách je možno najít například v [AlKe01] a [ALSU06]. Zpracování konstant (Constant folding). Vyhodnocení výrazu složeného čistě z konstant je provedeno již v době překladu a není tak generován žádný odpovídající kód. Tato optimalizační metoda je prováděna i při nejnižší úrovni optimalizování kódu. Příklad této optimalizace: Kód před optimalizací Kód po optimalizaci 1: i = 3 * 4; 1: i = 14; 2: i = i + 2; TJD Teorie programovacích jazyků 23
24 Ladění optimalizovaného kódu Uživatel, který by chtěl tento výpočet při ladění krokovat, by byl patrně překvapen tím, že výpočet výrazu se vůbec neprovádí. Podobné chování je možno pozorovat i u metody propagace proměnných. Přesunutí invariantů cyklů (Loop-invariant Code Motion). Jde o optimalizaci smyček, která se snaží přesunout mimo smyčku takové výpočty, které produkují stejné výsledky v každém cyklu (tj. jsou vůči cyklu invariantní). Viz následující příklad: Kód před optimalizací Kód po optimalizaci 1: i = 0; 1: i = 0; 2: while (i < 500) { 2: j = x * y; 3: j = x * y; 3: while (i < 500) { 4: a[i] = i + j; 4: a[i] = i + j; 5: i++; 5: i++; 6: } 6: } Při ladění tohoto kódu může dojít ke zmatení, jelikož hodnota proměnné j je přiřazena ještě před vstupem do smyčky. Obdobným způsobem pracuje i metoda transformace indukčních proměnných. Eliminace nepotřebného kódu. Dochází zde k odstranění částí kódu, které jsou sice prováděny, ale nemají žádný význam. Kupříkladu přiřazení proměnné sama sobě: 1: x = x; Takovýto kód je překladačem eliminován a není možné ho tak namapovat na žádnou strojovou instrukci, což může být problém při nastavování bodu přerušení. Registrové proměnné. Jde o další optimalizaci, u které může dojít k problémům při ladění. Uvažujme například následující kód: 1: int i; 2: for (i = 0; i < 10000; i++) { 3: a[i] = i * 2; 4: } Pokud bude kód neoptimalizovaný, tak bude proměnná i uložena v paměti (či na zásobníku). Ladicí nástroj tak nebude mít problémy se zobrazováním její hodnoty, protože se bude nalézat stále na stejném místě, a to i v průběhu cyklu. V něm bude hodnota proměnné i vždy načtena z paměti, provede se s ní porovnání, bude inkrementována a následně se opět uloží do paměti. TJD Teorie programovacích jazyků 24
25 Ladění optimalizovaného kódu Pokud však překladač provede optimalizace, může po dobu provádění cyklu proměnnou i uložit do registru (což bude výrazně rychlejší) a hodnota v paměti nemusí být po celou dobu provádění cyklu aktualizována. Jestliže informace o dynamické změně umístění proměnné není obsažena v ladicích informacích, pak ladicí nástroj bude ukazovat chybné hodnoty. 5.2 ARCHITEKTURY ZAMĚŘENÉ NA VYSOKOU MÍRU PARALELISMU Paralelní vykonávání kódu mnoha nezávislými výpočetními jednotkami urychluje běh programu. Architektury založené na paralelismu mohou mít různé podoby v závislosti na vlastnostech výpočetních jednotek a jejich propojení. Můžeme se například setkat se superskalárními procesory, více-jádrovými procesory či multiprocesorovými systémy. Z pohledu ladicího nástroje se vždy jedná o nárůst množství informací, které musí zjišťovat a spravovat. Do jisté míry speciálním typem architektury je architektury VLIW (Very Large Instruction Word). Ta je oproti ostatním zaměřena na dosažení vysoké míry paralelismu na úrovni instrukcí. Architektura se skládá z mnoha nezávislých funkčních jednotek, které jsou řízeny paralelně. Procesor v každém taktu vydává dlouhé instrukce, které jsou složeny z mnoha (typicky 4-16) operací pro funkční jednotky. Každá operace má podobu běžné instrukce pro architekturu RISC. Míra paralelismus vykonávání kódu na architektuře VLIW je omezena pouze tím, jak dobře dokáže překladač naplánovat instrukce. Pro efektivní plánování se do jedné dlouhé instrukce vkládají operace realizující různé příkazy zdrojového kódu současně. Dochází tak k rozbití pořadí provádění příkazů. Ladění neoptimalizovaného kódu pro VLIW architektury je tak v mnohém horší než ladění optimalizovaného kódu jiných architektur. Vzhledem k jednoduchosti hardwaru VLIW architektur je jejich efektivita závislá na kvalitě překladače [FFY05]. Z toho důvodu byla vytvořena celá řada optimalizací speciálně pro ni (např. software pipelining, modulo scheduling, trace scheduling atd.). Při použití optimalizací se problém ladění kódu dále stupňuje. Metoda mapování řádků zdrojového kódu na instrukce se tak stává nedostatečnou, jelikož není schopna zachytit současné rozpracování několika příkazů současně. Tento problém je v literatuře zmiňován pouze minimálně. Jedním z řešení, podle publikace [Coo92], by mohla být transformace tabulky s informacemi o řádcích do podoby tabulky s informacemi o instrukcích. Nebyly by v ní tedy uloženy informace o mapování příkazů na jednotlivé instrukce, ale naopak by obsahovala údaje o tom, které příkazy jsou prováděny danou instrukcí. To by vyžadovalo podporu na straně překladače, který by krom jiného mu- TJD Teorie programovacích jazyků 25
26 Ladění optimalizovaného kódu sel generovat i informace o sloupcích, aby bylo možno uživateli vyobrazit, která část příkazu se aktuálně provádí. Následuje ukázka tohoto konceptu (převzato z [Coo92]): Kód v jazyce C: // čísla sloupců 1: int i1, i2, i3; 2: float f1, f2, f3; 3: 4: i1 = i2 + i3; 5: f1 = (f2 / f3) / i1; 6: return; Odpovídající kód v jazyce symbolických instrukcí pro VLIW architekturu se 4 sloty: 0: load r1,i2 load r2,i3 load fr1,f2 load fr2,f3 1: add r1,r2 nop fdiv fr1,fr2 nop 2: store r1,i1 nop nop nop 3: nop nop load fr2,i1 nop 4: nop nop fdiv fr1,fr2 nop 5: nop nop store fr1,f1 nop 6: ret nop nop nop Zjednodušená podoba tabulky s informacemi o mapování řádků a instrukcí: Adresa Pozice ve zdrojovém instrukce kódu (řádek:sloupec) Komentář 0x0 4:6; 4:11; 5:7; 5:12 načtení i2, i3, f2 a f3 0x1 4:9; 5:10 i2 + i3, f2 / f3 0x2 4:4 přiřazení výsledku 0x3 5:18 načtení i1 0x4 5:16 / i1 0x5 5:4 přiřazení výsledku 0x6 6:1 return TJD Teorie programovacích jazyků 26
27 Závěr 6 ZÁVĚR Proces ladění kódu je v současnosti již nezbytný pro vytvoření kvalitního softwaru. V této práci jsme se zaměřili na jednu z metod ladění ladění kódu na úrovni zdrojového kódu. Tento přístup je pro uživatele intuitivní, jelikož svůj program odlaďují na stejné úrovni, na které ho vytvářeli. Jsou tak zbaveni nutnosti znát architekturu, na které ladění probíhá, jako je tomu při ladění na úrovni strojového kódu. Na druhou stranu je proces návrhu a implementace takového nástroje obtížnější. V prvé řadě je nutné získat podporu v překladači při generování ladicích informací, které jsou pro ladicí nástroj kritické. Jejich formát není univerzální a často se liší překladač od překladače. Ladicí nástroj se pak musí specializovat na práci s některým ze standardů, jakými jsou v současnosti formáty DWARF či Microsoft PDB. Ladicí informace jsou pak využity k mnoha účelům. Jedním z nich je zjišťování fyzického umístění proměnných, které se použije při zobrazování jejich hodnot za běhu programu. Druhým možným využitím je mapování čísel řádek ve zdrojovém kódu (tj. úroveň příkazů programovacího jazyka) na strojové instrukce. Díky tomuto jsme schopni uživateli navodit iluzi, že program je prováděn po příkazech, i když je ve skutečnosti prováděn po instrukcích. Program pak můžeme po příkazech i krokovat, což je činnost ovlivňující jeho rychlost i způsob vykonávání. (Nejenom) pro krokování se využívají body přerušení. Způsobů uplatnění je ale celá řada, což jenom podtrhuje jejich nezbytnost v procesu ladění. Tento princip musí být podpořen na hardwarové úrovni, což se děje na různých architekturách různým způsobem. Ladicí nástroj je pak buďto platformě závislý nebo musí počítat s odlišnými podmínkami na různých platformách. Samotnou kapitolou je pak ladění optimalizovaného kódu a kódu pro architektury zaměřené na paralelismus. Tato témata jsou v současnosti pro výrobce ladicích nástrojů poměrně palčivá, proto by se měl další výzkum ubírat především touto cestou. Práce měla spíše informativní charakter, kdy nebylo cílem popsat všechny metody a techniky používané při ladění na úrovni zdrojového kódu, ale především představit ty nejdůležitější. TJD Teorie programovacích jazyků 27
Pohled do nitra mikroprocesoru Josef Horálek
Pohled do nitra mikroprocesoru Josef Horálek Z čeho vycházíme = Vycházíme z Von Neumannovy architektury = Celý počítač se tak skládá z pěti koncepčních bloků: = Operační paměť = Programový řadič = Aritmeticko-logická
ČÁST 1. Základy 32bitového programování ve Windows
Obsah Úvod 13 ČÁST 1 Základy 32bitového programování ve Windows Kapitola 1 Nástroje pro programování ve Windows 19 První program v Assembleru a jeho kompilace 19 Objektové soubory 23 Direktiva INVOKE 25
Paralelní programování
Paralelní programování přednášky Jan Outrata únor duben 2011 Jan Outrata (KI UP) Paralelní programování únor duben 2011 1 / 14 Atomické akce dále nedělitelná = neproložitelná jiným procesem izolovaná =
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE
Architektury počítačů a procesorů
Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní
Architektury VLIW M. Skrbek a I. Šimeček
Architektury VLIW M. Skrbek a I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PAP, LS2010/11, Predn.3 Příprava studijního programu
Struktura programu v době běhu
Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů
Úvod. Programovací paradigmata
.. Úvod. Programovací paradigmata Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Cíl: programování efektivně a bezpečně Programovací techniky
Matematika v programovacích
Matematika v programovacích jazycích Pavla Kabelíková am.vsb.cz/kabelikova pavla.kabelikova@vsb.cz Úvodní diskuze Otázky: Jaké programovací jazyky znáte? S jakými programovacími jazyky jste již pracovali?
ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE
Vzorový příklad pro práci v prostředí MPLAB Zadání: Vytvořte program, který v intervalu 200ms točí doleva obsah registru reg, a který při stisku tlačítka RB0 nastaví bit 0 v registru reg na hodnotu 1.
Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012
Přednáška Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského
Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)
Programovací jazyky Programovací jazyky nižší assembler (jazyk symbolických instrukcí) vyšší imperativní (procedurální) Pascal, C/C++, Java, Basic, Python, php neimperativní (neprocedurální) Lisp, Prolog
Implementace systémů HIPS: historie a současnost. Martin Dráb
Implementace systémů HIPS: historie a současnost Martin Dráb martin.drab@secit.sk HIPS: základní definice Majoritně používané operační systémy disponují bezpečnostními modely, které dovolují jednotlivým
Překladač a jeho struktura
Překladač a jeho struktura Překladače, přednáška č. 1 Šárka Vavrečková Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz http://fpf.slu.cz/ vav10ui Poslední aktualizace: 23. září 2008 Definice
Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).
Strojový kód k d a asembler procesoru MIPS Použit ití simulátoru SPIM K.D. - cvičení ÚPA 1 MIPS - prostředí 32 ks 32bitových registrů ( adresa registru = 5 bitů). Registr $0 je zero čte se jako 0x0, zápis
GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)
GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK) 2011 Jan Janoušek MI-GEN Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Úvod
Strojový kód. Instrukce počítače
Strojový kód Strojový kód (Machine code) je program vyjádřený v počítači jako posloupnost instrukcí procesoru (posloupnost bajtů, resp. bitů). Z hlediska uživatele je strojový kód nesrozumitelný, z hlediska
Vstupní požadavky, doporučení a metodické pokyny
Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem
Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.
Trochu teorie Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací. Každá spuštěná aplikace má alespoň jeden proces
5. STRUKTURA PLC PROGRAMU
5. STRUKTURA PLC PROGRAMU Struktura PLC programu je navržena s ohledem na co jefektivnější návrh programu při přizpůsobení CNC systému na stroj. 5.1 Moduly jazyka TECHNOL Moduly jazyka PLC836 byly vytvořeny
Systém adresace paměti
Systém adresace paměti Základní pojmy Adresa fyzická - adresa, která je přenesena na adresní sběrnici a fyzicky adresuje hlavní paměť logická - adresa, kterou má k dispozici proces k adresaci přiděleného
TÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího
Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě
Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické
Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit
Jednoduché stránkování Operační systémy Přednáška 8: Správa paměti II Hlavní paměť rozdělená na malé úseky stejné velikosti (např. 4kB) nazývané rámce (frames). Program rozdělen na malé úseky stejné velikosti
Procesy a vlákna (Processes and Threads)
ÚVOD DO OPERAČNÍCH SYSTÉMŮ Ver.1.00 Procesy a vlákna (Processes and Threads) Správa procesů a vláken České vysoké učení technické Fakulta elektrotechnická 2012 Použitá literatura [1] Stallings, W.: Operating
Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě
Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické
Paměťový podsystém počítače
Paměťový podsystém počítače typy pamětových systémů počítače virtuální paměť stránkování segmentace rychlá vyrovnávací paměť 30.1.2013 O. Novák: CIE6 1 Organizace paměťového systému počítače Paměťová hierarchie...
Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)
Programovací jazyky Programovací jazyky nižší assembler (jazyk symbolických instrukcí) vyšší imperativní (procedurální) Pascal, C/C++, Java, Basic, Python, php neimperativní (neprocedurální) Lisp, Prolog
Profilová část maturitní zkoušky 2017/2018
Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2017/2018 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA
5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina
5a. Makra Visual Basic pro Microsoft Escel Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina Cyklické odkazy a iterativní výpočty Zde bude stránka o cyklických odkazech a iteracích.
Mezipaměti počítače. L2 cache. L3 cache
Mezipaměti počítače Cache paměť - mezipaměť Hlavní paměť procesoru je typu DRAM a je pomalá. Proto se mezi pomalou hlavní paměť a procesor vkládá menší, ale rychlá vyrovnávací (cache) paměť SRAM. Rychlost
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
Assembler pro Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague Zápis instrukcí umíme už zapisovat instrukce v binárním tvaru to je silně nešikovné pro snazší vývoj
09. Memory management. ZOS 2006, L.Pešička
09. Memory management ZOS 2006, L.Pešička Správa paměti paměťová pyramida absolutní adresa relativní adresa počet bytů od absolutní adresy fyzický prostor adres fyzicky k dispozici výpočetnímu systému
Princip funkce počítače
Princip funkce počítače Princip funkce počítače prvotní úlohou počítačů bylo zrychlit provádění matematických výpočtů první počítače kopírovaly obvyklý postup manuálního provádění výpočtů pokyny pro zpracování
Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012
Přednáška Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského
1. Programování proti rozhraní
1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní
Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.
13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny
Maturitní otázky z předmětu PROGRAMOVÁNÍ
Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti
Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21
Stručný obsah 1. Hardware, procesory a vlákna... 19 2. Programování s ohledemna výkon... 45 3. Identifikování příležitostí pro paralelizmus... 93 4. Synchronizace a sdílení dat... 123 5. Vlákna v rozhraní
VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu
VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632
4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody
4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina Cyklické odkazy a iterativní výpočty
TÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 25. Otázka : Komponentní technologie - základní pojmy a principy, metody specifikace komponent. Obsah : 1. Základní pojmy 1.1 Komponenta Komponenta
Profilová část maturitní zkoušky 2013/2014
Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2013/2014 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA
VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu
VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632
Obsah. Zpracoval:
Zpracoval: houzvjir@fel.cvut.cz 03. Modelem řízený vývoj. Doménový (business), konceptuální (analytický) a logický (návrhový) model. Vize projektu. (A7B36SIN) Obsah Modelem řízený vývoj... 2 Cíl MDD, proč
Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu
StatSoft Typy souborů ve STATISTICA Tento článek poslouží jako přehled hlavních typů souborů v programu STATISTICA, ukáže Vám jejich možnosti a tím Vám dovolí využívat program efektivněji. Jistě jste již
11. Přehled prog. jazyků
Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 11 1 Základy algoritmizace 11. Přehled prog. jazyků doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze
1 Webový server, instalace PHP a MySQL 13
Úvod 11 1 Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského
6 Příkazy řízení toku
6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní
Algoritmizace. 1. Úvod. Algoritmus
1. Úvod Algoritmizace V dnešní době již počítače pronikly snad do všech oblastí lidské činnosti, využívají se k řešení nejrůznějších úkolů. Postup, který je v počítači prováděn nějakým programem se nazývá
VISUAL BASIC. Přehled témat
VISUAL BASIC Přehled témat 1 ÚVOD DO PROGRAMOVÁNÍ Co je to program? Kuchařský předpis, scénář k filmu,... Program posloupnost instrukcí Běh programu: postupné plnění instrukcí zpracovávání vstupních dat
Výukový materiál zpracován v rámci projektu EU peníze školám
Výukový materiál zpracován v rámci projektu EU peníze školám Registrační číslo projektu: CZ. 1.07/1.5.00/34.0637 Šablona III/2 Název VY_32_INOVACE_39_Algoritmizace_teorie Název školy Základní škola a Střední
Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace
Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace Číslo projektu Číslo materiálu Autor Průřezové téma Předmět CZ.1.07/1.5.00/34.0565 VY_32_INOVACE_284_Programovací_jazyky
Operační systémy. Cvičení 4: Programování v C pod Unixem
Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné
Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2
Základy informatiky 2. Přednáška HW Lenka Carr Motyčková February 22, 2011 Základy informatiky 1 February 22, 2011 Základy informatiky 2 February 22, 2011 Základy informatiky 3 February 22, 2011 Základy
Správné vytvoření a otevření textového souboru pro čtení a zápis představuje
f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru
Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.
7 Předmluva 13 Použité konvence 14 KAPITOLA 1 Základní číselné soustavy a pojmy 15 1.1 Číselné soustavy a převody 15 1.2 Datové typy 18 KAPITOLA 2 Seznámení s mikroprocesory řady x86 21 2.1 Počítač obecně
Sdílení dat mezi podprogramy
Sdílení dat mezi podprogramy Datové objekty mohou být mezi podprogramy sdíleny pomocí ne-lokálních referenčních prostředí, která jsou vytvářena na základě æ explicitních modifikací (formální parametry
Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky
Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové
GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím
GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER váš partner na cestě od dat k informacím globtech spol. s r.o. karlovo náměstí 17 c, praha 2 tel.: +420 221 986 390 info@globtech.cz
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
ALGORITMIZACE A PROGRAMOVÁNÍ
Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení
Profilová část maturitní zkoušky 2014/2015
Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2014/2015 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 26-41-M/01 Elektrotechnika Zaměření: technika
Ladění ovladačů pomocí virtuálního stroje...2 Úvod...2 Ladění ovladačů pomocí dvou fyzických počítačů...2 Ladění ovladačů pomocí jednoho fyzického
Ladění ovladačů pomocí virtuálního stroje...2 Úvod...2 Ladění ovladačů pomocí dvou fyzických počítačů...2 Ladění ovladačů pomocí jednoho fyzického počítače...2 Výběr aplikace na virtualizaci počítače...2
Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.
Virtuální počítač Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor Virtuální počítač Překladač Překladač : Zdrojový jazyk Cílový jazyk Analytická část:
Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC
Informační systémy 2 Obsah: Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC ROM RAM Paměti typu CACHE IS2-4 1 Dnešní info: Informační systémy 2 03 Informační systémy
V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a
1 Počítače CISC a RISC V dnešní době se ustálilo dělení počítačů do dvou základních kategorií podle typu použitého procesoru: CISC - počítač se složitým souborem instrukcí (Complex Instruction Set Computer)
1. Webový server, instalace PHP a MySQL 13
Úvod 11 1. Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského
Microsoft Word základní
Časový rozsah: 2 dny (8:30-14:00) Cena: 2400 Kč + DPH Microsoft Word základní Tvorba kratších dokumentů se zaměřením na korespondenci. Základy tvorby a formátování písma a odstavců. Vkládání tabulek a
Architektura počítačů
Architektura počítačů Studijní materiál pro předmět Architektury počítačů Ing. Petr Olivka katedra informatiky FEI VŠB-TU Ostrava email: petr.olivka@vsb.cz Ostrava, 2010 1 1 Architektura počítačů Pojem
Program a životní cyklus programu
Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy
Architektura rodiny operačních systémů Windows NT Mgr. Josef Horálek
Architektura rodiny operačních systémů Windows NT Mgr. Josef Horálek = Velmi malé jádro = implementuje jen vybrané základní mechanismy: = virtuální paměť; = plánování vláken; = obsluha výjimek; = zasílání
5 ÚVOD DO TESTOVÁNÍ SOFTWARE. 6 Testování software ve vývojovém prostředí MICROSOFT VISUAL STUDIO V hlavním menu volba Debug
5 ÚVOD DO TESTOVÁNÍ SOFTWARE Testování software, za účelem dokázání existence chyby v něm, je nejčastěji prováděno na reálných datech, méně již na imitacích reálných dat a ještě méně na datech symbolických.
ČESKÉ VYSOKÉ UČENÍ TECHNIKÉ Fakulta elektrotechnická. Microsoft Sharepoint 2007 Workflows Průmyslové informační systémy
ČESKÉ VYSOKÉ UČENÍ TECHNIKÉ Fakulta elektrotechnická Microsoft Sharepoint 2007 Workflows Průmyslové informační systémy Bc. Petr Pokorný Letní semestr 2009/2010 1 Obsah 1 Úvod... 3 2 Workflow... 3 3 Workflow
Obsah. 1) Rozšířené zadání 2) Teorie zásuvných modulů a) Druhy aplikací používajících zásuvné moduly b) Knihovny c) Architektura aplikace d) Výhody
Obsah 1) Rozšířené zadání 2) Teorie zásuvných modulů a) Druhy aplikací používajících zásuvné moduly b) Knihovny c) Architektura aplikace d) Výhody 3) 4) Mantichora Mantichora je moderní aplikace, který
Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.
Model procesoru Jedná se o blokové schéma složené z registrů, paměti RAM, programového čítače, instrukčního registru, sčítačky a řídicí jednotky, které jsou propojeny sběrnicemi. Tento model má dva stavy:
Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13
Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací
První kroky s METEL IEC IDE
První kroky s poskytuje programování v IEC 61131-3 jazycích, podporuje jak grafickou tak textovou podobu. Umožňuje vytvářet, upravovat a ladit IEC 61131-3 (ST, LD, IL, FBD) programy pro řídicí jednotky
ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ 2013 1.3 2/14
ZÁKLADY PROGRAMOVÁNÍ Mgr. Vladislav BEDNÁŘ 2013 1.3 2/14 Co je vhodné vědět, než si vybereme programovací jazyk a začneme programovat roboty. 1 / 14 0:40 1.3. Vliv hardware počítače na programování Vliv
Implementace systémů HIPS: ve znamení 64bitových platforem. Martin Dráb martin.drab@email.cz
Implementace systémů HIPS: ve znamení 64bitových platforem Martin Dráb martin.drab@email.cz HIPS: základní definice Majoritně používané operační systémy disponují bezpečnostními modely, které dovolují
FORTANNS. havlicekv@fzp.czu.cz 22. února 2010
FORTANNS manuál Vojtěch Havlíček havlicekv@fzp.czu.cz 22. února 2010 1 Úvod Program FORTANNS je software určený k modelování časových řad. Kód programu má 1800 řádek a je napsán v programovacím jazyku
Přidělování paměti II Mgr. Josef Horálek
Přidělování paměti II Mgr. Josef Horálek Techniky přidělování paměti = Přidělování jediné souvislé oblasti paměti = Přidělování paměti po sekcích = Dynamické přemisťování sekcí = Stránkování = Stránkování
Výpočet v módu jádro. - přerušení (od zařízení asynchronně) - výjimky - softvérové přerušení. v důsledku událostí
Výpočet v módu jádro v důsledku událostí - přerušení (od zařízení asynchronně) - výjimky - softvérové přerušení řízení se předá na proceduru pro ošetření odpovídající události část stavu přerušeného procesu
Algoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
Datové struktury 2: Rozptylovací tabulky
Datové struktury 2: Rozptylovací tabulky prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
Zobrazte si svazy a uspořádané množiny! Jan Outrata
LatVis Zobrazte si svazy a uspořádané množiny! Jan Outrata Motivace potřeba visualizovat matematické (algebraické) struktury rychle, přehledně a automaticky počítačovými prostředky ruční kreslení je zdlouhavé
Algoritmy a algoritmizace
Otázka 21 Algoritmy a algoritmizace Počítačové programy (neboli software) umožňují počítačům, aby přestaly být pouhou stavebnicí elektronických a jiných součástek a staly se pomocníkem v mnoha lidských
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Příprava dat v softwaru Statistica
Příprava dat v softwaru Statistica Software Statistica obsahuje pokročilé nástroje pro přípravu dat a tvorbu nových proměnných. Tyto funkcionality přinášejí značnou úsporu času při přípravě datového souboru,
Business Intelligence
Business Intelligence Josef Mlnařík ISSS Hradec Králové 7.4.2008 Obsah Co je Oracle Business Intelligence? Definice, Od dat k informacím, Nástroj pro operativní řízení, Integrace informací, Jednotná platforma
Da D to t v o é v ty t py IB111: Datové typy
Datové typy IB111: Datové typy Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji provádět? Navržení práce s daty je velice důležité
1/1 ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018
ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018 Informační technologie 1 - Doporučená doba zpracování: 40 minut 1) Termín DCL v relačně databázové technologii
Programování v C++ 1, 1. cvičení
Programování v C++ 1, 1. cvičení opakování látky ze základů programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí procvičených
Přerušovací systém s prioritním řetězem
Přerušovací systém s prioritním řetězem Doplňující text pro přednášky z POT Úvod Přerušovací systém mikropočítače může být koncipován několika způsoby. Jednou z možností je přerušovací systém s prioritním
Algoritmy a datové struktury
Algoritmy a datové struktury 1 / 34 Obsah přednášky Základní řídící struktury posloupnost příkazů podmínka cyklus s podmínkou na začátku cyklus s podmínkou na konci cyklus s pevným počtem opakování Jednoduchá