GLib

bibliothèque logicielle
Ceci est une version archivée de cette page, en date du 30 janvier 2021 à 21:15 et modifiée en dernier par Vmagnin (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

GLib (qu'il ne faut surtout pas confondre avec Glibc, la « GNU C Library ») est une bibliothèque libre pour le langage C et spécifiquement l'interface de programmation GTK+. Sans se substituer à la bibliothèque standard du C, elle en réécrit certains aspects, comme les fonctions de traitement de chaînes alphanumériques et de fichiers, ou la gestion des erreurs d'appel ; mais implémente aussi des structures de données élaborées : arbres, table de hachage et listes. Cette bibliothèque offre les principales fonctions de gestion de la boucle d'événements (clics souris, frappe clavier, signaux en général) de GTK+ : pile d'exécution, tas mémoire, callbacks.

De par son caractère très général et sa licence libre, cette bibliothèque est utilisable pour programmer toutes sortes d'applications, en évitant certaines difficultés de la bibliothèque standard de C.

Développement

C'était à l'origine un sous-ensemble de fonctions destinées à faciliter le portage du code GTK+ sur différentes plates-formes, en donnant aux types (booléens, entiers longs, pointeurs) le même format et la même taille en octets ; le codage des entiers, notamment, pose un problème de compatibilité particulier : le « boutisme ». Au moment de la conception de GTK2+, les développeurs décidèrent de sortir de l'API GTK+ toutes les fonctions non-graphiques pour en faire une bibliothèque généraliste[1] : GLib. Elle s'est désormais étendue pour offrir des fonctionnalités supplémentaires (sécurité sur l'adressage des chaînes de caractères, formats date/heure, gestion de l'espace-disque, appels système, etc.).

GLib fait partie du paquet GTK+ du projet GNU. Elle est distribuée selon les termes de la licence GNU LGPL.

Nécessité de GLib

Outre la portabilité des données, GLib a été conçu pour donner à GTK+ une structure de langage objet, qui n'existe pas en langage C. Il s'agit de créer une arborescence de types abstraits :

GtkObjectGtkWidgetGtkContainerGtkBinGtkWindow

Une fenêtre graphique de GTK (GtkWIndow) est en effet un objet élaboré dont les paramètres d'état (position, taille, palette de couleurs, fontes, possibilités d'interaction, visibilité et activité) sont organisés en strates hiérarchiques. Schématiquement,

  • GtkObject ordonne la scrutation de la fenêtre à l'intérieur d'une boucle d'événements,
  • GtkWidget décrit les types d'interaction possibles de la fenêtre en la classant comme un composant graphique particulier (bouton à cliquer, fenêtre graphique, curseur, message pop-up),
  • GtkContainer permet de hiérarchiser des fenêtres ou composants graphiques à l'intérieur d'une fenêtre, par un système géométrique de cadrage,
  • GtkBin enregistre les composants graphiques subordonnés à une fenêtre,
  • la fenêtre elle-même est, par héritage d'état, le produit des quatre superstructures qui précédent, et qui décrivent chacune une partie de ses propriétés.

Lorsque l'on modifie une fenêtre, il faut donc gérer la communication entre ces couches logiques pour que l'actualisation graphique se fasse correctement[2].

GLib apporte les outils qui permettent cette communication entre couches superposées :

  • des structures de données hiérarchisées et de taille variable,
  • des aiguillages de routine dépendant du contexte, par le mécanisme des fonctions de rappel.

Ces outils sont rassemblés dans une partie essentielle de GLib, GObject.

Contenu

Fonctions sécurisées pour les chaînes et tableaux

  • allocation mémoire (g_try_malloc, g_free, etc.) : par rapport à la fonction standard malloc, GLib se charge de la gestion des erreurs et arrête le programme si l'allocation se passe mal. Il est possible d'allouer un tableau et de l'initialiser simultanément, et de préciser si la zone allouée se termine (ou non) par une valeur 0 conventionnelle[3].
  • vérification des limites de représentation pour les types de base ;
  • chaîne de caractère (g_string_new, g_string_insert, etc.) : on a pu écrire qu'« en langage C, il n'existe pas type chaîne, mais plutôt une convention pour les représenter[4] ». D'ailleurs certaines fonctions, comme gets (supprimée dans norme C11) ou strcpy sont délicates à manipuler ; GLib associe systématique aux chaînes de type GString leur longueur, ce qui évite les débordements[5].
  • les conversions de types : les fonctions de conversion de chaîne en nombre de GLib sont systématiquement dotées d'un indicateur d'erreur. En particulier, la fonction de conversion de type d'une chaîne "0" en entier retourne un code d'erreur qui n'est jamais codé par un 0, ce qui supprime une ambiguïté[6].

Structures de donnée évoluées

Glib permet de créer et de manipuler des structures de données évoluées, avec leurs macros associées (par ex. g_array_index() ) :

  • listes chaînées et files. Bien que les primitives de ces fonctions ne soient pas très difficiles à programmer en langage C[7],[8], Glib les fournit[9].
  • arbres équilibrés : l'apport de Glib est de doter les arbres d'une relation d'ordre entre branches, ce qui permet d'accélérer les recherches d'un nœud[10].
  • tables de hachage : glib fournit cette structure pour les données de type entier, caractère ou pointeur, en les dotant d'une relation d'équivalence, et même d'un algorithme de parcours[11].

Interaction avec l'utilisateur

  • interprétation de la ligne de commande : le langage C permet de compter et de décoder les paramètres passés en option après le nom du programme exécutable, en ligne de commande. La librairie standard propose une fonction sommaire, getopt(), qui permet le décodage ; toutefois, celle-ci suppose encore une syntaxe assez stricte. GLib offre, avec les fonctions G_option_context_parse() etc. une syntaxe complète qui permet par exemple de grouper les options.

Analyse de fichiers structurés courants

GLib fournit des fonctions d'analyse de certaines données structurées (sous-ensemble du XML, fichiers de configuration), ou de décodage des expressions régulières. Les expressions régulières fournissent un moyen précieux de tester la présence d'un motif dans une chaîne de caractère, ou d'extraire une partie d'une chaîne. Glib offre des fonctions de comparaison, de tri et d'extraction utilisant la syntaxe d'expression régulière de la norme POSIX.

Bibliographie

Notes et références

  1. Cf. Andrew Krause, Foundations of GTK+ Development. Expert's Voice in Open Source., Apress, , 630 p. (ISBN 978-1-59059-793-4 et 1-59059-793-1), p. 5
  2. Cf. Peter Wright, Beginning GTK+/GNOME Programming, Wrox, (ISBN 978-1-86100-381-2), « Controlling the User Interface Layout », p. 92-97.
  3. Mettier, p. 106-114.
  4. Cf. Cl. Delannoy, Programmer en langage C, Paris, Eyrolles, , 267 p. (ISBN 978-2-212-12546-7, lire en ligne), « 8. Les chaînes de caractère », p. 145
  5. Mettier, p. 81.
  6. Mettier, p. 93.
  7. Cf. par ex. B. Klemens, 21st Century C, O'Reilly, (ISBN 978-1-4919-0389-6), « 6. Your Pal the Pointer », p. 139-140
  8. Cf. par ex. N. Kalicharan, Data structures in C, CreateSpace Independent Publ., , 330 p. (ISBN 978-1-4382-5327-5), « 3. Linked lists »
  9. Mettier, p. 58-61.
  10. Mettier, p. 62.
  11. Mettier, p. 68-76.

Annexes

Sur les autres projets Wikimedia :

Liens externes