Archívum

Posts Tagged ‘linux’

Vala programozás II. – Helló GTK+!

január 10, 2012 Hozzászólás

Az előző bejegyzésben bemutattam röviden a Vala programozási nyelvet, és csináltam egy „Helló világ!” példaprogramot. Most egy komolyabb programot fogunk készíteni, amely egy egyszerű grafikus programocska lesz. Ehhez a GTK+ grafikus eszközkészletet fogjuk alkalmazni. A GTK+ eredendően egy C-ben írt függvénykönyvtár, amely a Vala-hoz hasonlóan a GObject típusrendszerét alkalmazza. A Vala nyelv megjelenése előtt kétféle lehetőségünk volt a használatára: vagy használtuk a natív C-s függvényeket (ez komolyabb programok esetén egy idő után nehéz feladat) vagy ún. csomagoló (wrapper) interfészeket használtunk más programozási nyelvekkel. A Vala lényegében GTK+/GNOME alkalmazások készítése során egy harmadik alternatívát ad, hiszen itt nincs szükség komoly wrapperrek használatára (egyszerű szöveges fájlokat használ erre), és a programozási nehézségeket is kiküszöböli. A C nyelv legnagyobb nehézsége az, hogy a gyakorta szükséges műveletekre nincsenek sztenderd megoldások, tehát magas absztrakciós szintet igénylő esetekben kellemetlen a használata.

A GTK+-ról röviden

A GTK+ a GNOME platform grafikus eszközkészlete. Tehát miden grafikus felülettel rendelkező GNOME alkalmazás használja. Mint a platform legtöbb függvénykönyvtára ez is jól portolható, létezik Linux, Windows, Mac OS X és BSD változata is (többek között). A GNOME és a GTK+ aktuális főverziója is a 3-as számú, ezt fogjuk használni.

A fejlesztéshez szükséges állományokat az Ubuntu 11.10-ben a libgtk-3-dev csomag telepítésével érhetjük el.

Példaprogram

A programot (majdnem) soronként fogom bemutatni, kitérve a lényeges funkciókra:

using Gtk;

Itt jelezzük, hogy a programban használjuk a Gtk névteret, így majd a névtérbe tartozó objektumokat közvetlenül hívhatjuk, azonban vigyáznunk kell a névütközéskre.

class Pelda : GLib.Object {
    public static int main (string[] args) {

Az osztálydefinícióban láthatjuk, hogy a Pelda osztályunk a GLib.Object alosztálya. Itt jegyezném meg hogy (szinte) minden osztálynak ennek az alosztályának kell lennie – kivételek vannak. A GLib névtér megadása alapesetben nem lenne feltétlenül szükséges, mivel a GLib névteret implicit módon használjuk, de a névütközések miatt mégis megtesszük. Jelen esetben például probléma lenne, hiszen a Gtk névtérben is szerepel Object osztály.

        // A GTK+ inicializálása
        Gtk.init(ref args);

Itt átadjuk a GTK+-nak a program argumentumait, a ref kulcsszó azt jelzi, hogy az átadás referencia szerint történik.

        // Új ablak kétrehozása, és pár tulajdonság beállítása
        var window = new Window();
        window.title = "GTK+ Példaprogram";
        window.border_width = 5;
        window.window_position = WindowPosition.CENTER;
        window.set_default_size (300, 100);
        window.destroy.connect(Gtk.main_quit);

Itt három dolgot jegyeznék meg. Az első a var kulcsszó, amely arra szolgál, hogy kevesebbet kelljen gépelnünk, ha a definíció jobb oldala egyértelműen meghatározza a típust.

A második az adattagok megadása. Ha ez Java forráskód lenne azt hihetnénk, hogy publikus adattagokat használunk, de nem erről van szó, hanem tulajdonságokat használunk (attribute), tehát implicit módon set függvényeket hívunk meg, így nem sértjük az objektum-orientált programozás alapelveit.

Végül pedig az utolsó sor. Itt a window objektum destroy szignáljához kötünk kezelőmetódust, a beépített main_quit metódust. A destroy szignál akkor adódik ki, ha bezárjuk a programablakot. Ekkor lefut a kezelőmetódus, amely kilépteti a programot a főciklusból (ld. később).

        // Gomb létrehozása
        var button = new Button.with_label("Kattints ide!");
        button.clicked.connect (() => {
            button.label = "Köszi!";
        });

Itt létrehozunk egy gombot, a Button osztály nevesített konstruktorával. Eztán a gomb kattintási szignáljához kötünk egy kezelőmetódust. Ez a metódus névtelen metódus vagy másnéven lambda kifejezés.

        // Gomb hozzáadása az ablakhoz, majd megjelenítés
        window.add(button);
        window.show_all();
        // Főciklus indítása
        Gtk.main();
        return 0;
    }
}

Itt jól látható az előbb említett főciklus. Ez addig fut amíg meg nem hívódik a main_quit() metódus.

A programból sok funkciót meg lehetett ismerni, de előre kell szögezni, hogy a  grafikus elemek (widgetek) programkóddal történő leírása rossz gyakorlat!

A következő bejegyzés a grafikus elemek leírónyelvvel történő megadásával fog foglalkozni, és a Builder osztállyal.

A teljes forráskód:

using Gtk;

class Pelda : GLib.Object {
    public static int main (string[] args) {
        // A GTK+ inicializálása
        Gtk.init(ref args);
        // Új ablak kétrehozása, és pár tulajdonság beállítása
        var window = new Window();
        window.title = "GTK+ Példaprogram";
        window.border_width = 5;
        window.window_position = WindowPosition.CENTER;
        window.set_default_size (300, 100);
        window.destroy.connect(Gtk.main_quit);
        // Gomb létrehozása
        var button = new Button.with_label("Kattints ide!");
        button.clicked.connect (() => {
            button.label = "Köszi!";
        });
        // Gomb hozzáadása az ablakhoz, majd megjelenítés
        window.add(button);
        window.show_all();
        // Főciklus indítása
        Gtk.main();
        return 0;
    }
}

A program fordítása némiképp megváltozik, hiszen a gtk csomagot is bele kell fordítani, ezért a fordítás során használjuk a -pkg gtk+-3.0 kapcsolót.

Reklámok
Kategóriák:Programozás Címke: , , , ,

Vala programozás I. – Helló világ!

október 15, 2011 Hozzászólás

Ebben és az ezt követő bejegyzésekben a Vala programozási nyelvvel fogok foglalkozni, gyakorlat-orientált módon. Mindenekelőtt azért célszerű általánosan is bemutatni a nyelvet, hiszin igencsak új-keletű programozási nyelvről van szó.

Mit kell róla tudni?

Röviden: a Vala nyelv egy olyan objektum-orientált programozási nyelv, amely szintaktikailag rendkívül hasonlít a C# nyelvre, fordítása során C forráskódot generál, ás a GObject függvénykönnytárra támaszkodik. A nyelv még igen fiatalnak számít, hiszen 2005-ben kezdődött a fejlesztése, de mostanra már jelentős funkcionalitással rendelkezik.

Pár nagyobb fontosságú tulajdonsága:

  • modern programozási funkciók, amelyek más népszerű nyelvekben is megtalálhatóak
  • kevés függőség:
    • ez rendkívül fontos, hiszen pl. a C# esetén a .Net/Mono platformhoz vagyunk kötve
    • jól portolható, hiszen csak a GObject könyvtárra van szükség (az pedig rendkívül sok platformra elérhető)
  • mivel a GObject-re épül, a többi GObject alapú könyvtárral jól használható, ez a gyakorlatban a GNOME platformot jelenti
  • nem használ virtuális gépet, mint a Java vagy a C#, hanem gépi kódra fordul (potenciálisan nagyobb sebesség)
  • nincs hulladékgyűjtés (garbage collection), helyette referencia-számlálás (reference counting), hasonlatosan a C++-hoz
    • ez valamilyen szempontból hátrány, de lehetőséget biztosít dinamikus memóriakezelésre

Hosszabb bemutatás található a következő, általam írt jegyzetben: A Vala programozási nyelv

Vágjunk bele!

Most akár el is kezdhetnénk kódolni, de nyilvánvalóan fejlesztőeszközökre van szükségünk. Én aktuálisan Ubuntu 11.10 operációs rendszert használok, így a fejlesztőeszközök beszerzését ezen mutatom be. Régebbi verziók esetén kissé eltérő lehet a módszer, de nem túlságosan. Lehetőség van Windows alatt is fejleszteni, ehhez tájékozódjunk a projekt weboldaláról.

Először szükségünk van a fordítóprogramra. Ha csak az alapvető csomagtárolókat használjuk, akkor telepítsük a valac-0.12 csomagot. Ha a legfrissebb stabil kiadást szeretnénk használni, akkor adjuk a rendszerhez a Vala PPA tárolóját: Vala Team PPA

Ezt például parancssorból tehetjük meg:

sudo add-apt-repository ppa:vala-team

Ezután csak telepítsük a megfelelő vala csomagot. Ez most jelenleg a valac-0.16 csomag.

sudo add-get install valac-0.16

A forráskód szerkesztéséhez én az operációs rendszer beépített szövegszerkesztő programját (a gedit-et) használom. Telepítve a gedit-valencia-plugin csomagot, és aktiválva a programban a Bővítmények között, egy egyszerű szerkesztőfelületet kapunk Vala programozáshoz. A fejlesztést segítheti még a Devhelp dokumentációböngésző is, de ez nem létfontosságú.

Ezzel lényegében belefoghatunk a kipróbálásba.

Az első Vala programunk

Szinte minden programozási nyelvet a klasszikus „Helló világ!” példával szoktak bemutatni, most én sem teszek másképp:

void main() {
    stdout.printf("Helló világ!\n");
}

Ugyan ez is tökéletesen működik, inkább hasonlít egy C programra, mint egy objektum-orientált megoldásra. A következő egy összetettebb megoldás:

class Main : GLib.Object {
    public static void main(string[] args) {
        stdout.printf("Helló világ!\n");
    }
}

Fordítás

Már csak az van hátra, hogy gépi kódra fordítsuk a forrásnyelvi szöveget. Erre a már feltelepített valac programot használjuk:

valac -o hello hello.vala

Ez először C forráskódot generál hello.c néven, majd azt lefordítja a GCC C fordítóprogrammal. Ha esetleg kíváncsiak vagyunk a generált C forráskódra, akkor adjuk át a -C kapcsolót a valac-nak. A programunk binárisa a hello állomány, amely futása során a „Helló világ!” üzenetet írja ki a konzolra.

Kategóriák:Programozás Címke: , , , ,