Compilación

Compilar código en Pharo es tan sencillo como hablar con el objeto compiler pasándole, entre otras cosas, el código a compilar y un objeto que sepa como resolver las variables. Por ejemplo, dado el siguiente método:

selector

    ^ unaVariable + OtraVariable

entendemos que unaVariable y OtraVariable van a ser referencias a objetos. La primera, unaVariable, parecería ser una variable de instancia dado que no es una variable temporal. Sin embargo, la segunda (OtraVariable) podría ser una variable de clase o una clase!

Para resolver correctamente las variables vamos a enviarle al compilador un objeto que sepa decirle por cada nombre en el código (unaVariable/OtraVariable), qué tipo de variable es. En Ozono las instancias de OBCompilationBinder se encargan de eso.

El compilador se encarga primero de resolver las variables de instancia, preguntándole #allInstVarNames al compilation binder. El resto de los nombres son luego resueltas mandándole el mensaje #bindingOf: a la clase, que deberá devolver un binding (una association).

Nota 1: En Pharo, #bindingOf: resuelve de la siguiente manera:
  - Primero busca las variables de clase de la clase
  - Luego busca en los SharedPools
  - Finalmente, busca en las variables globales
Nota 2: El workspace de Pharo usa este mismo mecanismo para poder tener variables persistentes. Tiene un diccionario con cada variable que usamos. Luego, en el #bindingOf: resuelve (luego de la resolución normal) el binding con su diccionario.

El OBCompilationBinder implementa como más importantes los siguientes métodos:

OBCompilationBinder >> allInstVarNames

^ class allInstVarNames

OBCompilationBinder >> bindingOf: aName 

^ lesson bindingOf: aName

luego, la lección implementa

OBLesson >> bindingOf: aName 

^(self includesLiteralNamed: aName)
ifTrue: [ aName -> (self literalNamed: aName) ]
ifFalse: [ nil ]

Nótese que la compilación en Ozono no incluye la resolución de variables globales. Luego, si intentamos usar una clase o variable global, el compilador va a interpretarlo como una variable que no conoce. Corolario: no pueden usarse clases del sistema en Ozono.
Comments