Dissection de GLib : introduction
icone programmation
Signature :
GNU/Linux Magazine
Sommaire de l'article :

Retrouvez cet article dans : Linux Magazine 86

Voici un bref aperçu d’une bibliothèque bien connue, glib, qui est un des composants du non moins connu GTK+, pierre angulaire du bureau GNOME.

Introduction

et article est le premier d’une série dont l’objet est, comme le titre l’indique, de disséquer la bibliothèque glib. Nous voulons explorer son code pour voir comment sont implémentées des fonctionnalités assez utilisées dans les programmes. Est-ce comme vous auriez fait ? Avec quelques astuces de programmation en plus ? Ou radicalement différent ? Nous n’allons pas nous plonger dans le code dans ce premier article. En effet, glib est une bibliothèque dont l’histoire commence en 1995 et il serait dommage de ne pas la présenter un peu plus. Aussi, nous allons vous raconter son histoire, vous présenter ses fonctionnalités majeures, comment l’installer, et une très rapide visite du code source.

Historique

L’histoire de glib commence en 1995 avec un compilateur cs164 programmé en LISP. Ce projet étudiant échoua et les deux étudiants devaient néanmoins présenter quelque chose. Aussi, Peter Mattis et Spencer Kimball décidèrent de se lancer dans l’écriture d’un programme de manipulation d’images en C. Ce logiciel devait permettre de se passer des logiciels concurrents et payants tels que Photoshop de la société Adobe. Ce logiciel serait le General Image Manipulation Program. En février 1996 sortait la version 0.54 du GIMP, si stable malgré son statut de bêta qu’il était possible d’en faire une utilisation quotidienne. Les deux auteurs souhaitaient pouvoir se passer de tout logiciel payant. Aussi, dépendre de la bibliothèque graphique Motif était quelque peu contradictoire avec leur philosophie. Aussi, leur travail suivant consista à remplacer Motif par un Gimp ToolKit de leur cru, aussi libre que le GIMP. Ainsi sortit la version 0.60 à destination des développeurs, version de travail pour la série des versions 0.99. Cette série commença en février 1997 et la trousse à outils d’affichage prit le nom de GTK+. Elle contenait libgtk, libgdk et libglib. A la fin de l’année scolaire, les deux étudiants obtinrent leur diplôme et trouvèrent du travail, ce qui les obligea à laisser de côté leur œuvre à la version 0.99.10. Le projet ne fut pas abandonné pour autant, une communauté de développeurs s’étant constituée autour du GIMP. En septembre 1997, le GTK+ en fut extrait et son développement devint séparé. Il était toujours constitué des bibliothèques glib, gtk et gdk, que l’on obtenait ensemble. Des développeurs se mirent à choisir GTK+ pour leurs applications. Ce fut d’ailleurs le cas des programmeurs du projet GNOME. A partir de la série 1.1, du 10 juin 1988 (merci le ChangeLog de GTK+ pour ces informations), glib est distribuée séparément de gtk, tout en continuant à être un des composants du projet GTK+. Aujourd’hui, il existe deux versions majeures de la bibliothèque glib : l’ancienne 1.2 et l’actuelle 2.0. Cependant, lorsque nous téléchargeons glib, nous obtenons quelque chose comme la version 2.12.1. Comme il s’agit d’une bibliothèque, nous devons distinguer deux numéros de version. La 2.12.1 est un numéro de version du code source. Mais contrairement aux programmes qui ne disposent que du numéro de version du code correspondant, les bibliothèques contiennent également un numéro de version qui leur est propre, et qui indique la compatibilité avec les bibliothèques précédentes. C’est pour cela qu’à glib est associé le numéro de version 2.12.1 et à libglib le numéro 2.0. glib est distribué sous licence LGPL.

Fonctionnalités

glib implémente des fonctionnalités de base de vos programmes, qui sont également des fonctionnalités que l’on retrouve pour la plupart dans tous les programmes bien implémentés. Vous trouverez ainsi :
  • la gestion des fils d’exécution (threads) ;
  • le chargement dynamique de greffons ;
  • la gestion des allocations mémoire ;
  • la gestion des entrées/sorties (fichiers, tubes et chaussettes) ;
  • la gestion des erreurs ;
  • la journalisation (log) ;
  • des macros et fonctions facilitant le débogage par affichage de messages ;
  • des utilitaires divers :
    • pour les chaînes de caractères (manipulations, conversions, UTF-8, analyseur lexical, complétion automatique...) ;
    • pour l’internationalisation (pour gettext) ;
    • pour les dates et heures ;
    • pour lancer des sous-processus (fork() et exec()) ;
    • pour les noms des fichiers ;
    • un analyseur XML simple, un analyseur de fichiers .ini ;
    • des commandes de compatibilité Unix pour les programmeurs sur Windows.
  • La gestion de types de données complexes :
    • tableaux dynamiques ;
    • listes chaînées simples et doubles ;
    • blocs de mémoire (notez que les memory chunks et memory allocators sont dépréciés au profit des memory slices) ;
    • tables de hachage ;
    • arbres (binaires balancés ou quelconques) ;
    • jeux de données divers (graphes, associations complexes de données entre elles...).
Attention : Socket ne veut pas dire " chaussette ", mais " prise " (comme une fiche/prise de courant, l’une se branchant dans l’autre). C’est " sock " qui se traduit par " chaussette ". L’auteur se permet cette erreur de traduction en guise de clin d’œil à ses lecteurs du numéro 35 !

tar xvzf glib-2.12.1.tar.gz

Une fois la bibliothèque décompactée, il vous faut la compiler et l’installer. Nous vous conseillons de le faire. En effet, vous avez probablement déjà une version installée sur votre système. Mais c’est ici que vous pouvez changer quelques options comme celle d’activer les options de débogage au niveau maximum.
 $ ./configure \
--prefix=/home/yves/glib-2.12.1 \
--enable-debug=yes
$ make
$ make install
Ainsi, lorsque vous compilerez vos programmes et les lierez à glib, vous pourrez au choix utiliser la version standard de votre système, comme si de rien n’était, ou préférer celle-ci en indiquant le chemin glib-2.12.1/lib/pkgconfig dans la variable PKG_CONFIG_PATH. Exemples :
 $ pkg-config --modversion glib-2.0
2.12.1
$ pkg-config --cflags --libs glib-2.0
-I/usr/include/glib-2.0 \
-I/usr/lib/glib-2.0/include \
-lglib-2.0
$
$ PKG_CONFIG_PATH=/home/yves/glib-2.12.1/lib/pkgconfig \
pkg-config --modversion glib-2.0
2.12.1
$ PKG_CONFIG_PATH=/home/yves/glib-2.12.1/lib/pkgconfig \
pkg-config --cflags --libs glib-2.0
-I/home/yves/glib-2.12.1/include/glib-2.0 
-I/home/yves/glib-2.12.1/lib/glib-2.0/include  
-L/home/yves/glib-2.12.1/lib -lglib-2.0
Si vous utilisez celle-ci, assurez-vous que le chargeur de bibliothèques connaît ce chemin. Sinon, sur de nombreux systèmes Unix dont celui au manchot, vous pouvez l’indiquer dans la variable d’environnement LD_LIBRARY_PATH. Remarquez que sur GNU/Linux, le moyen normal d’ajouter un tel chemin est de l’indiquer dans /etc/ld.so.cache. Cependant, faites la distinction entre votre rôle d’administrateur qui indique dans ce fichier les chemins définitifs ne posant pas de problème de sécurité, et votre rôle de développeur qui peut installer des bibliothèques partout où il le souhaite. Editez /etc/ld.so.cache pour les chemins système et prenez LD_LIBRARY_PATH pour vos bricolages et autres développements (et installations temporaires). N’hésitez pas à faire pointer votre navigateur dans les sources de glib, dans docs/reference/glib/html/index.html ou, après installation, dans $prefix/share/gtk-doc/html/glib/index.html.

Promenade dans les sources

Nous distinguons deux sources, celles concernant les objets gobject et le reste. Les gobjects sont une partie des fondations de glib qui s’appuie dessus pour permettre une approche orientée objet, même en C. C’est pour cela qu’il est facile d’adapter glib pour d’autres langages, ce qui a déjà été fait pour Perl, Python, Ruby, PHP, C++, Ada... A moins d’avoir besoin d’utiliser cette API, le programmeur peut s’en passer et se contenter du reste de glib.

La documentation

Lorsque vous travaillez avec glib, et que vous avez un besoin, commencez d’abord par inspecter la documentation. Elle est assez bien structurée, pas trop mal documentée, et vous ne devriez pas avoir trop de difficultés à trouver ce que vous cherchez. Le seul hic est qu’elle nécessite d’avoir quelques notions d’anglais. Par exemple, pour allouer de la mémoire, vous trouverez dès la première page Memory Allocation - general memory-handling qui vous conduit sur la liste des fonctions relatives à la gestion de la mémoire. Il ne vous reste plus qu’à découvrir celle qui vous convient le mieux dans la liste.

Les en-têtes

Vous avez par ailleurs le répertoire des en-têtes qui se trouve dans $prefix/include/glib-2.0/glib. Celui-ci ne présente pas un intérêt énorme, car vous disposez des mêmes informations dans la documentation. Vous pouvez néanmoins en avoir besoin pour rechercher où est défini un type de données, à l’aide de grep. Il en est de même dans le répertoire des sources glib/ dans le cas d’une recherche un peu poussée.

Les sources

Ce répertoire des sources est bien structuré, avec les fonctions réparties soit en fonction de leur utilité (fonctions de journalisation, de gestion des erreurs...), soit en fonction du type de données qu’elles permettent de gérer (listes chaînées, arbres, chaînes de caractères...). Aussi, dans l’exemple précédent, le code correspondant à la gestion de la mémoire se trouve globalement dans le fichier glib/gslice.c (et dans les versions 2.8 et précédentes dans glib/gmem.c).

Conclusion

Vous en savez maintenant assez pour vous lancer dans la programmation avec glib. N’hésitez pas à utiliser ses fonctionnalités quand elles existent. En effet, vous facilitez le portage éventuel pour d’autres architectures. glib est multiplateforme et les problèmes de portabilité de certains morceaux de code ont déjà été résolus. glib est assez optimisée, en particulier pour l’architecture x86 de nos chers PC. Si vous pensez pouvoir faire mieux (en particulier pour les architectures non x86), préférez optimiser glib que d’optimiser votre propre code. Cela profitera ainsi à tous. Et sinon, utilisez simplement glib, concentrez-vous sur le cœur de votre programme, pas sur des détails qui sont déjà réglés dans glib. Références :

Retrouvez cet article dans : Linux Magazine 86

Il y a : 0 commentaire(s)

Donnez votre avis

Vous devez avoir ouvert une session pour écrire un commentaire.

Brèves
Édito : Linux Pratique Essentiel N°24
Édito : Linux Pratique HS N°23
Édito : GNU/Linux Magazine 146
Édito : GNU/Linux Magazine HS N°58
Édito : Open Silicium N°5
Communication
Linux Pratique HS 23 – Communiqué de presse
Linux Pratique Essentiel N°24 – Communiqué de presse
Gnu/Linux Magazine sponsor et partenaire de PROLOGIN
Linux Essentiel partenaire des Rencontres du Libre de Lion sur Mer (Normandie)
GNU/Linux Magazine HS 58 – Communiqué de presse
prochainement moteur de recherches des articles
 
:
:
Jours heures minutes secondes
En kiosque
Le tout nouveau Linux Pratique Essentiel est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine HS est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Open Silicium est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Misc est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...