1. Un programme est aussi une donnée

Un programme n’est pas seulement quelque chose qu’on exécute : c’est d’abord un texte (une suite de caractères) stocké dans un fichier. Comme n’importe quelle donnée, ce texte peut être copié, envoyé, lu, analysé ou même transformé.

Idée centrale : si le code est une donnée, alors un programme peut manipuler d’autres programmes (compilateur, interpréteur, IDE, analyseur de code…).

Exemple 1 : Stocker du code dans une chaîne


programme = """
def carre(x):
    return x*x
"""
print(programme)

Exemple 2 : Exécuter une donnée contenant du code


code = "print(2 + 3)"
exec(code)
Attention : exécuter du code reçu d’une source inconnue est dangereux. Ici, c’est uniquement un exemple pédagogique.

2. Calculabilité : « Existe-t-il un algorithme ? »

Un problème est dit calculable s’il existe un algorithme qui, pour toute entrée valide, produit une réponse en un nombre fini d’étapes (même si c’est long).

Point important : un problème peut être calculable même si la durée est énorme. La calculabilité ne parle pas de rapidité, mais d’existence d’un algorithme.

La calculabilité ne dépend pas du langage

Python, C, Java… changent la manière d’écrire, mais pas ce qui est calculable. Dès qu’un langage permet variables, tests, boucles et mémoire, il peut simuler les mêmes algorithmes.

Donc : si un problème est calculable, il l’est dans n’importe quel langage « suffisant ». Le langage influe surtout sur la lisibilité, la sécurité et les performances.

3. Décidabilité : « Peut-on toujours répondre OUI/NON et terminer ? »

Un problème est décidable s’il existe un programme qui, pour toute entrée, renvoie OUI ou NON et termine toujours.

Décidable ≠ rapide.
Décidable signifie : réponse correcte + terminaison garantie.

4. Le problème de l’arrêt

On aimerait un programme capable de répondre à la question suivante :

Étant donné un programme P et une entrée x, est-ce que P(x) s’arrête (termine), ou bien boucle à l’infini ?

Si un tel programme existait, il pourrait détecter toutes les boucles infinies et certifier que n’importe quel programme termine. Mais nous allons voir que c’est impossible.

5. Pourquoi c’est indécidable (preuve par l'absurde)

Supposons (pour raisonner) qu’un programme parfait arrete(p) existe : il renvoie True si p s’arrête, sinon False.

Construisons un programme paradoxal qui utilise arrete :


def paradoxal(p):
    if arrete(p):        # si p s'arrête...
        while True:      # ... alors je boucle
            pass
    else:                # si p ne s'arrête pas...
        return "Je m'arrête"

Maintenant, on lance paradoxal(paradoxal).

Dans tous les cas, le programme « parfait » se trompe.
Conclusion : un tel programme n’existe pas : le problème de l’arrêt est indécidable.
Ce résultat pose une limite fondamentale de l’informatique : tout n’est pas calculable.

6. Ce que cela implique en pratique

7. À retenir

  • Programme = donnée : le code peut être stocké et manipulé.
  • Calculable : il existe un algorithme qui donne une réponse.
  • Décidable : il existe un algorithme OUI/NON qui termine toujours.
  • Problème de l’arrêt : il est indécidable.