Téma 9 Od programu k procesu



Podobné dokumenty
Téma 14. Od algoritmu k procesu

Téma 8 Od programu k procesu

Téma 14 Od programu k procesu

Téma 8 Od programu k procesu

Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem.

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Programování pro deskriptivní geometrii

AMU1 Monitorování bezpečného života letounu (RYCHLÝ PŘEHLED)

Algoritmizace a programování

Výrazy lze též zavést v nečíselných oborech, pak konstanty označuji jeden určitý prvek a obor proměnné není množina čísel.

Adresace paměti. 11.přednáška

Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1. Podpora digitalizace a využití ICT na SPŠ CZ.1.07/1.5.00/34.

Prostorové indexační techniky. Zdeněk Kouba

Lineární algebra. Vektorové prostory

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Karty externích médií

Uživatelský manuál k instalaci a aktivaci systému BUILDpower S

2.1. Pojem funkce a její vlastnosti. Reálná funkce f jedné reálné proměnné x je taková

Poruchy modul pro rychlé hlášení poruch z provozu.

MS Word 2007 REVIZE DOKUMENTU A KOMENTÁŘE

Algoritmus (nebo dřívějším pravopisem algorithmus)

Matrika otázky a odpovědi Vidimace částečné listiny. Ing. Markéta Hofschneiderová Eva Vepřková

Rychlé vyrovnávací paměti (cache)

Operace nad celými tabulkami

Konverze textových formátů

Numerická integrace. 6. listopadu 2012

Úvod do jazyka C. Proč jazyk C

Použití GIS v práci krajské hygienické stanice

Struktura počítačů základní pojmy

Programování - úvod. Programování. Proces programování. Vlastnosti dobrého programu: Kapitola seznamuje se základními pojmy programování.

Objektově orientované databáze

Karty externích médií Uživatelská příručka

účetních informací státu při přenosu účetního záznamu,

Externí zařízení Uživatelská příručka

-1- N á v r h ČÁST PRVNÍ OBECNÁ USTANOVENÍ. 1 Předmět úpravy

Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY

Rostislav Horčík. 13. října 2006

C. 2. Pořízení a implementace IS

Asymptoty grafu funkce

1 Měření kapacity kondenzátorů

VY_62_INOVACE_VK53. Datum (období), ve kterém byl VM vytvořen Květen 2012 Ročník, pro který je VM určen

Metody hodnocení rizik

MĚŘENÍ NÁKLADŮ, VÝKONNOSTI

Definice z = f(x,y) vázané podmínkou g(x,y) = 0 jsou z geometrického hlediska lokálními extrémy prostorové křivky k, Obr Obr. 6.2.

Aplikace počítačů v provozu vozidel 9

IRACIONÁLNÍ ROVNICE. x /() 2 (umocnění obou stran rovnice na druhou) 2x 4 9 /(-4) (ekvivalentní úpravy) Motivace: Teorie: Řešené úlohy:

Goniometrie trigonometrie

Sekvenční obvody. S R Q(t+1) 0 0? Q(t)

OBEC HORNÍ MĚSTO Spisový řád

B Kvantitativní test. Semestrální práce TUR. Novotný Michal

ORGANIZACE VELETRHU Z POHLEDU VYSTAVOVATELE

Business Contact Manager Správa kontaktů pro tisk štítků

Želva se nachází v tzv. grafickém okně (zviditelníme ji klávesou +), v němž jsou vidět i čáry, které nakreslila.

Příručka pro práci s dataloggerem Labquest 2. Zapínání a domácí obrazovka

František Hudek. červen ročník. Nastavení myši, místní a jazykové nastavení.

Příloha č. 54. Specifikace hromadné aktualizace SMS-KLAS

Fyzikální praktikum 3 - úloha 7

Algoritmizace a programování

Obsah. Úvodem 9 Komu je kniha určena 9 Forma výkladu 9 Konkrétní postup výuky 10 Příklady ke knize 11

SITEMAP / STRUKTURA. VÝVOJ ONLINE PREZENTACE / ETAPA I. CLIENT / DHL Global Forwarding THEQ ALL GOOD THINGS

Programování 1. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

1.1 Seminář z Informatiky. Charakteristika volitelného vyučovacího předmětu Seminář z Informatiky

NÁVOD NA PŘIHLÁŠENÍ DO INTERNETOVÉHO BANKOVNICTVÍ PRO SPRÁVU KREDITNÍ KARTY

Novinky verze ArCon 14 Small Business

Základní stavební prvky algoritmu

Obsah. Úvod 13 Část I: Úvod do MySQL. Část II: Návrh a tvorba databází v MySQL

ECB-PUBLIC ROZHODNUTÍ EVROPSKÉ CENTRÁLNÍ BANKY (EU) 2015/[XX*] ze dne 10. dubna 2015 (ECB/2015/17)

ČÁST PÁTÁ POZEMKY V KATASTRU NEMOVITOSTÍ

Server. Software serveru. Služby serveru

Úvod Petr Kropík viz:

Modul pro testování elektrických obvodů

NUMEROLOGIE CO JE NUMEROSKOP

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Uživatelská dokumentace

Kingston DataTraveler Locker+ G3. Instalační příručka. Kingston DataTraveler Locker+ G3

OBEC PŘIBYSLAVICE. Zastupitelstvo obce Přibyslavice. Obecně závazná vyhláška. Obce Přibyslavice Č. 1/2015

ŘÍZENÍ ABSORBERU KMITŮ POMOCÍ MATLABU

Podrobný postup pro doplnění Žádosti o dotaci prostřednictvím Portálu Farmáře. 1. kolo příjmu žádostí Programu rozvoje venkova ( )

Vítězslav Bártl. prosinec 2013

2.6.4 Lineární lomené funkce s absolutní hodnotou

PROBLEMATIKA TERÉNNÍCH ÚPRAV

NÁVOD K OBSLUZE MODULU VIDEO 64 ===============================

Windows 7 kompletní příručka. Bohdan Cafourek. Vydala Grada Publishing a.s. U Průhonu 22, Praha 7 jako svou publikaci

Mikroprocesor Intel 8051

( ) Slovní úlohy o společné práci I. Předpoklady: Sepiš postup na řešení příkladů o společné práci.

PŘÍLOHA 10 SMLOUVY O PŘÍSTUPU KE KONCOVÝM ÚSEKŮM. Pravidla a postupy

Programování v jazyce C. Proces celkového sestavení programu ze zdrojového kódu, vývojové nástroje Linuxu

Data v počítači EIS MIS TPS. Informační systémy 2. Spojení: jan.skrbek@tul.cz tel.: Konzultace: úterý

Výzva k podání nabídek (zadávací dokumentace)

VYHLÁŠKA ČÁST PRVNÍ STÁTNÍ ZKOUŠKY Z GRAFICKÝCH DISCIPLÍN. Předmět úpravy

Využití fixních a variabilních nákladů pro manažerské rozhodování a finanční řízení

Druhá mocnina. Druhá odmocnina Druhá odmocnina. Předpoklady: V této hodině jsou kalkulačky zakázány.

7. Silně zakřivený prut

(k 1)x k + 1. pro k 1 a x = 0 pro k = 1.

Metodika testování navazujících evidencí

1 METODICKÉ POKYNY AD HOC MODUL 2007: Pracovní úrazy a zdravotní problémy související se zaměstnáním

Operační systémy Rozdělení a popis. Autor: Ing. Jan Nožička SOŠ a SOU Česká Lípa VY_32_INOVACE_1124_Operační systémy Rozdělení a popis_pwp

Pokyny k vyplnění Průběžné zprávy

INFORMATIKA V CHOVECH PRASAT

Transkript:

Téma 9 Od programu k procesu Obsah 1. Interpretace a kompilace 2. Od zdrojového textu k procesu 3. Překladač a jeho činnost 4. Generování kódu 5. Výrazy, infixová a postfixová notace, vyhodnocení 6. Binární objektové moduly a jejich obsah 7. Sestavování 8. Zavádění 9. Co se nám sem nevešlo Tvorba spustitelného programu 1

Příprava a zpracování programů Při psaní programu je prvním krokem (pomineme-li analýzu zadání a volbu algoritmu) vytvoření zdrojového textu ve zvoleném programovacím jazyku zpravidla vytváříme textovým editorem a ukládáme do souboru s příponou indikující programovací jazyk zdroj.c pro jazyk C prog.java pro jazyk Java text.cc pro C++ Každý takový soubor obsahuje úsek programu označovaný dále jako modul V závislosti na typu dalšího zpracování pak tyto moduly podléhají různým sekvencím akcí, na jejichž konci je jeden nebo několik výpočetních procesů Rozlišujeme dva základní typy zpracování: Interpretace Kompilace (překlad) existuje i řada smíšených přístupů Tvorba spustitelného programu 2

Interpretace programů Interpretem rozumíme program, který provádí příkazy napsané v nějakém programovacím jazyku vykonává přímo zdrojový kód mnohé skriptovací jazyky a nástroje (např. bash), historické verze BASIC překládá zdrojový kód do efektivnější vnitřní reprezentace a tu pak okamžitě vykonává jazyky typu Perl, Python, MATLAB apod. vykonává předkompilovaný a uložený kód, vytvořený překladačem, který je součástí interpretačního systému Java (překládá se do tzv. byte kódu interpretovaného JVM) Výhody: rychlý vývoj bez potřeby explicitního překladu a dalších akcích nezávislost na cílovém stroji Nevýhody: nízká efektivita běhu programu interpret stále analyzuje zdrojový text (např. v cyklu) nebo se simuluje jiný stroj Důležitý poznatek: binární strojový kód je vždy interpretován hardwarem Tvorba spustitelného programu 3

Od zdrojového textu k procesu Tvorba spustitelného programu 4

Od zdrojového textu k procesu (jiný pohled) Tvorba spustitelného programu 5

Překladač (Compiler) Úkoly překladače (kompilátoru) kontrolovat správnost zdrojového kódu porozumět zdrojovému textu programu a převést ho do vhodného meziproduktu, který lze dále zpracovávat bez jednoznačné souvislosti se zdrojovým jazykem základní výstup kompilátoru bude záviset na jeho typu tzv. nativní překladač generuje kód stroje, na kterém sám pracuje křížový překladač (cross-compiler) vytváří kód pro jinou hardwarovou platformu (např. na PC vyvíjíme program pro vestavěný mikropočítač s procesorem úplně jiné architektury, než má naše PC) mnohdy umí překladač generovat i ekvivalentní program v jazyku symbolických adres (assembler) cílového stroje častou funkcí překladače je i optimalizace kódu např. dvě po sobě jdoucí čtení téže paměťové lokace jsou zbytečné jde často o velmi pokročilé techniky závislé na cílové architektuře, na zdrojovém jazyku optimalizace je časově náročná, a proto lze úrovně optimalizace volit jako parametr překladu při vývoji algoritmu chceme rychlý překlad, při konečném překladu provozní verze programu jde o jeho rychlost a efektivitu Tvorba spustitelného programu 6

Struktura překladače Detailní struktura překladače závisí na konkrétním zdrojovém jazyku Mezikód většinou reprezentuje tzv. syntaktický strom překládaného programu Optimalizaci lze většinou vypnout Generovaný kód závisí na dalším způsobu zpracování systémem některé překladače generují výhradně assembler a ten je pak převáděn do cílové binární formy Tvorba spustitelného programu 7

Rámcová činnost překladače Překlad programu probíhá v řadě fází (kroků) Lexikální analýza převádí textové řetězce na série tokenů (též lexemů), tedy textových elementů detekovaného typu např. příkaz: sedm = 3 + 4 generuje tokeny [sedm, IDENT], [=, ASSIGN_OP], [3, NUM], [+, ADD_OP], [4, NUM] Již na této úrovni lze detekovat chyby typu nelegální identifikátor (např. 1q) Tvorbu lexikálních analyzátorů lze mechanizovat pomocí programů typu lex nebo flex Syntaktická analýza kontroluje, zda sekvence tokenů odpovídají legálním pravidlům, která popisují příslušný programovací jazyk (zpravidla vyjádřeno bezkontextovou gramatikou) zde lze detekovat chyby typu nedefinovaný identifikátor ; číslu se přiřazuje řetězec apod. Sémantická analýza vytváří příslušné posloupnosti akcí definujících, jak chápat (a posléze vykonat) syntaktickou analýzou nalezené abstraktní výrazy výsledkem analýzy jsou zpravidla hierarchické stromové struktury (parse tree) [parse = větný rozbor ] Tvorba spustitelného programu 8

Rámcová činnost překladače (pokr.) Syntaktická a sémantická analýza většinou bývá prováděna společným kódem překladače, zvaným parser Tvorba parserů se mechanizuje pomocí programů typu yacc či bison yacc = Yet Another Compiler Compiler; bison je zvíře vypadající jako yacc Programovací jazyky se formálně popisují vhodnou deskripční metodou, např. tzv. pomocí tzv. Backus-Naurovy Formy (BNF) BNF elementární příklad české soukromé poštovní adresy: <postal-address> ::= <name-part> <street-address> <psc-part> <name-part> ::= <personal-part> <last-name> <EOL> <personal-part> <name-part> <personal-part> ::= <first-name> <initial> "." rekurze <street-address> ::= <street-name> <house-num> <EOL> <psc-part> ::= <PSC> <town-name> <EOL> Tvorba spustitelného programu 9

Rámcová činnost překladače (pokr.) Častěji se užívá EBNF (Extended BNF) obvyklá symbolika EBNF Mnohdy různé dialekty EBNF Příklad užití EBNF Užití Notace Užití Notace definice = opakování {... } zřetězení, grupování (... ) zakončení. terminální řetězec... alternativa terminální řetězec... volitelné [... ] komentář (*... *) digit_excluding_zero = "1" "2" "3" "4" "5" "6" "7" "8" "9". digit = "0" digit_excluding_zero. twelve = "1","2". three_hundred_twelve = "3",twelve. natural_number = digit_excluding_zero,{digit}. integer = "0" ["-"], natural_number. arit_operator = "+" "-" "*" "/". simple_int_expr = integer,arit_operator,integer. EBNF pro jazyk C lze nalézt na http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf EBNF pro jazyk Java http://cui.unige.ch/isi/bnf/java/ajava.html Tvorba spustitelného programu 10

Optimalizace během překladu Co může překladač optimalizovat Elementární optimalizace předpočítání konstant n = 1024 * 64 během překladu se vytvoří konstanta 65536 znovupoužití vypočtených hodnot if(x**2 + y**2 <= 1) a = x**2 + y**2 else a=0; detekce a vyloučení nepoužitého kódu if((a>=0) && (a<0)) { never used code; }; obvykle se generuje upozornění (warning) Sémantické optimalizace značně komplikované optimalizace cyklů lepší využití principu lokality (viz téma 8) minimalizace skoků v programu lepší využití instrukční cache... Celkově mohou být optimalizace velmi náročné během překladu, avšak za běhu programu mimořádně účinné (např. automatická paralelizace) Tvorba spustitelného programu 11

Generátor kódu Generátor kódu vytváří vlastní sémantiku "mezikódu" Obecně: Syntaktický a sémantický analyzátor buduje strukturu programu ze zdrojového kódu, zatímco generátor kódu využívá tuto strukturální informaci (např. datové typy) k tvorbě výstupního kódu. Generátor kódu mnohdy dále optimalizuje, zejména při znalosti cílové platformy např.: Má-li cílový procesor více střádačů (datových registrů), dále nepoužívané mezivýsledky se uchovávají v nich a neukládají se do paměti. Podle typu překladu generuje různé výstupy assembler (jazyk symbolických adres) absolutní strojový kód pro jednoduché systémy (firmware vestavných systémů) přemístitelný (object) modul speciální kód pro pozdější interpretaci virtuálním strojem např. Java byte-kód pro JVM V interpretačních systémech je generátor kódu nahrazen vlastním interpretem ukážeme několik principů používaných interprety (a někdy i generátory cílového kódu) Tvorba spustitelného programu 12

Výrazy v postfixovém zápisu Postfixová notace (též reverzní polská notace, RPN) 1920 představeno polským matematikem Łukasiewiczem operátor následuje své operandy, přičemž je odstraněna nutnost používat závorky (priorita operátorů se vyjadřuje samotným zápisem výrazu) např. infixové 3-4+5=(3-4)+5 v je RPN 3 4-5 + zatímco 3-(4+5) bude v RPN 3 4 5 + - Výpočet RPN výrazů zásobníkovým automatem: Stromová reprezentace výrazu 3- (4+5) - 3 + 4 5 Tvorba spustitelného programu 13

Výrazy v postfixovém zápisu (pokr.) Výpočet - příklad 8+((5+2)*7) 3 je v RPN 8 5 2 + 7 * + 3 Vstup Akce Zásobník 8 Ulož na zásobník 8 5 Ulož na zásobník 8, 5 2 Ulož na zásobník 8, 5, 2 + Dvě hodnoty z vrcholu zásobníku sečti a výsledek ulož zpět 8, 7 7 Ulož na zásobník 8, 7, 7 * Dvě hodnoty z vrcholu zásobníku násob a výsledek ulož zpět 8, 49 + Dvě hodnoty z vrcholu zásobníku sečti a výsledek ulož zpět 57 3 Ulož na zásobník 57, 3 - Dvě hodnoty z vrcholu zásobníku odečti a výsledek ulož zpět 54 Tvorba spustitelného programu 14

Přepis infixového zápisu do RPN Dijkstrův Shunting yard algoritmus Výstup doslovný překlad algoritmus seřaďovacího nádraží 3 - ( 4 + 5 ) Vstup 3 Výstup - ( 4 + 5 ) 3 Vstup Výstup ( 4 + 5 ) Vstup 3 Výstup Zásobník 4 + 5 ) 3 4 Vstup Výstup Zásobník + 5 ) Vstup 3 4 Výstup - Zásobník 5 ) Vstup Výstup 3 4 5 - ( Zásobník ) Vstup Výstup 3 4 5 - ( Zásobník 3 4 5 VstupVýstup - ( + Zásobník Vstup - ( + 3 4 5 + Zásobník - ( + ) 3 4 5 + - Zásobník - ( + Zásobník Výstup Vstup Výstup Vstup - Zásobník Zásobník Tvorba spustitelného programu 15

Algoritmus Shunting yard detailně Dokud jsou na vstupu tokeny: o Přečti token. o Pokud je token číslo či proměnná, předej ho na výstup. o Pokud je token funkce, ulož ho na zásobník. o Pokud je token levá závorka, ulož ji na zásobník. o Pokud je token pravá závorka: Dokud na vrcholu zásobníku nebude levá závorka, vybírej operátory ze zásobníku a zapisuj je do výstupní fronty. Vyjmi ze zásobníku levou závorku a zahoď ji. Pokud je zásobník prázdný a nepodařilo se najít levou závorku, jedná se o chybný neuzavřený výraz. Jestliže byly zpracovány všechny tokeny ze vstupu: o Dokud budou v zásobníku operátory: Jestliže operátor na vrcholu zásobníku je závorka, jedná se o chybný neuzavřený výraz. Vyjmi operátor ze zásobníku a vlož ho do výstupní fronty. Konec. Uvedený algoritmus je zkrácený. Je vynechána část týkající se funkcí s více argumenty v závorkách oddělenými čárkami, např. zápis fce(x, y). Neřeší se rovněž priorita a asociativita operátorů bez závorek (odčítání je asociativní zleva, umocňování je asociativní zprava) Úplný algoritmus viz např. http://montcs.bloomu.edu/~bobmon/information/rpn/infix2rpn.shtml česky na http://cs.wikipedia.org/wiki/shunting-yard_(algoritmus) Dostudujte sami, může se objevit u zkoušky! Tvorba spustitelného programu 16

Binární objektové moduly Objektové moduly (object modules) Vytvářeny jsou překladači jako binární forma přeloženého programového modulu. Jde o vnitřně strukturovanou kolekci (obvykle pojmenovaných) úseků strojového kódu a dalších informací nutných k následnému zpracování. Objektové moduly jsou vstupem pro sestavovací program (linker, někdy též linkage editor) Knihovna Obj 1 Obj 2 Nejčastěji Sestavovací program Občas Zřídka kdy Executable (.exe, ) Dynamická knihovna (.dll,.so) Knihovna (.lib,.a) Tvorba spustitelného programu 17

Binární objektový modul Každý objektový modul obsahuje sérii sekcí různých typů a vlastností Prakticky všechny formáty objektových modulů obsahují Sekce text obsahuje strojové instrukce a její vlastností je zpravidla EXEC ALLOC Sekce data slouží k alokaci paměťového prostoru pro inicializovaných proměnných, RW ALLOC Sekce BSS (Block Started by Symbol) popisuje místo v paměti, které netřeba alokovat ve spustitelném souboru, RW Mnohé formáty objektových modulů obsahují navíc Sekce rodata slouží k alokaci paměťového prostoru konstant, RO ALLOC Sekci symtab obsahující tabulku globálních symbolů ( ), kterou používá sestavovací program Sekci dynamic obsahující informace pro dynamické sestavení Sekci dynstr obsahující znakové řetězce (jména symbolů pro dynamické sestavení Sekci dynsym obsahující popisy globálních symbolů pro dynamické sestavení Sekci debug obsahující informace pro symbolický ladicí program Detaily viz např. http://www.freebsd.org/cgi/man.cgi?query=elf&sektion=5 Tvorba spustitelného programu 18

Formát binárního objektového modulu Různé operační systémy používají různé formáty jak objektových modulů tak i spustitelných souborů Existuje mnoho různých obecně užívaných konvencí.com,.exe, a.obj formát spustitelných souborů a objektových modulů v MSDOS Portable Executable (PE) formát spustitelných souborů, objektových modulů a dynamických knihoven (.dll) ve MS-Windows. Označení "portable" poukazuje na univerzalitu formátu pro různé HW platformy, na nichž Windows běží. COFF Common Object File Format formát spustitelných souborů, objektových modulů a dynamických knihoven v systémech na bázi UNIX V Jako první zavedl sekce s explicitní podporou segmentace a virtuální paměti a obsahuje také sekce pro symbolické ladění ELF - Executable and Linkable Format nejpoužívanější formát spustitelných souborů, objektových modulů a dynamických knihoven v moderních implementacích POSIX systémů (Linux, Solaris, FreeBSD, NetBSD, OpenBSD,...). Je též užíván např. i v PlayStation 2, PlayStation 3 a Symbian OS v9 mobilních telefonů. Velmi obecný formát s podporou mnoha platforem a způsobů práce s virtuální pamětí, včetně volitelné podpory ladění za běhu Tvorba spustitelného programu 19

Sekce Formát ELF Formát ELF je shodný pro objektové moduly i pro spustitelné soubory ELF Header obsahuje celkové popisné informace např. identifikace cílového stroje a OS typ souboru (obj vs. exec) počet a velikosti sekci odkaz na tabulku sekcí... Pro spustitelné soubory je podstatný seznam sekcí Pro sestavování musí být moduly popsány svými sekcemi Sekce jsou příslušných typů a obsahují strojový kód či data Tabulka sekcí popisuje jejich typ, alokační a přístupové informace a další údaje potřebné pro práci sestavovacího či zaváděcího programu Moduly ELF Header Program Table text rodata... data Section Table Tvorba spustitelného programu 20

Moduly a globální symboly V objektovém modulu jsou (aspoň z hlediska sestavování) potlačeny lokální symboly (např. lokální proměnné uvnitř funkcí jsou nahrazeny svými adresami, symbolický tvar má smysl jen pro případné ladění) globální symboly slouží pro vazby mezi moduly a jsou 2 typů daným modulem exportované symboly. Ty jsou v příslušném modulu plně definovány, je známo jejich jméno a je známa i sekce, v níž se symbol vyskytuje a relativní adresa symbolu vůči počátku sekce. daným modulem požadované externí (importované) symboly, o kterých je známo jen jejich jméno, případně typ sekce, v níž by se symbol měl nacházet (např. pro odlišení, zda symbol představuje jméno funkce či jméno proměnné) my_global_func; sekce text, rel. adresa 132 zero_init_variable; sekce data, rel. adresa 4 Šipky indikují směr viditelnosti symbolů Modul Tabulka exportovaných symbolů Tabulka importovaných symbolů Externí odkazy modulu při překladu neznámé umístění external_func; sekce text, adresa??? external_var; sekce (ro)data/bss?, adresa??? Tvorba spustitelného programu 21

Knihovny Knihovny jsou kolekce přemístitelných (objektových) modulů s vnitřní organizací Statické knihovny jsou určeny pro zpracování sestavovacím programem Jsou tvořeny záhlavím knihovny (katalogem) a sérií modulů Záhlaví obsahuje rejstřík globálních jmen (symbolů) exportovaných jednotlivými moduly a odkazy na ně. To umožňuje rychlé vyhledání potřebného modulu v knihovně zejména pro statické sestavování (static build) Dynamické (též sdílené) knihovny jsou složitější Jsou to formálně vlastně spustitelné programy, které zaregistrují v systémových strukturách globální symboly jednotlivých modulů, jimiž je knihovna tvořena, a pak opustí soutěž o procesor. V závislosti na způsobu volání rutin ve sdílené knihovně je mnohdy nutná podpora v jádře OS nebo aspoň ve správě virtuální paměti Tvorba spustitelného programu 22

Sestavovací program statické sestavení Sestavovací program zpracovává sadu objektových modulů a vytváří soubor se spustitelným programem Spustitelný soubor Při kopírování sekcí na výstup nutno přepočítat adresy v instrukcích a ukazatelích Při statickém sestavení nebudou ve spustitelném souboru žádné nevyřešené externí odkazy Sestavovací program připojí i inicializační kód Tvorba spustitelného programu 23

Sestavovací program dynamické sestavení Sestavovací program pracuje podobně jako při sestavování statickém, avšak na závěr mohou zůstat ve spustitelném souboru nevyřešené odkazy Na místě těchto odkazů připojí sestavovací program malé kousky kódu (zvané stub), které způsobí pozdější vyřešení odkazu Existují v zásadě dva přístupy: Vyřešení odkazů při zavádění programu do paměti Zavaděč (loader) zkontroluje, zda potřebné dynamické knihovny jsou v paměti (nejsou-li zavede je též), ve virtuální paměti je namapuje tak, aby je zaváděný proces viděl a stub zmodifikuje tak, že odkaz bude vyřešen Vyřešení odkazu skutečně za běhu Vyžaduje se podpora JOS, kdy stub nahrazující nevyřešený odkaz způsobí výjimku a v reakci na ni se provedou akce podobné jako při řešení během zavádění Výhodné z hlediska využití paměti, neboť se nezavádí knihovny, které nebudou potřeba. Tvorba spustitelného programu 24

Statické versus dynamické sestavení Jednoduchý příklad hello.c: #include <stdio.h> int main() { int n = 24; printf("%d \thello, world.\n", n); } hello.asm:.lc0:.file "hello.c".section.rodata.string "%d \thello, world.\n".text.p2align 4,,15 hello.o: file format elf32-i386-freebsd SYMBOL TABLE: 00000000 *ABS* 00000000 hello.c 00000000.text 00000000 00000000.data 00000000 00000000.bss 00000000 00000000.rodata 00000000 00000000.comment 00000000 00000000.text 00000034 main 00000000 *UND* 00000000 printf File Size hello.c 84 hello.asm 472 hello.o 824 hello-static 197970 hello 4846.globl main.type main: leal andl pushl pushl movl pushl subl movl movl movl movl call addl popl popl leal ret.size.ident main, @function 4(%esp), %ecx $-16, %esp -4(%ecx) %ebp %esp, %ebp %ecx $36, %esp $24, -8(%ebp) -8(%ebp), %eax %eax, 4(%esp) $.LC0, (%esp) printf $36, %esp %ecx %ebp -4(%ecx), %esp main,.-main "GCC: (GNU) 4.2.1 [FreeBSD]" Tvorba spustitelného programu 25

Zavaděč (loader) Zavaděč je součást JOS, která rozumí spustitelnému souboru V POSIX systémech je to vlastně obsluha služby exec Úkoly zavaděče vytvoření obrazu procesu (memory image) v odkládacím prostoru na disku a částečně i v hlavní paměti v závislosti na strategii virtualizace vytvoření příslušného deskriptoru procesu (PCB) případné vyřešení nedefinovaných odkazů sekce ze spustitelného souboru se stávají segmenty procesu pokud správa paměti nepodporuje segmentaci, pak stránkami segmenty jsou obvykle realizovány tak jako tak ve stránkované virtuální paměti segmenty získávají příslušná práva (RW, RO, EXEC,...) inicializace registrů procesu v PCB např. ukazatel zásobníku a čítač instrukcí předání řízení na vstupní adresu procesu Tvorba spustitelného programu 26

Poznámky k postupu vzniku procesu Zde popsaná problematika je velmi různorodá Popsali jsme jen klasický (byť soudobý) postup zdrojový kód proces Úplný výčet možností by vystačil na celý semestr K mechanizaci celého postupu slouží obvykle utilita make make má svůj vlastní popisný a (relativně jednoduchý) definiční jazyk zakládá se na časech poslední modifikace souborů ( ) např. pokud file.c není mladší než file.o, netřeba překládat file.c např. budování celého operačního systému lze popsat v jediném Makefile Moderní přístupy s virtuálními stroji používá princip JIC JIC = Just In time Compilation používá např. subsystém.net (nejen ve Windows) principem je, že překlad a sestavení probíhá při zavádění nebo dokonce za běhu Tvorba spustitelného programu 27

Poznámky k postupu vzniku procesu (pokr.) Zavádění (i sestavení) může urychlit použití tzv. PIC PIC = Position Independent Code Překladač generuje kód nezávislý na umístění v paměti např. skoky v kódu jsou vždy relativní vůči místu, odkud je skok veden kód je sice obvykle delší, avšak netřeba cokoliv modifikovat při sestavování či zavádění užívá se zejména pro dynamické knihovny Objektové programování vyžaduje další podporu jazykově pomocí závislých knihoven např. C++ nebo kompilovaná Java vyžadují podporu tvoby a správy objektů (a garbage collection) Mnoho optimalizačních postupů při překladu souvisí s architekturou cílového stroje von Neumannova a harwardská architektura mají rozdílné vlastnosti z pohledu optimálního strojového kódu pipe-lining instrukcí a strukturu cache lze lépe využít lépe optimalizovaným kódem A mnoho a mnoho dalších triků... Tvorba spustitelného programu 28

Dotazy Tvorba spustitelného programu 29