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. Sur 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 :
- Mise à jour du système
apt-get update && apt-get -y upgrade
- Installer le compilateur Vala qui supporte le langage Genie. Il vous faudra aussi le compilateur gcc.
apt-get install gcc valac-0.16
- Vous pouvez maintenant créer votre premier programme : Hello World ! (Lui est vraiment universel 😉 )
init print "Hello World"
- Vous lancez la compilation avec la commande valac.
- Reste à lancer le programme généré : hello.
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 :
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
Simple, rapide et efficace !
Bon et pour notre Raspberry Pi ? C’est presque simple. Mais j’ai bien préparé le terrain ! 🙂
- Installer la librairie C wiringPi. Le tutoriel est sur la page officielle.
- 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.
- 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);
- 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 ! 🙂