Fordítóprogramok szerkezete avagy Mi történik Pascalban mikor F9-et nyomunk?



Hasonló dokumentumok
Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

4. Programozási nyelvek osztályozása. Amatőr és professzionális

15. Programok fordítása és végrehajtása

Fordítóprogramok felépítése, az egyes programok feladata. A következő jelölésmódot használjuk: program(bemenet)(kimenet)

A NYELV NEVE. Kezdetben: Oak. James Gosling. Java: Sun Mycrosystems védjegyev

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Történeti áttekintés

OBJEKTUMORIENTÁLT TERVEZÉS ESETTANULMÁNYOK. 2.1 A feladat

2.3. A C nyelv utasításai

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

II. év. Adatbázisok és számítógépek programozása

Számítógépes grafika

1.1 Szakdolgozat témája A Program célja A használt technológiák ismertetése A program megtervezése...

117. AA Megoldó Alfréd AA 117.

INFORMATIKAI ALAPISMERETEK

Széchenyi István Szakképző Iskola

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Computer Setup. Felhasználói útmutató

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Javaslat AZ EURÓPAI PARLAMENT ÉS A TANÁCS RENDELETE

C# gyorstalpaló. Készítette: Major Péter

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Tipp A Word makrók kimerítõ tárgyalását megtalálhatjuk az O Reilly gondozásában megjelent Writing Word Macros címû könyvben.

Szkriptnyelvek. 1. UNIX shell

Operációs rendszerek. 3. előadás Ütemezés

(11) Lajstromszám: E (13) T2 EURÓPAI SZABADALOM SZÖVEGÉNEK FORDÍTÁSA

C programnyelv 1. Kedves Kollegina, Kolléga!

Objektumorientált programozás C# nyelven

Szakmai program 2015

C# feladatok gyűjteménye

INFORMATIKAI ALAPISMERETEK

Máté: Assembly programozás

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

INFORMATIKAI ALAPISMERETEK

Máté: Számítógép architektúrák

Ködös határ (Félreértés, hiba)

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

JAVA PROGRAMOZÁS 3.ELŐADÁS

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Objektum Orientált Szoftverfejlesztés (jegyzet)

Kriptográfiai algoritmus implementációk időalapú támadása Endrődi Csilla, Csorba Kristóf BME MIT

C# osztályok. Krizsán Zoltán

S z á m í t ó g é p e s a l a p i s m e r e t e k

Mérési útmutató. A/D konverteres mérés. // Első lépésként tanulmányozzuk a digitális jelfeldolgozás előnyeit és határait.

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Általános információk

2.3. A rendez pályaudvarok és rendez állomások vonat-összeállítási tervének kidolgozása A vonatközlekedési terv modellje

BASH script programozás II. Vezérlési szerkezetek

VBA. Visual Basic for Applications

1. ábra Légijárm-típus ablak

A PC vagyis a személyi számítógép. XV. rész. 1. ábra. A billentyűzet és funkcionális csoportjai


ábra 1 LabelPOINT 250 elektromos feliratozógép Címkekimeneti nyílás Vágóél LCD kijelző Bekapcsológomb

12. tétel. Lemezkezelés

VB C++ C# JScript J# Common Language Specification. ADO.NET and XML. Base Class Library. Common Language Runtime. Operating System

C programozás. 1 óra Bevezetés

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

Fájl rendszer. Fájl koncepció Elérési módok Könyvtár szerkezet Védelem Konzisztencia szemantika

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

A rendszer általános áttekintése

Adatszerkezetek és algoritmusok Geda, Gábor

2. Digitális hálózatok...60

A word első megnyitása

Érdekes informatika feladatok

Bevezetés a C++ programozásba

A közigazgatási ügyintézés társadalmi megítélése a magyarországi vállalkozások körében

PROGRAMOZÁS ALAPJAI (ANSI C NYELVEN)

Eötvös Loránd Tudományegyetem Tanító- és Óvóképző Kar. Útmutató a szakdolgozat szerkesztéséhez

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Programozás alapjai. 5. előadás

Komputeralgebra Rendszerek

Pénzkezelési szabályzat szerkesztő

VISUAL BASIC ALAPISMERETEK

3. Gyakorlat Ismerkedés a Java nyelvvel

Borkereskedő. Dokumentáció a Programozási módszertan elmélete című tárgy beadandó programjához. Magyar Attila mattila@inf.elte.hu

Mesterséges intelligencia 1 előadások

USB HID 1. Bevezetés. 2. A Hardver

MPLAB leírás V1.1. Projektek kezelése. MPLAB leírás - dr. Kónya László 1

Sintony SAK 41. Kezelési utasíitás 8AA D0-20/10/99 - UK -

Máté: Számítógép architektúrák

Legénytoll a láthatáron II.

Matematikai alapok. Dr. Iványi Péter

Programozás alapjai Bevezetés

Mielıtt használná termékünket Az eltérı környezeti körülmény elektromos áramütést, tüzet, hibás mőködést vagy. okozhat.

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

4. Gyakorlat: Csoportházirend beállítások

A számítógép bemutatása

Régi, statikus adatok élővé tétele és vizsgálata

Széchenyi István Egyetem

INFORMATIKAI ALAPISMERETEK

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Hálózati protokoll tervezése

KETTŐS KÖNYVELÉS PROGRAM CIVIL SZERVEZETEK RÉSZÉRE

A (hír)név terrorja (Politikaelmélet és individuumszemlélet Bethlen Miklós Elöljáró beszédében)

ERDÉSZETI LAPOK AZ ORSZÁGOS ERDÉSZETI EGYESÜLET KÖZLÖNYE ERDŐ- ÉS FÖLDBIRTOKOSOK, ERDÉSZETI ÜGYEKKEL FOGLALKOZÓK ÉS ERDŐTISZTEK SZÁMÁRA.

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Kombinatorika

DUNAÚJVÁROSI FŐISKOLA

Átírás:

volnék én, a nemes, a tündökl, az értékek értéke, akkor hamarosan egy sárgöröngyöt választanátok s amiatt zsigerelnétek egymást. Akarva, nem-akarva érettem hajszolódtok, amíg éltek, st újabban a modern halottak még a sírba is elvisznek magukkal és miután a férgek leharabdálták ajkaikat, aranyfogaikkal vigyorognak az enyészetre. Csak az vethet meg, aki a becsvágyat megveti. Engem keresve találtátok meg az utat az igaz tudomány és élet felé. Nem is aljas fulajtárjaimra vagyok büszke, hanem erre. Meg arra, hogy egy költt, aki maga a tökéletesség, az ami én a nemesfémek között, rólam neveztek el. Ezüst Én az arany szegény testvére, fáradt Lelkembl a múlt halvány fénye árad. Olyan vagyok, mint az ég kési sszel, Mint könny a csipkén, a holdfény s az sz fej. Emlékezem csupán, de már nem élek. Ezért zenélek. Platina Igénytelen külsmmel többnyire vegykonyhák poros asztalán húzódom meg, olvaszthatatlan, t)zálló tégely alakjában. A legnagyobb szerelem hfokát is állom. Mikor újabban a poklot a mai kor igényeihez képest átalakították, lemezeimmel vonták be padlóját, mennyezetét, falait. Dante még nem tudta, de elárulhatom, hogy azok az amerikai bankárok, akik a hamisbukás következményei ell repülgépen menekülnek, platinakamrákban fognak égni örökkön-örökké. Gyémánt Adamas! A legyzhetetlen, a legkeményebb! Mindenkit megkarcolok. Ki karcol meg engem? Spinoza valaha Amszterdamban próbált köszörülni, kicsiszolni, de nem birt velem. Én köszörültem, csiszoltam ki t. Tlem tanulta gyémántlogikáját. Királyi koronákban villogok. Dollár-milliomosnk aszott keblén, hervatag fülcimpáiban, de mindig közönyösen, függetlenül tlük, rájuk se hederítve. Másnap, hogyha elárverezik ékszerüket, éppúgy szikrázom egy ügynök sötét páncélszekrényében, hol nincs is közönségem. Az embereket túlélem. Századokon át folyton gazdát cserélek. Természetem a h)tlenség. Csak egyhez vagyok h). A szegény üvegestóthoz. Annak kopott brtáskájában mindig találok egy darab gyémántkt, mert ez az ablakvágó szerszámához szükséges. Hitvány gyémántrögöcske ez, igaz. De örökre nála marad. Fordítóprogramok szerkezete avagy Mi történik Pascalban mikor F9-et nyomunk? 2003-2004/6 229

A magas szint) programozási nyelvek megjelenése maga után vonta a fordítóprogramok elméletének kialakulását. A számítógépek csak a gépi kódot fogadják el alapnyelvként. A gépi kód a processzor bels utasításkészlete, vagyis egyesek és nullák sorozata. A magas szint) nyelvekben való programozás szükségszer)vé teszi egy olyan program használatát, amely áthidalja az illet nyelv és a gépi kód közötti különbséget, vagyis az illet nyelv utasításait (forráskód, forrásprogram) gépi kódú utasításokra vagy valamilyen értelmezhet formára (tárgykód) fordítja. Ezt a fordítást háromféleképpen végezhetjük el. Az els módszer az, hogy a tervezett nyelvben megírt programot lefordítjuk a számítógép gépi kódjára. A fordítást megvalósító program a fordítóprogram (compiler). Például Pascal, C nyelvek esetében. A második módszer az, hogy készítünk egy olyan egységet, virtuális gépet, amely a tervezett nyelvet értelmezi. Ezt a módszert értelmezésnek, a megvalósítóját pedig értelmeznek (interpreter) nevezzük. Például FoxPro, BASIC nyelvek esetében. Az értelmezt hardver útján is meg lehet valósítani, ekkor formulavezérlés számítógépekrl beszélünk. Például készítettek olyan hardvert, amely a Java nyelv köztes kódját tudja értelmezni. A harmadik módszer az, hogy a tervezett nyelvben megírt programot egy hasonló elvek szerint m)köd, már megírt, magas vagy alacsony szint) nyelvre fordítjuk és a késbbi m)veleteket ezen nyelv fordítóprogramjára vagy értelmezjére bízzuk. Egy ilyen fordítóprogramot átalakítónak (translator) nevezünk. Például a Java nyelv. Elméleti szempontból az els és a harmadik módszer között nincs lényeges különbség, ezért a két módszert együtt vizsgáljuk. A fordítóprogramok m)ködése elméleti szempontból két különálló egységre bontható: az analízisre és a szintézisre. Az analízis fázisban a forrásszöveg kerül elemzasztalra, és három elemzési szempont (lexikális, szintaktikai és szemantikai elemzés) szerint vizsgáljuk a program helyességét. A szintézis fázisban a fordítóprogram kódot generál és optimalizál. Ha fordítóprogramról vagy átalakítóról beszélünk akkor a tárgykód a gépi kód vagy valamilyen köztes kód, ha értelmezrl beszélünk akkor a generált kód azonnal végre is hajtódik. A különféle programozási nyelveknek tehát semmi értelmük nem lenne fordítóprogramok nélkül. A fordítóprogramok m)ködése tehát így ábrázolható: Azt az idintervallumot, ami alatt a fordítás történt fordítási idnek, azt az idintervallumot, ami alatt a generált tárgykódot futtatjuk, futási idnek nevezzük. Fordítás esetén a fordítási id és a futási id teljesen elkülönített, diszjunkt idintervallumok. Értelmezés esetén a megfelel elemzések után a beolvasott, helyes szimbólumokat azonnal kiértékeljük. A fordítási id tehát egybeesik a futási idvel. 230 2003-2004/6

Parancssoros fordítók, a környezet fogalma A fordítóprogramok kezdetben parancssorosak voltak, ez azt jelentette, hogy egyszer) utasításként meghívtuk ket az adott számítógép operációs rendszerének parancsértelmezjében, megadtuk paraméterként a kívánt forráskódot tartalmazó állományt, esetleg kapcsolódirektívák segítségével különféle opciókat állíthattunk be, majd eredményként megkaptuk a tárgykódot, ha a forráskód helyes volt. Ha ez helytelen volt, akkor a fordítóprogram hibaüzenettel tért vissza, megjelölve a hiba elfordulási helyét is. A forráskódot tartalmazó állományt valamilyen szövegszerkesztben kellett elkészítenünk, hasonlóan, valamilyen szövegszerkeszt segítségével kellett kijavítani a hibákat is. A hibajavítás után megint meghívtuk a parancssoros fordítóprogramot mindaddig, míg meg nem kaptuk a tárgykódot. Gyakran megesett az is, hogy az egyes modulokat külön, önállóan kellett lefordítani, és ezután a lefordított köztes kódokat össze kellett szerkeszteni egy linker segítségével. A teljes fordításhoz pedig hogy helyzetünket megkönnyítse egy fordító szkriptet kellet írni. A következ példa a Turbo Pascal parancssoros fordítóját mutatja be (tpc.exe). Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International Syntax: TPC [options] filename [options] -B = Build all units -L = Link buffer on disk -D<syms> = Define conditionals -M = Make modified units -E<path> = EXE/TPU directories -O<path> = Object directories -F<seg>:<ofs> = Find error -Q = Quiet compile -GD = Detailed map file -T<path> = TPL/CFG directory -GP = Map file with publics -U<path> = Unit directories -GS = Map file with segments -V = Debug information in EXE -I<path> = Include directories -$<dir> = Compiler directive Compiler switches: -$<letter><state> (defaults are shown below) A+ Word alignment I+ I/O error checking R- Range checking B- Full boolean eval L+ Local debug symbols S+ Stack checking D+ Debug information N- 80x87 instructions T- Typed pointers E+ 80x87 emulation O- Overlays allowed V+ Strict var-strings F- Force FAR calls P- Open string params X+ Extended syntax G- 80286 instructions Q- Overflow checking Memory sizes: -$M<stack>,<heapmin>,<heapmax> (default: 16384,0,655360) A fordítás pedig így történt: C:\Apps\BP\BIN>tpc program.pas Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International PROGRAM.PAS(2) 2 lines, 1472 bytes code, 668 bytes data. C:\Apps\BP\BIN> Hasonlóan m)ködik az Assembly nyelv fordítója is, itt azonban a szerkesztést külön lépésben kell elvégezni: a tasm.exe fordító segítségével az ASM állományt egy köztes kódra, OBJ állományra tudjuk lefordítani, majd egy vagy több OBJ állományt a tlink.exe szerkeszt segítségével tudunk összeszerkeszteni, futtatható COM vagy EXE állománnyá alakítani. Nagyobb projekt esetében, ha több modullal dolgozunk, a fordításra egy külön BAT állományt is kell írnunk, amely megkönnyíti a hívásokat. Napjaink tendenciája, hogy a fordítóprogramokat környezettel lássuk el, mely integrálja a különböz elemeket. Legfontosabb kritérium, hogy a környezet egy szövegszerkesztvel rendelkezzen, amelyben meg tudjuk írni a forráskódot, közvetlenül lehessen hívni a fordítóprogramot vagy a szerkesztt, a környezet tartalmazzon egy jól megírt kontextusfügg súgórendszert is (help), amely a nyelvleírást és az egyes modulok, eljárások, függvények stb. bemutatását tartalmazza lehetleg sok példaprogrammal. 2003-2004/6 231

Gondoljunk csak a Turbo Pascal 6.0 környezetére, mennyire kényelmesebb benne dolgozni, mint parancssoros fordítás esetén. Ezeket a környezeteket IDE-nek (Integrated Development Environment), beágyazott fejlesztési környezeteknek nevezzük. Egy modern fordítóprogram környezete a következ elemeket tartalmazza: Szövegszerkeszt Fordítórendszer Szerkesztrendszer (linker) Futtatórendszer Súgó Kódkiegészítk, sablonok Varázslók, kódgenerátorok Tervezfelület (vizuális tervezés elsegítése: folyamatábrák, UML tervezési lehetségek stb.) Projekt kezelése, egyszerre több forráskód-állomány szerkesztése Debugger, nyomkövet (töréspontok definiálása, részletes futtatás, változók értékeinek nyomon követése, kifejezések kiértékelése stb.) Szimbólumkövet Verem, regiszterek tartalmának kijelzése, gépi kód Adatbázis-tervez (relációk megadása) Csoport- és nemzetközi programozás támogatása Automatikus dokumentációkészít Tennivalók listája (ToDo) Más környezeti eszközök, beágyazott lehetségek (pl. ikon rajzolóprogramok stb.) Elemzések A fordítás els feladata a forrásszöveg beolvasása. Ez a leggyakoribb esetben valamilyen szövegszerkesztvel megírt fizikai állományként van jelen a háttértárolón, vagy környezet esetében a memóriában. A szépség és áttekinthetség kedvéért a forrásszöveg megjegyzéseket, szóközöket, sorbarendezéseket, behúzásokat tartalmaz. A forrásszöveg beolvasásakor a legfontosabb feladat, hogy a forrásszöveget egy egységes, a késbbi felhasználás céljára egyszer), egyértelm), szimbolikus alakra hozzuk. Az ömlesztett forrásszövegbl tehát fel kell ismerni a szimbolikus egységeket. A szimbolikus egységeket elválasztó karakterek határolják. Elválasztó karaktereknek nevezünk bizonyos fehér karaktereket (pl. TAB, Space, Enter) és bizonyos speciális szimbólumokat vagy szimbólum párokat (pl. (, ), :=, <, >, stb.). A szimbolikus egységeket lexikális atomoknak nevezzük, és ezek felismerése, elkülönítése a lexikális elemz feladata. A lexikális atomok általában a következ részekbl állnak: a szimbólum azonosítója, a szimbólum típusa, elfordulási helye a forrásszövegben a késbbi beazonosítás céljából. A lexikális atomokat egy rendezett táblázatba (szimbólumtábla vagy lexikális atomtáblázat) írjuk. A szimbólumok típusa általában a következ: fehér karakter kulcsszó azonosító m)velet 232 2003-2004/6

speciális szimbólum elválasztó kulcsszó string konstans egész konstans valós konstans megjegyzés Példa: Tekintsük a következ Pascal programrészt: begin x := 10; end. A programrész beolvasása után a következ lexikális atomtáblázat generálódik: azonosító típus sor karakter begin <kulcsszó> 1 1 x <azonosító> 2 3 := <mlvelet> 2 5 10 <szám> 2 8 ; <elválasztó> 2 10 end <kulcsszó> 3 1. <elválasztó> 3 4 A lexikális atomokat a lexikális elemz ismeri fel. Ha a forrásszövegbe egy felismerhetetlen lexikális atom kerül, akkor a lexikális elemz hibajelzést generál. A lexikális elemz karaktereken operál és a karakterekbl szimbólumsorozatokat állít el. Feladata megmondani, hogy az elállított szimbólum eleme-e a nyelvnek vagy sem. Például ha a # jelt nem tartalmazza a nyelv ábécéje, karakterkészlete, és ez elfordul egy program forráskódjában, a lexikális elemz hibajelzést ad. A szintaktikai elemz dönti el, hogy a lexikális elemz által elállított szimbólumsorozat megfelel-e a nyelv leírásának. Ellenkez esetben szintaktikai hibajelzést generál. A hagyományos szintaktikai elemzk meg kell, hogy határozzák a programhoz tartozó szintaxisfát, ismerve a szintaxisfa gyökérelemét és a leveleit, el kell, hogy állítsák a szintaxisfa többi elemét és éleit, vagyis meg kell, hogy határozzák a program egy levezetését. Ha ez sikerült, akkor azt mondjuk, hogy a program eleme a nyelvnek, vagyis szintaktikusan helyes. A szintaxisfa bels részeinek a felépítésére több módszer létezik. Az egyik az, mikor a grammatika kezdszimbólumból kiindulva építjük fel a szintaxisfát. Ezt felülrl-lefelé történ elemzésnek nevezzük. Hasonlóan, ha a szintaxisfa felépítése a levelektl halad a gyökér felé, akkor ezt alulról-felfelé elemzésnek nevezzük. A szintaktikus elemzések elmélete van a legtökéletesebben kidolgozva, a formális nyelvek elméletének köszönheten. Számos módszerrel lehet szintaktikai elemzést végezni (teljes visszalépéses elemzés, korlátozott visszalépéses elemzés, LL(k), LR(k) elemzések, rekurzív leszállásos elemzés stb.). A szintaktikai elemz tehát szimbólumsorozatokon operál és azt mondja meg, hogy a szimbólumok milyen sorrendje eredményez helyes programot. Például nem mindegy, hogy a lexikálisan helyes if then else szimbólumokat milyen sorrendben írjuk. Sem a then else if, sem az else if, then sorrend nem helyes. A programozási nyelv szemantikája határozza meg a szimbólumsorozat értelmét. A szemantikai elemz a forrásszöveg értelmét, az adattípusok, m)veletek kompatibilitását ellenrzi. A szemantikai elemz dönti el, hogy a szintaktikailag helyes program a 2003-2004/6 233

fordítás szempontjából is valóban helyesnek tekinthet-e. Ellenkez esetben szemantikai hibajelzést generál. A szemantika olyan megkötéseket tartalmaz, mint például a típusazonosság egy értékadó utasítás két oldalán, a szimbólumok érvényességi tartományának a megadása, vagy az, hogy egy eljárás definíciójában és hívásában a formális és aktuális paraméterek darabszáma és típusa meg kell, hogy egyezzen. Ezeket a tulajdonságokat statikus szemantikának hívjuk. A hagyományos értelemben vett szemantikát a statikus szemantikától való megkülönböztetésre dinamikus vagy runtime szemantikának szokták nevezni. Dinamikus például az a := 1 értékadó utasítás szemantikája, az, hogy az a-nak megfelel állapotkomponens értéke 1-re változik. Pascalban a konstruktorok például értelemszer)en nem lehetnek virtuálisak, így egy constructor Init; virtual; programrész szemantikai hibajelzést eredményez. Kódgenerálás A fordítóprogramok a szintézis els lépésében a már elemzett, helyes forrásprogramból futtatható bináris kódot generálnak. A tárgykód gép és operációs rendszer függ, lényege az, hogy a programozási nyelv minden egyes utasítására, vezérlési struktúrájára külön meg kell adni, milyen kódot generáljon a fordítóprogram, és azt, hogy közben milyen elre megírt eljárásokat, függvényeket kell meghívjon (pl. kifejezés kiértékel). Kódgenerálással és az elemzési algoritmusok kifejtésével itt nem foglalkozunk, ez a téma teljesen más hatáskörbe tartozik. Kódoptimalizálással is abból a meggondolásból foglalkozunk részletesebben, hogy a megismert optimalizálási módszereket már programírásnál fel tudjuk használni, így már a forráskód optimális, szebb, áttekinthetbb lesz. Kód optimalizálás A fordítóprogram a generált tárgykódot optimalizálja. Az optimalizálás történhet tárhely vagy idbonyolultság szerint. Ennek érdekében a kódoptimalizálás a tárgykódban lév azonos utasítás sorozatok felfedezésére és eljárásokban való elhelyezésükre, ciklusok független részeinek összevonására, egymást kiegészít utasítások redukálására, optimális regiszterhasználatra szorítkozik. Lényege, hogy az optimalizált tárgykód gyorsabban fusson le, vagy kevesebb helyet foglaljon. Célja, hogy a tárgykód minsége javuljon. Az optimalizálással szemben támasztott legfontosabb követelmény a megbízhatóság, vagyis az optimalizált tárgykód ugyanazt kell mindig eredményezze, mint az eredeti tárgykód. Az optimalizálás nem jelenti az optimális program meghatározását. Ha például egy programág sohasem fut le, azt optimálisan jobb lenne teljesen kitörölni, de ilyen döntéseket a kódoptimalizáló nem hozhat. Az optimalizálás lehet gépfügg vagy gépfüggetlen. A gépfügg optimalizálás a speciális regiszterhasználatot, az adott architektúrára jellemz alapm)veletetek minél jobban történ kihasználását jelenti. Az optimalizálás lehet globális vagy lokális optimalizálás. A globális optimalizálás program-transzformációkkal jár: utasítások kiemelése ciklusból, konstansösszevonás, utasítások kiemelése elágazásból, elágazások összevonása, ciklusok összevonása, azonos részkifejezések egyszeri kiszámítása, kifejezések algebrai egyszer)sítése stb. A lokális optimalizálás lokális gyorsításokkal jár: felesleges utasítások kihagyása, konstanskifejezések kiértékelése, eljárás behelyettesítése, ciklus kifejtése, késleltetett tárolás, hatékony nyelvi elemek használata, felesleges m)veletek elhagyása stb. 234 2003-2004/6

Logikai értékadásra optimálisabb a következ alakot használni: egyenlo := (a = b); soha ne írjuk azt, hogy: if (a = b) then egyenlo := true else egyenlo := false; vagy azt, hogy: if (a = b) = true then egyenlo := true else egyenlo := false; A kódoptimalizáló összevonja a konstansokat, így az a := b + 1 + c + 3 + 4; utasításból a := b + c + 8; lesz. A fordítóprogram, kódoptimalizálás során a konstansokat továbbterjeszti, így az: a := 8; b := a / 2; c := b + 3; program részletbl a: a := 8; b := 4; c := 7; programrészlet lesz. A fordítóprogram optimalizálja a ciklusokat. Az optimalizálás lényege, hogy egy ciklusmagban lev m)veleteket gyorsabban végrehajtható m)velettel vagy m)veletekkel helyettesítjük. Például a szorzást összeadásokkal és eltolásokkal helyettesítjük. Vegyük például a következ Pascal while ciklust: while i < n do begin i := i + d; a := i * j; end; Az els átalakítás után temporális változók bevezetésével a következ formára hozható: t1 := i * j; t2 := d * j; while i < n do begin i := i + d; t1 := t1 + t2; a := t1; end; Látható, hogy a t 1 veszi át az i szerepét. Ha a ciklusváltozónak t 1-t választjuk, akkor végfeltételének értéke n * j lesz: t1 := i * j; t2 := d * j; t3 := n * j; while t1 < t3 do begin i := i + d; t1 := t1 + t2; a := t1; end; A ciklusmag els utasítására már nincs szükség. Ha az eredeti ciklusmag legalább egyszer végrehajtódik, akkor a t 1 helyett az a is használható, ezért a ciklusmagból a második utasítás, és ezennel a begin és end; is törölhet: a := i * j; t2 := d * j; t3 := n * j; while a < t3 do a := a + t2; 2003-2004/6 235

Cikluskifejtéssel is néha javíthatunk a kód minségén. Például a következ ciklus helyett: for i := 1 to 10 do if odd(i) then a[i] := 0; egyszer)en a[1] := 0; a[3] := 0; a[5] := 0; a[7] := 0; a[9] := 0; írható. Ez az öt értékadás sokkal gyorsabban végrehajtódik, mint a ciklus és az elágazás, de nem minden esetben meggondolandó, hogy mikor éri meg jobban használni. A hatékony nyelvi elemek kihasználása azt jelenti, hogy például Pascalban i := i + 5; helyett az inc(i, 5); eljárást használjuk, vagy halmazm)veletek esetében az include és exclude eljárásokat használjuk. Ha for ciklussal keresünk egy értéket például egy tömbben, akkor ha megkaptuk, break-kel befejezhetjük a ciklust, adatstruktúrák lenullázását a FillChar eljárással végezzük stb. Kovács Lehel A Föld mágneses térersségének mérése Már az ókorban ismeretes volt, hogy a Földnek egy meghatározott mágneses tere van, amelyet a földi tájékozódásban jól fel lehetett használni. Ez a tény fleg a nagy távolságú szárazföldi vagy tengeri utazásoknál jelentett biztos tájékozódást. Valószín)leg elsként a kínaiak, Európában pedig a görögök ismerték fel, hogy a Földnek mágneses tere van. Ez azt jelenti, hogy a közel gömb alakú Föld mágneses szempontból egy óriás mágneses dipólusként fogható fel, melynek mágneses momentuma 10 9 Wbm. Ezt úgy is tekinthetjük mint egy mágnesrudat (lásd 1. ábrát), melynek egy jól meghatározott északi és déli pólushelye van. A Föld mágneses pólushelyei jól meghatározhatók akárcsak a földrajzi pólushelyek. A földrajzi észak-dél irányt a Föld forgástengelye jelenti. Ez nem esik egybe a mágneses észak-dél iránnyal. A két irány által bezárt ` szöget a mágneses elhajlás vagy mágneses deklináció szögének nevezik. 1. ábra A Föld mágneses terének eredetét napjainkig sem sikerült részleteiben tisztázni, valószínüleg több hatás együttesének tulajdonítható. Ennek megfelelen több hipotézis is igyekszik a földmágnesség okára magyarázatot adni. Az egyik ilyen hipotézis a telurikus áramok elmélete, amely feltételezi, hogy a földkéregben és a magmában különböz eredet) (galvanikus, termoelektromos) áramok mágneses tere hozza létre, melyhez hozzáadódik a Föld légkörében folyó elektromos áramok mágneses tere. Egy régebbi elmélet szerint a földkéregben lév ferromágneses anyagok egy része mágnesezett állapotban van és ezek eredményezik a földmágnességet. Ezen elmélet szerint a kéregnek ezt a mágnesezett állapotát részben a Föld belsejében folyó áramok, részben küls kozmikus hatások hozták létre. 236 2003-2004/6