
Code-Garage #75 - La réflexivité en programmation
Durée: 8m21s
Date de sortie: 03/10/2023
Où comment analyser, inspecter ou modifier le comportement du code pendant son exécution...
Notes de l'épisode :
Salut et bienvenue dans ce nouvel épisode du podcast de Code Garage,
je m'appelle Nicolas Brondin-Bernard et aujourd'hui on va parler de la réflexivité en programmation.
Alors la réflexivité c'est la capacité d'un langage de programmation à examiner voire à
modifier le fonctionnement du code pendant que ce dernier est en cours d'exécution. Alors la
réflexivité ça permet notamment de faciliter l'audit, le debug du code mais aussi l'écriture de
plugin ou le chargement de code à la volée. Alors il faut savoir que la réflexivité ça se
divise en deux notions différentes. Il y a d'abord l'introspection puis l'intercession. Alors certains
langages permettent la réflexivité dans son ensemble, javascript par exemple, d'autres ne
permettent que l'introspection c'est le cas de ces charpes et d'autres encore ne le permettent pas
du tout c'est le cas du langage C. Alors qu'est ce que l'introspection exactement ? Comme on l'a
dit l'introspection c'est la capacité d'un logiciel à inspecter son propre fonctionnement pendant
le runtime pendant l'exécution. Par exemple il est possible de faire du type h dynamique puisque le
type va être géré au moment du runtime, récupérer le nom de la classe d'un objet,
lister les attributs et les méthodes d'une classe etc. Maintenant on va voir ensemble un
exemple d'introspection en javascript comme c'est un des langages où c'est le plus simple à faire.
On va prendre un objet vide qu'on va appeler OBJ puis on va appeler la méthode object donc de la
classe object. On va appeler la méthode get prototype off et on va lui passer notre objet de départ.
Là notre nouvelle variable va contenir la classe object, une référence vers la classe object ce qui va
nous permettre ensuite par exemple d'aller chercher des choses comme proto donc là on l'avait stocké
le prototype dans une variète proto on va pouvoir faire proto.constructor ce qui va nous
renvoyer la méthode utilisée pour construire notre objet. Là on est capable au runtime en javascript
d'avoir un objet quelconque peu importe ça peut mettre un objet que vous avez créé avec des
classes personnalisées etc. Et vous allez pouvoir faire un objet.getprototypeoff récupérer le prototype
donc la classe de cet objet et aller chercher toutes les méthodes les noms de méthode etc. ça
c'est de l'introspection on est capable d'aller chercher des informations dynamiquement pendant
le runtime. Maintenant on va parler d'intercession. L'intercession c'est la possibilité de modifier
le fonctionnement du code pendant l'exécution et ça peut prendre deux formes différentes. D'abord
il y a l'appel dynamique de code existant ensuite il y a l'injection de code alors on va voir aussi
un exemple en javascript. L'appel dynamique de code alors on pourrait très bien reprendre notre
exemple d'introspection où on a réussi à récupérer le constructeur de notre objet et on
pourrait réappeler ce constructeur pour recréer un autre objet ça serait de l'intercession mais on
peut faire autre chose en javascript on va imaginer un objet obj avec à l'intérieur une méthode
qui va s'appeler execute et qui va simplement retourner une chaîne hello world. Et bien ce qu'on
peut faire en javascript au lieu de faire évidemment un obj.execute entre parenthèses pour
exécuter notre fonction et bien on va pouvoir faire obj on va utiliser les crochets comme si on
allait chercher un élément dans un tableau et dans ce crochet on va mettre une chaîne de
caractères execute et ensuite on va mettre nos parenthèses et comme on a été chercher
alors de manière dynamique puisque c'est une chaîne de caractères la méthode execute dans
tous les dans toutes les propriétés de notre objet obj et bien ça va nous retourner effectivement
la méthode et comme on va lui passer on lui va lui mettre des parenthèses après et bien on va
demander à l'exécuter et donc le retour de cette fonction va être hello world puisque c'était son
objectif ensuite on a de l'injection de code en javascript on peut faire par exemple const code
égal et là on va avoir un code sous forme d'une chaîne de caractères par exemple let a égal 1
point virgule et en javascript on va pouvoir faire éval entre parenthèses et notre code sous forme
de stream et ensuite si jamais ben dans notre code on fait un console point log de a il va bien
nous retourner un puisque le code à condition qu'il soit valide aura été interprété par
javascript et exécuté et donc tout le contenu d'un code va se retrouver et bas dans notre script
global donc là par exemple la variable a va se retrouver attaché à notre objet global
window et donc il va être accessible par notre script alors évidemment de mémoire si on fait
ça à l'intérieur d'une autre fonction la variable a normalement ne sera accessible que à
l'intérieur de cette fonction c'est le concept de scope classique de javascript en justement
en js l'intercession elle est très permissive mais dans des dans d'autres langages typé comme le java
le contrôle de l'injection il peut être beaucoup plus précis il est par exemple possible d'injecter
une nouvelle classe mais uniquement si cette classe là elle implément une interface spécifique
déclarée à la compilation donc on a quand même une condition à la compilation pour pouvoir
injecter du code pendant le runtime c'est notamment comme ça que fonctionne beaucoup de
systèmes de plug-in d'extension pour des logiciels écrit en java alors est-ce qu'il y a un impact sur
la sécurité bon pour ce qui est de l'introspection l'impact sur la sécurité il n'est pas inexistant
mais il est vraiment négligeable tant qu'une information elle transite dans la mémoire
vive d'un ordinateur elle est récupérable même si c'est évidemment un sujet très complexe
c'est vraiment pas évident à faire si on a accès à la machine c'est possible donc il y a un adage
qui dit en sécurité et ben une sécurité qui consiste simplement à cacher une information
c'est pas de la sécurité tant qu'elle est accessible quelque part et bien il faut faire comme si cette
information elle était plus ou moins publique même si c'est pas le cas pour ce qui est de l'intercession
la modification du fonctionnement du code c'est une autre paire de manches parce que là tout dépend
comment l'intercession est utilisée dans le logiciel en question si la modification du fonctionnement
du code ou l'ajout de code n'est ouvert que pour certains cas d'usage très limité et contrôlé
le risque majeur c'est éventuellement de déclencher des exceptions en cas de problème et donc de
faire cracher notre logiciel mais imaginons qu'on laisse la possibilité d'insérer du code avec je
sais pas une simple url aux utilisateurs pour pouvoir injecter des paquets directement dans notre code
là on laisse une belle porte ouverte à la menace c'est d'ailleurs exactement ce qui s'est passé le
9 décembre 2021 avec la panique autour de la bibliothèque java log forji ça a vraiment fait tremble
l'internet pendant quelques semaines je vous laisse un lien dans les notes de l'épisode si jamais
ça vous intéresse et pour la robustesse alors et bien pour la robustesse du code là ça dépendra
énormément de la flexibilité du langage et de la pays de réflexivité mais aussi de la précision
des développeurs et des développeuses qui travaillent sur le code pour les langages comme javascript
comme la réflexivité est dans la base même du langage on l'utilise beaucoup plus souvent et souvent
pour les mauvaises raisons donc il faut vraiment faire attention à ne pas l'utiliser à tort et à
travers surtout dans le langage qu'il permette j'espère que cet épisode vous aura été utile vous
aurez appris quelque chose et peut-être la notion même de réflexivité en programmation moi je vous
donne rendez-vous la semaine prochaine pour un prochain épisode du podcast et bien sûr sur
code-garage.fr pour retrouver tous nos articles tous nos épisodes de podcast et évidemment toutes
nos formations pour continuer à vous former et progresser dans votre carrière la nouvelle version
la version 2.0 de la plateforme vient de sortir allez-y faire un tour tout à complètement
changer l'expérience a complètement été repensée je suis sûr que ça va vous plaire à la semaine
prochaine salut !
Episode suivant:
Les infos glanées
Code-Garage
Découvrons ensemble des sujets passionnants autour du métier de dev et de la programmation en général !
Tags
Code-Garage #76 - Types MIME : utilité, format, évolution...