Nadpis kapitoly Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem. Klíčové pojmy: Překladač, editor, compiler, linker.
Úvod Abychom mohly využívat našich napsaných programů, musíme je přeložit. Jazyky jsou proto aby byly blíže nám lidem a umožnili i napsat hodně abstraktní programové konstrukce. Také nám šetří spoustu času, to co by jsme psaly ve strojovém kódu, jde napsat ve vyšším jazyku ve zlomku tohoto času.
Překlad jazyka C Způsob zpracování programu v jazyce C Jazyk C je univerzální programovací jazyk nízké úrovně, má velmi úsporné vyjadřování, je strukturovaný, má velká soubor operátorů a moderní datové struktury. Základní zpracování programu v C probíhá několika fázemi schematicky vyjádřenými níže. .LIB
.H
.C
Debuger
Linker
Preprocesor Compiler
Editor
.OBJ .LIS
.EXE spuštění
Fáze zpracování programu v jazyce C
•
Překladač, kompilátor (compiler) - je program, který vezme zdrojový text programu a přeloží jej do jazyka stroje, což jsou obvykle kódy instrukcí pro daný procesor. Výsledkem tohoto překladu obvykle není spustitelný program, protože v místech kde se volají podprogramů z jiných modulů a knihoven nejsou konkrétní adresy těchto podprogramů, ale pouze značky, které se zpracují později při linkování.
Aktuální datum
Název kapitoly
Stránka/počet stránek
•
•
•
Souborům, které produkuje překladač se říká objektové soubory (nemá to nic společného s objektově orientovaným programováním). Důležitou funkcí překladače je syntaktická kontrola. Sestavovací program, linker - slouží k sestavení samostatně přeložených modulů a knihoven do funkčního celku. Linker do kódu doplní konkrétní adresy podprogramů (statický překlad) nebo kód pro jejich zavolání (při použití dynamických knihoven). Pokud vytváříme spustitelný program (u knihoven to je trochu jinak), linker nakonec doplní do programu kód, který se používá při spuštění programu. Tato část, stejně jako formát použitých statických nebo dynamických knihoven se liší v závislosti na použitém operačním systému a hardwarové platformě. Pokud proto chceme vyrobit spustitelný program pro jinou platformu, musíme u jazyků typu C, C++ provést překlad na zvolené platformě znovu. Debugger - je program pro ladění a hledání chyb v programu. Aby mělo ladění s debuggerem smysl, je obvykle nutné říci překladači, aby do výsledného kódu přidal speciální značky, díky nimž si debugger bude umět spojit konkrétní část binárního kódu programu s konkrétními řádky zdrojového textu. Preprocesor - je speciální program používaný v jazycích C a C++ pro zpracovávání maker a symbolických konstant. Tento program v podstatě provádí pouze textové náhrady definovaných symbolů v textu a umožnuje podmíněný překlad. Příkazy pro preprocessor začínají vždy znakem mřížky (#), například #define nebo #ifndef. Příkazy preprocessoru byste měli používat co nejméně.
Další důležité výrazy S těmito výrazy se můžeme setkat při programování, nebo při samotném překladu. Překladač nám usnadňuje práci a zpětnou vazbou nás informuje o nalezených chybách. • Assembler - je program pro překlad jazyka symbolických instrukcí do binárního kódu. Někdy bývá nesprávně zaměňován se samotným jazykem symbolických instrukcí, což je vemi nízkoúrovňový jazyk, kde zdrojový kód tvoří posloupnost zkratek instrukcí procesoru. Při velmi speciálních příležitostech lze jazyk symbolických instrukcí kombinovat s kódem v jazyce C. Velmi speciální situace zahrnují přístup k nejnižsím úrovním hardwaru a brutální optimalizace. Při běžném programování se s tím nesetkáte (a ani by to většinou nebylo prospěšné). • Syntaktická chyba - je prohřešek proti gramatice programovacího jazyka. Počítač je matematický stroj a vyžaduje naprosto jednoznačný předpis své činnosti. Ve zdrojovém kódu nesmí být žádné syntaktické chyby, aby bylo jednoznačné, co má překladač dělat. Překladač neví, co chcete naprogramovat, proto se nemůže ani pokoušet o opravu vašich chyb, to musíte udělat sami. Mezi syntaktické chyby patří především překlepy, ale může to být také použití nekompatibilních datových typů nebo třeba chybné použití operátorů (např. nemůžete zkoušet násobit textové řetězce). • Sémantická chyba - je chyba v logice vašeho programu. Váš program může být syntakticky správný, překladač jej přeloží, linker slinkuje, ale program přesto může Aktuální datum
Název kapitoly
Stránka/počet stránek
•
•
fungovat chybně. Za tyto chyby je vždy zodpovědný programátor a je na něm, aby se jich zbavil. Tyto chyby překladač ani linker neodhalí. Pokud máte štěstí, může na ně překladač nepřímo upozornit pomocí varovných hlášení při překladu. Chybové hlášení - je zpráva, kterou vám překladač nebo linker sdělují, proč nelze z vašeho kódu vytvořit spustitelný program. Tato zpráva obvykle obsahuje jméno souboru a číslo řádku, kde se chyba nachází. Pozor! V jazyce C může někdy překladač odhalit chybu na jiném řádku, než je skutečná příčina. Pokud se vám označené číslo řádku nezdá, zkuste hledat chybu i několik řádků okolo. Abyste mohli co nejlépe lokalizovat své chyby, pište na každý řádek zdrojového textu maximálně jeden příkaz. Usnadníte si tím nejen lokalizaci chyb, ale i ladění. Chybové hlášení obsahuje také vysvětlení, co je podle překladače špatně. Varovné hlášení - je upozornění, kterým vám překladač nebo linker dávají najevo, že váš program sice možná jde přeložit, ale že obsahuje podezřelé konstrukce, které mohou naznačovat závažnější problém. Moudrý programátor věnuje varovným hlášením překladače náležitou pozornost. Vaší ambicí by měl být překlad bez varovných hlášení. Dobré porozumění chybovým hlášením vyžaduje znalost angličtiny a především dobrou znalost fungování počítače a logiky programovacího jazyka. Pokud zatím tyto znalosti nemáte, nezoufejte. Není tak těžké se to naučit. Čím více budete programovat, tím to pro vás bude snazší.
Struktura programu Příklad struktury programu C /* * struktura programu * Autor PEPE * verze v.1.0 */ #include <stdio.h> #define PI 3.141593
/* vložení hlavičkového souboru*/ /* direktiva */
float polomer = 1.8; int printf(char*, …);
/* definice proměnné */ /* deklarace funkce */
/* soukromé informace o programu
main() /* začátek definice fce main*/ { float obvod, obsah; /* definice proměnné */ . . . obsah = PI * polomer * polomer; /* příkazy */ . . . obvod = 2 * PI * polomer; printf(“Obsah = %f\nObvod = %f\n”, obsah, obvod);
Aktuální datum
Název kapitoly
Stránka/počet stránek
}
/* konec fce main */
Aby byl program lépe čitelný je potřeba dodržovat „Štábní kulturu“. Doporučené postupy jsou například tyto: • Jméno zdrojového programu by mělo být jednoznačné • Program začíná hlavičkou s informacemi o programu, autorovi, verzi • Jména proměnných, funkcí psát malými písmeny • Snažit se nepsat dlouhé identifikátory (do 8 znaků) • Nepoužívat podobné identifikátory • Nepožívat k rozlišení velkých a malých písmen • Psát časté komentáře • Neprogramovat dlouhé sekvence příkazů „nudle“[1] Překladač GCC GCC znamená GNU Compiler Collection. Jak název napovídá, jde o kolekci programů určených pro překlad programů napsaných v různých jazycích. V současné verzi (4.5.0) je podporováno několik programovacích jazyků (C, C++, Objective C, assembler, Ada, Java, Fortran77). Primárně je však tento překladač určen pro překlad jazyků C, C++ a Assembleru. Tento překladač funguje v současné době na většině hlavních platforem (Unix, Windows, MacOS; Intel, PPC, Sparc, různé jednočipy, a jiné). Nejdůležitějšími programy jsou překladač, preprocesor, assembler a sestavovací program (linker). Člověk však naštěstí nemusí znát konkrétní jména těchto programů. Stačí volat pouze překladač (gcc pro jazyk C, g++ pro jazyk C++) a ten potom podle použitých parametrů zavolá ty správné programy ve správném pořadí.[3]
Překlad jazyka Java Způsob zpracování jazyka Java Java se zpracovává podobně jako v případě jazyka C. A to pěti fázemi – editováním, překladem(kompilací), zavedením(load), ověřováním(verifikací) a prováděním. Další rozdíl je v překladu. Překlad neprobíhá do přímo spustitelného souboru, ale do pseudojazyka nazývaného bye-code. Tento jazyk je nezávislý na cílovém počítači. Spuštění probíhá pomocí interpreteru, tudíž je jazyk interpretovaný.[2] JRE – běhové prostředí JDK – vývojové prostředí
Aktuální datum
Název kapitoly
Stránka/počet stránek
Takto vypadá první příklad programu v Javě: public class Hello { public static void main(String args[]) { System.out.println("Hello SSITSP Sokolska"); } }
Zdrojový soubor lze napsat v libovolném textovém editoru a uložit pod jménem třídy, uvedeným v řádku class, s příponou .java , v tomto případě Hello.java. Po napsání a uložení programu se zdrojový program přeloží příkazem javac
jménosouboru.java
, tedy zde javac Hello.java.
Překladem se vytvořil soubor stejného jména s příponou .class tedy zde Hello.class , který již obsahuje přeložený bytecode programu a lze ho spouštět z příkazového řádku: Java jmeno souboru (bez přípony), tedy java Hello
Výstupem programu je obligátní pozdrav Hello SSITSP Sokolska.
Shrnutí: Programování je složitý proces. Správný programátor by měl mít alespoň základní informace i dějích při překladu programu. Také je potřeba psát programy tak, aby byly čitelné a to jak pro programátora co programoval, tak i pro jiné programátory.
Literatura: [1] Herout Pavel; Učebnice jazyka C; str.269; Kopp 2001 [2] Herout Pavel; Učebnice jazyka Java; str. 381; Kopp 2008 [3] wikipedia.org; http://cs.wikipedia.org/wiki/Gcc; 6.11.2010
Aktuální datum
Název kapitoly
Stránka/počet stránek