Lancée début 2011, la bibliothèque gtk-fortran permet de créer des interfaces graphiques GTK dans des programmes en Fortran. Elle est multi‐plate‐forme (GNU/Linux, Windows via MSYS2, BSD et macOS) et le projet est publié sous licence GNU GPL v3. Environ 10 000 fonctions sont accessibles (GTK, GDK, GdkPixbuf, Cairo, Pango, ATK, GLib, GObject, GIO). En plus de l’aspect interface graphique, gtk-fortran permet également :
- d’accéder aux fonctions de la GLib ;
- d’accéder aux fonctionnalités de la bibliothèque de tracé scientifique PLplot.
La version 19.04 vient de sortir. Une présentation technique de gtk-fortran et les nouveautés de cette version suivent en deuxième partie. Profitez‐en, avec cette dépêche, c’est l’auteur de la bibliothèque qui régale !
Quelques aspects techniques
Techniquement, gtk-fortran utilise le module ISO_C_BINDING introduit dans la norme Fortran 2003 afin de faciliter et de normaliser l’interfaçage entre les programmes Fortran et C, en assurant au mieux l’interopérabilité des types de données, des pointeurs, des appels de fonctions, etc.
Un programme Python se charge de parcourir les fichiers .h
des bibliothèques GTK afin d’essayer d’en extraire la substantifique moelle à l’aide d’expressions régulières et de générer les interfaces Fortran permettant d’accéder aux fonctions C.
Par exemple, pour ce prototype C situé dans /usr/include/gtk-3.0/gtk/gtkwindow.h
:
void gtk_window_set_title (GtkWindow *window, const gchar *title);
On obtient l’interface Fortran suivante :
subroutine gtk_window_set_title(window, title) bind(c)
use iso_c_binding, only: c_ptr, c_char
type(c_ptr), value :: window
character(kind=c_char), dimension(*) :: title
end subroutine
La plupart des énumérations sont également traduites. Par exemple :
typedef enum
{
G_DATE_DAY = 0,
G_DATE_MONTH = 1,
G_DATE_YEAR = 2
} GDateDMY;
Ce qui devient en Fortran :
enum, bind(c) !GDateDMY
enumerator :: G_DATE_DAY = 0
enumerator :: G_DATE_MONTH = 1
enumerator :: G_DATE_YEAR = 2
end enum
Nouveautés dans gtk-fortran 19.04
La version 19.04 (la numérotation correspond à la version d’Ubuntu utilisée pour générer la bibliothèque) est basée sur GTK 3.24.8, GLib 2.60.0 et GTK 2.24.32. Elle se caractérise également par l’ajout d’outils permettant de repérer les fonctions GTK obsolètes (deprecated), la parallélisation de la compilation (make -j
) dans la branche GTK 3, un effort particulier sur la qualité de la documentation, des corrections de bogues dans les exemples…
Futurs développements
Concernant l’avenir, le projet se prépare lentement à l’arrivée de GTK 4. Avec également une réflexion sur l’opportunité de passer de CMake à Meson, outil désormais utilisé par le projet GTK.
Les bonnes volontés sont bien sûr les bienvenues, d’autant plus que nous ne sommes pas légion !
Aller plus loin
- Journal à l’origine de la dépêche (36 clics)
- Page principale du projet (59 clics)
- John Reid : The New Features of Fortran 2003 (PDF) (28 clics)
- Un exemple de projet utilisant gtk-fortran (69 clics)
# gobject introspection
Posté par Guillaum (site web personnel) . Évalué à 6.
La force de gtk ce n'est pas justement de fournir des outils d'introspection permettant de générer des bindings facilement et sans passer par des expressions régulières peu robustes ?
[^] # Re: gobject introspection
Posté par Sytoka Modon (site web personnel) . Évalué à 4. Dernière modification le 26 avril 2019 à 20:03.
À noter que Perl6 / Raku a ré-inventé les expressions rationnelles et qu'elles peuvent être couplées à la notion de Grammar et là on est tout à fait robuste : https://docs.perl6.org/language/grammar_tutorial.
Cela dit, dans pleins de cas, les expressions rationnelles classiques du Perl5 (PRCE) sont suffisantes et ont, bien que je suis loin de toutes les comprendre, fait le charme d'une informatique souvent un peu trop impérative et parfois même laborieuse ;-)
[^] # Re: gobject introspection
Posté par Guillaum (site web personnel) . Évalué à 4.
Par robuste, j'entendais le fait que en parsant des fichier .h, si le format des fichiers .h change pour une raison absurde (nouvelle norme de C par example), le parseur sera à revoir.
Alors que, de ce que j'ai compris, l'introspection de gobject s'occupe de fournir les scanners et le format de sortie normalisé.
Ma question était plutôt sur l’intérêt de réinventer la roue sachant que la force de GTK (à mon avis) c'est ce coté hyper "bindable" grâce à son architecture d'introspection.
[^] # Re: gobject introspection
Posté par vmagnin (site web personnel) . Évalué à 3.
C'est sûr que que ce serait plus rigoureux et robuste d'utiliser l'introspection. Je m'y étais intéressé dans la première année du projet :
https://github.com/vmagnin/gtk-fortran/issues/27
Apparemment, à l'époque dans les choses qui m'avaient bloquées, il y avait un manque de documentation et le fait qu'il n'y avait pas de fichier gir pour la librairie Cairo qui était importante pour le graphisme dans le projet (ou peut-être que je ne l'avait pas trouvé).
Les choses se sont probablement améliorées depuis :
https://gi.readthedocs.io/en/latest/
Sur le long terme, ça pourrait être une option de se ré-intéresser à ce sujet. Pour l'instant le parser est très satisfaisant, mais c'est effectivement chatouilleux. Le problème des expressions régulières n'est pas tant de les écrire pour récupérer quelque chose de précis, mais de gérer les petites variations de conventions de codage d'un fichier à l'autre (on parse 757 fichiers dans GTK 3.24.8).
[^] # Re: gobject introspection
Posté par vmagnin (site web personnel) . Évalué à 3.
Merci pour le lien sur les Grammar. Je jetterai un oeil à ce concept !
Les expressions régulières/rationnelles sont effectivement une des plus belles choses que j'ai découvertes en informatique depuis une douzaine d'années, avec les mécanismes des shells Unix. Je me suis longtemps contenté des wildcards du DOS…
[^] # Re: gobject introspection
Posté par Sytoka Modon (site web personnel) . Évalué à 5.
Pour moi, une des forces de GTK est aussi d'être une bibliothèque objet à héritage simple. Je ne sais pas si cela aurait été compliqué mais à première vu, je n'ai pas l'impression que le système objet du Fortran (oui Fortran est un langage objet normalisé depuis 2003) soit ici utilisé.
[^] # Re: gobject introspection
Posté par vmagnin (site web personnel) . Évalué à 3.
Effectivement, gtk-fortran n'utilise pas du tout la programmation objet du Fortran moderne. Je ne sais pas ce qu'il serait possible de faire avec GTK et je ne sais pas quel est le niveau de complexité que ça impliquerait.
[^] # Re: gobject introspection
Posté par Sytoka Modon (site web personnel) . Évalué à 5.
Je ne sais pas si cela sera facile à faire mais cela pourrait éviter l'import (use) de 10000 fonctions et d'imposer la restriction sur celles-ci (only).
Bref, cela serait super "clean" et dans l'esprit… Peut être est-il possible de s'inspirer des bindings comme par exemple celui de Vala (qui est juste une surcouche objet à héritage simple du C) ?
# Raspberry Pi
Posté par vmagnin (site web personnel) . Évalué à 1.
gtk-fortran 19.04 fonctionne également sur Raspberry Pi (testé sur un Raspberry Pi 3) :
https://github.com/vmagnin/gtk-fortran/issues/127#issuecomment-489329743
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.