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
