COGNEW
2: Referencia de Lenguaje Spin –
La Necesidad de Espacio de Pila
Un cog ejecutando código spin a diferencia de uno ejecutando ensamblador Propeller necesita
un espacio temporal llamado espacio de pila para retener datos tales como llamadas de pila,
parámetros y resultados intermedios. Sin esto características sofisticadas como llamadas a
métodos, valores y expresiones complejas no serian posibles sin tener limitaciones.
El compilador Spin automáticamente proporciona espacio de pila para la aplicación del
código inicial, el código superior de la aplicación spin. El "espacio libre" siguiendo la
memoria de la aplicación se usa para este propósito. Sin embargo el compilador no puede
distinguir entre bloques de pila para el código spin que la aplicación esta corriendo por si
misma, por lo tanto la aplicación debe proveer el espacio de pila a si mismo.
Típicamente este espacio de pila se proporciona en la forma de variables globales declaradas
SqStack
solo para ese uso, tales como la variable
en el ejemplo. Desafortunadamente es difícil
determinar cuanto espacio debe proporcionarse, así que cuando desarrolle un objeto se
sugiere que inicialmente proporcione un monto largo de memoria long (120 longs o mas) y
una vez que el objeto se completo utilice un objeto como el objeto Stack Lenght de la librería
Propeller para determinar el tamaño optimo. Ver el objeto Stack Lenght para mayor
explicación
código Spin solo puede ser iniciado por su propio Objeto
En lenguaje spin, por diseño, los objetos deben inteligentemente controlar su propia
información, los métodos que operan, los cogs que ejecutan esos métodos y la interfase que
otros objetos usan para afectarlo. Estos son todos los aspectos que sirven para mantener la
integridad del objeto e incrementar su uso y consistencia.
Por estas razones el objeto y su diseñador son notablemente el mejor equipo para proveer el
apropiado espacio de pila que se requiere para que el código spin pueda iniciarse en otro cog.
COGNEW
COGINIT
Para reforzar este principio la instrucción
y
no pueden iniciar código spin
fuera de su objeto contenido. Esto significa que la sentencia como la que sigue no trabajara
como se espera.
cognew(SomeObject.Method, @StackSpace)
SomeObject.Method
SomeObject.Method
En vez de iniciar
en otro cog, el Propeller ejecutara
dentro del cog actual y si ese método regresa un valor el Propeller tomara el valor y lo usara
como la dirección de código a iniciar con la instrucción cognew. Esto no representa la
intención de lo que el escritor del código quería realizar.