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.

