Forth es un lenguaje de programación orientado a pilas y un entorno de desarrollo integrado interactivo diseñado por Charles H. "Chuck" Moore y utilizado por primera vez por otros programadores en 1970. Aunque no es un acrónimo , en sus inicios el nombre del lenguaje se escribía a menudo en mayúsculas como FORTH . Las implementaciones FORTH-79 y FORTH-83, que no fueron escritas por Moore, se convirtieron en estándares de facto , y en 1994 se publicó un estándar técnico oficial del lenguaje llamado ANS Forth. Existía una amplia gama de derivados de Forth antes y después de ANS Forth. La implementación de software libre y de código abierto Gforth se mantiene activamente, al igual que varios sistemas con soporte comercial .
Forth normalmente combina un compilador con un intérprete de comandos integrado, donde el usuario interactúa a través de subrutinas llamadas palabras . [ a ]
Las palabras se pueden definir, probar, redefinir y depurar sin necesidad de recompilar ni reiniciar todo el programa. Todos los elementos sintácticos, incluidas las variables, los operadores y el flujo de control, se definen como palabras. Se utiliza una pila para pasar parámetros entre palabras, lo que da lugar a una notación de estilo polaco inverso .
Durante gran parte de la existencia de Forth, la técnica estándar consistía en compilarlo a código multihilo , que se interpreta más rápido que el código de bytes . Una de las primeras ventajas de Forth era su tamaño: un entorno de desarrollo completo —que incluía el compilador, el editor y los programas de usuario— cabía en la memoria de un sistema de 8 bits o similar. Ya sin las limitaciones de espacio, existen implementaciones modernas que generan código máquina optimizado , al igual que otros compiladores de lenguajes.
La relativa simplicidad de crear un sistema Forth básico ha dado lugar a muchas variantes personales y propietarias, como el Forth personalizado utilizado para implementar el videojuego superventas de 1986 Starflight de Electronic Arts . [ 3 ] Forth se utiliza en el cargador de arranque de Open Firmware , en aplicaciones de vuelos espaciales [ 4 ] como la nave espacial Philae , [ 5 ] [ 6 ] y en otros sistemas embebidos que implican interacción con hardware.
A principios de la década de 1980, Moore desarrolló una serie de microprocesadores para ejecutar directamente código compilado similar a Forth y experimentó con lenguajes más pequeños basados en conceptos de Forth, como cmForth y colorForth . La mayoría de estos lenguajes se crearon para dar soporte a los propios proyectos de Moore, como el diseño de chips.
Usos
Forth tiene un nicho en aplicaciones astronómicas y espaciales [ 7 ] , así como una historia en sistemas embebidos . Las ROM de arranque de Open Firmware utilizadas por Apple , IBM , Sun y OLPC XO-1 contienen un entorno Forth.
Forth se ha utilizado con frecuencia para poner en marcha nuevo hardware. Forth fue el primer software residente en el nuevo chip Intel 8086 en 1978, y MacFORTH fue el primer sistema de desarrollo residente para el Macintosh 128K en 1984. [ 8 ]
Alrededor de 1982, Atari, Inc. utilizó una elaborada demo autoejecutable escrita en Forth para mostrar las capacidades de las computadoras Atari de 8 bits en grandes almacenes. [ 9 ] Electronic Arts publicó varios videojuegos en la década de 1980 que fueron escritos en Forth, incluyendo Worms? (1983), [ 10 ] Adventure Construction Set (1984), [ 11 ] Amnesia (1986), [ 12 ] Starflight (1986), [ 3 ] y Lords of Conquest (1986). El juego de codificación de robots ChipWits (1984) fue desarrollado en MacFORTH para la Macintosh 128K , [ 13 ] mientras que el puerto para Commodore 64 fue escrito con SuperForth 64. [ 14 ] El prototipo de Boulder Dash (1984) fue implementado en Forth antes de ser reescrito en lenguaje ensamblador 6502. [ 15 ]
RapidFile (1986) de Ashton-Tate , un programa de base de datos de archivos planos, y VP-Planner [ 16 ] de Paperback Software International (1983), un programa de hoja de cálculo que competía con Lotus 1-2-3 , fueron escritos en Forth.
El Canon Cat (1987) utiliza Forth para la programación de su sistema.
Rockwell fabricó microordenadores de un solo chip con núcleos Forth integrados: los modelos R65F11 y R65F12.
ASYST era una expansión de Forth para medir y controlar en PCs. [ 17 ]
Historia
Forth evolucionó a partir del sistema de programación personal de Charles H. Moore , que había estado en continuo desarrollo desde 1968. [ 8 ] [ 18 ] Forth se dio a conocer a otros programadores a principios de la década de 1970, comenzando con Elizabeth Rather en el Observatorio Nacional de Radioastronomía de los Estados Unidos (NRAO). [ 8 ] Después de su trabajo en el NRAO, Charles Moore y Elizabeth Rather fundaron FORTH, Inc. en 1973, refinando y adaptando los sistemas Forth a docenas de otras plataformas en la década siguiente.
Moore vio a Forth como un sucesor de los lenguajes de programación de tercera generación de compilación-enlace-ejecución , o software para hardware de "cuarta generación". Recuerda cómo se acuñó el nombre: [ 19 ]
En Mohasco [a finales de la década de 1960] también trabajé directamente con una IBM 1130 conectada a una pantalla gráfica IBM 2250. La 1130 era una computadora muy importante: tenía el primer disquete, así como un lector de tarjetas, una perforadora de tarjetas (como respaldo del disquete) y una máquina de escribir de consola. La 1130 permitió al programador, por primera vez, controlar la computadora de forma totalmente interactiva.
FORTH apareció por primera vez como una entidad en la 1130. Se llamaba FORTH, una abreviatura de cinco letras de FOURTH, que significa lenguaje de programación de cuarta generación. Era la época de las computadoras de tercera generación, como recordarán, y yo iba a dar un salto cualitativo. Pero como FORTH funcionaba en la 1130 (que solo permitía identificadores de cinco caracteres), el nombre se acortó.
El microFORTH de FORTH, Inc. fue desarrollado para los microprocesadores Intel 8080 , Motorola 6800 , Zilog Z80 y RCA 1802 , a partir de 1976. Posteriormente, aficionados utilizaron MicroFORTH para generar sistemas Forth para otras arquitecturas, como la 6502 en 1978. El Forth Interest Group se formó en 1978. [ 20 ] Promovió y distribuyó su propia versión del lenguaje, FIG-Forth, para la mayoría de las marcas de computadoras domésticas.
Forth fue popular a principios de la década de 1980, [ 21 ] porque se adaptaba bien a la memoria limitada de los microordenadores . La facilidad de implementación del lenguaje propició numerosas implementaciones. [ 22 ] El ordenador doméstico Jupiter ACE tiene Forth en su sistema operativo residente en la ROM . Insoft GraFORTH es una versión de Forth con extensiones gráficas para el Apple II. [ 23 ]
La práctica común se codificó en las normas de facto FORTH-79 [ 24 ] y FORTH-83 [ 25 ] en los años 1979 y 1983, respectivamente. Estas normas fueron unificadas por ANSI en 1994, conocidas comúnmente como ANS Forth. [ 26 ] [ 27 ]
A partir de 2018, se ha recuperado el código fuente de la versión original 1130 de FORTH, y ahora se está actualizando para que funcione en un sistema 1130 restaurado o emulado. [ 28 ]
Descripción general
Forth enfatiza el uso de funciones pequeñas y simples llamadas palabras . Las palabras para tareas más grandes invocan muchas palabras más pequeñas, cada una de las cuales realiza una subtarea distinta. Un programa Forth grande es una jerarquía de palabras. Estas palabras, al ser módulos distintos que se comunican implícitamente a través de un mecanismo de pila, pueden prototiparse, construirse y probarse de forma independiente. El nivel más alto del código Forth puede asemejarse a una descripción en inglés de la aplicación. Forth ha sido denominado un lenguaje de metaaplicación : un lenguaje que puede usarse para crear lenguajes orientados a problemas . [ 29 ]
Forth se basa en el uso implícito de una pila de datos y la notación polaca inversa , comúnmente utilizada en calculadoras de Hewlett-Packard . En la notación polaca inversa, el operador se coloca después de sus operandos, a diferencia de la notación infija, más común , donde se coloca entre ellos. La notación postfija facilita el análisis sintáctico y la extensión del lenguaje; la flexibilidad de Forth hace que una gramática BNF estática sea inapropiada, y no cuenta con un compilador monolítico. Extender el compilador solo requiere escribir una nueva palabra, en lugar de modificar una gramática y cambiar la implementación subyacente.
Utilizando RPN, se puede calcular el valor de la expresión aritmética (25 × 10) + 50 de la siguiente manera:
25 10 * 50 + CR . 300 ok
Primero se colocan los números 25 y 10 en la pila.

La palabra *toma los dos números superiores de la pila, los multiplica y vuelve a colocar el producto en la pila.

Luego se coloca el número 50 en la pila.

La palabra +toma los dos números superiores de la pila, los suma y vuelve a colocar la suma en la pila. CR( retorno de carro ) inicia la salida en una nueva línea. Finalmente, .imprime el resultado. Como todo ha finalizado correctamente, el sistema Forth imprime OK. [ 30 ]
Incluso las características estructurales de Forth se basan en pilas. Por ejemplo:
: PISO 5 ( n -- n' ) DUP 6 < SI DROP 5 SINO 1 - ENTONCES ;Los dos puntos indican el comienzo de una nueva definición, en este caso una nueva palabra (nuevamente, palabra es el término utilizado para una subrutina) llamada FLOOR5. El texto entre paréntesis es un comentario que indica que esta palabra espera un número en la pila y devolverá un número posiblemente modificado (en la pila).
La subrutina utiliza los siguientes comandos: DUPduplica el número en la pila; 6coloca un 6 en la parte superior de la pila; <compara los dos números superiores de la pila (6 y la DUPentrada ed) y los reemplaza con un valor verdadero o falso; IFtoma un valor verdadero o falso y elige ejecutar comandos inmediatamente después o saltar a ELSE; DROPdescarta el valor en la pila; 5coloca un 5 en la parte superior de la pila; y THENfinaliza la condición.
La FLOOR5palabra es equivalente a esta función escrita en el lenguaje de programación C utilizando el operador condicional '?:'.
int floor5 ( int v ) { return ( v < 6 ) ? 5 : ( v - 1 ); }Esta función se escribe de forma más concisa como:
: PISO 5 ( n -- n' ) 1- 5 MÁX ;Esto se puede ejecutar de la siguiente manera:
1. PISO 5 CR . 5 ok 8. PISO 5 CR . 7 okPrimero se inserta un número (1 u 8) en la pila, FLOOR5se llama a la función, que extrae el número y vuelve a insertar el resultado. CRSe mueve la salida a una nueva línea (de nuevo, esto solo está aquí para facilitar la lectura). Finalmente, una llamada a .extrae el resultado y lo imprime.
Instalaciones
La gramática de Forth no tiene una especificación oficial. En cambio, se define mediante un algoritmo simple. El intérprete lee una línea de entrada del dispositivo de entrada del usuario, que luego se analiza para encontrar una palabra utilizando espacios como delimitador ; algunos sistemas reconocen caracteres de espacio en blanco adicionales . Cuando el intérprete encuentra una palabra, la busca en el diccionario . Si se encuentra la palabra, el intérprete ejecuta el código asociado a ella y luego continúa analizando el resto del flujo de entrada. Si no se encuentra la palabra, se asume que es un número e intenta convertirlo en un número y apilarlo; si tiene éxito, el intérprete continúa analizando el flujo de entrada. De lo contrario, si fallan tanto la búsqueda como la conversión a número, el intérprete imprime la palabra seguida de un mensaje de error que indica que la palabra no se reconoce, vacía el flujo de entrada y espera una nueva entrada del usuario. [ 31 ]
La definición de una palabra nueva comienza con la palabra :(dos puntos) y termina con la palabra ;(punto y coma). Por ejemplo,
: X DUP 1+ . . ;compilará la palabra Xy hará que el nombre sea localizable en el diccionario. Cuando se ejecute escribiendo 10 Xen la consola, se imprimirá 11 10. [ 32 ]
La mayoría de los sistemas Forth incluyen un ensamblador para escribir palabras utilizando las funciones del procesador. Los ensambladores Forth suelen usar una sintaxis polaca inversa en la que los parámetros de una instrucción preceden a la instrucción misma. Un ensamblador polaco inverso típico prepara los operandos en la pila y el mnemónico copia la instrucción completa en la memoria como último paso. Un ensamblador Forth es, por naturaleza, un ensamblador de macros, por lo que resulta sencillo definir un alias para los registros según su función en el sistema Forth: por ejemplo, "dsp" para el registro utilizado como puntero de la pila de datos. [ 33 ]
Sistema operativo, archivos y multitarea
La mayoría de los sistemas Forth se ejecutan bajo un sistema operativo anfitrión como Microsoft Windows , Linux o una versión de Unix , y utilizan el sistema de archivos del sistema operativo anfitrión para los archivos fuente y de datos; el estándar ANS Forth describe las palabras utilizadas para la entrada/salida. Todos los sistemas Forth modernos utilizan archivos de texto normales para el código fuente, incluso si están integrados. Un sistema integrado con un compilador residente recibe su código fuente a través de una línea serie.
Los sistemas Forth clásicos tradicionalmente no utilizan ni sistema operativo ni sistema de archivos . En lugar de almacenar el código en archivos, el código fuente se almacena en bloques de disco escritos en direcciones físicas del disco. La palabra clave BLOCK`forth` se utiliza para traducir el tamaño de un bloque de disco de 1 KB a la dirección de un búfer que contiene los datos, gestionado automáticamente por el sistema Forth. El uso de bloques se ha vuelto poco común desde mediados de la década de 1990. En un sistema alojado, estos bloques también se asignan en un archivo normal.
La multitarea , generalmente mediante planificación cooperativa round-robin , suele estar disponible (aunque las palabras y el soporte para multitarea no están cubiertos por el estándar ANS Forth). La palabra PAUSEse utiliza para guardar el contexto de ejecución de la tarea actual, localizar la siguiente tarea y restaurar su contexto de ejecución. Cada tarea tiene sus propias pilas, copias privadas de algunas variables de control y un área de trabajo temporal. El intercambio de tareas es sencillo y eficiente; como resultado, los multitarea Forth están disponibles incluso en microcontroladores muy simples , como el Intel 8051 , el Atmel AVR y el TI MSP430 . [ 34 ]
Otras funcionalidades no estándar incluyen un mecanismo para realizar llamadas al sistema operativo anfitrión o a sistemas de ventanas , y muchas ofrecen extensiones que emplean la planificación proporcionada por el sistema operativo. Por lo general, utilizan un conjunto de palabras más amplio y diferente al de Forth PAUSEpara la creación, suspensión, destrucción y modificación de la prioridad de las tareas.
Autocompilación y compilación cruzada
Un sistema Forth completo con todo el código fuente se autocompila, una técnica comúnmente denominada metacompilación o autoalojamiento por los programadores de Forth (aunque el término no coincide exactamente con la definición habitual de metacompilación ). El método habitual consiste en redefinir las pocas palabras que colocan los bits compilados en la memoria. Las palabras del compilador utilizan versiones con nombres especiales de fetch y store que pueden redirigirse a un área de búfer en la memoria. El área de búfer simula o accede a un área de memoria que comienza en una dirección diferente a la del búfer de código. Dichos compiladores definen palabras para acceder tanto a la memoria del ordenador de destino como a la memoria del ordenador anfitrión (que compila). [ 35 ]
Tras redefinir las operaciones de búsqueda y almacenamiento para el espacio de código, el compilador, el ensamblador, etc., se recompilan utilizando las nuevas definiciones. Esto permite reutilizar todo el código del compilador y del intérprete. A continuación, se compila el código del sistema Forth, pero esta versión se almacena en el búfer. El búfer en memoria se escribe en el disco y se proporcionan mecanismos para cargarlo temporalmente en memoria para realizar pruebas. Cuando la nueva versión funciona correctamente, se sobrescribe la versión anterior.
Existen numerosas variantes de estos compiladores para diferentes entornos. Para sistemas embebidos , el código puede escribirse en otro ordenador, una técnica conocida como compilación cruzada , a través de un puerto serie o incluso un único bit TTL , manteniendo los nombres de las palabras y otras partes no ejecutables del diccionario en el ordenador que realiza la compilación original. Las definiciones mínimas para un compilador Forth de este tipo son las palabras que obtienen y almacenan un byte, y la palabra que ordena la ejecución de una palabra Forth. A menudo, la parte que más tiempo consume al escribir un puerto remoto es la construcción del programa inicial para implementar la obtención, el almacenamiento y la ejecución, pero muchos microprocesadores modernos han integrado funciones de depuración (como el Motorola CPU32 ) que eliminan esta tarea. [ 36 ]
Estructura del lenguaje
La estructura de datos básica de Forth es el "diccionario", que asigna "palabras" a código ejecutable o estructuras de datos con nombre. El diccionario se organiza en memoria como un árbol de listas enlazadas, donde los enlaces parten de la palabra definida más recientemente hasta la más antigua, hasta encontrar un valor centinela , generalmente un puntero NULL. Un cambio de contexto hace que la búsqueda en la lista comience en una hoja diferente. La búsqueda en la lista enlazada continúa a medida que la rama se fusiona con el tronco principal, volviendo finalmente al valor centinela, la raíz. Puede haber varios diccionarios. En casos excepcionales, como en la metacompilación, un diccionario puede estar aislado e independiente. El efecto se asemeja al de anidar espacios de nombres y puede sobrecargar las palabras clave según el contexto.
Una palabra definida generalmente consta de una cabeza y un cuerpo , donde la cabeza está formada por el campo de nombre (NF) y el campo de enlace (LF), y el cuerpo por el campo de código (CF) y el campo de parámetro (PF).
El encabezado y el cuerpo de una entrada de diccionario se tratan por separado porque pueden no ser contiguos. Por ejemplo, cuando un programa Forth se recompila para una nueva plataforma, el encabezado puede permanecer en el ordenador que realiza la compilación, mientras que el cuerpo va a la nueva plataforma. En algunos entornos (como los sistemas embebidos ), los encabezados ocupan memoria innecesariamente. Sin embargo, algunos compiladores cruzados pueden colocar los encabezados en el sistema de destino si se espera que este admita un Forth interactivo. [ 37 ]
No existe un formato exacto preestablecido para las entradas del diccionario, y las implementaciones varían.
Estructura del compilador
El compilador en sí no es un programa monolítico. Consta de palabras Forth visibles para el sistema y utilizables por el programador. Esto permite al programador modificar las palabras del compilador para fines específicos. La compilación en los sistemas Forth tradicionales es sencilla y no implica la creación ni la optimización de una representación abstracta del código. (Algunos compiladores Forth más recientes utilizan métodos de compilación más elaborados, como es común en otros lenguajes).
El indicador "tiempo de compilación" en el campo de nombre se establece para palabras con comportamiento de "tiempo de compilación". La mayoría de las palabras simples ejecutan el mismo código, ya sea que se escriban en una línea de comandos o estén incrustadas en el código. Al compilarlas, el compilador simplemente coloca código o un puntero enhebrado a la palabra. [ 32 ]
Los ejemplos clásicos de palabras de tiempo de compilación son las estructuras de control como IFy WHILE. Casi todas las estructuras de control de Forth y casi todo su compilador se implementan como palabras de tiempo de compilación. Aparte de algunas palabras de flujo de control poco utilizadas que solo se encuentran en unas pocas implementaciones, como la palabra de retorno condicional utilizada en preForth de Ulrich Hoffmann, todas las palabras de flujo de control?EXIT de Forth se ejecutan durante la compilación para compilar varias combinaciones de palabras primitivas junto con sus direcciones de bifurcación. [ 1 ] [ 2 ]
Por ejemplo, IFy WHILE, y las palabras que coinciden con ellas, configuran BRANCH(salto incondicional) y ?BRANCH(extrae un valor de la pila y salta si es falso). Las palabras de flujo de control de bucle con contador funcionan de manera similar, pero configuran combinaciones de palabras primitivas que trabajan con un contador, y así sucesivamente. Durante la compilación, la pila de datos se utiliza para admitir el equilibrio de la estructura de control, el anidamiento y la corrección inversa de las direcciones de salto. El fragmento:
... DUP 6 < SI DROP 5 SINO 1 - ENTONCES ...A menudo se compilaría en la siguiente secuencia dentro de una definición:
... DUP LIT 6 < ?RAMA 5 CAÍDA LIT 5 RAMA 3 LIT 1 - ...Los números que siguen BRANCHrepresentan direcciones de salto relativas. LITes la palabra primitiva para insertar un número "literal" en la pila de datos. (Se compilaría un código más rápido y conciso usando punteros a constantes en lugar de LITy datos incrustados, si alguno de los números involucrados se ha definido por separado como constante. Habría cambios similares si se usaran otras palabras en lugar de constantes, y así sucesivamente).
Estado de compilación y estado de interpretación
La palabra :(dos puntos) analiza un nombre como parámetro, crea una entrada de diccionario (una definición de dos puntos ) y entra en estado de compilación. El intérprete continúa leyendo palabras separadas por espacios desde el dispositivo de entrada del usuario. Si encuentra una palabra, el intérprete ejecuta la semántica de compilación asociada a la palabra, en lugar de la semántica de interpretación . La semántica de compilación predeterminada de una palabra consiste en añadir su semántica de interpretación a la definición actual. [ 32 ]
La palabra ;(punto y coma) finaliza la definición actual y regresa al estado de interpretación. Es un ejemplo de una palabra cuya semántica de compilación difiere de la predeterminada. La semántica de interpretación de ;(punto y coma), la mayoría de las palabras de flujo de control y varias otras palabras no están definidas en ANS Forth, lo que significa que solo deben usarse dentro de definiciones y no en la línea de comandos interactiva. [ 32 ]
El estado del intérprete se puede cambiar manualmente con las palabras [(corchete izquierdo) y ](corchete derecho) que entran en el estado de interpretación o en el estado de compilación, respectivamente. Estas palabras se pueden usar con la palabra LITERALpara calcular un valor durante una compilación e insertar el valor calculado en la definición de dos puntos actual. LITERALtiene la semántica de compilación para tomar un objeto de la pila de datos y agregar semántica a la definición de dos puntos actual para colocar ese objeto en la pila de datos.
En ANS Forth, el estado actual del intérprete se puede leer a partir de un indicadorSTATE que contiene el valor verdadero cuando está en estado de compilación y falso en caso contrario. Esto permite la implementación de las llamadas palabras inteligentes de estado, cuyo comportamiento cambia según el estado actual del intérprete.
Palabras inmediatas
La palabra IMMEDIATEmarca la definición de dos puntos más reciente como una palabra inmediata , reemplazando efectivamente su semántica de compilación con su semántica de interpretación. [ 38 ] Las palabras inmediatas normalmente se ejecutan durante la compilación, no se compilan, pero esto puede ser anulado por el programador en cualquiera de los estados. ;es un ejemplo de una palabra inmediata. En ANS Forth, la palabra POSTPONEtoma un nombre como parámetro y agrega la semántica de compilación de la palabra nombrada a la definición actual incluso si la palabra fue marcada como inmediata. Forth-83 definió palabras separadas COMPILEy [COMPILE]para forzar la compilación de palabras no inmediatas e inmediatas, respectivamente.
En lugar de reservar espacio para un indicador de inmediato en cada definición, algunas implementaciones de Forth utilizan un diccionario de inmediatos que se comprueba primero cuando se está en modo de compilación.
Palabras sin nombre y fichas de ejecución
En ANS Forth, las palabras sin nombre se pueden definir con la palabra :NONAMEque compila las palabras siguientes hasta la siguiente ;(punto y coma) y deja un token de ejecución en la pila de datos. El token de ejecución proporciona un identificador opaco para la semántica compilada, similar a los punteros de función del lenguaje de programación C.
Los tokens de ejecución se pueden almacenar en variables. La palabra EXECUTEtoma un token de ejecución de la pila de datos y realiza la semántica asociada. La palabra COMPILE,(compile-comma) toma un token de ejecución de la pila de datos y agrega la semántica asociada a la definición actual.
La palabra '(tick) toma el nombre de una palabra como parámetro y devuelve el token de ejecución asociado con esa palabra en la pila de datos. En estado de interpretación, ' RANDOM-WORD EXECUTEes equivalente a RANDOM-WORD. [ 39 ]
Analizando palabras y comentarios
Las palabras :(dos puntos), POSTPONE, '(marca de verificación) son ejemplos de palabras de análisis sintáctico que toman sus argumentos del dispositivo de entrada del usuario en lugar de la pila de datos. Otro ejemplo es la palabra ((paréntesis), que lee e ignora las palabras siguientes hasta el siguiente paréntesis derecho inclusive, y se utiliza para colocar comentarios en una definición de dos puntos. De manera similar, la palabra \(barra invertida) se utiliza para comentarios que continúan hasta el final de la línea actual. Para que se analicen correctamente, ((paréntesis) y \(barra invertida) deben estar separadas por espacios en blanco del texto del comentario siguiente.
Estructura del código
En la mayoría de los sistemas Forth, el cuerpo de una definición de código consiste en lenguaje máquina o en algún tipo de código multihilo . El Forth original, que sigue el estándar informal FIG (Forth Interest Group), es un TIL (Threaded Interpretive Language). También se le conoce como código multihilo indirecto, pero las versiones de Forth multihilo directo y multihilo de subrutinas también se han popularizado en la actualidad. Los Forth modernos más rápidos, como SwiftForth, VFX Forth e iForth, compilan Forth a código máquina nativo.
objetos de datos
Cuando una palabra es una variable u otro objeto de datos, el CF apunta al código de tiempo de ejecución asociado con la palabra definitoria que la creó. Una palabra definitoria tiene un "comportamiento de definición" característico (crea una entrada de diccionario y posiblemente asigna e inicializa espacio de datos) y también especifica el comportamiento de una instancia de la clase de palabras construidas por esta palabra definitoria. Algunos ejemplos son:
VARIABLE- Nombra una ubicación de memoria de una celda no inicializada. El comportamiento de instancia
VARIABLEdevuelve su dirección en la pila. CONSTANT- Nombra un valor (especificado como argumento para
CONSTANT). El comportamiento de la instancia devuelve el valor. CREATE- Indica una ubicación; en ella se puede asignar espacio o bien se puede configurar para que contenga una cadena u otro valor inicializado. El comportamiento de la instancia devuelve la dirección del inicio de este espacio.
Forth también ofrece una herramienta que permite al programador definir nuevas palabras clave específicas para cada aplicación, especificando tanto un comportamiento de definición personalizado como un comportamiento de instancia. Algunos ejemplos incluyen búferes circulares, bits con nombre en un puerto de E/S y matrices indexadas automáticamente.
Los objetos de datos definidos por estas y otras palabras similares tienen un alcance global. La función que proporcionan las variables locales en otros lenguajes la proporciona la pila de datos en Forth (aunque Forth también tiene variables locales reales). El estilo de programación de Forth utiliza muy pocos objetos de datos con nombre en comparación con otros lenguajes; normalmente, estos objetos de datos se utilizan para contener datos que son utilizados por varias palabras o tareas (en una implementación multitarea). [ 40 ]
Forth no impone la coherencia en el uso de los tipos de datos ; es responsabilidad del programador utilizar los operadores adecuados para obtener y almacenar valores o realizar otras operaciones con los datos.
Ejemplos
"¡Hola Mundo!"
: HOLA ( -- ) CR ." ¡Hola, mundo! " ;HOLA <cr> ¡ Hola, mundo !
La palabra CR(Retorno de carro) hace que la salida siguiente CR se muestre en una nueva línea. La palabra de análisis ."(comillas dobles) lee una cadena delimitada por comillas dobles y agrega código a la definición actual para que la cadena analizada se muestre al ejecutarse. El espacio que separa la palabra ."de la cadena Hello, World!no se incluye como parte de la cadena. Es necesario para que el analizador la reconozca ."como una palabra Forth.
Un sistema Forth estándar también es un intérprete, y se puede obtener el mismo resultado escribiendo el siguiente fragmento de código en la consola Forth:
CR . (¡Hola, mundo!).((punto-paréntesis) es una palabra inmediata que analiza una cadena delimitada por paréntesis y la muestra. Al igual que con la palabra, ."el carácter de espacio que separa .(no Hello, World!forma parte de la cadena.
La palabra CRprecede al texto que se va a imprimir. Por convención, el intérprete de Forth no inicia la salida en una nueva línea. Asimismo, por convención, el intérprete espera la entrada al final de la línea anterior, tras una oksolicitud. En Forth no existe una acción implícita de "vaciar el búfer" CR, como ocurre a veces en otros lenguajes de programación.
Mezcla de estados de compilación e interpretación
Aquí está la definición de una palabra EMIT-Qque, al ejecutarse, emite un único carácter Q:
: EMIT-Q 81 (el valor ASCII para el carácter 'Q') EMITIR ;Esta definición se redactó para utilizar directamente el valor ASCII del Qcarácter (81). El texto entre paréntesis es un comentario y el compilador lo ignora. La palabra EMITtoma un valor de la pila de datos y muestra el carácter correspondiente.
La siguiente redefinición EMIT-Qutiliza las palabras [(corchete izquierdo), ](corchete derecho) CHARy LITERALpara cambiar temporalmente al estado de intérprete, calcular el valor ASCII del Qcarácter, volver al estado de compilación y añadir el valor calculado a la definición de dos puntos actual:
: EMITIR-Q [ CARÁCTER Q ] EMISIÓN LITERAL ;La palabra de análisis CHARtoma como parámetro una palabra delimitada por espacios y coloca el valor de su primer carácter en la pila de datos. La palabra [CHAR]es una versión inmediata de CHAR. Usando [CHAR], la definición de ejemplo para EMIT-Qpodría reescribirse así:
: EMIT-Q [CARACTER] Q EMITIR ; \ Emite el carácter 'Q'Esta definición se utiliza \(barra invertida) para el comentario descriptivo.
Tanto CHARcomo [CHAR]están predefinidos en ANS Forth. Usando IMMEDIATEy POSTPONE, [CHAR]se podría haber definido así:
: [CHAR] CHAR POSPONE LITERAL ; INMEDIATOPrograma de cifrado RC4
En 1987, Ron Rivest desarrolló el sistema de cifrado RC4 para RSA Data Security, Inc. Su descripción es la siguiente:
Tenemos un array de 256 bytes, todos diferentes. Cada vez que se usa el array, cambia intercambiando dos bytes. Los intercambios están controlados por los contadores i y j , cada uno inicialmente en 0. Para obtener un nuevo i , se suma 1. Para obtener un nuevo j , se suma el byte del array en el nuevo i . Se intercambian los bytes del array en i y j . El código es el byte del array en la suma de los bytes del array en i y j . Esto se combina mediante XOR con un byte del texto plano a cifrar o del texto cifrado a descifrar. El array se inicializa asignándole primero valores del 0 al 255. Luego se recorre usando i y j , obteniendo el nuevo j sumándole el byte del array en i y un byte clave, e intercambiando los bytes del array en i y j . Finalmente, i y j se establecen en 0. Todas las sumas son módulo 256.
La siguiente versión de Standard Forth utiliza únicamente palabras Core y Core Extension.
valor 0 ii valor 0 jj valor 0 KeyAddr valor 0 KeyLen crear SArray 256 asignación \ matriz de estado de 256 bytes : KeyArray KeyLen mod KeyAddr ;: get_byte + c@ ; : set_byte + c! ; : as_byte 255 y ; : reset_ij 0 A ii 0 A jj ; : i_update 1 + as_byte A ii ; : j_update ii SArray get_byte + as_byte A jj ; : swap_s_ij jj SArray get_byte ii SArray get_byte jj SArray set_byte ii SArray set_byte ;: rc4_init ( KeyAddr KeyLen -- ) 256 min A KeyLen A KeyAddr 256 0 HACER i i SArray set_byte BUCLE reset_ij COMIENZO ii KeyArray get_byte jj + j_update swap_s_ij ii 255 < MIENTRAS ii i_update REPETIR reset_ij ; : rc4_byte ii i_update jj j_update swap_s_ij ii SArray get_byte jj SArray get_byte + as_byte SArray get_byte xor ;Esta es una forma de probar el código:
hex crear AKey 61 c, 8 A c, 63 c, D2 c, FB c, : prueba cr 0 HACER rc4_byte . BUCLE cr ; AKey 5 rc4_init 2 C F9 4 C EE DC 5 prueba \ la salida debería ser: F1 38 29 C9 DEMotores Forth
Un procesador diseñado para admitir un lenguaje de programación específico se denomina "motor" de lenguaje. [ 41 ]
Los motores Forth son plataformas de hardware diseñadas específicamente para admitir el desarrollo y la ejecución de programas escritos en Forth. (Del mismo modo, las máquinas Lisp fueron diseñadas específicamente para admitir el desarrollo y la ejecución de programas escritos en Lisp, el Pascal MicroEngine fue diseñado específicamente para admitir el desarrollo y la ejecución de programas escritos en Pascal, etc.).
El primer motor Forth de un solo chip disponible comercialmente fue el Rockwell R65F11, [ 41 ] un chip que incluye un núcleo Forth en ROM, un 6502 mejorado , SRAM y varios circuitos de interfaz que anteriormente requerían chips periféricos. [ 41 ] [ 42 ] [ 43 ] [ 44 ] [ 45 ]
Muchos otros procesadores comerciales (Harris RTX-2000, Novix NC4016, F21, MARC4, KimKlone, etc.) y muchos procesadores caseros (My4TH, J1, H2, Mark 1 FORTH Computer, etc.) están diseñados específicamente para ejecutar Forth. Por lo general, implementan primitivas comunes de Forth, como la instrucción "Forth NEXT", como instrucciones individuales.
Implementaciones
Debido a que Forth es sencillo de implementar y no cuenta con una implementación de referencia estándar, existen numerosas versiones del lenguaje. Además de ser compatibles con los sistemas operativos de escritorio más comunes ( POSIX , Microsoft Windows , macOS ), muchos de estos sistemas Forth también están dirigidos a diversos sistemas embebidos . A continuación, se enumeran algunos de los sistemas que cumplen con el estándar ANS Forth de 1994 .
- ASYST, un sistema tipo Forth para la recopilación y el análisis de datos [ 46 ] [ 17 ]
- Gforth , una implementación portátil de ANS Forth del Proyecto GNU
- noForth , una implementación de ANS Forth (en la medida de lo posible) para microcontroladores Flash (MSP430, RISC-V y RP2040).
- Open Firmware , un estándar de firmware y gestor de arranque basado en ANS Forth.
- pForth , Forth portátil escrito en C
- SP-Forth, implementación de ANS Forth del Grupo de Interés Ruso en Forth (RuFIG)
- Swift Forth, implementación para la generación de código máquina de Forth, Inc.
- VFX Forth, optimización de código nativo Forth
- Firth , una adaptación de Forth para la computadora Little Man Stack Machine.
- Shi , una implementación de Forth integrable, rápida y compacta, escrita para la arquitectura Thumb-2 (ARMv7-M y posteriores).
Véase también
- Videojuegos escritos en Forth
- RTX2010 , una CPU que ejecuta Forth de forma nativa.
Notas
Referencias
- 1 2 "Diapositivas de Ulrich Hoffmann previas al Forth" (PDF) .
- 1 2 "El pre-Forth de Ulrich Hoffmann" (PDF) .
- 1 2 Maher, Jimmy (28 de octubre de 2014). "Starflight" . The Digital Antiquarian . Recuperado el 29 de abril de 2023 .
- ↑ Aplicaciones de Forth en la NASA (el servidor original de la NASA ya no está en funcionamiento, copia de archive.org)
- ↑ "Los procesadores RTX de Intersil y el software Forth controlaron el exitoso aterrizaje de Philae" (PDF) . MicroProcessor Engineering Limited . 13 de octubre de 2014. Archivado del original (PDF) el 29 de abril de 2023. Consultado el 29 de abril de 2023 .
- ↑ "¡Aquí llega Philae! Impulsado por una RTX2010" . El Museo CPU Shack . 12 de octubre de 2014. Consultado el 29 de abril de 2023 .
- ↑ "Aplicaciones de Forth relacionadas con el espacio" . Archivado del original el 24 de octubre de 2010. Consultado el 4 de septiembre de 2007 .
- 1 2 3 Rather, Elizabeth D.; Colburn, Donald R.; Moore, Charles H. (1996) [1993]. "La evolución de Forth" . En Bergin, Thomas J.; Gibson, Richard G. (eds.). Historia de los lenguajes de programación - II . Association for Computing Machinery. págs. 625–670 . doi : 10.1145/234286.1057832 . ISBN 0201895021.
- ↑ "Programa de demostración en tienda de Atari" . Atari Mania .
- ↑ Maynard, David S. "David Maynard: Artista de software" .
- ↑ John Romero (23 de septiembre de 2020). "Time Warp: Episodio 9 - Stuart Smith" (Podcast). El evento ocurre en el minuto 29:02.
- ↑ Aycock, John (2023). Amnesia Remembered: Reverse Engineering a Digital Artifact . Berghahn Books. p. 79. ISBN 978-1800738676.
- ↑ Sharp, Doug (8 de abril de 2023). "Lenguaje de programación FORTH (Going FORTH)" .
- ↑ Rochat, Jan (6 de febrero de 2025). "De vuelta a 1985: Cómo rehicimos ChipWits para la C64" .
- ↑ "Entrevista 66 - Peter Liepa, Boulder Dash" . ANTIC The Atari 8-bit Podcast . 16 de junio de 2015.
- ↑ "FORTH TENDRÁ SU PROPIO GRUPO DE INTERÉS ESPECIAL" . Tech Monitor . 6 de febrero de 1989.
- 1 2 Campbell et al, "Puesta en marcha con Asyst 2.0", MacMillan Software Co., 1987
- ↑ Moore, Charles H. (1991). "Forth - Los primeros años" . Archivado del original el 15 de junio de 2006. Recuperado el 3 de junio de 2006 .
- ↑ Moore, Charles H. (agosto de 1980). "La evolución de FORTH, un lenguaje inusual" . Revista BYTE . 5 (8): 82.
- ↑ "Especificación ANS 1994, Anexo C ("Perspectiva")" . taygeta.com .
- ↑ "El cuarto idioma" , Revista BYTE , 5 (8), 1980
- ↑ M. Anton Ertl. "Árbol genealógico y cronología de la familia Forth" .
- ^ Lutus, Paul (1982). "Manual de idiomas GraFORTH" . archivo.org . Insoft.
- ↑ "El estándar Forth-79" (PDF) . Consultado el 29 de abril de 2023 .
- ↑ "El estándar Forth-83" . Archivado del original el 5 de abril de 2023. Consultado el 29 de abril de 2023 .
- ↑ "Lenguajes de programación: Forth" . Comité técnico ANSI X3J14. 24 de marzo de 1994. Consultado el 3 de junio de 2006 .
- ↑ "Referencia estándar Forth (ANSI INCITS 215-1994)" (PDF) . Quartus Handheld Software. 13 de septiembre de 2005. Consultado el 29 de abril de 2023 .
- ↑ Claunch, Carl (2018-03-02). "Restaurando el código fuente original para FORTH en el IBM 1130" . rescue1130 . Recuperado el 30 de julio de 2018 .
- ↑ Brodie, Leo (1987). Starting Forth (2.ª ed.). Prentice-Hall. ISBN 978-0-13-843079-5Archivado del original el 3 de abril de 2016. Consultado el 29 de abril de 2023 .
- ↑ Brodie 1987 , pág. 20
- ↑ Brodie 1987 , pág. 14
- 1 2 3 4 Brodie 1987 , pág. 16
- ↑ Rodríguez, Brad. "Construye tu propio ensamblador, parte 2: un ensamblador 6809 Forth" . Consultado el 29 de abril de 2023 .
- ↑ Rodríguez, Brad. "Multitarea 8051 CamelForth" (PDF) . Recuperado el 29 de abril de 2023 .
- ↑ Rodríguez, Brad (julio-agosto de 1995). "AVANZANDO, Parte 8: CamelForth para el 6809" . Recuperado el 29 de abril de 2023 .
- ↑ Shoebridge, Peter (1998-12-21). "Controlador de modo de depuración en segundo plano de Motorola para Windows NT" . Archivado del original el 6 de junio de 2007. Recuperado el 19 de junio de 2006 .
- ↑ Martin, Harold M. (marzo de 1991). "Desarrollo de un modelo Forth con cable" . Boletín informativo ACM SIGFORTH . 2 (3). ACM Press: 17–19 . doi : 10.1145/122089.122091 . S2CID 26362015 .
- ↑ Brodie 1987 , pág. 273
- ↑ Brodie 1987 , pág. 199
- ↑ "Under The Hood". Brodie 1987. p. 241.
En resumen, existen tres tipos de variables: Las variables del sistema contienen valores utilizados por todo el sistema Forth. Las variables de usuario contienen valores únicos para cada tarea, aunque las definiciones pueden ser utilizadas por todas las tareas del sistema. Las variables regulares pueden ser accesibles tanto a nivel de sistema como dentro de una sola tarea, dependiendo de si se definen dentro de una
tarea o dentro de una tarea privada.
OPERATOR - 1 2 3 Randy M. Dumse. "Las computadoras Forth de un solo chip R65F11 y F68K". Archivado el 2 de diciembre de 2014 en Wayback Machine 1984.
- ↑ Ed Schmauch. "Un sistema computarizado de monitoreo de corrosión" . 1986.
- ↑ Lawrence P. Forsley. "Sistemas embebidos: Cuarta Conferencia de Rochester de 1990: del 12 al 16 de junio de 1990, Universidad de Rochester". Archivado el 25 de marzo de 2015 en Wayback Machine . pág. 51.
- ↑ Rockwell. "Manual del usuario de RSC-Forth". Archivado el 7 de diciembre de 2013 en Wayback Machine . 1983.
- ↑ "Microcomputadoras Rockwell R65F11 R65F12 basadas en Forth" (PDF) . Junio de 1987. Archivado (PDF) del original el 4 de agosto de 2020. Consultado el 28 de abril de 2020 .
- ↑ Hary, David; Oshio, Koichi; Flanagan, Steven D. (1987). "El software ASYST para computación científica". Science . 236 (4805): 1128– 32. Bibcode : 1987Sci...236.1128H . doi : 10.1126/science.236.4805.1128 . JSTOR 1699106 . PMID 17799670 . S2CID 30463062 .
Enlaces externos
- Sitio web oficial del Forth 2012 Standard
- Programación de un lenguaje orientado a problemas. Archivado el 27/09/2025 en Wayback Machine. Libro inédito de Charles H. Moore (1970).
- Conferencia anual europea del Cuarto Congreso (1985-presente)
- Cuarta investigación en el Institut für Computersprachen
- Familia de lenguajes de programación Forth
- lenguajes de programación concatenativos
- Máquinas virtuales basadas en pila
- lenguajes de programación de sistemas
- Lenguajes de programación creados en 1970
- Lenguajes de programación con sintaxis extensible
- Lenguajes de programación con un estándar ISO
- Lenguajes de programación
- Software de 1970