En este video, Me gustaría mostrarte
cómo podemos usar el inspector navegar y
entender el interior del sistema.
El inspector es como un microscopio
que nos permitirá explorar el interior del
sistema pero también, como si pudiéramos enviar sondas
para modificar el sistema. Es como si fueramos
un biólogo que de hecho está manipulando bacterias y haciéndolas reaccionar.
Entonces nos divertiremos explorando que son "Smalltalk globals".
De hecho, este es el namespace, es decir, el lugar donde
todas las clases de Pharo están referenciadas.
Es un diccionario, el diccionario del sistema es
un diccionario. Lo que es interesante es eso, con el inspector.
Si miro al inspector, es
una gran tabla con
valores dentro.
Entonces, por ejemplo, si elijo ... No lo sé…
Breakpoint, veo que en mi tabla tengo una clave
que contiene al menos un objeto que contiene este objeto,
que contiene un valor.
Lo que es interesante con el inspector es que aquí,
por ejemplo, veo que en el elemento 2
en la tabla, ¿qué tengo?
Tengo lo que llamamos una variable global.
Entonces, ¿Qué es una variable global?
Es un objeto compuesto por una clave y un valor.
La clave, si hago click en ella, veo que es
un ByteSymbol representando el nombre, y si
retrocedo y miro el
valor, tendré una clase.
Entonces vamos a ir dentro de las clases.
Aquí vuelvo al principio.
El nuevo inspector de Pharo,
llamado GT Inspector por el equipo
que lo desarrolló para Pharo, nos propondrá
pestañas dedicadas.
En el diccionario del sistema, ¿qué pestañas específicas
tengo? Tengo una pestaña mostrando los pares
clave / valor para mis clases,
o solo tengo las claves.
Las claves no son tan interesantes porque
solo obtendré los nombres de las clases
en cuestión.
Algo lindo que tiene este
inspector, es que puedo navegar, o sea ...
Tomemos un ejemplo ...
He navegado, voy de un objeto a otro
seleccionando una ruta en el estructura en cuestion.
Si considero la clave, por ejemplo, si considero
el valor, aquí obtengo el clase y si en la
clase entro en su diccionario de métodos ...
Desde el diccionario de métodos, Podría ir a un
método compilado, etc.
Realmente navego y con esta herramienta puedo
limitar la vista de lo que quiero ver o ver todo el flujo.
Pero lo bueno es que también puedo agregar
una nueva rama en mi flujo.
Eso es lo que vamos a hacer aquí. Entonces imaginemos eso
minimizo, vuelvo al comienzo.
Aquí, finalmente, imaginemos que me digo a mí mismo: "Estoy
interesado en la clase Point".
Sé que normalmente puedo accederla
haciendo "Smalltalk globals at: #Point".
Entonces lo hago y le digo
'execute-it' y abre un
inspector en el inspector activo.
Y aquí, de repente, si nos fijamos en
la navegación, hice una ramificación
entre la navegación que tenía y a donde quiero ir ahora.
Entonces esto es bueno, significa que puedes escribir
muchas expresiones y empezar a navegar.
Entonces, ¿qué vemos?
Vemos la clase Point como un objeto.
De hecho, el inspector nos muestra
que hay pestañas específicas para las clases.
Entonces aquí, la pestaña "Raw" nos muestra
que la clase Point está definida en la
categoría Kernel, tiene un environment, nos muestra
en el mismo lugar el formato de codificación de
sus instancias, tiene un 'layout'.
En resumen, este es la implementación en Pharo de lo que es una clase.
Ahora, lo que es realmente bueno con este inspector es
que puedo ver, por ejemplo aquí la definición,
los comentarios y hay otras pestañas como todas las referencias.
Entonces, si hago click en la referencia, aquí veré
Point realmente se usa
en el método @.
Miro una vez más, esta es la versión cruda
de la información, que es un objeto que representa
un método y aquí está código fuente, así que cada vez puedo
elige cuál es la mejor
representación para la tarea que estoy haciendo.
Bien, vamos hacia atrás.
Si miro
mi clase, aquí me gustaría profundizar en el diccionario de métodos.
¿Qué es el diccionario de métodos?
Es un diccionario con una clave que es el nombre de un
método y un valor que es un método compilado,
una instancia de CompileMethod. Entonces, si miro en la pestaña
"Raw", veo que es un poco más molesto
porque tendría que entender cómo están
implementados los diccionarios de métodos para poder
interactuar con ellos, mientras que aquí no es lo que me interesa.
Quiero ver un método compilado.
Entonces, para ver un método compilado,
Elijo #degrees por ejemplo, y navego
y, de repente obtengo un CompileMethod
Un CompileMethod es un objeto que, una vez más,
propone diferentes formas de ser mostrado por el inspector.
Aquí ves un método compilado,
De hecho, este es un marco de datos, una tabla
un poco específica, que contiene los bytecodes
y literales. ¿Qué son los literales?
En el código, cada vez que referenciamos
asFloat, arcTan, degrees o RadianToDegrees,
esto necesita ser almacenado en alguna parte.
Se almacena aquí, ya ves, al principio
del método compilado
¿Qué hace los bytecodes?
Se refiere a esos objetos
para ponerlos en el stack de ejecución e invocar los métodos.
Entonces, esto es lo que podemos ver, por ejemplo, si nos fijamos en
la vista, minimizo esto, si miramos la vista de Bytecode
¿que hace?
Hace PushRcvr, por lo que pone 0 en el stack y #equal.
¿A que corresponde?
Si miramos un poco de cerca,
Lo muestro dos veces, este modo de visualización es
realmente muy útil, mira lo que podemos hacer:
si ahora quiero ver
el código, elijo Bytecode allí y
y Source aquí, esas expresiones se corresponden entre sí,
mira que se muestra.
Entonces esto es genial.
Significa que puedo hacer un Push de la variable de instancia 0 del receptor,
puse 0 en el stack
y envío el mensaje "equal".
Y aquí, es genial porque significa
que la persona que está haciendo
el compilador puede ver que el Bytecode que produjo
corresponde a la estructura del código.
De la misma manera, puede fácilmente
verlo... Retrocedo ...
Si estoy en la parte superior y hago clic en "self",
aquí obtengo mis 2 métodos compilados
Obtengo mis 2 métodos compilados y de hecho
me gustaría ver si tengo
un árbol de sintaxis abstracto,
y el código fuente. También puedo explorar dentro.
Aquí, por ejemplo, en mi árbol que puede ser
complicado para este método, si abro todo, puedo ver
que si selecciono la variable
temporal "Time", selecciono
la parte del código a la cual se refiere.
Esto también es genial. Una vez más si
miro esto ... el mensaje que envía "equal" a X
con 0 como argumento, esto es esta pequeña parte del árbol
correspondiente a esta parte aquí.
El inspector me permite administrar, en
representación textual del árbol
las selecciones que tengo de los nodos del árbol.
Esto constituye una gran herramienta por ejemplo para ayudar
a los que desarrollan el compilador.
Puedes usar este enfoque para
cada dominio, incluso para tu objetos de dominio
puedes extender el inspector,
para proponer facetas y vistas que tienen sentido.