En/Je/On 2017-06-26 12:09, javier gil [email protected] [forth-es] escribió / 
skribis / wrote :

> Desde siempre se ha dicho que Forth fuerza la programación de abajo hacia
> arriba. Es el estilo natural para este lenguaje y el que recomiendan los
> que saben. Sin embargo, me he dado cuenta de que por la carencia de
> elementos sintácticos que distraigan, la programación de arriba hacia abajo
> es más natural en Forth que en otros lenguajes, porque el código que se
> escribe, teniendo aspecto de pseudocódigo, es realmente código Forth listo
> para ejecutarse. Luego, cuando se ha descendido lo suficiente, se puede
> enlazar desde abajo hacia arriba.

Es una reflexión muy interesante.

Yo pienso que ambos caminos son complementarios, igual de útiles y
productivos. Escoger uno u otro en cada momento depende de muchos
factores.

A veces, para tener una visión global del código, es útil empezar desde
arriba, partiendo de una descripción ideal del problema, e ir
descendiendo, repitiendo el proceso en cada paso.

Otras veces se ve claramente la necesidad de ciertas palabras de bajo
nivel, y su uso condiciona la forma de los niveles superiores.

> Esto tiene un beneficio adicional muy importante: el ruido de pila
> queda confinado en los niveles más bajos, y en el nivel alto no queda
> rastro de él. Ciertamente, una factorización bien hecha desde abajo
> puede conseguir el mismo efecto. Pero, para un programador corriente,
> como yo, esto se consigue más fácilmente empezando desde arriba.

Sí, es cierto que en código bien factorizado el ruido de pila desaparece
de los niveles superiores, porque la pila se usa solo para el paso de
parámetros.

Por otra parte, cuanto más pequeñas y especializadas sean las palabras,
menos necesidad habrá de hacer manipulaciones confusas en la pila.

Idealmente, al final del proceso, cada palabra, lo más pequeña posible,
debería corresponderse con una tarea concreta, precisa, clara, y cuya
función resulte lo más evidente posible fuera de contexto.

Un ejemplo de código reciente que escribí con ese doble proceso (de
arriba hacia abajo y de abajo hacia arriba), es el bucle principal de
_Nuclear Waste Invaders_
(http://programandala.net/es.programa.nuclear_waste_invaders.html), cuya
versión actual es la siguiente:

----------------------------------------------------------------
: extermination? ( -- f ) invaders c@ 0= ;

: attack-wave ( -- ) init-mothership init-invaders parade ;

: fight ( -- )
  fly-projectile driving
  fly-projectile shooting
  fly-projectile manage-mothership
  fly-projectile invasion ;

: end-of-attack? ( -- f ) extermination? catastrophe? or ;

: under-attack ( -- ) check-breachs attack-wave
                      begin fight end-of-attack? until
                      lose-projectiles ;

: another-attack? ( -- f ) breachs? catastrophe? 0= and ;

: weapons ( -- ) new-tank new-projectiles ;

: prepare-battle ( -- ) settle weapons ;

: interlude ( -- ) new-breach? ?exit repair-building ;

: battle ( -- )
  prepare-battle begin under-attack another-attack?
                 while attack-report interlude repeat ;

: campaign ( -- ) begin battle catastrophe? 0=
                  while battle-report reward travel repeat ;

: war ( -- ) prepare-war campaign defeat ;

: run ( -- ) begin mobilize war again ;
----------------------------------------------------------------

Creo que ese código también ilustra lo que comentas de que el ruido de
pila desaparece en el nivel superior.

> Empiezo a pensar que el buen programador de Forth no es el que domina la
> pila, y puede escribir código que la manipule al vuelo. Empiezo a pensar
> que el buen programador de Forth es aquél que necesita muy poco luchar
> contra la pila.

Estoy de acuerdo.  El objetivo ideal es hacer que la pila pase lo más
desapercibida posible, para que no ensucie la «poesía» de Forth...

-- 
Marcos Cruz
http://programandala.net

Responder a