Tester le langage Vala / Genie sur Raspberry Pi

Les langages sont nombreux sur le Raspberry Pi. Des anciens comme le C en passant par les modernes (Python ?) ou les poids lourds comme Java, le choix est large ! Petit nouveau soutenu par The Gnome Project, Genie vient s’installer sur notre Raspberry. most-popular-programming-languages-of-2014_52efd3a81d277_w1500Sur la page officielle de Genie vous allez trouver les bases d’utilisation de ce langage. Mais commençons par installer ce qu’il faut pour le langage :

  1. Mise à jour du système
    apt-get update && apt-get -y upgrade
  2. Installer le compilateur Vala qui supporte le langage Genie. Il vous faudra aussi le compilateur gcc.
    apt-get install gcc valac-0.16

    Capture d’écran 2014-05-05 à 22.52.29

  3. Vous pouvez maintenant créer votre premier programme : Hello World ! (Lui est vraiment universel 😉 )
    init
            print "Hello World"
  4. Vous lancez la compilation avec la commande valac.
  5. Reste à lancer le programme généré : hello. Capture d’écran 2014-05-05 à 22.59.22

Alors tout ça c’est bien joli mais quel est l’intérêt de ce language ?

Je vais vous donner la liste (partielle) de ses avantages :

  • Une grande simplicité de programmation. Le code est proche du Python (avec un peu de Boo, Delphi ou encode du D). Donc facile à appréhender !
  • Les performances. Là où les langages de haut niveau utilisent un processus pour l’interprétation (via pré compilation ou non), le code généré par Genie est du C donc avec d’excellentes performances à l’exécution.
  • La possibilité d’utiliser des objets de type GObject. Il s’agit (dans les grandes lignes) d’un équivalent à l’objective-C d’Apple. Ultra pratique pour monter en quelques lignes une interface graphique portable. Seules libc et Glib sont nécessaires.
  • Des exécutables légers. Le Hello World classique fait 2.9Kb et le même en GTK fait moins de 6Kb.
  • Liaison avec les librairies systèmes directement depuis Genie. Pas de surcouche comme dans Python par exemple pour le binding.

Bien sur, tout n’est pas rose et il y a des inconvénients :

  • C’est compilé. C’est l’inconvénient des avantages 🙂 Un script python peut être facilement envoyé par email, modifié et exécuté. Ici ce n’est pas forcément si simple (surtout si vous envoyé le code C généré ou que la personne n’a pas Vala d’installé).
  • Et le dernier : une communauté existante mais assez restreinte. Le support reste donc limité lors de la phase d’apprentissage. Je galère ! 🙂

Voici donc dans les (très) grandes lignes ce que l’on peut dire du langage.

Je vous donne encore quelques exemples :

Afficher un écran rouge avec un texte par dessus en utilisant la librairie curses :

[indent=8]
uses
        Curses

init
        initscr ()

        start_color ()
        init_pair (1, Color.YELLOW, Color.RED)

        var win = new Window (LINES - 8, COLS - 8, 4, 4)
        win.bkgdset (COLOR_PAIR (1) | Attribute.BOLD);
        win.addstr ("Raspberry Pi Home Server");
        win.refresh();
        win.clrtobot ();
        win.getch ();

        endwin ()

Pour compiler (si votre fichier s’appelle test.gs) :

valac --pkg curses -X -lncurses test.gs

Le résultat :

Capture d’écran 2014-05-06 à 22.54.11

Avec GTK installé, vous pouvez créer des fenêtres rapidement :

[indent=4]
uses
    Gtk

init
    Gtk.init (ref args)
    var wintest= new win_test()
    wintest.show_all ()
    Gtk.main ()

class win_test : Window
    init
        title = "Raspberry Pi Home Server"
        default_height = 250
        default_width = 250
        window_position = WindowPosition.CENTER

        var button = new Button.with_label ("Press here")
        button.clicked.connect (pushed)

        destroy.connect(Gtk.main_quit)

        add(button)

    def pushed (btn : Button)
        title = "You clicked it"
        btn.label = "You pressed me !"

La compilation avec GTK 3 installé :

valac --pkg gtk+-3.0 gtk.gs

Capture d’écran 2014-05-06 à 23.08.48

Simple, rapide et efficace !

Bon et pour notre Raspberry Pi ? C’est presque simple. Mais j’ai bien préparé le terrain ! 🙂

  1. Installer la librairie C wiringPi. Le tutoriel est sur la page officielle.
  2. Créer un lien (le binding) entre wiringPi et Vala/Genie. Pour ça vous créez le fichier /usr/share/vala-0.16/vapi/wiringPi.vapi avec le contenu suivant :
    [CCode (cheader_filename = "wiringPi.h")]
    public const int NUM_PINS;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int INPUT;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int OUTPUT;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PWM_OUTPUT;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int GPIO_CLOCK;
    
    [CCode (cheader_filename = "wiringPi.h")]
    public const int LOW;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int HIGH;
    
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PUD_OFF;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PUD_DOWN;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PUD_UP;
    
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PWM_MODE_MS;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int PWM_MODE_BAL;
    
    [CCode (cheader_filename = "wiringPi.h")]
    public const int INT_EDGE_SETUP;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int INT_EDGE_FALLING;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int INT_EDGE_RISING;
    [CCode (cheader_filename = "wiringPi.h")]
    public const int INT_EDGE_BOTH;
    
    [CCode (cname = "int", cprefix = "WPI_", has_type_id = false)]
    [Flags]
    public enum Foo {
        FATAL,
        ALMOST
    }
    
    [CCode (cname = "wiringPiSetup")]
    public int wiringPiSetup ();
    [CCode (cname = "pinMode")]
    public void pinMode (int pin, int mode);
    [CCode (cname = "digitalRead")]
    public int digitalRead (int pin);
    [CCode (cname = "digitalWrite")]
    public void digitalWrite (int pin, int value);
    
    [CCode (cname = "piBoardRev")]
    public int piBoardRev ();
    
    namespace wiringPi {
    	[CCode (cname = "int", cprefix = "WPI_MODE_", has_type_id = false)]
    	public enum WpiMode {
       		PINS,
        	GPIO,
        	GPIO_SYS,
        	PHYS,
        	PIFACE,
        	UNINITIALISED
    	}
    }
    

    Ce fichier reprend une partie des définitions faites dans la librairie C. Je n’ai pas tout fait mais le principe y est ! Vous pouvez faire le setup et changer la position d’un GPIO.

  3. Reste le programme qui fait clignoter une LED branchée sur le GPIO 17. Je l’ai nommé genius_test.gs
    uses 
    	wiringPi
    init
    	stdout.printf ("Raspberry Pi Board revision : %d\n", piBoardRev());
    	wiringPiSetup();
    	pinMode (0, OUTPUT) ;
    	for var i = 0 to 6
    		digitalWrite (0, HIGH);
    		Thread.usleep (500*1000);
    		digitalWrite (0, LOW);
    		Thread.usleep (500*1000);
    
  4. Et enfin la compilation !
    valac --pkg wiringPi -X -lwiringPi genie_test.gs ; ./genie_test
    

Vous voilà donc avec une LED qui clignote grâce à un programme qui fait moins de 6kb et sans avoir à passer par le codage plus complexe du C. Vous pouvez l’intégrer facilement dans une interface en GTK par exemple.

A vous de jouer maintenant ! 🙂

Vous aimerez aussi...