Nous allons utiliser quelques outils de base pour pouvoir écrire des programmes en langage C, les compiler, et les exécuter.
Cartes de référence ...indispensable...
Une carte de référence, refcard en anglais, est un condensé de notes sur un sujet donné, un logiciel, etc. Des cartes de références pour les outils que nous allons utiliser sont disponibles. Des copies de ces cartes vous sont distribuées.
Durant ces travaux pratiques, les cartes de références suivantes vous seront particulièrement utiles :
- Carte de référence de GNU Emacs à
https://www.gnu.org/software/emacs/refcards/- Carte de référence Unix (shell bash) à
http://www.ai.univ-paris8.fr/~djedi/poo/unix-refcard.pdf- C Reference Card (ANSI) à
http://www.math.brown.edu/~jhs/Gardez ces cartes avec vous !
1.1 Un shell
Pour éditer, compiler et tester vos programmes, un shell qui s’exécute dans un terminal texte est très pratique. Nous utilisons le shell bash.
Rappelez-vous que :
- pour compléter une ligne, on utilise la touche <→∣> (tabulation) ;
- pour reexécuter une ligne, on utilise la touche <↑> (flèche haut);
- pour récupérer le code de retour d’un programme, on utilise la commandeecho $?.
La recheche de documentation est une des opérations essentielles que vous devez savoir faire avec un shell. Vous avez été aguerri à l’utilisation d’un shell dans le cadre du Stage Unix dispensé au semestre précédent.
Pour mémoire, vous pouvez consulter les pages du stage :
http://www.fil.univ-lille1.fr/~sedoglav/SHELL/Consultez aussi la refcard bash pour prendre en main votre shell.
Exercice 1 (Trouver la documentation avec votre shell) Quelle commande pouvez-vous utiliser pour consulter la documentation du shell ? Comment l’utiliser pour consulter l’aide de echo ?
Exercice 2 (Souffleur) Comme vous le savez déjà la touche tabulation <→∣> peut vous aidez à souffler une commande dont vous avez saisi les premiers caractères. Cependant, il est aussi possible de l’utiliser pour souffler des paramètres pour la plupart des commandes standard. Combien de commandes documentées par le manuel commence par e ?
Exercice 3 (Manuel de la librairie standard) Dans la suite de l’énoncé, nous utiliserons une fonction de la librairie standard du langage C. Il s’agit de la fonction putchar(). Les fonctions C de la librairie standard sont documentées dans le manuel du shell. Comment pouvez-vous consulter la documentation ? Et comment réutiliser la ligne de commande saisie lors de l’exercice précédent ?1.2 Un éditeur, Emacs
Nous vous conseillons d’utiliser emacs comme éditeur de fichier texte. Cet éditeur vous permettra d’écrire vos programmes source en langage C. En pratique n’importe quel éditeur de fichiers textes convient. Cependant emacs prend en charge les fichiers sources écrits en langage C et rend leur lecture et leur édition plus agréables.
Il s’agit de vous assurer que vous disposez bien de emacs. En fait, il faut que vous disposiez d’une version au moins égale à Emacs 25.
Exercice 4 (Recherche dans le manuel en ligne) Comment trouver dans l’aide en ligne l’option de la commande emacs qui permet de connaître le numéro de version de votre logiciel ? Plus particulièrement, comment chercher «version» dans les 417 lignes du manuel, relatif à emacs ?
Exercice 5 (Emacs) À l’aide de ce que vous avez trouvé dans le manuel, déterminez le numéro de version de votre emacs ?Consultez la carte de référence emacs pour prendre en main cet éditeur.
Exercice 6 (C-et M-) Que signifient les notations <C-> et <M-> utilisées dans cette carte de référence ?1.3 Une forge, GitLab
Tout au long du semestre, vous allez rendre vos travaux via GitLab. GitLab est une forge qui permet de gérer des dépôts Git.
Git est un logiciel de gestion de versions. Un dépôt Git permet de stocker un ensemble de fichiers en conservant l’historique de toutes les modifications qui ont été effectuées sur ces fichiers.
Il permet de plus de partager cette gestion entre plusieurs utilisateurs et depuis différentes machines (chez vous et à la fac par exemple).
Vous avez accès à un dépôt Git sur GitLab à l’adresse
https://gitlab-etu.fil.univ-lille1.fr/ls4-pdc/introce dépôt contient les éléments nécessaires à la réalisation du présent TP de PdC.
Vous ne pouvez pas directement travailler sur ce dépôt, vous allez devoir réaliser un fork. Un fork vous permet de copier ce dépôt, et d’obtenir votre propre copie sous forme d’un dépôt GitLab sur lequel vous pourrez travailler.
Exercice 7 (Forker un dépôt GitLab) Authentifiez vous sur GitLab avec votre nom d’utilisateur et mot de passe du FIL, et accédez au dépôthttps://gitlab-etu.fil.univ-lille1.fr/ls4-pdc/intro-g<i>-y<yy><i> étant votre numéro de groupe et <yy> l’année en cours, par exemple intro-g7-y42 pour le groupe 7 en 2042.Réalisez un fork de ce dépôt.
Il est nécessaire d’inviter les personnes qui vont devoir travailler sur ce dépôt via la fonction Members du menu Settings (se trouvant dans la barre de navigation de gauche sur la page du dépôt). Quand vous ajoutez une personne dans le dépôt, vous pouvez lui donner un rôle (par exemple développeur).
Exercice 8 (Ajouter des personnes sur un dépôt) Ajoutez votre binôme et votre enseignant dans votre dépôt, en tant que développeurs.Votre dépôt sur GitLab est maintenant prêt. Toutefois, ce dépôt est sur le serveur GitLab, c’est donc ce qu’on appelle un dépôt distant. Pour commencer à travailler, vous devez créer une copie locale (c’est-à-dire sur votre machine de TP) de ce dépôt distant. Cette action s’appelle cloner un dépôt.
Quelle est la différence entre un fork et un clone ?
- le fork permet de créer une copie d’un dépôt GitLab, sous forme d’un autre dépôt GitLab. Les deux dépôts sont donc des dépôts distants, et l’opération se fait via l’interface web de GitLab ;
- le clone est réalisé par une commande git clone à taper dans votre terminal, et produit une copie local du dépôt sur laquelle il va être possible de travailler.
Exercice 9 (Cloner votre dépôt) Clonez votre dépôt GitLab vers le dossier de votre choix.Attention : clonez bien votre dépôt (celui résultant du fork) et non pas le dépôt GitLab original. Depuis l’interface web de GitLab, vous pouvez lister vos dépôts via l’action de menu Projets → Your Projects.
Une fois votre dépôt cloné, vous pouvez travailler dans le répertoire local en modifiant ou ajoutant des fichiers. Ensuite, pour valider ces modifications, vous devez réaliser un commit. Le commit permet d’enregistrer des modifications ou ajouts de fichiers dans le dépôt, de manière versionnée. Avant chaque commit, il faut indiquer à Git l’ensemble des fichiers modifiés (ou ajoutés).
Exercice 10 (Modifier le dépôt local)Il s’agit maintenant de valider ces modifications et de les enregistrer dans le dépôt local.
Exercice 11 (Enregistrer les modifications locales)
- Exécutez la commande
qui affiche l’état, modifié, ajouté, ou supprimé de vos fichiers par rapport au dépôt local.bash$ git status- Identifiez ensuite les fichiers dont vous désirez enregister les modifications dans votre dépôt local via la commande git add (que le fichier ait été modifié ou ajouté).
- Exécutez à nouveau la commande
qui affiche à nouveau l’état de votre dépôt local.bash$ git status- Précisez la nature des modifications apportées à l’ensemble de ces fichiers par un commit :
bash$ git commit -m "solution premiers exercices"- Affichez une nouvelle fois l’état de votre dépôt local.
Votre dépôt local a étét modifié grâce à votre commit, mais cette modification n’est pas encore répercutée sur le dépôt distant (sur GitLab). L’envoi des commits d’un dépôt local vers un dépôt distant s’appelle un push.
Exercice 12 (Pousser une modification) Réalisez un push de votre commit sur votre dépôt distant GitLab.L’opération réciproque du push s’appelle le pull, elle permet de mettre à jour vôtre dépot local, en récupérant les commits depuis le dépôt distant.
Exercice 13 (Garder le dépôt local à jour) Demandez à votre binôme de travailler sur sa session pour
- réaliser une copie locale de votre dépôt GitLab ;
- ajouter son nom dans le fichier Readme.md et ajouter un fichier exo-emacs.txt avec la réponse à l’exercice 6 ;
- enregister ces modifications dans son dépôt local par git add et git commit ;
- pousser ces modifications sur le dépôt du serveur GitLab.
Cela fait, mettez à jour votre dépôt local à l’aide de la commande
bash$ git pullet vérifiez que vous voyez bien les modifications réalisées par votre binôme.
1.4 Un compilateur
Nous vous conseillons d’utiliser gcc pour compiler vos programmes. Un compilateur de langage C est un programme qui lit un fichier texte contenant le code source contenant un programme écrit en C, et qui le traduit en un code exécutable qu’un microprocesseur peut exécuter. Le code exécutable par le microprocesseur est composé d’une suite d’octets qui doivent être compris comme autant d’instructions et de données à l’attention du microprocesseur. Il ne constitue donc pas un texte et n’est pas lisible par un humain.
Les microprocesseurs qui équipent vos machines ne savent exécuter qu’un seul type de code, que l’on appelle souvent code exécutable, code machine ou encore, de manière impropre code binaire. Le compilateur fait une fois pour toute l’opération de traduction. D’autres langages tel que Python font cette traduction à chaque exécution, on parle alors d’interpréteurs, et de langage interprété. Notez encore qu’il existe des langages hybrides qui tel que Java, qui recourrent à un compilateur pour transformer le source dans une représentation intermédiaire aussi appelée bytecode. C’est alors une machine virtuelle qui termine, lors de chaque exécution, la traduction.
Exercice 14 (Un compilateur, gcc) La commande gcc transforme donc un code source en code exécutable. En considérant que le code source est dans le fichier prog1.c et que vous souhaitez produire un programme executable dans prog1, quelles sont les options qu’il faut saisir pour compiler votre code source dans votre code exécutable ? (Vous pouvez consulter le manuel en ligne !)Compilateurs C ...en savoir plus...
Dans l’UE Pratique du C, nous utilisons gcc mais il existe bien d’autres compilateurs de code source en langage C vers du code exécutable. Au nombre des plus connus, on trouve : clang, icc (d’Intel) ou encore cl (de microsoft).
En général le compilateur produit un code exécutable pour le microprocesseur de l’ordinateur sur lequel le compilateur est exécuté. Cependant il est possible d’utiliser un compilateur pour produire un code exécutable destiné à un autre microprocesseur. Par exemple, on peut compiler un code C sur un PC/Linux (processeur intel) avec un compilateur arm-gcc qui produit un code exécutable pour processeur ARM (qui équipent notamment les smartphone). Dans ce cas le code exécutable produit par arm-gcc ne pourra pas être exécuté sur la machine qui l’a compilé, mais seulement sur le smartphone visé. On parle de cross-compilation.
![]()
![]()