En 2015-12 decidí convertir Solo Forth
(http://programandala.net/es.programa.solo_forth.html) de ITC (código de
enhebrado indirecto, el sistema clásico en Forth, en que el campo de
código de las palabras contiene la dirección del código ejecutable por
el procesador) a DTC (código de enhebrado directo, en que el campo de
código es la dirección del código ejecutable). ITC había sido heredado
de Abersoft Forth, el fig-Forth de cuyo código partió el desarrollo de
Solo Forth.  La conversión a DTC había sido un objetivo desde el
principio, pero la fui postergando hasta que el sistema estuviera
suficientemente maduro y fuera bastante estable, aparte de que ya no
tuviera casi rastro del fig-Forth original.

Lo primero que hice fue calcular cuánta memoria adicional haría falta.
Algunos tipos de palabras ahorran dos o tres octetos en DTC, pero la
mayoría de tipos necesita un octeto más por palabra.  Me sorprendió que
el núcleo del sistema solo fuera a necesitar 22 octetos más:

|===
| Tipo de palabra     | Cantidad | Diferencia de memoria en DTC

| código              | 145      | -290
| dos puntos          | 248      | +248
| variable            | 42       |  +42
| variable de usuario | 20       |  +20
| constante           | 38       |  +38
| vector              | 12       |  -36
| TOTAL               |          |  +22
|===

La mayoría de las palabras en la biblioteca del sistema son de dos
puntos, variables o constantes, pero un octeto más por cada definición
parecía un coste pequeño a cambio de los beneficios de DTC (código más
rápido y más sencillo).

De todas formas conservé el código original ITC, de modo que el núcleo
pudiera compilarse a voluntad como ITC o DTC, por si acaso, hasta que
DTC estuviera totalmente probado.

Después hice unas pruebas de rendimiento. No imaginaba cuánto más rápido
sería DTC en un Z80, y los resultados fueron satisfactorios: El tiempo
de ejecución en modo DTC era entre el 80% y el 90% comparado con ITC:

  \ ------------------------------------------------------------
  \ BYTE Magazine benchmark
  \ Code adapted from: Forth Dimensions (volume 17, number 4,
  \ page 11, 1995-11).
  \
  \ Times Frames (1 frame = 50th of second)
  \ ----- -----------------------------------
  \       ITC           DTC
  \       -----         -----
  \ 00010  6397          5216
  \ 00100 63970 (1.00)  52159 (0.81)

  \ ------------------------------------------------------------
  \ Interface Age Benchmark, 1985-11-16.  This is the Interface
  \ Age benchmark program described in Appendix D of the
  \ forthCMP Manual.

  \ Code adapted from: Forth Dimensions (volume 17, number 4,
  \ page 11, 1995-11).

  \ Times Frames (1 frame = 50th of second)
  \ ----- -----------------------------------
  \       ITC           DTC
  \       ------------  ------------
  \ 05000 80091 (1.00)  72445 (0.90)

  \ ------------------------------------------------------------
  \ vector-loop-benchmark
  \ Code adapted from: Forth Dimensions (volume 17, number 4,
  \ page 11, 1995-11).
  \ M. Edward Borasky, 1995-07-30

  \ Benchmark     Frames (1 frame = 50th of second)
  \ ---------     -----------------------------------
  \               ITC           DTC
  \               ------        -------------
  \ Vector noop    10919 (1.0)    9033 (0.82)
  \ Vector +       58650 (1.0)   47462 (0.80)
  \ Vector *      107770 (1.0)   91611 (0.85)
  \ Vector /      149002 (1.0)  127495 (0.85)
  \ Vector */     178854 (1.0)  154480 (0.86)

Solo Forth ha estado funcionando como DTC los últimos tres meses, sin
problemas relacionados con ello, por lo que en la versión 0.2.0, la más
reciente, he eliminado el antiguo código ITC.

¿Alguien tiene alguna experiencia con ITC y DTC en algún sistema Forth?

-- 
Marcos Cruz
http://programandala.net

Responder a