Spé. NSI · Terminale · cours rédigé et vérifié par Claryo, conforme au Bulletin officiel
La notion de programme en tant que donnée est l'une des idées fondatrices de l'informatique. Le code source d'un programme n'est rien d'autre qu'une suite de caractères stockée dans un fichier : c'est donc une donnée, au même titre qu'un texte ou une image. Cette donnée peut être lue, copiée, modifiée, analysée ou exécutée par d'autres programmes.
Cette idée a une racine théorique : la machine de Turing universelle. Alan Turing montre qu'une seule machine, recevant sur son ruban le codage d'une autre machine, peut simuler le comportement de cette dernière. La machine reçoit donc un programme sous forme de donnée et l'exécute.
Elle a aussi une racine matérielle : l'architecture de von Neumann. Dans cette architecture, le programme et les données sont stockés dans une même mémoire (principe du programme enregistré). Les instructions sont alors elles-mêmes des données accessibles en mémoire. C'est précisément ce qui rend l'ordinateur universel : un seul matériel peut exécuter n'importe quel programme.
De nombreux outils du quotidien illustrent ce principe. Un compilateur prend en entrée le code source et le traduit en code machine. Un interpréteur lit et exécute le code source instruction par instruction. Un éditeur de texte, un linter ou un débogueur manipulent eux aussi du code comme une donnée. Enfin, en Python, les fonctions sont des objets de première classe : on peut les ranger dans une variable, les passer en argument, les renvoyer. Le code y est donc manipulé comme une donnée ordinaire.
· Compilation : \text{code source} \xrightarrow{\text{compilateur}} \text{exécutable}, puis l'exécutable tourne seul.
· Interprétation : \text{code source} \xrightarrow{\text{interpréteur}} \text{exécution directe} (à chaque lancement).
· Chaîne en Python : f = fonction puis f(x) ; appliquer(f, donnees) applique une fonction passée en argument.
Schéma à connaître : la mémoire de von Neumann contenant à la fois une zone « instructions » et une zone « données », avec un compteur ordinal pointant vers l'instruction courante.
Quand on demande d'illustrer la notion : citer un outil (compilateur / interpréteur / débogueur), préciser sa donnée d'entrée (un programme) et sa sortie. Pour un exercice de code : savoir écrire une fonction qui reçoit une autre fonction en argument (f(x) dans une boucle) et la tester sur un petit exemple.
· Ne pas confondre compilation (traduction préalable) et interprétation (exécution directe ligne à ligne).
· eval transforme une donnée en code exécuté : faille d'injection si l'entrée n'est pas maîtrisée.
· « Universel » ne veut pas dire « rapide » : cela signifie qu'un seul matériel peut exécuter tout programme.
· Une fonction passée en argument n'est pas appelée tant qu'on n'écrit pas f(...).
Retenir le triptyque machine de Turing universelle / architecture de von Neumann / programme enregistré, et savoir le relier à la polyvalence de l'ordinateur. Savoir, sur un exemple Python, manipuler une fonction comme une donnée (passage en argument). Connaître le risque de sécurité de eval sur une entrée non contrôlée.