Programmes et données

Signaler

Il n’y a pas de différence de nature entre fonctions ou méthodes (codant des programmes) et les données ou paramètres de ces fonctions. La puissance de l’informatique d’aujourd’hui découle grandement de cette constatation.

I. L’interpréteur Python

Lorsque nous lançons la commande : python prog.py, il y a bien un programme derrière la commande python. Ce programme prend prog.py en entrée et le lance en procédant au passage à des vérifications syntaxiques (indentation, nommage, etc.), puis exécute et affiche ce qui est demandé dans prog.py et s’arrête.

On désigne communément cette commande python sous le nom d’interpréteur Python (nous verrons qu’elle est davantage que cela).

Le cycle d’un interpréteur est le suivant : lire et vérifier une instruction ou une expression, si l’instruction est correcte l’exécuter, ou évaluer l’expression, puis passer à l’instruction suivante.

Mot-clé

On parle parfois aussi de REPL (Read Eval Print Loop ou boucle de lecture/évaluation) lorsqu’on lance l’interpréteur Python pour obtenir l’invite >>>.

Nous pouvons en conclure que cet interpréteur Python prend en entrée des programmes, les exécute ligne après ligne, puis se termine généralement.

Si un programme met plus d’une minute à s’exécuter, que devons-nous en conclure ? Ce programme est peut-être un peu long à répondre, à moins qu’il ne soit parti dans une boucle infinie ? Peut-on le prévoir à l’avance en analysant le code du programme de manière automatique ?

II. Des programmes de test

Un programme de test comme pytest.main prend également en entrée une liste de programmes et lance tous les tests qu’ils contiennent :

60a040a7-19c2-44ef-ba48-82c0ab5fe6ee

Il s’agit ici d’un programme qui pilote et lance d’autres programmes de test qui vont vérifier le comportement de certaines fonctions. Ces tests peuvent même être lancés automatiquement, couplés à des systèmes de gestion de version comme git. On parle alors d’intégration continue.

Les décorateurs Python sont un autre exemple de fonction qui prend en entrée une fonction pour retourner une fonction « décorée ».

III. Virus et antivirus

Un programme antivirus se lance sur un système d’exploitation (OS) donné et examine tous les fichiers susceptibles d’être infectés, au premier rang desquels on trouve tous les fichiers exécutables installés dans l’OS. Il s’agit donc bien ici d’un programme qui scanne d’autres programmes pour essayer d’y trouver éventuellement des séquences suspectes.

Le virus, quant à lui, est un programme qui vise à installer des séquences de code malveillant et qui cherche à se répliquer et ainsi infecter d’autres fichiers ou machines. C’est donc encore un programme qui prend en en entrée des programmes pour en produire d’autres, infectés.

IV. Un système d’exploitation

Les systèmes informatiques d’aujourd’hui sont des programmes très complexes qui doivent gérer d’autres programmes en leur donnant accès à certaines ressources comme les systèmes de fichiers ou les réseaux, tout en veillant, dans la mesure du possible, à ne jamais s’arrêter.

Nous avons étudié en Première l’interpréteur Bash dont beaucoup de commandes prennent en entrée des listes de fichiers qui peuvent ou non être des programmes. Dans un système d’exploitation moderne, la distinction entre programme et donnée est très ténue !

On observe une grande perméabilité entre la notion de donnée et celle de programme en informatique. Cette perméabilité a été un grand facteur de progrès permettant la construction de véritables cathédrales que sont les systèmes d’exploitation modernes grâce aux outils puissants que sont les interpréteurs et compilateurs. Elle est à l’œuvre dans beaucoup de développements récents de l’informatique. Nous la retrouverons dans les aspects théoriques comme le problème de l’arrêt.

V. Développement hybride

De nombreuses plateformes logicielles modernes permettent de développer des applications multi-plateformes, comme Electron pour des applications de bureau ou Flutter qui permet de cibler différentes plateformes mobiles à partir d’un code unique. Unity3D permet le développement de jeux vidéo multi-plateformes.

Tous ces outils utilisent des techniques de développement hybride. On écrit une seule version du code et on peut ensuite cibler une multiplicité de plateformes comme Android, iOS, Linux, Windows, MacOS, etc. à partir de cet unique développement. On voit ici que la plateforme est un outil logiciel qui prend en entrée un code donné et fournit en sortie différentes applications adaptées.