Program fordítása és futtatása

BecomeAnXcoder – Program fordítása és futtatása

Bevezető

A pogramkód, amit eddig alkottunk gyakorlatilag csak emberi olvasásra alkalmas szöveg. Mi sem sokat élvezünk belőle, de a Mac-nek még rosszabb, közvetelenül semmit sem tud kezdeni vele! Szüksége van egy speciális programra, amit fordítóprogramnak hívnak. Ez képes arra, hogy a programkódot átfordítsa gépi kódra, ami már értelmezhető, futtatható lesz a Mac-en. A fordítóprogram része az Apple ingyenes programfejlesztő környezetének. Telepíteni kell az Xcode programot a Mac OS X telepítő lemezéről, ha eddig ezt még nem tetted volna meg. Azt is érdemes ellenőrizni, hogy a legfrissebb változattal rendelkezel-e, amit a http://developer.apple.com oldalon tudsz megtenni (ingyenes regisztrációra szükség van).

Projekt

Indítsuk el a Developer folderen belül található Application folderből az Xcode programot. Az első indítás alkalmával feltesz egy sor kérdést. Nyugodtan elfogadhatod a felajánlott válaszokat, mert azokkal el lehet kezdeni a munkát és később ha szükséges, bármelyiket egyszerűen meg tudod változtatni a Preferences-ben. Válasszuk ki az új projektet (New Project) a File menüből. A programban különböző projekt típusokból lehet választani.

01 New Project

Az Xcode Assistant segítségével kiválasztjuk az új projekt típusát

Egy nagyon egyszerű Objective C program megírása a célunk, amelyik nem használ grafikus felhasználói felületet (GUI), ezért válasszuk ki a Foundation Tool-t a Command Line Utility csoportból.

02 New Title

A projekt nevének és elérési útvonalának beállítása.

Legyen a program neve “justatry”. Válasszuk, ki hova szeretnénk elmenteni és kattintsunk a Finish gombra.

A programunkat közvetlenül a Terminal-ból is lehet futtatni. Amennyiben ezt szeretnéd és szeretnél elkerülni alapvető kellemetlenségeket, akkor a neve kezdődjön kis betűvel és csak egy szóból álljon. Nagy betűvel majd azoknak a programoknak a nevét fogjuk jelölni, amelyek már grafikus felhasználói felületet használnak.

Ismerkedés az Xcode-dal

Most egy olyan ablakot látsz, amivel a programozás során gyakran fogsz találkozni. Ez két fő részre bontható. A bal oldali “Groups & Files” nevű oszlopban a projekthez tartozó összes fájlt el lehet érni. Most még nincs olyan sok, de később, amikor többnyelvű grafikus programokat fogsz fejleszteni, akkor itt lesz majd látható a grafikus felhasználói felületet leíró és a nyelvi változatokat tartalmazó összes fájl. A fájlok úgynevezett virtuális folderekben vannak csoportosítva a könnyebb áttekinthetőség érdekében, de a Finderben nem fogod ezeket megtalálni, csupán az Xcode-on belüli tájékozódást könnyítik meg.

A bal oldali listában kattintsunk a justatry-ra, majd a csoportba tartozó fájlok nevére kattintva megnézhetjük ezek forráskódját. Van itt egy justatry.m nevű fájl [1]. Emlékszel, hogy mindegyik programnak kell tartalmaznia egy main() függvényt? Nos ez az a fájl, amelyik tartalmazza a main() függvényt. Hamarosan módosítani fogjuk ezt és beillesztjük a saját pogramkódunkat. Ha duplán rákattintasz az ikonjára és kinyitod a justatry.m fájlt, meg fogsz lepődni. Az Apple már meg is csinálta helyetted a main() függvényt.

03 Xcode Window

A main() függvény megjelenítése az Xcode-ban.

//[1] 
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) //[1.2] {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //[1.4]
// ide jön a programkód ...
NSLog(@"Hello, World!");
[pool drain]; //[1.7]
return 0; }

Tanulmányozzuk a programkódot, és figyeljünk a következőkre:

- Az NSLog() és más alapfüggvények meghívásához egy import utasítás szükséges, amit a # jellel kell kezdeni.
- A main() függvény megléte.
- A kapcsos zárójelek ölelik át a programtörzset.
- Egy megjegyzés, ami jelen esetben megmutatja hova kell írni a programkódot.
- Egy NSLog() utasítás, aminek segítségével kiíratunk egy stringet a képernyőre.
- A return 0; utasítás.

Van még néhány ismeretlen dolog is számodra itt:

- Két fura argument a main() függvény zárójelei között [1.2]
- Az NSAutoreleasePool kezdetű utasítás [1.4]
- Egy másik utasítás, amelyik tartalmazza a pool és drain szavakat [1.7]

Személy szerint nem szoktam örülni annak, amikor egy könyvben azt olvasom, hogy az itt szereplő dolgokat majd később meg fogom érteni. Ezért is tárgyaltuk olyan részletesen a függvény fogalmát az eddigiekben, hogy a lehető legtöbb dolgot előre tisztázzuk.

Már pontosan tudod, hogy a függvények arra valók, hogy áttekinthetőbbé tegyék a programot, hogy minden programban van egy main() függvény, és azt is hogy milyen a függvények felépítése. Azonban el kell ismernem, hogy nem sikerült előre megmagyarázni mindent, ami az [1]-es példában szerepel. Valóban sajnálom, de kérem, hogy egyelőre tekintsünk el ezektől a dolgoktól (mint pl. [1.2, 1.4 és 1.7]). Először azokra az alapvető dolgokra szeretnénk koncentrálni az Objective C programozás tanítása során, amelyekre feltétlenül szükség van az egyszerű programok megírásához. Azért annyi jó hírrel szolgálhatunk, hogy két kemény fejezeten már túljutottál, és most három könnyebb lélegzetű következik mielőtt ismét kicsit bekeményítenénk.

Amennyiben nagyon furdal a kíváncsiság, egy rövid ismertetővel azért már most is szolgálhatunk. A main() függvény argumentumában levő dolgok ahhoz kellenek, hogy a programot Terminal-ból is lehessen futtatni. A programnak futásakor memóriára van szüksége. Amikor a futás befejeződött, más programok szeretnék használni – esetleg ugyanazt – a memória területet. A programozó feladata, hogy lefoglalja a szükséges memóriamennyiséget a programja számára és ugyanolyan fontos, hogy ezt fel is szabadítsa, amikor a programnak már nincsen rá szüksége. Erre szolgálnak a pool, drain szavakat tartalmazó utasítások.

Fordít és futtat

Futtassuk le az Apple által megírt programot mielőtt bármit is tennénk vele [1]. Ne felejtsük el kinyitni a Console ablakot (a Run menüből), hogy láthassuk a futás eredményét. Ezután kattintsunk a kalapácsos ikonra (Build and Go) annak érdekében, hogy megtörténjen a fordítás és a futtatás.

04 Build

Fordít és futtat gomb.

A program ekkor lefut és a futás eredménye látható lesz a Console ablakban néhány további információval együtt. Az utolsó sorban levő mondat arról szól, hogy a 0 visszatérési kóddal állt le. Jól látható hogy megkaptuk a main() függvény zéró visszatérési értékét, ahogy arról a 3-as fejezetben már beszéltünk [10.9]. Ez ugye azt jelenti, hogy a programunk nem állt le idő előtt, hanem sikeresen végrehajtott minden szükséges utasítást. Ez igazán jó hír!

Hibakeresés

Térjünk vissza az [1]-es programkódhoz és vizsgáljuk meg mi történik, ha hiba kerül a kódba. Például kicseréljük az NSLog() utasítást egy másikra, de elfelejtjük a pontosvesszőt az utasítás végéről.

//[2] 
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // ide kerül a programkód ... NSLog(@"Step1: create a bug!") // Hoppá, elfelejtettük a pontosvesszőt! [pool drain]; //[2.9] return 0; }

Kattintsunk a Build ikonra az eszköztárban. Nyomban megjelenik egy piros kör a [2.8] utasítás előtt.

05 Parse Error

Az Xcode hibaüzenetei

Ha rákattintasz, akkor az eszköztár alatt egy rövid magyarázat jelenik meg:

error: szintaktikai hiba a "drain" előtt

A szintaktikai, formai elemzés az első feladata a fordítóprogramnak: lépésenként ellenőrzi a program minden sorát, hogy formailag helyes-e. Annak érdekében, hogy segítsd a munkáját bizonyos szabványos jeleket kell elhelyezned a programban. Ilyen például az, hogy az import utasítást [2.2] a # jellel kezd kezdeni. Az utasítás végét [2.8] pedig a pontosvesszővel kell jelezned. Amint a fordítóprogram a [2.9]-es sorhoz érkezik, észreveszi, hogy valami rossz. Azt sajnos nem érzékeli pontosan, hogy nem ebben a sorban van a hiba, hanem az előző sorban, ahol ugye hiányzik a pontosvessző. Tehát a legfontosabb tanulság ezen a ponton az, hogy a fordítóprogram megkíséreli ugyan, hogy a lehető legpontosabb visszajelzést adjon, de egyáltalán nem biztos, hogy pontos leírását kapjuk a hibának, sőt még az sem biztos, hogy a konkrét hiba pontos előfordulási helyén jelzi a problémát, csak próbál közelíteni ahhoz.

Javítsd ki a hibát, azaz add hozzá a pontosvesszőt a megfelelő helyre és futtasd ismét, hogy meggyőződjél, most már jól működik.

Az első progarmunk

Most vegyük elő az előző fejezetben megírt programkódot és illesszük be az utasításokat az Apple által szolgáltatott programváz [1] megfelelő helyére, ahogy azt a [3]-as példában láthatjuk.

//[3] 
#import  <Foundation/Foundation.h>
float circleArea(float theRadius);    // [3.3] 
float rectangleArea(float width, float height);    // [3.4] 
int main (int argc, const char * argv[])    // [3.6] 
{
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];   
   int pictureWidth;   
   float pictureHeight, pictureSurfaceArea,
         circleRadius, circleSurfaceArea;
   pictureWidth = 8;
   pictureHeight = 4.5;
   circleRadius = 5.0;
   pictureSurfaceArea =  pictureWidth * pictureHeight;
   circleSurfaceArea = circleArea(circleRadius);
   NSLog(@"A kép területe: %f. A kör területe: %10.2f.",
         pictureSurfaceArea, circleSurfaceArea);
   [pool drain];
   return 0; 
}

float circleArea(float theRadius)           // [3.22] 
{
   float theArea;
   theArea = 3.1416 * theRadius * theRadius;
   return theArea; 
}
float rectangleArea(float width, float height)  // [3.29]
{
   return width*height; 
}

Ne sajnáld az időt arra, hogy megértsd a program szerkezetét! A circleArea() [3.22] és rectangleArea() [3.29] függvények fejléce [3.3, 3.4] a main() függvény [3.6] előtt láthatók, ahol lenniük is kell.
A saját függvényeink a main() függvény kapcsos zárójelein kívül helyezkednek el. A programkódunkat a main() függvény azon részére illesztettük be, ahova az Apple kérte.

Ha lefuttatjuk a programot, akkor a következő eredményt kapjuk:

    A kép területe: 36.000000.  A kör területe:      78.54.
    justatry has exited with status 0.

Hibakeresés

Minél összetettebb lesz a programkód, annál nehezebbé válik a hibakeresés. Időnként hasznos lehet megtudni, hogy mi történik a program belsejében, miközben az fut. Az Xcode erre egy nagyon egyszerű lehetőséget biztosít. Válaszd ki azt a változót és azt a sort a programban ahol kíváncsi vagy a változó értékére majd kattints az utasítás melletti szürke margóra. Az Xcode egy töréspontot (breakpoint) helyez a programkódba és ezt egy kék szürke nyíllal fogja jelezni.

06 Breakpoint

Töréspont elhelyezése a programkódba

Jegyezd meg, hogy az adott utasítás végrehajtása előtti változó értéket kapjuk meg ezen az úton, ezért gyakran szükség lehet, hogy a töréspontot egy lépéssel későbbre helyezzük el.

Most mozgasd az egeret a második kalapácsos gomb főlé az eszköztárban, kattints egyet és egy pop-up menüt fogsz kapni.

07 Build Menu

A Build and Go (Debug) popup menü

Válaszd ki: Build and Go (Debug).

Amennyiben ki van nyitva a Console és a Debugger ablak (a Run menüből), akkor a Console ablakban ilyesmit fogunk látni:

 [Session started at 2009-06-03 15:48:02 +1000.]
 Loading program into debugger…
 GNU gdb 6.3.50-20050815 (Apple version gdb-956) (Wed Apr 30 05:08:47 UTC 2008)
 Copyright 2004 Free Software Foundation, Inc.
 GDB is free software, covered by the GNU General Public License, and you are
 welcome to change it and/or distribute copies of it under certain conditions.
 Type "show copying" to see the conditions.
 There is absolutely no warranty for GDB.
 Type "show warranty" for details.
 This GDB was configured as "i386-apple-darwin".tty /dev/ttys000 
 Program loaded. sharedlibrary apply-load-rules all run [Switching to process 86746 local thread 0x2d03] 
 Running…

Ez mutatja, hogy a program fordítása megtörtént, betöltődött és a hibakereső is elindult.

A Debugger ablakban pedig ezt láthatjuk:

08 Debugger

Az Xcode hibakeresője lehetővé teszi számodra, hogy lépésenként futtasd a programot és közben figyeld a változók állapotát

A program most addig fut, amíg eléri az első töréspontot. A Debugger jobb felső ablakában láthatod a különböző változók aktuális állapotát. Az utoljára beállított, vagy megváltoztatott értéket mindig piros karakterrel jelzi. A Continue gombra kattintva folytathatjuk a program futását. A hibakereső egy nagyon hasznos dolog az Xcode-ban. Szánjál rá időt, hogy megismerd és megszokd a használatát.

Befejezés

Mindent láttunk most már: hogy kell írni, tesztelni és futtatni egy egyszerű programot a Mac OS X alatt.

Amennyiben megelégszel olyan programokkal, amelyek nem használnak grafikus felhasználói felületet, akkor már nincs más dolgod, mint tökéletesíteni az Objective C-vel kapcsolatos tudásodat és egyre tökéletesebb nem grafikus programokat fogsz tudni írni. A következő fejezetekben éppen ehhez fogunk segítséget adni, és azután pedig következhetnek a GUI alapú programok. További jó olvasást!

 

eredeti oldal