1 00:00:01,540 --> 00:00:03,650 Dans cette vidéo, j'aimerais vous montrer un petit peu 2 00:00:03,817 --> 00:00:08,710 comment on peut utiliser l'inspecteur pour naviguer et 3 00:00:08,877 --> 00:00:09,620 comprendre l'intérieur du système. 4 00:00:10,880 --> 00:00:15,020 Alors l'inspecteur, c'est un objet comme un microscope 5 00:00:15,187 --> 00:00:17,910 qui va nous permettre d'aller explorer l'intérieur du 6 00:00:18,077 --> 00:00:21,190 système et aussi, comme si on pouvait envoyer des sondes 7 00:00:21,357 --> 00:00:22,860 aller modifier le système. C'est comme si on était un 8 00:00:23,027 --> 00:00:26,940 biologiste qui en fait va manipuler des bactéries et les faire réagir. 9 00:00:27,800 --> 00:00:32,240 Donc on va s'amuser à explorer ce que c'est que "Smalltalk globals". 10 00:00:34,910 --> 00:00:37,470 En fait, c'est le name space, c'est-à-dire l'endroit où 11 00:00:37,637 --> 00:00:40,050 toutes les classes de Pharo sont stockées. 12 00:00:41,770 --> 00:00:44,000 Donc c'est un dictionnaire, le système dictionnary c'est 13 00:00:44,167 --> 00:00:48,180 un dictionnaire, ce qui est intéressant avec l'inspecteur 14 00:00:48,630 --> 00:00:53,540 c'est que si je regarde l'inspecteur c'est un 15 00:00:53,707 --> 00:00:56,240 grand tableau avec des 16 00:01:00,080 --> 00:01:00,860 valeurs à l'intérieur. 17 00:01:01,027 --> 00:01:02,410 Donc par exemple si je prends, je ne sais pas, moi, 18 00:01:02,577 --> 00:01:06,770 Breakpoint, je vais voir que dans mon tableau j'ai 19 00:01:07,680 --> 00:01:11,840 une clé qui contient au moins un objet qui contient 20 00:01:12,710 --> 00:01:14,350 cet objet-là, qui contient une clé de valeur. 21 00:01:14,517 --> 00:01:16,190 Alors ce qui est intéressant avec l'inspecteur c'est que 22 00:01:16,357 --> 00:01:20,390 là, par exemple ce que je vois, je vois que à l'élément 2 23 00:01:20,557 --> 00:01:22,370 du tableau, j'ai quoi ? 24 00:01:22,537 --> 00:01:24,150 J'ai ce qu'on appelle une variable globale. 25 00:01:24,317 --> 00:01:26,150 Donc une variable globale qu'est-ce qu'elle a? 26 00:01:26,317 --> 00:01:28,350 C'est un objet qui est composé d'une clé et d'une valeur. 27 00:01:29,220 --> 00:01:33,040 Donc la clé, là je vois si je clique dessus, la clé je 28 00:01:33,207 --> 00:01:37,870 vois que c'est un ByteSymbol qui représente le nom, et si 29 00:01:38,037 --> 00:01:42,720 je reviens en arrière et si je regarde la 30 00:01:42,887 --> 00:01:44,820 valeur, là je vais avoir une classe. 31 00:01:45,000 --> 00:01:47,520 Donc on va aller s'amuser à aller dans les classes après. 32 00:01:48,000 --> 00:01:49,230 Donc là, je vais revenir au début. 33 00:01:50,460 --> 00:01:54,790 Donc le nouvel inspecteur de Pharo, ce 34 00:01:55,670 --> 00:01:59,440 qui s'appelle GT inspecteur, du nom de l'équipe de 35 00:01:59,607 --> 00:02:03,380 développeurs qui l'a développé pour Pharo, va nous 36 00:02:03,547 --> 00:02:05,220 proposer donc des onglets dédiés. 37 00:02:06,610 --> 00:02:08,570 Donc sur le système dictionnary qu'est-ce que j'ai comme 38 00:02:08,737 --> 00:02:12,210 onglets dédiés? J'ai cet onglet qui nous montre les 39 00:02:12,377 --> 00:02:17,240 paires clés/valeurs pour mes classes, 40 00:02:17,407 --> 00:02:18,220 ou alors je ne vais avoir que des clés. 41 00:02:18,387 --> 00:02:20,340 Donc les clés c'est un peu moins intéressant puisque je 42 00:02:20,507 --> 00:02:25,270 ne vais avoir que les noms des classes en 43 00:02:25,437 --> 00:02:26,070 question. 44 00:02:26,237 --> 00:02:28,720 Maintenant, ce qui est sympa aussi, c'est que cet 45 00:02:28,887 --> 00:02:33,170 inspecteur, donc vous avez vu soit je peux naviguer, ça 46 00:02:33,337 --> 00:02:34,730 veut dire prenons un exemple. 47 00:02:35,270 --> 00:02:39,410 J'ai navigué, je vais d'un objet à un autre en 48 00:02:39,620 --> 00:02:42,390 sélectionnant un chemin dans la structure en question. 49 00:02:42,940 --> 00:02:44,900 Donc si je prends la clé par exemple, si je prends la 50 00:02:45,067 --> 00:02:47,600 valeur, voilà, là j'obtiens une classe et si sur cette 51 00:02:47,767 --> 00:02:49,420 classe, je vais aller dans son dictionnaire de méthodes. 52 00:02:49,790 --> 00:02:53,730 Du dictionnaire de méthodes, je pourrais aller sur une 53 00:02:53,897 --> 00:02:54,840 méthode compilée etc. 54 00:02:55,007 --> 00:02:58,960 Donc je navigue vraiment et avec cet outil-là, je peux 55 00:02:59,127 --> 00:03:03,810 restreindre la vue de ce que je veux voir ou par exemple voir tout mon flot. 56 00:03:04,510 --> 00:03:08,540 Mais ce qui est sympa, c'est que je peux aussi injecter 57 00:03:08,940 --> 00:03:11,530 un nouveau branchement dans mon flot. 58 00:03:12,130 --> 00:03:14,570 Donc c'est ce qu'on va faire ici donc imaginons que je 59 00:03:14,737 --> 00:03:16,300 réduise, je revienne au départ. 60 00:03:18,070 --> 00:03:22,560 Là, finalement, imaginons que je me dise, tiens je suis 61 00:03:22,727 --> 00:03:24,530 intéressé par la classe point. 62 00:03:24,920 --> 00:03:26,600 La classe point je sais que normalement, je peux faire 63 00:03:26,767 --> 00:03:29,050 "Smalltalk global" at #Point pour y arriver. 64 00:03:29,217 --> 00:03:31,890 Donc là, ce que je vais faire, je le fais et ce que je 65 00:03:32,057 --> 00:03:36,670 lui dis, je lui dis, exécute-le et ouvre-moi un 66 00:03:36,837 --> 00:03:39,280 inspecteur dans l'inspecteur actuel. 67 00:03:41,340 --> 00:03:45,270 Et là, tout d'un coup, j'ai, donc si on regarde la 68 00:03:45,437 --> 00:03:50,230 navigation, ce que j'ai fait, j'ai fait un branchement 69 00:03:50,580 --> 00:03:52,230 entre la navigation que j'avais et celle où je veux aller. 70 00:03:54,440 --> 00:03:56,380 Donc ça c'est sympa, ça veut dire que vous pouvez taper 71 00:03:56,547 --> 00:03:59,330 des tas d'expressions et commencer une navigation. 72 00:04:00,760 --> 00:04:01,750 Donc là, qu'est-ce qu'on voit ? 73 00:04:02,120 --> 00:04:04,520 On voit la classe Point comme un objet. 74 00:04:04,760 --> 00:04:09,000 En fait, là, ce que l'inspecteur nous montre c'est qu'il 75 00:04:09,167 --> 00:04:12,400 y a des onglets qui sont spécifiques pour les classes. 76 00:04:12,860 --> 00:04:17,490 Donc là, l'onglet brut "Raw", nous 77 00:04:17,657 --> 00:04:20,030 montre, bon ben la classe Point elle est définie dans la 78 00:04:20,197 --> 00:04:23,760 catégorie Kernel, elle a un environnement, elle pointe 79 00:04:24,010 --> 00:04:28,960 sur ce le même space, ça c'est le format d'encodage de 80 00:04:29,127 --> 00:04:30,470 ces instances, elle a un layout. 81 00:04:30,637 --> 00:04:35,520 Bref, c'est l'implémentation en Pharo de ce qu'est une classe. 82 00:04:36,220 --> 00:04:38,920 Maintenant, ce qui est sympa avec cet inspecteur, c'est 83 00:04:39,087 --> 00:04:41,810 que je peux voir donc, voilà par exemple la définition, 84 00:04:42,000 --> 00:04:46,790 le commentaire et il y a d'autres onglets comme toutes les références. 85 00:04:46,957 --> 00:04:49,550 Donc si je clique sur la référence, là je vais voir, ah 86 00:04:49,717 --> 00:04:54,610 ben oui, Point est bien utilisé 87 00:04:54,777 --> 00:04:56,000 dans la méthode @. 88 00:04:57,200 --> 00:04:59,540 Et là je vais voir encore une fois, ça c'est la version 89 00:04:59,920 --> 00:05:02,500 brute de l'information qui est un objet qui représente une 90 00:05:02,667 --> 00:05:05,630 méthode et là son Source, et donc je vais pouvoir à 91 00:05:05,797 --> 00:05:07,790 chaque fois choisir quelle est la meilleure 92 00:05:07,957 --> 00:05:09,770 représentation pour la tâche que je suis en train de faire. 93 00:05:10,440 --> 00:05:11,700 Donc revenons en arrière. 94 00:05:13,440 --> 00:05:16,810 Donc si je regarde 95 00:05:18,740 --> 00:05:21,950 ma classe, là j'aimerais aller dans le dictionnaire des méthodes. 96 00:05:22,117 --> 00:05:25,660 Donc le dictionnaire des méthodes, en gros qu'est-ce que c'est? 97 00:05:25,827 --> 00:05:27,930 C'est un dictionnaire avec une clé qui est le nom de la 98 00:05:28,097 --> 00:05:31,870 méthode et une valeur qui est une méthode compilée, une 99 00:05:32,037 --> 00:05:35,490 instance de CompileMethod. Donc si je regardais l'aspect 100 00:05:35,657 --> 00:05:37,730 brut, vous voyez que c'est déjà un peu plus embêtant 101 00:05:38,680 --> 00:05:43,540 parce qu'il faudrait que je comprenne comment sont 102 00:05:43,707 --> 00:05:45,820 implémentés des dictionnaires de méthodes, pour pouvoir 103 00:05:46,000 --> 00:05:47,940 interagir avec alors que là, ce n'est pas ça qui m'intéresse, 104 00:05:48,107 --> 00:05:49,420 c'est d'aller voir une méthode compilée. 105 00:05:49,930 --> 00:05:51,460 Donc pour voir une méthode compilée, ce que je vais 106 00:05:51,627 --> 00:05:54,670 faire, je vais prendre par exemple degrees et là je 107 00:05:54,837 --> 00:05:57,570 navigue et tout d'un coup j'obtiens une CompileMethod. 108 00:05:58,270 --> 00:06:01,280 Une CompileMethod c'est un objet, qui encore une fois, va 109 00:06:01,447 --> 00:06:05,610 proposer différentes façons d'être vue par l'inspecteur. 110 00:06:06,810 --> 00:06:10,300 Et donc là ce qu'on voit, on voit une méthode compilée en 111 00:06:10,467 --> 00:06:13,700 fait c'est une structure de données, c'est un tableau un 112 00:06:13,867 --> 00:06:17,570 peu particulier, donc là il contient du Bytecode, et qui 113 00:06:17,737 --> 00:06:19,810 contient des littéraux. Alors qu'est-ce que c'est que les literal? 114 00:06:20,100 --> 00:06:21,790 Quand à chaque fois dans le code, quand vous avez 115 00:06:21,957 --> 00:06:25,620 asFloat, arcTan, degrees or RadianToDegrees, il 116 00:06:27,900 --> 00:06:30,100 faut bien que ça soit stocké quelque part. 117 00:06:31,000 --> 00:06:33,820 Eh ben là c'est stocké, vous voyez, dans le début 118 00:06:37,780 --> 00:06:38,413 de la méthode compilée. 119 00:06:38,580 --> 00:06:39,213 Et qu'est-ce que va faire le Bytecode? 120 00:06:39,380 --> 00:06:41,880 Il va pouvoir faire référence à ces objets-là pour 121 00:06:42,047 --> 00:06:43,830 pouvoir les mettre sur la pile et invoquer les méthodes. 122 00:06:44,000 --> 00:06:45,860 Donc là, c'est ce qu'on voit par exemple, si on regarde 123 00:06:46,027 --> 00:06:49,810 la vue, je vais réduire ça, si on regarde la vue du 124 00:06:50,000 --> 00:06:51,400 Bytecode qu'est-ce que ça fait ? 125 00:06:51,567 --> 00:06:55,470 Ca va faire PushRcvr donc ça va mettre 0 sur la pile et faire égal. 126 00:06:55,637 --> 00:06:56,900 Alors à quoi ça correspond ça? 127 00:06:57,240 --> 00:06:58,870 Si on regarde un tout petit peu, 128 00:07:03,330 --> 00:07:06,700 je vais mettre en double, alors cette vue-là elle est 129 00:07:06,867 --> 00:07:08,690 vraiment très très pratique parce que vous allez voir ce 130 00:07:08,857 --> 00:07:11,910 qu'on va faire avec, c'est que si je veux voir maintenant 131 00:07:12,077 --> 00:07:16,880 le source, alors je vais me mettre en Bytecode ici et 132 00:07:17,047 --> 00:07:20,350 ici en source, ces expressions-là correspondent, ah ben 133 00:07:20,517 --> 00:07:21,900 tiens, vous avez vu, ça s'affiche. 134 00:07:22,690 --> 00:07:23,480 Donc ça c'est super. 135 00:07:23,890 --> 00:07:27,260 Donc là ça veut dire je veux faire un push de la variable 136 00:07:27,427 --> 00:07:30,920 d'instance 0 du receveur, je vais te mettre 0 sur la pile 137 00:07:31,087 --> 00:07:33,700 et je vais envoyer le message égal. 138 00:07:34,560 --> 00:07:36,390 Et là tout d'un coup c'est génial parce que ça veut dire 139 00:07:36,557 --> 00:07:38,670 que, pour la personne qui est en train de faire le 140 00:07:38,837 --> 00:07:42,230 compilateur, elle peut voir que le Bytecode qu'elle a 141 00:07:42,397 --> 00:07:45,740 émis, eh bien correspond bien à la structure du code. 142 00:07:45,940 --> 00:07:50,220 De la même manière, ce qu'il peut voir 143 00:07:50,387 --> 00:07:54,780 facilement, c'est, alors je vais retourner en arrière, 144 00:07:58,320 --> 00:08:00,590 si je suis en haut et que je clique sur Self, 145 00:08:04,900 --> 00:08:07,700 voilà, là, j'ai mes 2 méthodes compilées. 146 00:08:10,930 --> 00:08:13,000 Donc là j'ai mes 2 méthodes compilées et en fait, ce que 147 00:08:13,167 --> 00:08:16,920 j'aimerais bien voir, c'est finalement si j'ai 148 00:08:18,680 --> 00:08:20,510 un arbre de syntaxe abstraite, une augmentation de 149 00:08:20,677 --> 00:08:23,490 syntaxe abstraite et le source, je peux aussi naviguer dedans. 150 00:08:23,657 --> 00:08:26,630 Donc là par exemple, dans mon arbre qui peut être 151 00:08:26,797 --> 00:08:31,420 compliqué pour cette méthode, si j'ouvre tout, je vois 152 00:08:31,587 --> 00:08:35,270 que si je sélectionne la variable 153 00:08:36,780 --> 00:08:41,610 temporaire Time, je vais sélectionner le 154 00:08:42,410 --> 00:08:44,030 morceau de texte auquel elle se réfère. 155 00:08:44,197 --> 00:08:46,510 Donc ça, c'est vraiment super aussi, encore une fois, si 156 00:08:46,677 --> 00:08:50,760 je regarde ça, ah tiens le message qui envoie égal à X 157 00:08:50,927 --> 00:08:54,000 avec 0 en argument, ben c'est ce petit morceau d'arbre 158 00:08:54,440 --> 00:08:55,820 qui correspond à ce morceau-là. 159 00:08:57,530 --> 00:09:01,860 L'inspecteur va me permettre de gérer, dans la 160 00:09:02,027 --> 00:09:04,670 représentation textuelle de l'arbre par exemple, les 161 00:09:04,837 --> 00:09:06,880 sélections que j'ai des noeuds de l'arbre. 162 00:09:08,000 --> 00:09:12,120 Donc ça fait un superbe outil pour aider par exemple les 163 00:09:12,287 --> 00:09:13,400 gens qui font le compilateur de Pharo. 164 00:09:14,080 --> 00:09:16,220 Et cette approche-là, on va pouvoir la retrouver pour 165 00:09:16,387 --> 00:09:20,460 chacun des domaines, et donc même pour vos objets de 166 00:09:20,627 --> 00:09:24,060 votre domaine vous allez pouvoir étendre l'inspecteur, 167 00:09:24,420 --> 00:09:27,680 pour pouvoir proposer des facets et des vues qui font du sens.