sábado, 28 de enero de 2012

La furia del Forth, más que un lenguaje.




El Forth fue desarrollado en 1970 por un inquieto programador de mainframes. Charles Moore que contaba con una gran experiencia en la programación de grandes ordenadores. Pronto se dio cuenta de que las soluciones a los problemas que se le planteaban casi nunca eran compatibles con los medios de que disponía.
Durante sus dilatados trabajos en varios sistemas de distíntas característícas, fue perfilando lo que sería el nuevo lenguaje. Experimentó con pilas, notación polaca (coloca los operadores a la izquierda de sus operandos ) y otra serie de elementos que más tarde combinaría dando a luz el lenguaje Forth.


Charles Moore


Esto ocurría cuando Moore comenzó a trabajar en un observatorio astronómico y fue aquí donde el lenguaje demostró su eficacia. Fue utilizado para el control del radiotelescopio del observatorio con ex­celentes resultados. Allí conocería al que más tarde sería su socio en la formación de la compañía Forth Inc, de la que Moo­re saldría no mucho tiempo después.
En un principio el Forth estuvo destina­do al desarrollo de programas de control en tiempo real, imprescindible para el funcionamiento como tal del telescopio, pero se aplicó con éxito en desarrollos de todo tipo y gestión de gráficos.
Si bien en Europa su éxito y conoci­miento fué nulo, en Estados Unidos fué más reconocido. Un ejem­plo de ello es que a mediados de los años 70 un grupo de usuarios de Forth consti­tuyeron el Forth Standar Team, encamina­do a dictar una serie de normas que con­tribuyesen a estandarizar el lenguaje. Así, existen varias revisiones que correspon­den a los años 1977, 1978, 1979, 1980 y, la última, que es de 1983.
Otro grupo de usuarios forma el grupo FIG (Forth Interesting Group) que, ante la pasividad de Forth Inc para promocionar el lenguaje, decidieron aceptar ellos el reto. Así, el grupo formado por cinco pro­gramadores experimentados, desarrollará una versión denominada FIG-Forth, que podía correr en seis ordenadores distin­tos. En 1979 presentaron esta versión en San Francisco, con motivo de la feria In­formática de la Costa Oeste. En ella expli­caron sus características y vendieron los listados fuentes y los manuales de instala­ción al irrisorio precio de 20 dólares. De esta forma consiguieron que gran número de personas conociera el lenguaje y com­probase sus posibilidades, aumentando su popularidad.


Un desconocido

Apesar de su probada eficacia, el Forth es el gran desconocido de los lenguajes de programación. Varias son las razones que han contribuido a este hecho.
Si se estudia la trayectoria desde su na­cimiento, se puede apreciar que, al con­trario de otros lenguajes, no ha sido ni desarrollado ni promocionado por ningu­na gran firma de ordenadores y ni siquie­ra ha sido reconocido por organismos ofi­ciales. Al contrario que el ADA, que fue desarrollado bajo los auspicios del Pentá­gono.
Otra de las posibles causas de este «ol­vido» es que el lenguaje, si bien puede ser usado por cualquier persona sin difi­cultad, está más bien dirigido a experi­mentados programadores que necesiten de una herramienta potente. De esta ma­nera su llegada al gran público se ve más restringida.



Características

Forth es un lenguaje que se sitúa en ese nivel intermedio que delimita las fron­teras entre los lenguajes de alto nivel y los lenguajes máquina. De ello se derivan dos de sus principales características, la excasa ocupación de memoria y la rapi­dez. Un intérprete Forth viene a ocupar unos 8 Kbytes de memoria RAM, lo que determina su simplicidad y facilita su implementación en microordenadores que cuenten con escasez de memoria, por ejemplo, los domésticos. En cuanto a la rapidez, baste decir que cualquier reali­zación sobre este lenguaje se comporta diez veces más rápida que otra realizada, por ejemplo, en Basic.
Forth cuenta con tres elementos funda­mentales: verbos, nombres y definición de palabras. Los verbos provocan la eje­cución de determinadas acciones, los nombres facilitan la dirección de rutinas objeto y, la definición de palabras, crea nuevos verbos, nombres o palabras que pueden ser usados por el programador como si fueran originales del lenguaje.
Este último elemento es el que le pro­porciona más potencia. A través de él, el programador puede añadir a su versión de Forth todos aquellos elementos especí­ficos de su problema o aquellos que con­sidere que pueden serle útiles en un mo­mento determinado. Es decir, el lenguaje se comporta como un entorno abierto que permite configurarlo según las necesida­des de cada uno.
Forth es un lenguaje altamente estruc­turado, lo que se demuestra por el hecho de que las palabras deben ser definidas antes de su utilización o que el programa­dor pueda operar con procedimientos in­dependientes, lo que le provee de una mayor rapidez y fiabilidad.
Dentro del lenguaje se pueden definir cinco partes fundamentales: el dicciona­rio, los stacks, el intérprete, el ensambla­dor y el almacenamiento virtual.

Diccionario

Todos los elementos de Forth están or­ganizados dentro de un diccionario. En él se encuentran los verbos, nombres y pa­labras definidas, que pueden ser de va­rios tipos. Pero, como ya se ha comenta­do, el lenguaje es abierto y el diccionario puede ser ampliado con nuevas palabras. La definición es bastante sencilla, por ejemplo para determinar el cubo de un número se puede defmir la palabra CU­BO.

:CUBO
DUP DUP
* - *;

Los dos puntos le indican que lo que viene a continuación es una nueva pala­bra que deberá ser incluida en el diccio­nario. Lo siguiente debe ser un conjunto de palabras ya definidas en el dicciona­rio, en esta caso DUP (duplicar) y * (multi­plicar). La definición debe termmar con un punto y coma. Así, la palabra CUBO pasa a formar parte del diccionario y pue­de ser utilizada para realizar operaciones o participar en otras definiciones, por ejemplo:

3 CUBO
Calcula el cubo de 3.

: PEPE
3 CUBO *;

Define una nueva palabra que permitirá multiplicar el cubo de un número por tres.
Pero el diccionario no contiene sólo pa­labras propiamente dichas, como puede ser DUP o CUBO, sino que también dispo­ne de los símbolos aritméticos, *, +, -, =, /, y los lógicos como <, >, <=, >=. Por tanto, cualquier símbolo, palabra o proce­dimiento estará recogido en el dicciona­rio.
Stack
Para la realización de cálculos, el Forth utiliza un método muy peculiar. Organiza los datos en pilas (stacks), utilizando el método LIFO (Last Input First Output -Ultima Entrada Primera Salida). De esta for­ma, si se desean multiplicar dos números, por ejemplo, 4 por 5 se escribirá así:
4 5 *
Entonces colocará el 4 en la primera posición de la pila, a continuación situará en esta posición el 5, pasando el 4 a la segunda, al encontrar el asterisco se da cuenta de que se trata de una palabra del diccionario y ejecutará el procedimiento correspondiente, es decir multiplicar. Así, cogerá el número que se encuentra en la parte superior de la pilta (Ultima entrada primera salida) y lo multiplicará por el que se encuentra en segundo lugar, colo­cando el resultado (20) en la parte más alta de la pila.
En el caso de utilizar más números, lejos de complicarse, se hace más sencillo y rápido. Por ejemplo, sumar tres núme­ros, seguiría el siguiente procedimiento:
2 3 + 4 +
Colocará el 2 en primer lugar, luego el 3 y el 2 pasa a la segunda posición, calcu­la el resultado de la suma (5) y la coloca en la parte más alta. A continuación recojerá el 4, situándolo en esta posición y pasando el resultado anterior a la segun­da posición y sumará, obteniendo el total fmal (9) que, lógicamente, quedará en la posición superior de la pila.
Como se ha podido ver hasta aquí, la sintaxis utilizada para los cálculos es bas­tante extraña. La suma de dos números en cualquier lenguaje se realizará como 2 + 3, mientras que en Forth se hace 2 3 + . Esto se debe a que se utiliza la notación Polaca. Esta elección está fundamentada precisamente en la utilización de las pilas. En la lógica de las pilas se colocan prime­ro los dos números y luego se realiza el cálculo conveniente. Si se utilizase la nota­ción normal sería el lenguaje el que ten­dría que desmenuzar la expresión y colo­car los datos en la pila. Al ser el progra­mador el que lo hace se gana en veloci­dad y además se abre otra vía de flexibili­dad al poder jugar con las pilas como más convenga.

El intérprete

El lenguaje Forth está definido como un lenguaje intérprete, pero con la caracte­rística de ser muchísimo más rápido que cualquier otro lenguaje de estas caracte­rísticas. Esto se debe, de un lado, a la ya mencionada definición entre lenguaje má­quina y lenguaje de alto nivel y, por otro, a la peculiar forma de interpretación.
El Forth utiliza para la interpretación dos niveles, un intérprete de palabra y un intérprete de direcciones. El primero se encarga de recoger las palabras que se introducen en el programa, ya sea desde la consola o desde un medio de almace­namiento externo, y realiza una búsqueda en el diccionario. Una vez hecho esto lla­ma al intérprete de direcciones, el cual se encarga de ejecutar los procedimientos asociados a la palabra recogida. Por ejemplo, en el caso de CUBO el intérpre­te de palabras buscaría en el diccionario su existencia y mandaría al intérprete de direcciones buscar el procedimiento que corresponde, es decir DUP DUP *-*.

Ensamblador

El lenguaje provee de una potente he­rramienta que permite al programador definir palabras con un macroemsamblador residente. Para ello se utiliza la pala­bra CODE. A través de ella se consigue un absoluto y directo control de la CPU del sistema por lo que usado conveniente­mente, se pueden optimizar aún más los tiempos de ejecución, así como contar con un elemento de control de cualquier dispositivo del sistema.

Almacenamiento virtual

Para el almacenamiento en disco, Forth utiliza el método de almacenamiento vir­tual. Otros lenguajes almacenan los datos y programas en los lugares del disco que están libres y posteriormente para locali­zarlos, deben recorrer todo el disco hasta dar con ellos. Forth organiza el disco en una serie de bloques de 1 Kbyte. Estos bloques están contenidos en dos o más Buffer, de forma que cuando se hace refe­rencia a un bloque el sistema accede di­rectamente a la posición de disco en el que se encuentra, sin necesidad de tener que recorrerlo.
Por otro lado, existen diversos tipos de bloques según la información que conten­gan, así se disponen unos para datos, otros para programas, para el editor, etc. .Este acceso directo agiliza enormemen­te las operaciones de lectura y escritura, que por regla general son las operaciones más lentas de un programa. Además, se añade la característica de que las direc­ciones de los bloques suelen coincidir con la dirección correspondiente a su posición física dentro del disco.

Encontrar un sistema Forth que se ajus­tara a un equipo en concreto no suponía nin­gún problema. Se disponía de numerosas versiones para los más variados equipos. Desde el legendario Apple al IBM PC, pasando por cualquier doméstico.
Concretamente en nuestro país, existió un ordenador doméstico que lo incorporó de forma estándar en lugar del acostum­brado Basic. Se trata del Jupiter ACE de procedencia inglesa. El fabricante consi­deró que era más interesante icluir este lenguaje que cualquier otro debido a su potencia y facilidad de manejo, además al ocupar muy poca memoria se optimiza és­ta y se abarata el sistema.




Enlaces de interés :

- Página oficial de Forth.-
- Intérprete Forth en Retrowiki


José Ignacio Salmerón con modificaciones y revisiones de Drachco.

5 comentarios:

  1. Yo tengo un Fignition y se programa en Forth! Muy bueno el artículo.

    http://sites.google.com/site/libby8dev/fignition

    ResponderEliminar
  2. Hola.
    Interesante aparatejo!!. Tengo pendiente el montaje de un clón del Jupiter Ace para poder programar y experimentar con el Forth. La verdad es que es un lenguaje pontente y con muchas posibilidades por descubrir.

    ResponderEliminar
  3. Me da gusto que alguien mas entienda los alcances de un lenguaje verdaderamente potente, felicidades por el aporte y muchas gracias.

    Saludos

    ResponderEliminar
  4. a mi tambien me sirve falta mucho mas por investigar

    ResponderEliminar