Cours d'informatique centré sur la programmation en langage C destiné originellement aux étudiants de première année du cursus ISMIN (Ingénieur Systèmes Microélectronique et INformatique) de l'EMSE (École des Mines de St-Étienne).
Toutes les dépendances peuvent être installées via apt-get.
-
inkscape nécessaire pour l'insertion des fichiers au format SVG lors de la compilation LaTeX
-
essayer miktex (dernière version). Si bug d'encodage UTF-8 (non corrigé à ce jour), alors installer texlive-full
Se placer dans le répertoire racine et écrire la suite de commandes :
pdflatex -shell-escape main.tex
pdflatex -shell-escape main.tex
bibtex main
pdflatex -shell-escape main.texRQ : les deux dernières commandes servent à mettre à jour les références BibTex de citations. Elles sont nécessaires pour la première compilation des sources et ne le sont plus ensuite si aucune nouvelle référence n'est ajoutée.
Le fichier généré est main.pdf.
Évidemment, rien ne sera fait...
Il faut penser à matérialiser les opérateurs logiques par des circuits, pour faire comprendre que c'est pas juste du blabla théorique.
Décrire la logique propositionnelle, pour être rigoureux sans fucked upé les notations des opérateurs logiques (ou au moins pour introduire en douceur). Et aussi pour parler de SAT (qui est utilisé dans l'industrie, recherche opérationnelle notamment)
Une introduction à la logique est de toutes les façons obligatoires pour discuter :
- de bases de données et de SQL (mais c'est chiant donc éviter sauf si quelqu'un un jour n'a pas la flemme)
- de circuits numériques (on parle a priori pas de modelchecking)
Ça permet aussi de faire facilement le lien entre la théorie et la matière avec les circuits logiques comme réalisation de la logique propositionnelle.
- introduire un peu plus précisement les bases d'architecture des systèmes d'exploitations standards (Linux/Windows, on essaie au plus de présenter des techniques présentes partout, mais focus sur Linux parce-que fuck Windows)
- décrire plus précisément l'architecture physique moderne (en particulier : cycle et coûts différents des opérations, cache et accès mémoire, pages et mémoire virtuelle, prédiction, ...)
- Présenter la récursivité (et les optimisations de fonctions récursives terminales, présentes dans GCC -O2 et au dessus)
- régler le problème des exercices qui demandent des démonstrations alors que le/la lecteur/lectrice sait pas forcément faire
- IMPORTANT : ajouter une section sur les assert et introduire aux tests et à ACSL
SIMPLIFIER LE DISCOURS ET MOTIVER INDUSTRIELLEMENT (les étudiants ont pas forcément tous conscience que la théorie joue un rôle important dans le monde réel en informatique, ex : SAT). DONNER L'INTUITION. DONNER UN TAS D'EXEMPLES RÉELLES
-
finir l'induction structurelle
-
ajouter des exercices de maths
-
tables de hachage : analyse plus précise de la complexité, parler de l'universalité de la classe
$h_{a, b} : k\mapsto (ak + b\mod p) \mod m$ (peut-être juste focus sur cette classe) -
finir les sections sur les graphes
-
ajouter les corrections d'exercice pour la partie théorique
-
détailler les opérations de tamisage sur les tas
Il est absurde de ne pas discuter de preuve/vérification de correction de programmes. Il faut donc ajouter un bout sur les bases de l'analyse de programmes en partie 3
- méthodes humaines de terminaison et de correction partielle
- méthodes formelles de terminaison et de correction partielle :
- introduction d'une restriction du C
- logique de Hoare et ACSL (https://en.wikipedia.org/wiki/ANSI/ISO_C_Specification_Language)
- graphes de flot de contrôle/de données
Presque tout à faire :
- Doxygen (ou équivalent)
- Semantic Versionning (check https://semver.org/)
- présenter le versionning avec git (via un TP de réalisation d'un mini-version de git ce serait optimal)
- GDB
- Tests unitaires (à voir si on met pas dans la partie 2)
- Intégration continue (avec git ?)
- Putnam/Docker pour le test en isolation
Programmation système et réseaux
Bases de données.
Algèbre relationnelle et calcul relationnel + théorème de Codd