1
00:00:00,390 --> 00:00:04,100
Salut. Dans ce cours,
j'aimerais aborder avec vous

2
00:00:04,780 --> 00:00:07,820
comment l'exécution de Pharo
fonctionne et quelles sortes

3
00:00:08,020 --> 00:00:11,050
de fichiers sont
utilisés et où et quand.

4
00:00:11,250 --> 00:00:13,000
Parce que pour le moment,
vous avez dû utiliser Pharo,

5
00:00:13,310 --> 00:00:15,570
vous avez eu un point
images, un point source et un point

6
00:00:15,770 --> 00:00:18,270
change, ça doit être
complètement obscur pour vous, ça

7
00:00:18,470 --> 00:00:20,940
fonctionne très bien mais là
j'aimerais vous expliquer ce

8
00:00:21,140 --> 00:00:23,280
que ça fait exactement, de
façon à ce que vous évitiez de

9
00:00:23,480 --> 00:00:24,940
faire des bêtises dans le
futur et que vous contrôliez un

10
00:00:25,140 --> 00:00:26,020
peu mieux votre système.

11
00:00:27,440 --> 00:00:30,800
En gros, le système
d'exécution de Pharo, c'est une

12
00:00:31,000 --> 00:00:33,000
machine virtuelle qui
exécute du code compilé.

13
00:00:33,440 --> 00:00:37,620
La machine virtuelle est
spécifique à une plateforme et

14
00:00:38,160 --> 00:00:41,000
il y a des VM qui existent
pour Mac OSX, Windows, Linux,

15
00:00:41,200 --> 00:00:43,330
différentes
versions, iOS, ARM, Androïd.

16
00:00:45,290 --> 00:00:49,810
C'est le modèle d'exécution
de C sharp, de Java, c'est

17
00:00:50,010 --> 00:00:51,050
exactement le même dans Pharo.

18
00:00:52,620 --> 00:00:55,490
Et on a ce qu'on appelle
une compilation multiple, ça

19
00:00:55,690 --> 00:00:57,910
veut dire que le code que
vous écrivez en Pharo est

20
00:00:58,110 --> 00:01:01,000
compilé vers du bytecode. Le
bytecode, c'est un ensemble

21
00:01:01,200 --> 00:01:03,810
d'instructions qui est
indépendant de la plateforme, et

22
00:01:04,010 --> 00:01:06,790
la matière virtuelle va
transformer dynamiquement ce

23
00:01:07,000 --> 00:01:08,840
bytecode en
assembleur lors de l'exécution.

24
00:01:09,820 --> 00:01:11,620
Voilà comment fonctionne
Pharo, c'est pareil que dans les

25
00:01:11,820 --> 00:01:14,410
autres langages objet de base.

26
00:01:16,120 --> 00:01:17,770
La machine
virtuelle, c'est le fichier.

27
00:01:18,000 --> 00:01:20,470
Suivant votre OS, ça va être
le fichier qui est en point exe.

28
00:01:20,720 --> 00:01:22,330
Sur Mac, ça va être en point app.

29
00:01:22,530 --> 00:01:26,240
Ce sont des machines
virtuelles que l'on peut exécuter de

30
00:01:26,440 --> 00:01:29,750
2 manières, soit avec une
instruction aux command-line,

31
00:01:30,500 --> 00:01:33,380
soit en mode interactif, ça
veut dire avec une interface

32
00:01:33,580 --> 00:01:36,340
graphique, ça dépend. Par
exemple sur Linux, quand on

33
00:01:36,540 --> 00:01:39,830
utilise Pharo sur un serveur, on va
utiliser souvent en mode command-line.

34
00:01:41,260 --> 00:01:42,690
La machine virtuelle, c'est ce
que je disais tout à l'heure,

35
00:01:42,890 --> 00:01:46,430
elle prend du code compilé,
elle génère de l'assembleur au vol.

36
00:01:46,630 --> 00:01:50,670
Maintenant, le code compilé
est packagé, stocké dans ce

37
00:01:50,870 --> 00:01:51,680
qu'on appelle une image.

38
00:01:52,390 --> 00:01:55,570
C'est un snapshot aussi, c'est
un système de virtualisation.

39
00:01:55,770 --> 00:01:58,390
En fait, l'image représente
un système de virtualisation

40
00:01:58,590 --> 00:02:00,000
pour les objets Pharo.
On va voir ça juste après.

41
00:02:01,120 --> 00:02:03,810
La machine virtuelle, elle,
pour s'exécuter n'a besoin

42
00:02:04,010 --> 00:02:07,440
que de l'image parce que
c'est là où le code est compilé

43
00:02:08,000 --> 00:02:09,950
et où sont les objets.

44
00:02:10,740 --> 00:02:13,000
A côté de la machine
virtuelle, on a 3 fichiers.

45
00:02:13,560 --> 00:02:16,520
On a le fichier image, le
fichier change et le fichier source.

46
00:02:16,720 --> 00:02:19,000
Je vais vous expliquer chacun de ces
fichiers et quels rôles ils jouent.

47
00:02:20,540 --> 00:02:24,830
Le fichier image, c'est une sorte
de cache qui contient des objets.

48
00:02:25,390 --> 00:02:27,730
Il contient des objets
tout simples: les points, les

49
00:02:27,930 --> 00:02:30,690
chaînes, tout ce qu'on va manipuler.

50
00:02:31,050 --> 00:02:34,580
Mais il contient aussi
les méthodes compilées et en

51
00:02:34,780 --> 00:02:37,090
particulier aussi les
 classes qui ont été compilées.

52
00:02:37,670 --> 00:02:40,680
À chaque fois que vous allez
sauver votre image, tous les

53
00:02:40,880 --> 00:02:42,010
objets sont sauvés sur disque.

54
00:02:43,000 --> 00:02:45,470
L'image, c'est vraiment un
système de virtualisation

55
00:02:45,670 --> 00:02:50,350
avant l'heure et au
démarrage, tous vos objets qui ont

56
00:02:50,550 --> 00:02:53,190
été ça sérialisés sur disque
vont être remis en mémoire,

57
00:02:53,670 --> 00:02:56,840
en particulier le pointeur
de programme va aussi être

58
00:02:57,040 --> 00:03:01,750
sauvé et rétabli exactement
à l'endroit où il était avant

59
00:03:01,950 --> 00:03:02,710
que vous sauviez.

60
00:03:03,780 --> 00:03:06,510
Ce qu'il faut voir c'est
que vous avez un OS, vous avez

61
00:03:06,710 --> 00:03:10,030
la machine virtuelle, et sur
cette machine virtuelle vous

62
00:03:10,230 --> 00:03:14,060
avez ce système qui est en
fait un espace mémoire dans

63
00:03:14,260 --> 00:03:17,690
lequel vos objets vivent et que vous
allez pouvoir sauver sur disque ou pas.

64
00:03:18,730 --> 00:03:22,120
Et lui contient des objets
compilés, c'est pour ça que j'ai

65
00:03:22,320 --> 00:03:24,380
mis des petits 1 et 0 sur le dessin.

66
00:03:25,460 --> 00:03:27,170
A côté de ça vous
avez le fichier change.

67
00:03:27,370 --> 00:03:31,120
En fait c'est un fichier qui
contient des enregistrements.

68
00:03:32,240 --> 00:03:35,430
Tout ce que vous faites
dans Pharo est loggé, est écrit

69
00:03:35,630 --> 00:03:38,530
dans une sorte de
grande cassette virtuelle qui

70
00:03:38,800 --> 00:03:41,000
représente toutes les
additions, les modifications, tout

71
00:03:41,200 --> 00:03:43,060
ce que vous avez fait. C'est
comme Big Brother mais c'est

72
00:03:43,260 --> 00:03:46,080
pour Pharo et donc on peut
s'amuser, on peut l'utiliser

73
00:03:46,280 --> 00:03:49,700
pour rejouer certaines
séquences parce que c'est une

74
00:03:49,900 --> 00:03:52,650
cassette qui contient des
enregistrements qui sont des

75
00:03:52,850 --> 00:03:57,740
actions qui modifient
Pharo. Un fichier changes

76
00:03:58,020 --> 00:03:59,750
est associé à un fichier image.

77
00:04:00,790 --> 00:04:02,220
En particulier, à quoi ça sert ?

78
00:04:02,420 --> 00:04:05,220
Quand vous allez définir une
nouvelle classe, le code de

79
00:04:05,420 --> 00:04:09,560
la classe n'est pas stocké
dans le fichier image, il est

80
00:04:09,760 --> 00:04:14,610
stocké dans le fichier
changes et si vous dissociez les

81
00:04:14,810 --> 00:04:16,930
2, vous allez peut-être
perdre votre définition de code.

82
00:04:17,130 --> 00:04:19,000
Le programme va continuer à
s'exécuter mais vous allez

83
00:04:19,200 --> 00:04:22,200
peut-être perdre le source
code de votre application.

84
00:04:23,570 --> 00:04:28,300
Si on regarde, j'ai mon
image qui contient mon bytecode,

85
00:04:30,000 --> 00:04:33,320
mes objets compilés et à
côté de ça, j'ai mon fichier

86
00:04:33,520 --> 00:04:35,110
changes qui contient
une liste de changements.

87
00:04:35,310 --> 00:04:36,730
Là par exemple je dis "Ah
ben tiens, on a ajouté la

88
00:04:36,930 --> 00:04:38,490
 classe Counter, on a
ajouté la méthode increase, la

89
00:04:38,690 --> 00:04:42,430
méthode decrease et on a fait la
même chose sur d'autres classes.

90
00:04:42,950 --> 00:04:46,350
" On a des outils qui
permettent de rejouer ces changements-là.

91
00:04:47,040 --> 00:04:48,840
Vous avez peut-être vu
dans Pharo qu'on a aussi la

92
00:04:49,040 --> 00:04:51,070
possibilité de browser
différentes versions de méthodes.

93
00:04:51,420 --> 00:04:53,540
Les outils qui utilisent
différentes versions de méthodes

94
00:04:53,740 --> 00:04:56,760
utilisent le point
changes. J'ai mis ces pointillés

95
00:04:57,360 --> 00:05:00,230
autour de ce couple parce
que c'est très important de

96
00:05:00,430 --> 00:05:04,200
garder le point changes et
le point image synchronisés.

97
00:05:04,510 --> 00:05:07,340
N'allez pas vous amuser à éditer avec
emacs à l'intérieur du point changes.

98
00:05:08,090 --> 00:05:10,300
Vous pouvez le faire mais ce
n'est pas très intéressant,

99
00:05:10,720 --> 00:05:12,070
parce que vous allez
casser votre point changes.

100
00:05:13,650 --> 00:05:15,620
L'image va continuer à
fonctionner parce qu'elle s'en

101
00:05:15,820 --> 00:05:18,320
sert juste, quand on est en
mode de développement, pour

102
00:05:18,520 --> 00:05:20,750
nous montrer de l'information.
Mais c'est dommage, ne le faites pas.

103
00:05:21,580 --> 00:05:25,240
De manière générale, j'ouvre
une parenthèse, une image c'est

104
00:05:25,440 --> 00:05:27,000
vraiment quelque chose de très cosy.

105
00:05:27,290 --> 00:05:28,930
Vous êtes en train de
 programmer, il y a quelqu'un qui

106
00:05:29,130 --> 00:05:30,550
vous interrompt, vous
sauvez votre image, vous allez

107
00:05:30,750 --> 00:05:32,870
boire un café, vous
relancez votre image, vous êtes

108
00:05:33,070 --> 00:05:37,160
exactement dans la même
situation. Vous avez complètement

109
00:05:37,360 --> 00:05:40,620
stocké l'état de
votre système sur disque.

110
00:05:40,820 --> 00:05:42,730
Vous pouvez faire ça et
 revenir dans 3 ans, et 3 ans en

111
00:05:42,930 --> 00:05:45,000
arrière vous aurez
exactement le même état que celui dans

112
00:05:45,200 --> 00:05:46,190
lequel vous étiez 3 ans en arrière.

113
00:05:46,890 --> 00:05:48,400
Le problème, c'est que d'un
point de vue généologiciel,

114
00:05:48,600 --> 00:05:49,710
ce n'est pas une bonne pratique.

115
00:05:49,910 --> 00:05:52,010
Ça veut dire que c'est très
bien de l'utiliser pour du

116
00:05:52,210 --> 00:05:56,060
développement et du
prototypage, utilisez un système de

117
00:05:56,260 --> 00:05:59,170
version de contrôle, on a
Monticello qui est un système

118
00:05:59,370 --> 00:06:01,590
de version de contrôle qui
est écrit en Pharo, il y a des

119
00:06:01,790 --> 00:06:04,470
back end pour Git pour
sauver votre code, vous le sauvez

120
00:06:04,670 --> 00:06:08,350
dans un système de version
de contrôle, et après vous

121
00:06:08,550 --> 00:06:11,910
allez utiliser un serveur
d'intégration comme Jenkins ou

122
00:06:12,110 --> 00:06:14,760
Travis pour construire vos images à
chaque fois que vous allez démarrer.

123
00:06:16,410 --> 00:06:19,430
Souvent les gens qui arrivent
sur Pharo confondent ces 2 choses.

124
00:06:19,770 --> 00:06:21,880
Les images sont super
pratiques quand on est en mode

125
00:06:22,080 --> 00:06:25,590
développement, quand on
veut faire du développement un

126
00:06:25,790 --> 00:06:28,840
peu structuré et contrôler
un peu, il faut absolument

127
00:06:29,040 --> 00:06:32,680
utiliser des outils
 classiques qui fonctionnent très bien

128
00:06:32,880 --> 00:06:34,770
parce qu'en fait, on est en
mode prototype dans certains,

129
00:06:35,150 --> 00:06:37,960
quand on arrive à un point,
on va sauver sur un système

130
00:06:38,160 --> 00:06:39,930
de version et on va pouvoir
accéder à toutes nos versions

131
00:06:40,130 --> 00:06:43,190
depuis l'environnement.
Il y a des vidéos qui vous

132
00:06:43,390 --> 00:06:45,390
montreront ça ou qui vous
ont déjà montré ça sur la

133
00:06:45,590 --> 00:06:47,250
 classe Counter par exemple.

134
00:06:47,750 --> 00:06:50,460
Il reste un troisième
fichier dont je n'ai pas parlé qui

135
00:06:50,660 --> 00:06:51,640
s'appelle le fichier source.

136
00:06:52,060 --> 00:06:55,350
En fait, le fichier source, c'est un
fichier changes un peu particulier.

137
00:06:55,590 --> 00:06:59,540
Il va contenir toutes les
définitions du système à l'instant T0.

138
00:06:59,740 --> 00:07:01,880
A chaque fois que vous
avez une nouvelle version de

139
00:07:02,080 --> 00:07:03,560
Pharo, il y a un nouveau
fichier point changes, et vous

140
00:07:04,000 --> 00:07:06,580
voyez que ce fichier va
contenir les définitions des

141
00:07:06,780 --> 00:07:09,750
tableaux, les définitions
des ensembles, toutes les

142
00:07:09,950 --> 00:07:13,000
méthodes qui sont définies
sur toutes les librairies

143
00:07:14,580 --> 00:07:19,500
corps de Pharo. En général,
ce fichier source vous allez

144
00:07:19,700 --> 00:07:23,110
le partager et il est en
read-only, alors que le fichier

145
00:07:23,310 --> 00:07:25,780
change il y en a un par
image et il est en écriture.

146
00:07:26,950 --> 00:07:29,890
Si on regarde là ce que je
vous montre, c'est un état du

147
00:07:30,090 --> 00:07:33,600
système où on a commencé
avec une nouvelle version de

148
00:07:33,800 --> 00:07:37,000
Pharo 4 qui
correspondait en fait à ce monde-là,

149
00:07:39,160 --> 00:07:41,600
et tout d'un coup vous avez
défini de nouvelles classes.

150
00:07:41,800 --> 00:07:44,020
Là, j'ai défini la classe
Node, donc j'ai créé des

151
00:07:44,220 --> 00:07:47,480
nouveaux objets à
l'intérieur de mon aspect binaire.

152
00:07:47,780 --> 00:07:52,320
Et dans le fichier changes
associé à mon image, j'ai eu

153
00:07:52,520 --> 00:07:55,460
des nouveaux
enregistrements qui ont été écrits ici.

154
00:07:56,520 --> 00:07:58,320
Comme je vous ai dit que ce
fichier-là, de toute façon il

155
00:07:58,520 --> 00:08:01,910
était read-only, et lui il est write.

156
00:08:03,020 --> 00:08:05,930
Vous voyez encore une
fois, on va dire que

157
00:08:06,130 --> 00:08:08,050
conceptuellement, ce sont
2 fichiers qui fonctionnent

158
00:08:08,250 --> 00:08:10,010
ensemble, l'image et le changes.

159
00:08:10,550 --> 00:08:13,660
J'espère que ça a un peu
clarifié les rôles de ces 3 fichiers.

160
00:08:14,600 --> 00:08:16,860
Maintenant ce qu'il faut
savoir, c'est qu'on est en train

161
00:08:17,060 --> 00:08:20,700
de mettre en place un
nouveau mécanisme de gestion de

162
00:08:20,900 --> 00:08:23,500
cette cassette, de façon
à pouvoir récupérer plus

163
00:08:23,700 --> 00:08:25,700
facilement quand vous avez
un crash ou que vous voulez

164
00:08:25,900 --> 00:08:27,770
rejouer et voir toutes les
versions de votre système.

165
00:08:28,490 --> 00:08:30,100
Dans le futur, il va y
avoir une bien meilleure

166
00:08:30,300 --> 00:08:34,660
intégration avec Git, et
aussi de meilleures façons de

167
00:08:34,860 --> 00:08:36,610
produire des images de
manière industrielle.

