1
00:00:01,540 --> 00:00:03,650
En este video,
Me gustaría mostrarte

2
00:00:03,817 --> 00:00:08,710
cómo podemos usar el inspector
navegar y

3
00:00:08,877 --> 00:00:09,620
entender el interior del sistema.

4
00:00:10,880 --> 00:00:15,020
El inspector es como
un microscopio

5
00:00:15,187 --> 00:00:17,910
que nos permitirá
explorar el interior del

6
00:00:18,077 --> 00:00:21,190
sistema pero también, como si
pudiéramos enviar sondas

7
00:00:21,357 --> 00:00:22,860
para modificar el sistema.
Es como si fueramos

8
00:00:23,027 --> 00:00:26,940
un biólogo que de hecho está manipulando
bacterias y haciéndolas reaccionar.

9
00:00:27,800 --> 00:00:32,240
Entonces nos divertiremos explorando
que son "Smalltalk globals".

10
00:00:34,910 --> 00:00:37,470
De hecho, este es el namespace,
es decir, el lugar donde

11
00:00:37,637 --> 00:00:40,050
todas las clases de Pharo
están referenciadas.

12
00:00:41,770 --> 00:00:44,000
Es un diccionario,
el diccionario del sistema es

13
00:00:44,167 --> 00:00:48,180
un diccionario. Lo que es interesante es
eso, con el inspector.

14
00:00:48,630 --> 00:00:53,540
Si miro al inspector, es

15
00:00:53,707 --> 00:00:56,240
una gran tabla con

16
00:01:00,080 --> 00:01:00,860
valores dentro.

17
00:01:01,027 --> 00:01:02,410
Entonces, por ejemplo, si elijo ...
No lo sé…

18
00:01:02,577 --> 00:01:06,770
Breakpoint, veo que en mi
tabla tengo una clave

19
00:01:07,680 --> 00:01:11,840
que contiene al menos un objeto
que contiene este objeto,

20
00:01:12,710 --> 00:01:14,350
que contiene un valor.

21
00:01:14,517 --> 00:01:16,190
Lo que es interesante con el
inspector es que aquí,

22
00:01:16,357 --> 00:01:20,390
por ejemplo, veo
que en el elemento 2

23
00:01:20,557 --> 00:01:22,370
en la tabla, ¿qué tengo?

24
00:01:22,537 --> 00:01:24,150
Tengo lo que llamamos
una variable global.

25
00:01:24,317 --> 00:01:26,150
Entonces, ¿Qué es una variable global?

26
00:01:26,317 --> 00:01:28,350
Es un objeto compuesto por
una clave y un valor.

27
00:01:29,220 --> 00:01:33,040
La clave, si hago click en ella,
veo que es

28
00:01:33,207 --> 00:01:37,870
un ByteSymbol representando
el nombre, y si

29
00:01:38,037 --> 00:01:42,720
retrocedo y miro el

30
00:01:42,887 --> 00:01:44,820
valor, tendré una clase.

31
00:01:45,000 --> 00:01:47,520
Entonces vamos a ir dentro de
las clases.

32
00:01:48,000 --> 00:01:49,230
Aquí vuelvo al principio.

33
00:01:50,460 --> 00:01:54,790
El nuevo inspector de Pharo,

34
00:01:55,670 --> 00:01:59,440
llamado GT Inspector
por el equipo

35
00:01:59,607 --> 00:02:03,380
que lo desarrolló para Pharo,
nos propondrá

36
00:02:03,547 --> 00:02:05,220
pestañas dedicadas.

37
00:02:06,610 --> 00:02:08,570
En el diccionario del sistema,
¿qué pestañas específicas

38
00:02:08,737 --> 00:02:12,210
tengo? Tengo una pestaña
mostrando los pares

39
00:02:12,377 --> 00:02:17,240
clave / valor para mis clases,

40
00:02:17,407 --> 00:02:18,220
o solo tengo las claves.

41
00:02:18,387 --> 00:02:20,340
Las claves no son tan
interesantes porque
42
00:02:20,507 --> 00:02:25,270
solo obtendré los nombres de las clases

43
00:02:25,437 --> 00:02:26,070
en cuestión.

44
00:02:26,237 --> 00:02:28,720
Algo lindo que tiene este

45
00:02:28.887 --> 00:02:33.170
inspector, es que puedo
navegar, o sea ...

46
00:02:33,337 --> 00:02:34,730
Tomemos un ejemplo ...

47
00:02:35,270 --> 00:02:39,410
He navegado, voy de un objeto
a otro

48
00:02:39,620 --> 00:02:42,390
seleccionando una ruta en el
estructura en cuestion.

49
00:02:42,940 --> 00:02:44,900
Si considero la clave, por ejemplo,
si considero

50
00:02:45,067 --> 00:02:47,600
el valor, aquí obtengo el
clase y si en la

51
00:02:47,767 --> 00:02:49,420
clase entro en su
diccionario de métodos ...

52
00:02:49,790 --> 00:02:53,730
Desde el diccionario de métodos,
Podría ir a un

53
00:02:53,897 --> 00:02:54,840
método compilado, etc.

54
00:02:55,007 --> 00:02:58,960
Realmente navego y con
esta herramienta puedo

55
00:02:59,127 --> 00:03:03,810
limitar la vista de lo que quiero
ver o ver todo el flujo.

56
00:03:04,510 --> 00:03:08,540
Pero lo bueno es que
también puedo agregar

57
00:03:08,940 --> 00:03:11,530
una nueva rama en mi flujo.

58
00:03:12,130 --> 00:03:14,570
Eso es lo que vamos a hacer
aquí. Entonces imaginemos eso

59
00:03:14,737 --> 00:03:16,300
minimizo, vuelvo al comienzo.

60
00:03:18,070 --> 00:03:22,560
Aquí, finalmente, imaginemos
que me digo a mí mismo: "Estoy

61
00:03:22,727 --> 00:03:24,530
interesado en la clase Point".

62
00:03:24,920 --> 00:03:26,600
Sé que normalmente puedo
accederla

63
00:03:26,767 --> 00:03:29,050
haciendo "Smalltalk globals at: #Point".

64
00:03:29,217 --> 00:03:31,890
Entonces lo hago y le digo

65
00:03:32,057 --> 00:03:36,670
'execute-it' y abre un

66
00:03:36,837 --> 00:03:39,280
inspector en el inspector activo.

67
00:03:41,340 --> 00:03:45,270
Y aquí, de repente,
si nos fijamos en

68
00:03:45,437 --> 00:03:50,230
la navegación, hice
una ramificación

69
00:03:50,580 --> 00:03:52,230
entre la navegación que tenía y
a donde quiero ir ahora.

70
00:03:54,440 --> 00:03:56,380
Entonces esto es bueno, significa que
puedes escribir

71
00:03:56,547 --> 00:03:59,330
muchas expresiones
y empezar a navegar.

72
00:04:00,760 --> 00:04:01,750
Entonces, ¿qué vemos?

73
00:04:02,120 --> 00:04:04,520
Vemos la clase Point como un objeto.

74
00:04:04,760 --> 00:04:09,000
De hecho, el inspector nos muestra

75
00:04:09,167 --> 00:04:12,400
que hay pestañas específicas
para las clases.

76
00:04:12,860 --> 00:04:17,490
Entonces aquí, la pestaña "Raw" nos muestra

77
00:04:17,657 --> 00:04:20,030
que la clase Point
está definida en la

78
00:04:20,197 --> 00:04:23,760
categoría Kernel, tiene un
environment, nos muestra

79
00:04:24,010 --> 00:04:28,960
en el mismo lugar el
formato de codificación de

80
00:04:29,127 --> 00:04:30,470
sus instancias, tiene un 'layout'.

81
00:04:30,637 --> 00:04:35,520
En resumen, este es la implementación
en Pharo de lo que es una clase.

82
00:04:36,220 --> 00:04:38,920
Ahora, lo que es realmente bueno con
este inspector es

83
00:04:39,087 --> 00:04:41,810
que puedo ver, por ejemplo aquí
la definición,

84
00:04:42,000 --> 00:04:46,790
los comentarios y hay otras
pestañas como todas las referencias.

85
00:04:46,957 --> 00:04:49,550
Entonces, si hago click en la referencia,
aquí veré

86
00:04:49,717 --> 00:04:54,610
Point realmente se usa

87
00:04:54,777 --> 00:04:56,000
en el método @.

88
00:04:57,200 --> 00:04:59,540
Miro una vez más,
esta es la versión cruda

89
00:04:59,920 --> 00:05:02,500
de la información,
que es un objeto que representa

90
00:05:02,667 --> 00:05:05,630
un método y aquí está código fuente,
así que cada vez puedo

91
00:05:05,797 --> 00:05:07,790
elige cuál es la mejor

92
00:05:07,957 --> 00:05:09,770
representación para la tarea
que estoy haciendo.

93
00:05:10,440 --> 00:05:11,700
Bien, vamos hacia atrás.

94
00:05:13,440 --> 00:05:16,810
Si miro

95
00:05:18,740 --> 00:05:21,950
mi clase, aquí me gustaría
profundizar en el diccionario de métodos.

96
00:05:22,117 --> 00:05:25,660
¿Qué es el diccionario de métodos?

97
00:05:25,827 --> 00:05:27,930
Es un diccionario con una clave
que es el nombre de un

98
00:05:28,097 --> 00:05:31,870
método y un valor que es
un método compilado,

99
00:05:32,037 --> 00:05:35,490
una instancia de CompileMethod.
Entonces, si miro en la pestaña

100
00:05:35,657 --> 00:05:37,730
"Raw", veo que es
un poco más molesto

101
00:05:38,680 --> 00:05:43,540
porque tendría que
entender cómo están

102
00:05:43,707 --> 00:05:45,820
implementados los diccionarios de métodos
para poder

103
00:05:46,000 --> 00:05:47,940
interactuar con ellos, mientras que aquí
no es lo que me interesa.

104
00:05:48,107 --> 00:05:49,420
Quiero ver un método compilado.

105
00:05:49,930 --> 00:05:51,460
Entonces, para ver un método compilado,

106
00:05:51,627 --> 00:05:54,670
Elijo #degrees por ejemplo,
y navego

107
00:05:54,837 --> 00:05:57,570
y, de repente
obtengo un CompileMethod

108
00:05:58,270 --> 00:06:01,280
Un CompileMethod es un objeto
que, una vez más,

109
00:06:01,447 --> 00:06:05,610
propone diferentes formas de ser
mostrado por el inspector.

110
00:06:06,810 --> 00:06:10,300
Aquí ves un método compilado,

111
00:06:10,467 --> 00:06:13,700
De hecho, este es un marco de datos,
una tabla

112
00:06:13,867 --> 00:06:17,570
un poco específica, que contiene
los bytecodes

113
00:06:17,737 --> 00:06:19,810
y literales. ¿Qué son los
literales?

114
00:06:20,100 --> 00:06:21,790
En el código, cada vez
que referenciamos

115
00:06:21,957 --> 00:06:25,620
asFloat, arcTan,
degrees o RadianToDegrees,

116
00:06:27,900 --> 00:06:30,100
esto necesita ser almacenado en alguna parte.

117
00:06:31,000 --> 00:06:33,820
Se almacena aquí, ya ves,
al principio

118
00:06:37,780 --> 00:06:38,413
del método compilado

119
00:06:38,580 --> 00:06:39,213
¿Qué hace los bytecodes?

120
00:06:39,380 --> 00:06:41,880
Se refiere a esos objetos

121
00:06:42,047 --> 00:06:43,830
para ponerlos en el stack de ejecución
e invocar los métodos.

122
00:06:44,000 --> 00:06:45,860
Entonces, esto es lo que podemos
ver, por ejemplo, si nos fijamos en

123
00:06:46,027 --> 00:06:49,810
la vista, minimizo esto,
si miramos la vista de  Bytecode

124
00:06:50,000 --> 00:06:51,400
¿que hace?

125
00:06:51,567 --> 00:06:55,470
Hace PushRcvr, por lo que pone 0
en el stack y #equal.

126
00:06:55,637 --> 00:06:56,900
¿A que corresponde?

127
00:06:57,240 --> 00:06:58,870
Si miramos un poco de cerca,

128
00:07:03,330 --> 00:07:06,700
Lo muestro dos veces,
este modo de visualización es

129
00:07:06,867 --> 00:07:08,690
realmente muy útil,
mira lo que podemos hacer:

130
00:07:08,857 --> 00:07:11,910
si ahora quiero ver

131
00:07:12,077 --> 00:07:16,880
el código, elijo
Bytecode allí y

132
00:07:17,047 --> 00:07:20,350
y Source aquí, esas expresiones
se corresponden entre sí,

133
00:07:20,517 --> 00:07:21,900
mira que se muestra.

134
00:07:22,690 --> 00:07:23,480
Entonces esto es genial.

135
00:07:23,890 --> 00:07:27,260
Significa que puedo hacer un Push de
la variable de instancia 0 del receptor,

136
00:07:27,427 --> 00:07:30,920
puse 0 en el stack

137
00:07:31,087 --> 00:07:33,700
y envío el mensaje "equal".

138
00:07:34,560 --> 00:07:36,390
Y aquí, es genial porque
significa

139
00:07:36,557 --> 00:07:38,670
que la persona que está haciendo

140
00:07:38,837 --> 00:07:42,230
el compilador puede ver que el Bytecode
que produjo

141
00:07:42,397 --> 00:07:45,740
corresponde a la estructura del código.

142
00:07:45,940 --> 00:07:50,220
De la misma manera, puede fácilmente

143
00:07:50,387 --> 00:07:54,780
verlo...
Retrocedo ...

144
00:07:58,320 --> 00:08:00,590
Si estoy en la parte superior y hago clic
en "self",

145
00:08:04,900 --> 00:08:07,700
aquí obtengo mis 2 métodos compilados

146
00:08:10,930 --> 00:08:13,000
Obtengo mis 2 métodos compilados
y de hecho

147
00:08:13,167 --> 00:08:16,920
me gustaría ver si tengo

148
00:08:18,680 --> 00:08:20,510
un árbol de sintaxis abstracto,

149
00:08:20,677 --> 00:08:23,490
y el código fuente.
También puedo explorar dentro.

150
00:08:23,657 --> 00:08:26,630
Aquí, por ejemplo, en mi árbol
que puede ser

151
00:08:26,797 --> 00:08:31,420
complicado para este método,
si abro todo, puedo ver

152
00:08:31,587 --> 00:08:35,270
que si selecciono la variable

153
00:08:36,780 --> 00:08:41,610
temporal "Time", selecciono

154
00:08:42,410 --> 00:08:44,030
la parte del código a la cual
se refiere.

155
00:08:44,197 --> 00:08:46,510
Esto también es genial.
Una vez más si

156
00:08:46,677 --> 00:08:50,760
miro esto ... el mensaje
que envía "equal" a X

157
00:08:50,927 --> 00:08:54,000
con 0 como argumento, esto es
esta pequeña parte del árbol

158
00:08:54,440 --> 00:08:55,820
correspondiente a esta parte aquí.

159
00:08:57,530 --> 00:09:01,860
El inspector me permite
administrar, en

160
00:09:02,027 --> 00:09:04,670
representación textual del árbol

161
00:09:04,837 --> 00:09:06,880
las selecciones que tengo de
los nodos del árbol.

162
00:09:08,000 --> 00:09:12,120
Esto constituye una gran herramienta
por ejemplo para ayudar

163
00:09:12,287 --> 00:09:13,400
a los que desarrollan el compilador.

164
00:09:14,080 --> 00:09:16,220
Puedes usar este enfoque
para

165
00:09:16,387 --> 00:09:20,460
cada dominio, incluso para tu
objetos de dominio

166
00:09:20,627 --> 00:09:24,060
puedes extender el inspector,

167
00:09:24,420 --> 00:09:27,680
para proponer facetas y
vistas que tienen sentido.
