Jupiter Ace Forth (Interpetado/Compilado)

Elurdio
Mensajes: 495
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 110 veces
Agradecimiento recibido: 93 veces

Jupiter Ace Forth (Interpetado/Compilado)

Mensajepor Elurdio » 24 Mar 2022 12:07

Se habla a veces sobre si el Jupiter Ace (JA) es un lengueje compilado o interpretado. La respuesta habitual es que es ambos.

Intérprete:
Se puede usar interactivamente, escribiendo las palabras y/o números en el búfer de entrada y tras pulsar ENTER el JA los va interpretando y ejecutando uno tras otro.

Pero hay palabras que solo se pueden ejecutar tras haberse compilando dentro de otras palabras. Están por ejemplos todas las estructuras de control: Bucles y Condicionales. Por lo que no es un intérprete al uso, como el BASIC.

Compilador:
Cuando se define una palabra se entra en modo compilación. Todo lo que escribamos en este modo, cuando se pulse ENTER el JA lo interpreta y a continuación lo compila en la definición. NO lo ejecuta.

Ahora bien. Es un tipo de compilación llamada en inglés "Threaded Code" (Código enhebrado). No es una compilación al estilo de la que convierte el código fuente (el texto que escribes como programa) a un fichero ejecutable en código máquina al uso.

Digamos que se genera una "lista" de direcciones que apuntan a subrutinas en código máquina. Esta lista la examina un "intérprete" especial que va realizando llamadas (CALL) a dichas subrutinas.

El Jupiter Ace es el tipo de Forth que tiene dos intérpretes:

  1. El intérprete de código fuente. El que lee el texto (código fuente) que escribimos en el búfer de entrada. Lo traduce a Forth y, según el modo en que estemos, lo ejecuta o lo compila.
  2. El intérprete interno. Que es el que se encarga de leer la lista de apuntadores e ir ejecutando las subrutinas a las que apuntan.

Es por esto que yo (y otros muchos) consideramos al Forth un lenguaje interpretado. Aunque también compila, no es una compilación, digamos, total.

Existen COMPILADORES de Forth que funcionan como otros lenguajes compilados, generando un ejecutable en código máquina al uso, que se ejecuta directamente, sin el concurso del intérprete especial que mencionaba.

Así, a modo de ejemplo sencillo, en el JA podemos definir la siguiente palabra:

Código: Seleccionar todo

: TEST
DUP +
;

Para ello escribimos lo siguiente en el búfer de entrada y pulsamos ENTER:

: TEST DUP + ; <ENTER>

Tras pulsar ENTER entra en acción el Intérprete(1) que nos va traduciendo lo escrito a Forth:
  • Encuentra el ":" que le dice a Forth que vamos a crear una palabra cuyo nombre será lo siguiente que encuentre en el búfer. También le dice a Forth que todo lo que se interprete a partir de ahora se ha de "compilar" en el diccionario (sin ejecutarlo).
  • Interpreta TEST como el nombre de la palabra.
  • Interpreta DUP. Como estamos en modo compilación, no lo ejecuta sino que compila su CFA en la palabra TEST que estamos definiendo.
  • Interpreta "+". Compila su CFA en la palabra TEST justo depués del CFA de DUP.
  • Interpreta ";" y compila el CFA de EXIT, la palabra que terminará la ejecución de TEST. ";" también informa a Forth que entramos en modo intérprete. Si hubiera algo más en el búfer el intérprete lo traduciría a Forth y lo ejecutaría. En nuestro ejemplo no hay nada más.

En definitiva TEST consta de una cabecera con su nombre y otros datos seguida de su Campo de parámetros que no es más, en este caso, que una serie o lista de los CFAs de cada una de las palabras que la componen.

Los CFA son apuntadores de 16 bits. Cada CFA apunta a la cabecera de una palabra. En la dirección de memoria apuntada hay otro apuntador de 16 bits que apunta al código máquina que se ha de ejecutar cuando se ejecute esta palabra.

Así TEST es:

Cabecera de TEST
CFA de DUP
CFA de +
CFA de EXIT

Cuando escribimos TEST en el búfer y pulsamos ENTER arranca el intérprete(1) que lee el nombre de la palabra y la ejecuta.

Al ejecutarse TEST su CFA (el de la cabecera de TEST) apunta al Intérprete Interno, o sea, el Intérprete(2). Este es el que se encarga de la ejecución de TEST:

  • Lee el primer CFA del Campo de Parámetros: El CFA de DUP
  • Lee la dirección que hay guardada allí y que apunta al código máquina que corresponde a la ejecución de DUP.
  • Ejecuta el código en dicha dirección: Salta a (CFA)
  • Repetimos el proceso, ahora con el segundo CFA, etc.

Este proceso que realiza el Intérprete(2), el interno, es muy rápido, pues como se ve es una rápida sucesión de cargar dirección, ejecutar subrutina, cargar siguiente dirección, ejecutar subrutina, ... etc.

Elurdio
Mensajes: 495
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 110 veces
Agradecimiento recibido: 93 veces

Re: Jupiter Ace Forth (Interpetado/Compilado)

Mensajepor Elurdio » 26 Mar 2022 12:32

Pongo aquí una lista de las características de FORTH que más me chocaron cuando "contacté" con el Jupiter Ace viniendo de BASIC.

  1. FORTH usa Notacion Polaca Reversa (RPN) al realizar operaciones aritméticas. Basicamente al realizar una operación primero van los números con los que se opera y luego viene la operación a realizar. Así, para sumar 2 y 3: " 2 3 + " mientras en BASIC sería " 2 + 3 "
  2. FORTH maneja los números a través de una pila de datos tipo LIFO (el último dato que entra es el primero en salir). BASIC utiliza variables.
  3. FORTH es un lenguaje estructurado. NO tiene el comando GOTO. En BASIC depende de ti que sean más o menos estructurados los programas. En general, mis programas en BASIC acababan siendo una maraña de armas tomar...
  4. FORTH trabaja con números enteros sencillos (y dobles en menor grado). BASIC trabaja con números decimales.
  5. En FORTH casi todo está por hacer. Cosas que en BASIC te vienen dadas (como por ejemplo el manejo de cadenas de caracteres o las matrices) en FORTH te las tenías que definir tú.
  6. Lo cerca que está FORTH de la máquina. El conocer FORTH me facilitó mucho el aprendizaje posterior del código máquina por ejemplo.

Y la lista podría continuar...

NOTA: Las dos primeras impactan viniendo de BASIC paro yo también usaba calculadoras HP, por lo que el impacto fue mucho menor. La falta del GOTO sí que fue un poco "shock", pues hasta las HP lo tienen.

(*) Hace mucho, pero que muchos años que no uso el Basic. Me he olvidado de casi todo. Pero bueno, probando y tal he podido hacer alguna cosa sin tener que leerme el manual. Parece mentira que se me haya olvidado siendo el lenguaje que más habré usado.

Elurdio
Mensajes: 495
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 110 veces
Agradecimiento recibido: 93 veces

Re: Jupiter Ace Forth (Interpetado/Compilado)

Mensajepor Elurdio » 02 Sep 2022 00:34

Vamos a hacer una comparativa de las velocidades del Ace Forth actuando como lenguaje Interpretado y como lenguaje Compilado.

Para ello escribo en el búfer de entrada lo siguiente:

TIMEX_INI 30 20 10 ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT
ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT TIMEX .

Pulso ENTER y el Ace Forth me va interpretando y ejecutando cada palabra del búfer de entrada. Tarda unos 0.6 segundos en ejecutarlo todo.

Ahora pongo lo que hemos cronometrado (lo que hay entre TIMEX_INI y TIMEX) dentro de una definición COLON con lo que queda compilado:
: TEST
30 20 10 ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT
ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT ROT
;

y cronometro cuanto tarda en ejecutarse TEST. Me sale 0.0068 segundos

Esta da una estimación aproximada que la ejecución en modo Compilado del Ace Forth es unas 87 veces más rápida que en modo Interpretado del Ace Forth.

En realidad no es tan abultada la diferencia, pues en modo interpretado va imprimiendo en pantalla (incluso en modo INVIS), lo cual enlentece el proceso en modo Interpretado, pero por ahí van los tiros.
Además, para ser más real, debería usar diferentes palabras, pues mientras más cerca están del inicio del diccionario, más tarda el intérprete en "encontrarlas"... es solo una estimación burda de la diferencia de velocidades.

EDIT (2-9-2022): Me equivoqué por un factor de 10 en el tiempo de ejecución de TEST. Ya lo he corregido en el texto (color cyan). No me acordé que dado que tardaba mucho en ejecutarse el test incluso estando la velocidad del emulador a 32x, lo dividí por 10 (de ejecutar 4 millones de ROTs a 400.000)

jltursan
Mensajes: 4707
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 692 veces
Agradecimiento recibido: 1546 veces
Contactar:

Re: Jupiter Ace Forth (Interpetado/Compilado)

Mensajepor jltursan » 02 Sep 2022 08:47

Bueno, realmente esa es la diferencia que siempre existe entre lo interpretado y lo compilado. El tiempo que tarda en compilar una única vez, es el que te ahorras luego en posteriores ejecuciones.
Actualmente estas sutilezas son parte de los fundamentos de mecanismos como la compilación JIT, si el tiempo extra que te lleva compilar algo es inferior al tiempo que ganas al ejecutar el resultado de dicha compilación, pues hazlo.

Elurdio
Mensajes: 495
Registrado: 07 Dic 2021 21:33
Ubicación: Barcelona
Agradecido : 110 veces
Agradecimiento recibido: 93 veces

Re: Jupiter Ace Forth (Interpetado/Compilado)

Mensajepor Elurdio » 23 Sep 2022 01:12

En el primer post de este hilo expresaba mi opinión respecto al título del mismo:
Es por esto que yo (y otros muchos) consideramos al Forth un lenguaje interpretado. Aunque también compila, no es una compilación, digamos, total.

En el ebook de Dutra (página 39) afirma todo lo contrario:
Clarifying some Myths:
* "Forth is interpreted language"... NOT! (Only user interaction is)
It's a compiled Language, How it is compiled depends on implementation.
Forth original method is Threaded Compilation, of pointers run by a dispatcher.
(Treading can be Subroutine based.) Using a dispatcher is the equivocation source,
though much different than using an interpreter. There is a translation action on
compiling, sometimes lazily referenced as 'interpretation' (a flawed designation.)
···


Volver a “Jupiter Ace”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado