Téma 8 Od programu k procesu

Podobné dokumenty
Téma 8 Od programu k procesu

Téma 14 Od programu k procesu

Téma 14. Od algoritmu k procesu

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

11. Přehled prog. jazyků

Konstruktory překladačů

Překladač a jeho struktura

09. Memory management. ZOS 2006, L.Pešička

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Přednáška. Správa paměti I. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Operační systémy. Přednáška 7: Správa paměti I

B4B35OSY: Operační systémy

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Struktura programu v době běhu

TÉMATICKÝ OKRUH TZD, DIS a TIS

Operační systémy. Správa paměti (SP) Požadavky na SP. Spojování a zavedení programu. Spojování programu (linking) Zavádění programu (loading)

Matematika v programovacích

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Jazyk symbolických adres

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Operační systémy. Cvičení 3: Programování v C pod Unixem

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Vývoj programů. ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Úvod. Programovací paradigmata

Úvod do programovacích jazyků (Java)

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

ČÁST 1. Základy 32bitového programování ve Windows

Paměťový podsystém počítače

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

1 Úvod do kompilátorů

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Struktura a architektura počítačů (BI-SAP) 11

DTP Základy programování Úvod do předmětu

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Systém adresace paměti

Lexikální analýza Teorie programovacích jazyků

ISU Cvičení 2. Marta Čudová

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

MS WINDOWS II. Jádro. Správa objektů. Správa procesů. Zabezpečení. Správa paměti

C2115 Praktický úvod do superpočítání

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

Pár odpovědí jsem nenašla nikde, a tak jsem je logicky odvodila, a nebo jsem ponechala odpověď z pefky, proto je možné, že někde bude chyba.

3. Počítačové systémy

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Přidělování paměti II Mgr. Josef Horálek

Algoritmizace- úvod. Ing. Tomáš Otáhal

Maturitní otázky z předmětu PROGRAMOVÁNÍ

konec šedesátých let vyvinut ze systému Multics původní účel systém pro zpracování textů autoři: Ken Thompson a Denis Ritchie systém pojmnoval Brian

ÚVOD DO OPERAČNÍCH SYSTÉMŮ. Vývoj SW aplikací. Unix, POSIX, WinAPI, programování komunikace s periferními zařízeními, ovladače zařízení

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Počítač jako prostředek řízení. Struktura a organizace počítače

Pohled do nitra mikroprocesoru Josef Horálek

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Téma 9 Od programu k procesu

Architektury počítačů a procesorů

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Opakování programování

Programovací jazyk Pascal

Úvod do jazyka C. Úvod do jazyka C. Knihy 2/2. Knihy 1/2. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze.

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Systém souborů (file system, FS)

Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem. Úvod do jazyka C. Jan Faigl

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

IB111 Programování a algoritmizace. Programovací jazyky

Procesy a vlákna (Processes and Threads)

ISU Cvičení 2. Marta Čudová

Real Time programování v LabView. Ing. Martin Bušek, Ph.D.

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

IUJCE 07/08 Přednáška č. 6

Operační systémy. Cvičení 4: Programování v C pod Unixem

Paměť počítače. alg2 1

přetížení operátorů (o)

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

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Semestrální práce z předmětu Teorie programovacích jazyků

Architektura a koncepce OS OS a HW (archos_hw) Architektura a koncepce OS Jádro OS (archos_kernel) Architektura a koncepce OS Typy OS (archos_typy)

Algoritmizace prostorových úloh

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

B4B35OSY: Operační systémy

Metody připojování periferií BI-MPP Přednáška 2

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

Transkript:

Téma 8 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 Od programu k procesu 1

Příprava a zpracování programů Při psaníprogramu je prvním krokem (pomineme-li analýzu zadání, volbu algoritmuatd.) 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ů Od programu k procesu 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 praktická nezávislost na cílovém stroji Nevýhody: nízkáefektivita běhu programu, neboť interpret stále analyzuje zdrojový text (např. v cyklu) Důležitý poznatek: binární strojový kód je vždy interpretován hardwarem Od programu k procesu 3

Od zdrojového textu k procesu examle.c int initialized_variable = 1000; int zero_init_variable; static int* pointer_to_int; Další object moduly Zdrojový kód int global_function(int argument) { int local_variable= 1; return argument + local_variable + initialized_variable + zero_init_variable; } Statické sestavení Sestavovací program (linker) Sestavování link time Překladač Překlad compile time example.o Systémové knihovny Sestavení během zavádění Zaveditelný program my_prog[.exe] Obsahuje virtuální (logické) adresy sekcí Zavádění load time Object modul example.o: ELF 32-bit LSB, relocatable, Intel 80386, not stripped 00000000 T global_function 00000000 D initialized_variable 00000000 b pointer_to_int 00000004 C zero_init_variable Dynamicky připojované knihovny Zavaděč (loader) Proces Logické adresy navázány na adresy fyzické Binární kód programu v paměti Doba běhu run time Od programu k procesu 4

Od zdrojového textu k procesu (jiný pohled) Od programu k procesu 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) č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 žádáme rychlost a efektivitu Od programu k procesu 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 Od programu k procesu 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 ] Od programu k procesu 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; bisonje zvíře vypadajícíjako yacc Programovací jazyky se formálněpopisujívhodnou deskripční metodou např. 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> rekurze <initial> "." <street-address> ::= <street-name> <house-num> <EOL> <psc-part> ::= <PSC> <town-name> <EOL> Od programu k procesu 9

Rámcová činnost překladače (pokr.) Častěji se užívá EBNF (Extended BNF) obvyklásymbolika EBNF Mnohdy různé dialekty EBNF Užití definice zřetězení zakončení alternativa volitelné Notace =,. [... ] Užití opakování grupování terminální řetězec terminální řetězec komentář Notace {... } (... )...... (*... *) Příklad užití EBNF 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 Od programu k procesu 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 o správě paměti) 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) Od programu k procesu 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) Od programu k procesu 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 Dokud jsou na vstupu znaky o přečti další znak o jestliže je znak hodnota ulož ji na zásobník o jinak znak představuje funkci (operátor) je známo, že funkce přebírá n parametrů vyber ze zásobníku n hodnot Stromová reprezentace výrazu 3-(4+5) jestliže je na zásobníku méně než n hodnot (Chyba) dostatečný počet parametrů vypočti hodnotu funkce výsledek ulož zpět na zásobník jestliže je na zásobníku jen jedna hodnota o je to výsledek výpočtu jinak o (Chyba) příliš mnoho hodnot Od programu k procesu 13-3 + 4 5

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 8 5 2 + 7 * + 3 - Akce Ulož na zásobník Ulož na zásobník Ulož na zásobník Dvě hodnoty z vrcholu zásobníku sečti a výsledek ulož zpět Ulož na zásobník Dvě hodnoty z vrcholu zásobníku násob a výsledek ulož zpět Dvě hodnoty z vrcholu zásobníku sečti a výsledek ulož zpět Ulož na zásobník Dvě hodnoty z vrcholu zásobníku odečti a výsledek ulož zpět Zásobník 8 8, 5 8, 5, 2 8, 7 8, 7, 7 8, 49 57 57, 3 54 Od programu k procesu 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 ) Vstup 3 Výstup ( 4 + 5 ) Vstup 3 Výstup Zásobník 4 + 5 ) 34 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 3 4 5 Výstup -( Zásobník 3 4 5 VstupVýstup -( + Zásobník Vstup -( + 345 + Výstup Zásobník Vstup -( + ) 345 + - Výstup Zásobník Vstup -( + Zásobník - Zásobník Zásobník Od programu k procesu 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 nebo česky na http://cs.wikipedia.org/wiki/shunting-yard_(algoritmus) Dostudujte sami, může se objevit u zkoušky! Od programu k procesu 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 Executable Sestavovací program Občas Dynamická knihovna Knihovna Zřídka kdy Od programu k procesu 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ř. Od programu k procesu 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 PortableExecutable(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 CommonObject FileFormat 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 Od programu k procesu 19

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í... ELF Header Program Table Pro spustitelnésoubory je podstatný seznam sekcí i modulů. data Pro sestavování musí být moduly popsány svými sekcemi. Section Table 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 text rodata... Sekce Od programu k procesu 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í symbolyslouží 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 external_func; sekce text, adresa??? external_var; sekce (ro)data/bss?, adresa??? Od programu k procesu 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 Od programu k procesu 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 Od programu k procesu 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. Od programu k procesu 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]" Od programu k procesu 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 Od programu k procesu 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 a rozbor možností by vystačil na celý semestr K mechanizaci celého postupu slouží obvykle utilita make makemá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 Od programu k procesu 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 tvorby 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ů... Od programu k procesu 28

Dotazy Od programu k procesu 29