====== les rudiments de la programmation en C en 28 courtes sessions. ======
**Notes de travail préparatoires à l'écriture d'article et réalisation d'ateliers
Ouvertes à modifications et commentaires (s'il faillait préciser)**
De “Hello, World !” Jusqu'à terminer par un cas pratique de sécurité de l'information (rootkit)
Apprendre, depuis le niveau débutant·e, les rudiments de la programmation en C en 28 courtes sessions.
De ''Hello, World!'' Jusqu'à terminer par un cas pratique de sécurité de l'information ([[wp>fr:Rootkit|rootkit]]).
C'est en anglais, c'est rustre dans le sens où cela oblige la personne apprenante à chercher par elle-même des informations contextuelles.
Ça fait le taf !
Si ça tente quelqu'un·e de le (re)faire à rythme choisi et d'en discuter...
https://github.com/h0mbre/Learning-C
{{ c_draw_starter.png }}
====== Zéro : Démarrer ======
Il peut y avoir des termes et/ou des supposés qui vous ennuis voir vois refoule l'accès à cette petite expérience. Essayons de les contourner ensemble.
> « Si on se sait pas qu'il faut compiler comment apprend-on ? » G.M quelque part sur Internet
Peut-être séduit⋅e par une annonce accrocheuse un peu trop prometteuse vous souhaitez vous lancer dans cette courte aventure d'apprentissage. Il nous faut alors se débarrasser de quelques non-dits gênants, franchir quelque gué dans les mots utilisés et accompagner les petits pas qui vous êtes prêt⋅e⋅s à tenter.
Tout d'abord, cette //ressource// proposée en lien dans l'introduction est en anglais, comporte 28 exercices ou missions (assignement) d'apprentissage, et ne contient que très peu d'explication.
**Commençons par choisir de parcourir ces missions ensemble, à travers ces notes de travail et à travers plusieurs articles blog sur https://xavcc.frama.io que l'on propose de répartir par __unité pédagogique d'environ 5 missions par article (en fonction du degrés de difficulté)__**
Ensuite, choisissons une posture d'égalité en pair : **Je ne sais pas plus que vous, il est même possible que vous ignoriez que vous savez déjà des choses. Et j'avoue mes ignorances pour progresser ensemble**
**Il s'agit dans cette démarche de faciliter l'initiation, et cela réciproquement**. Il n'est pas choisi de tutorer ou de mentorer
Puis essayons d'user d'un langage clair et d'accompagner à la traduction, compréhension, de termes anglais.
Il est également vrai que ce dossier https://github.com/h0mbre/Learning-C pose avant même de commencer une marche abrupte dans le début du parcours d'apprentissage. Ce problème reflète une myriade de présupposés d'appréhensions techniques et de maitrise d'us et coutumes qu'il nous faut accompagner dans leur préhension.
Il ne s'agit pas dans les articles à venir de surcharger en contenu et en informations supplémentaires une ressource qui est efficace et séduisant par son juste dépouillement et sa claire simplicité. **Il s'agit de faire clair et net ensemble et d'ouvrir des fenêtres vers une autonomie des questionnements et de pratique**
===== Juste avant zéro =====
La langage C date des années 1970 et reste aujourd'hui en 2019 un langage de programmation majeur. Il est considéré comme relativement simple d'apprentissage. Vous trouverez sur Internet et en librairie de très nombreux ouvrages, sous diverses formes, qui vous proposeront d'aborder le lanage C sous différents besoins métiers ou par différents niveaux de connaissance.
La ressource que nous proposons d'aborder s'ancre dans les formats que l'on pourrait qualifier //d'initation à moment choisi en court temps par étapes circonscrites avec objectif de réalisation//.
Pour résumer plus synthétiquement : 28 petits exercices à faire vous-même ou avec d'autres qui vous amène à réaliser au final un objet plus ou moins proche d'une réalité professionnelle.
La personne à l'origine du parcours résume assez bien cela
> « //De plus, chaque cours de programmation devrait commencer par l'impression de "Hello, World" et se terminer par la création de logiciels malveillants, j'en suis convaincu.// » (also, every programming class should begin with printing "Hello, World!" and end with building malware i'm convinced.) **[[https://github.com/h0mbre|h0mbre]]**
Cette déclaration illustre assez bien des questions de sécurité, de traitement et de circulation de l'information, quotidiennes et présentes, avec un langage qui est par prédilection utilisé en programmation des systèmes et en progrommation des réseaux.
Une traduction littérale de //malware// pourrait être logiciel ou programme malveillant ou dangereux. Il s'agit ici dans notre exemple d'un programme pensé et conçu et pour mettre en évidence des risques à l'intérieur d'une infrastrurture de production et de traitement de l'information et pour l'extérieur de cette infrastructure. La conception de ce programme n'est pas neutre, et il ne s'agit d'une forme virale destinée à se propager par elle-même. **C'est ici une « trousse d'administration » avec //dissimulation de l'activité de la personne qui opère avec cette trousse//** qui vise
* **D'abord à comprendre des enjeux techniques et sociétaux**
* **Ensuite à envisager le contexte dans lesquels surviennent des failles ou fuites d'informations**
Vous faire découvrir une forme d'écriture et vous entrainer à la compréhension des livres et de leur conception ne fait pas de vous un⋅e hors-la-loi
C'est aussi un objectif pédagogique et réalisation technique atteignable à temps court et en commençant d'une petite marche.
Nous tenterons de conserver cet élan dans les différentes étapes de notre parcours
===== Un rapide tour d'horizon =====
==== Très rapide historique du langage ====
Avant C existait le [[wp>fr:B_(langage)|langage B]], le langage C se nomme en référence à son prédécesseur conçu aux USA dans les Bell Telephone Laboratories, fondés par Graham Bell en 1925.
Le langage C a été créé par [[wp>fr:Dennis_Ritchie|Dennis Ritchie]] lui aussi au sein du Bell Telephone Laboratories en 1972 à dessein de développer le système d'exploitation UNIX.
Rapidement devenu un langage très utilisé avec des diversités d'état donné dans l'évolution de ce langage, autrement dit avec des versions du langage différentes. Pour apporter une forme de régulation dans ces diversités qui posaient des problèmes de compatibilités entre différentes versions, une définition d'un standard pour la lanage C est conçue en 1983 par l'American National Standards Institut (ANSI) qui est toujours la base de référence aujourd'hui en 2019.
==== Pourquoi C ====
Il existe de nombreux langages de programmation, de nouveaux langages sont conçus régulièrement. Chacun ayant des avantages et des inconvénients.
Pour le Langage C :
* **Il est souple et puissant**, utilisé pour des projets variés de tableurs, de textes, de systèmes d'exploitations, en sécurité informatique…
* **Le langage C est portable** (Norme ANSI). Un programme écrit en C sur un ordinateur avec ses spécificités machines sera utilisable après compilation sur toute autre machine (parfois avec quelques rares modifications)
* Lorsqu'un nouvelle architecture apparaît (Nouvel OS, nouveau processeur…), **le langage est souvent dans les tous premiers disponibles pour une architecture**.
* **le langage C contient peu de mot**. Une poignée d'expression appelée mots clés servent de bas pour élaborer des fonctions
* **Le langage C est modulaire**, il peut, et c'est encouragé, être écrit dans un design de sous-programmes appelés fonctions. En //passant// des information sà ces fonction on obtient du code réutilisable.
==== Écrire avant de programmer ====
Au travers de différents petits étapes, nous essaierons de faire passer les personnes apprenantes dans des situations dites //d'ignorance//, c'est à entendre comme faire face à des information et des concepts que ces personnes ne maîtrise pas encore.
Il s'agit avant d'écrire, de commettre des erreurs, de les corriger en réécrivant, d'être amené⋅e⋅s à chercher quelques compléments d'information par soi-même de temps en temps, de récrire et de lire les résultats donnée en sortie d'erreur tout au long du cycle de développement et aussi lors de la manipulation du programme conçu. Pour **découvrir** et **apprendre**.
==== Cycle de développement d'un programme ====
Cette considération du concept de cycle de développement dans le Langage C est importante.
- **Création de code source**
* Avec un éditeur de texte (gedit, edit, Notes, Mousepad, VSCodium…)
* création du code source
- **Compilation du code source**
* avec un compilateur [[https://gcc.gnu.org|GnuCC]] (''cc''), ou Compilatuer C Unix (''cc''), ou C Borderland (''bcc'') ou, Turbo C Borderland (''tcc'')
* Création du code objet
* Afin de vérifier que notre code est exécutable
- **Création d'un exécutable**
* C'est l'instruction de livrable en sortie de compilation que nous donnons à notre compilateur
* Exécuter la liaison du fichier objet
* Vérifier qu'aucune erreur apparaît ou corriger cette erreur en revenant à l'étape 1
* Exécuter le programme et contrôler les résultats obtenus
- **Fin du cycle de développement**
===== Utiliser le dossier ressource =====
**Le dossier accessible par github** est-ce un problème ? Qu'est ce que cela signifie pour moi / vous ?
* Github est un site internet très //populaire// qui fonctionne comme une bibliothèque de partage de code informatique, également de fichiers contenants d'autres formes d'informations
* Github a été récemment racheté par l'entreprise Microsoft, dont l'une des stratégies est littéralement «[[wp>fr:Embrace,_extend_and_extinguish |Adopte, étend et étouffe]] »
* Vous n'avez dans la plupart des cas par besoin d'un compte github pour lire, télécharger, réutiliser une ressource. **En respectant la licence attribuée à cette ressource**
* Github a des fonctionnalités qui visent à faciliter la collaboration des plusieurs personnes sur une ou plusieurs ressources
* Dans le cas qui nous intéresse nous avons uniquement besoin de lire la ressource concernant les missions à réaliser pour s'initier au langage C
* Vous pouvez le faire début un navigateur web avec l'adresse https://github.com/h0mbre/Learning-C dans la barre de navigation
* Vous pouvez la consulter hors ligne en :
* Téléchargeant depuis le bouton Clone or download
en vert à droite sous contributors
, puis en allant sur Download Zip
écrit en bleu
* ou directement depuis https://github.com/zweed4u/Learning-C/archive/master.zip
* Si vous utilisez déjà [[wp>fr:Git]], vous pouvez également utiliser un terminal et la commande ''git clone https://github.com/zweed4u/Learning-C.git''
===== Pour s'échauffer avant les 6 premières missions =====
Vous allez dans ce premières étapes probablement trouver plusieurs éléments qui viendront heurter //ce que vous ne savez pas encore//.
Des mots parfois vous donner l'impression de vous perdre.
Cela pourrait aussi être l'usage d'un compilateur et d'un terminal, ou de l'usage de ''#include stdio.h'' dans le code source ou encore l'usage de ''./'' pour exécuter un programme.
Nous essayerons de vous aider à comprendre petites étapes par petites étapes.
====== Missions de 1 à 6 ======
===== Avant de démarer : quelques bases =====