Programmation Linux

Toutes les activités du système d’exploitation sont réalisées à l’aide de programmes, c’est pourquoi de nombreux nouveaux venus sont intéressés non seulement par l’utilisation des programmes d’autres personnes, mais aussi par l’écriture de leurs propres programmes. Beaucoup veulent contribuer à la base de code OpenSource.

Il s’agit d’un article de synthèse sur la programmation sous Linux. Nous verrons quels sont les langages les plus couramment utilisés, nous passerons en revue les concepts de base ainsi que les fonctionnalités, nous verrons comment écrire un programme simple dans l’un des langages de programmation les plus populaires et comment le construire et l’exécuter manuellement.

En quoi les programmes sont-ils écrits ?

Historiquement, le noyau Unix a été écrit en C. Plus encore, ce langage a été créé pour écrire le noyau Unix. Le noyau Linux étant basé sur le noyau Minix (une version d’Unix), il a également été écrit en C. On peut donc dire que les principaux langages de programmation pour Linux sont le C et le C++. Cette tendance dure depuis longtemps.

D’une manière générale, il est possible d’écrire des programmes pour Linux dans presque tous les langages, de Java et Python à C# ou même Pascal. Il existe des compilateurs et des interprètes pour tous les langages. Étant donné qu’il est difficile d’écrire des programmes en C++ et que le C est considéré comme obsolète par de nombreux programmeurs, ces derniers utilisent d’autres langages pour écrire des programmes. Par exemple, de nombreux outils système sont écrits en Python ou en Perl. L’équipe de Linux Mint, le programme d’installation d’Ubuntu et certains scripts apt sont écrits en Python. De nombreux scripts, y compris des scripts d’optimisation simples, sont écrits en Perl. Occasionnellement, Ruby est utilisé pour les scripts. Il s’agit de scripts OpenShift ou, par exemple, du framework Metasploit. Certains développeurs multiplateformes utilisent Java. Mais les principaux composants du système sont toujours écrits en C.

Nous ne couvrirons pas les bases du C dans cet article. Le C est un langage complexe et il faut lire au moins un livre et s’entraîner beaucoup pour le maîtriser. Nous verrons comment écrire des programmes en C sous Linux et comment les construire et les exécuter.

les bibliothèques

Naturellement, si vous devez afficher une chaîne de caractères ou une image à l’écran, vous n’appellerez pas directement la carte graphique. Vous appellerez simplement quelques fonctions déjà implémentées dans le système et leur transmettrez les données que vous souhaitez afficher. Ces fonctions sont placées dans des bibliothèques. En fait, les bibliothèques sont des ensembles de fonctions utilisées par d’autres programmes. Elles contiennent le même code que les autres programmes, à la seule différence qu’elles ne contiennent pas nécessairement de fonctions d’initialisation.

Il existe deux types de bibliothèques :

  • Statiques – elles sont liées au programme au moment de la compilation, elles sont liées et toutes les fonctions de la bibliothèque sont alors disponibles dans le programme en tant que natives. Ces bibliothèques portent l’extension .a ;
  • Dynamiques – ces bibliothèques sont beaucoup plus courantes ; elles sont chargées dans la mémoire vive et liées au programme de manière dynamique. Lorsqu’un programme a besoin d’une bibliothèque, il l’appelle simplement à une adresse connue dans la RAM. Cela permet d’économiser de la mémoire. L’extension de ces bibliothèques est .so, ce qui signifie Shared Object (objet partagé).

Ainsi, pour tout programme C, il est nécessaire d’inclure des bibliothèques, et tous les programmes utilisent des bibliothèques. Il est également important de noter que, quel que soit le langage dans lequel vous envisagez d’écrire, les bibliothèques du système C finiront par s’imposer. Par exemple, vous écrivez un programme en Python et utilisez les fonctionnalités standard de ce langage, mais l’interpréteur lui-même est déjà un programme C/C++ qui utilise les bibliothèques système pour accéder aux fonctionnalités de base. Il est donc important de comprendre le fonctionnement des programmes en C. Bien sûr, il existe des langages comme Go qui sont directement traduits en langage d’assemblage, mais les principes sont les mêmes qu’ici. De plus, la programmation du système Linux se fait principalement en C ou en C++.

Le processus de construction

Avant de passer à la pratique et de construire notre premier programme, nous devons comprendre le processus de construction et ce en quoi il consiste.

Tout programme sérieux se compose de plusieurs fichiers, à savoir les fichiers sources avec l’extension .c et les fichiers d’en-tête avec l’extension .h. Ces fichiers d’en-tête contiennent des fonctions qui sont utilisées par les développeurs. Ces fichiers d’en-tête contiennent des fonctions qui sont importées dans le programme à partir de bibliothèques ou d’autres fichiers .c. Avant que le compilateur ne puisse construire un programme et le préparer à être utilisé, il doit vérifier que toutes les fonctions ont effectivement été implémentées, que toutes les bibliothèques statiques sont disponibles et que le programme est assemblé en un seul fichier. Par conséquent, la première étape consiste à exécuter le préprocesseur, qui assemble le fichier source et exécute des instructions telles que include pour inclure le code du fichier d’en-tête.

L’étape suivante est le compilateur, qui s’occupe du code, analyse la syntaxe du langage et les variables, et traduit tout cela en code intermédiaire, puis en code d’instructions machine, que nous pouvons ensuite lire en assembleur. À ce stade, le programme est appelé module objet et n’est pas encore prêt à être exécuté.

Ensuite, l’éditeur de liens se met au travail. Son travail consiste à lier le module objet aux bibliothèques statiques et aux autres modules objets. Un module objet distinct est créé pour chaque fichier source. Ce n’est que maintenant que le programme peut être exécuté.

Examinons maintenant l’ensemble du processus en pratique, à l’aide du compilateur GCC.

Comment construire un programme

Il existe deux types de compilateurs que nous utilisons pour construire des programmes Linux : Gcc et Clang. GCC est le plus courant jusqu’à présent, c’est pourquoi nous allons l’étudier. Normalement, le programme est déjà installé sur votre système, mais si ce n’est pas le cas, vous pouvez le lancer pour l’installer dans Ubuntu

sudo apt install gcc

Avant de passer à l’écriture et à la construction du programme, regardons la syntaxe et les options du compilateur :

$ gcc options fichier_source_1.c -o fichier_fini

Avec les options, nous indiquons à l’utilitaire ce qu’il doit faire, quelles bibliothèques utiliser, puis nous spécifions simplement les fichiers sources du programme. Examinons les options que nous allons utiliser aujourd’hui :

  • o – écrire le résultat dans un fichier de sortie ;
  • c – créer un fichier objet ;
  • x – spécifie le type de fichier ;
  • l – charger une bibliothèque statique.

C’est à peu près tout ce dont nous aurons besoin. Créons maintenant notre premier programme. Il affichera une ligne de texte à l’écran et, pour le rendre plus intéressant, il calculera la racine carrée de 9. Voici le code source :

#include <stdio.h>

#include <math.h>

int main(){ printf(« losst.pro\n ») ; printf(« Root : %f\n », sqrt(9)) ; return 0 ; }

J’ai intentionnellement ajouté une fonction racine pour montrer comment travailler avec des bibliothèques. Tout d’abord, vous devez construire le fichier objet. Allez dans le dossier source et exécutez

gcc -c program.c -o program.o

Il s’agit de l’étape de compilation. S’il n’y a pas d’erreurs dans le programme, la compilation sera réussie. S’il y a plus d’un fichier source, cette commande est exécutée pour chacun d’entre eux. Ensuite, il faut faire l’édition de liens :

gcc -lm programme.o -o programme

Faites attention à l’option -l, qui permet de spécifier quelles bibliothèques doivent être incluses, par exemple, ici, nous incluons la bibliothèque des fonctions mathématiques, sinon l’éditeur de liens ne trouvera pas l’emplacement de telle ou telle fonction. Ce n’est qu’après cela que nous pouvons exécuter le programme :

./programme

Bien sûr, toutes ces étapes peuvent également être réalisées à l’aide de différents environnements graphiques, mais en faisant tout manuellement, vous pouvez obtenir une meilleure compréhension de la façon dont les choses fonctionnent. Avec la commande ldd, vous pouvez voir quelles sont les bibliothèques utilisées par notre programme :

ldd ./programme

Il s’agit des deux bibliothèques du chargeur de démarrage, la libc et la libm standard, que nous avons insérées.

Automatisation de la construction

Lorsque l’on parle de programmation sous Linux, il est impossible de ne pas mentionner le système d’automatisation de la construction des programmes. En effet, lorsque les fichiers sources d’un programme sont nombreux, il n’est pas nécessaire d’entrer manuellement des commandes pour les compiler. Vous pouvez les écrire une fois et les utiliser partout. Pour cela, il existe un utilitaire make et des fichiers Makefile. Ce fichier est constitué de cibles et a cette syntaxe :

target : dependencies command

La dépendance de la cible peut être un fichier ou une autre cible, la cible principale est all et la commande effectue les actions nécessaires à la construction. Par exemple, pour notre programme, un Makefile pourrait ressembler à ceci

all : programme

program : program.o gcc -lm program.o -o program

programme.o : programme.c gcc -c programme.c -o programme.o

Il ne vous reste plus qu’à exécuter la commande make pour lancer la compilation, en veillant à supprimer tous les fichiers temporaires précédents et le programme compilé :

make

Le programme est à nouveau prêt et vous pouvez l’exécuter.

Conclusion

La création de programmes Linux est amusante et passionnante. Vous le constaterez par vous-même une fois que vous aurez pris le coup de main. Il est difficile de tout couvrir dans un article aussi court, mais nous avons couvert les bases et celles-ci devraient vous servir de point de départ. Dans cet article, nous avons couvert les bases de la programmation sous Linux, si vous avez encore des questions, n’hésitez pas à les poser dans les commentaires !