Calculabilité, modularité et paradigmes de programmation
Programme en tant que donnée, notion de calculabilité et indécidabilité du problème de l'arrêt, modularité (modules, API, interfaces), paradigmes impératif, fonctionnel et objet, et gestion des bugs.
1. Programme en tant que donnée
Définition
Un programme est lui-même une donnée : un compilateur prend un programme en entrée et produit un autre programme ; un interpréteur l'exécute ; un système d'exploitation charge des programmes en mémoire. Cette idée remonte à Alan Turing (1936) et sa machine universelle.
2. Calculabilité et problème de l'arrêt
Propriété · Indécidabilité
Une fonction est calculable s'il existe un algorithme qui la calcule. Turing a démontré qu'il n'existe aucun programme arret(prog, x) capable de dire, pour tout programme et toute entrée, si le programme s'arrête : le problème de l'arrêt est indécidable.
Exemple · Idée de la preuve
def paradoxe(p):
if arret(p, p):
while True:
pass
return 0Si paradoxe(paradoxe) s'arrête, alors arret répond vrai et le programme boucle ; s'il boucle, arret répond faux et il s'arrête : contradiction. Donc arret ne peut pas exister.
3. Modularité
Définition
Un logiciel est découpé en modules qui proposent une interface (ou API) documentée : on peut les utiliser sans connaître leur implémentation, les tester et les remplacer séparément. En Python, un fichier outils.py s'importe avec import outils.
4. Paradigmes
Propriété · Trois styles
Impératif : suite d'instructions qui modifient l'état (variables, boucles). Fonctionnel : composition de fonctions sans effet de bord, sans modifier les données (fonctions pures, récursivité, map, filter, fonctions passées en argument). Objet : objets regroupant données et méthodes. Python permet les trois ; d'autres langages en privilégient un (Haskell : fonctionnel ; Java : objet ; C : impératif).
Exemple · Même calcul, deux paradigmes
# impératif
s = 0
for x in t:
if x > 0:
s = s + x * x
# fonctionnel
s = sum(map(lambda x: x * x, filter(lambda x: x > 0, t)))Activité · Créer un module
geometrie.py contenant aire_disque(r) et perimetre_disque(r) documentées, puis les utiliser depuis main.py.import geometrie ; geometrie.aire_disque(2) ; help(geometrie) affiche la documentation.Attention · Bugs
Erreurs fréquentes : dépassement de capacité, erreurs d'arrondi des flottants, effets de bord inattendus, accès hors limites, mauvaise gestion des cas limites. Les tests, les assertions et la relecture du code limitent leur nombre.
S'entraîner
Exercices corrigés
🎓 20 exercices corrigés et un quiz vous attendent dans ce chapitre.
Créez votre compte gratuit pour voir les corrections, faire les quiz et suivre votre progression.
Programme comme donnée
★☆☆Citer deux programmes qui prennent un programme en entrée.
Calculable
★☆☆Qu'est-ce qu'une fonction calculable ?
Problème de l'arrêt
★★☆Énoncer le résultat de Turing sur le problème de l'arrêt.
Paradoxe
★★★Expliquer la contradiction obtenue avec paradoxe(paradoxe).
Conséquence pratique
★★☆Pourquoi aucun logiciel ne peut-il détecter à coup sûr toutes les boucles infinies ?
Turing
★☆☆Qui est Alan Turing ?
Module
★☆☆Quel est l'intérêt de découper un programme en modules ?
API
★★☆Qu'est-ce qu'une API ?
Importer
★☆☆Comment importer seulement la fonction sqrt du module math ?
Paradigme impératif
★☆☆Qu'est-ce qui caractérise le paradigme impératif ?
Fonction pure
★★☆Qu'est-ce qu'une fonction pure ? Donner un exemple et un contre-exemple.
map
★★☆Que donne list(map(lambda x: x + 1, [1, 2, 3])) ?
filter
★★☆Que donne list(filter(lambda x: x % 2 == 0, range(7))) ?
Fonction en argument
★★★Écrire une fonction appliquer(f, t) qui renvoie la liste des f(x) pour x dans t, sans map.
Traduire en fonctionnel
★★★Réécrire en style fonctionnel : calculer la somme des longueurs des mots de plus de $3$ lettres d'une liste.
Langages et paradigmes
★☆☆Associer un paradigme principal à : Haskell, Java, C.
Bug célèbre
★★☆En 1996, la fusée Ariane 5 a explosé à cause d'un bug : la conversion d'un flottant en entier sur $16$ bits a débordé. De quel type d'erreur s'agit-il ?
Effet de bord
★★☆Pourquoi les effets de bord rendent-ils les programmes plus difficiles à tester ?
Documentation
★☆☆Comment afficher la documentation d'un module en Python ?
Vrai ou faux
★★☆a) Le problème de l'arrêt est décidable. b) Python est multi-paradigme. c) Une fonction pure peut modifier une variable globale.
Vérifier
Avez-vous bien compris ?
Répondez au quiz : la correction s'affiche immédiatement.