Cuarto (lenguaje de programación)

Ajustar Compartir Imprimir Citar

Forth es un lenguaje de programación orientado a la pila y un entorno interactivo diseñado por Charles H. "Chuck" Moore y utilizado por primera vez por otros programadores en 1970. Aunque no es un acrónimo, el nombre del lenguaje en sus primeros años a menudo se deletreaba en mayúsculas como FORTH. Las implementaciones de FORTH-79 y FORTH-83, que no fueron escritas por Moore, se convirtieron en estándares de facto, y en 1994 se publicó una estandarización oficial del lenguaje como ANS Forth. Existía una amplia gama de derivados de Forth antes y después de ANS Forth.

Forth generalmente combina un compilador con un shell de comando integrado, donde el usuario interactúa a través de subrutinas llamadas palabras. Las palabras se pueden definir, probar, redefinir y depurar sin volver a compilar o reiniciar todo el programa. Todos los elementos sintácticos, incluidas las variables y los operadores básicos, se definen como palabras. Se utiliza una pila para pasar parámetros entre palabras, lo que lleva a un estilo de notación polaca inversa.

Durante gran parte de la existencia de Forth, la técnica estándar consistía en compilar en código de subprocesos, que se puede interpretar más rápido que el código de bytes. Uno de los primeros beneficios de Forth fue el tamaño: un entorno de desarrollo completo, incluidos los programas de compilador, editor y usuario, podía caber en la memoria en un sistema de 8 bits o similarmente limitado. Ya no está limitado por el espacio, existen implementaciones modernas que generan código de máquina optimizado como otros compiladores de lenguaje.

Forth se utiliza en el cargador de arranque Open Firmware, en aplicaciones espaciales como la nave espacial Philae y en otros sistemas integrados que implican interacción con hardware. La relativa simplicidad de crear un sistema Forth básico ha dado lugar a muchas variantes personales y patentadas, como el Forth personalizado que se usó para implementar el videojuego Starflight de Electronic Arts, el éxito de ventas de 1986. La implementación del software libre Gforth se mantiene activamente, al igual que varios sistemas con soporte comercial.

Más tarde, 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, incluidos cmForth y colorForth.

Usos

Forth tiene un nicho en aplicaciones astronómicas y espaciales, así como una historia en sistemas integrados. Las ROM de arranque de Open Firmware utilizadas por Apple, IBM, Sun y OLPC XO-1 contienen un entorno Forth.

Forth se ha utilizado a menudo para mostrar 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 Macintosh 128K en 1984.

Atari, Inc. usó una elaborada demostración animada escrita en Forth para mostrar las capacidades de las computadoras Atari 400 y 800 en los grandes almacenes. Tres juegos de computadora para el hogar de Electronic Arts, publicados en la década de 1980, fueron escritos en Forth: Worms? (1983), Starflight (1986) y Lords of Conquest (1986).

El Canon Cat (1987) usa Forth para la programación de su sistema.

Rockwell produjo microcomputadoras de un solo chip con núcleos Forth residentes: el R65F11 y el R65F12. ASYST fue una expansión de Forth para medir y controlar en PC.

Historia

Forth evolucionó a partir del sistema de programación personal de Charles H. Moore, que había estado en continuo desarrollo desde 1968. Forth se expuso por primera vez a otros programadores a principios de la década de 1970, comenzando con Elizabeth Rather en la Radio Astronomía Nacional de los Estados Unidos. Observatorio (NRAO). Después de su trabajo en NRAO, Charles Moore y Elizabeth Rather formaron FORTH, Inc. en 1973, refinando y trasladando los sistemas Forth a docenas de otras plataformas en la próxima década.

Forth se llama así porque en 1968 "el archivo que contenía el intérprete se denominaba CUARTO, para software de cuarta (siguiente) generación, pero el sistema operativo IBM 1130 restringía los nombres de archivo a cinco caracteres." Moore vio a Forth como un sucesor de los lenguajes de programación de tercera generación compila-link-go, o software para "cuarta generación" hardware.

El microFORTH de FORTH, Inc. se desarrolló para los microprocesadores Intel 8080, Motorola 6800, Zilog Z80 y RCA 1802 a partir de 1976. Posteriormente, los aficionados utilizaron MicroFORTH para generar sistemas Forth para otras arquitecturas, como como 6502 en 1978. Forth Interest Group se formó en 1978. 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 porque se adaptaba bien a la memoria limitada de las microcomputadoras. La facilidad de implementar el lenguaje llevó a muchas implementaciones. La computadora doméstica británica Jupiter ACE tiene Forth en su sistema operativo residente en ROM. Insoft GraFORTH es una versión de Forth con extensiones de gráficos para Apple II.

La práctica común se codificó en los estándares de facto FORTH-79 y FORTH-83 en los años 1979 y 1983, respectivamente. Estos estándares fueron unificados por ANSI en 1994, comúnmente denominados ANS Forth.

A partir de 2018, se recuperó el código fuente de la versión 1130 original de FORTH y ahora se está actualizando para ejecutarse en un sistema 1130 restaurado o emulado.

Resumen

Forth enfatiza el uso de funciones pequeñas y simples llamadas palabras. Las palabras para tareas más grandes requieren muchas palabras más pequeñas, cada una de las cuales realiza una subtarea distinta. Un gran programa Forth 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 crearse prototipos, construirse y probarse de forma independiente. El nivel más alto del código Forth puede parecerse a una descripción en inglés de la aplicación. En cuarto lugar se ha denominado lenguaje de metaaplicaciones: un lenguaje que se puede utilizar para crear lenguajes orientados a problemas.

Forth se basa en el uso explícito de una pila de datos y la notación polaca inversa que se usa comúnmente en las calculadoras de Hewlett-Packard. En RPN, el operador se coloca después de sus operandos, a diferencia de la notación infija más común donde el operador se coloca entre sus operandos. La notación Postfix hace que el lenguaje sea más fácil de analizar y ampliar; La flexibilidad de Forth hace que una gramática BNF estática sea inapropiada y no tiene 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.

Usando RPN, uno puede obtener el resultado de la expresión matemática (25 * 10 + 50) de esta manera:

 25 10 * 50 + CR . 300 Ok
Stack1.svg

Primero se ponen en la pila los números 25 y 10.

Forthstack1 5.svg


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

Forthstack2.svg

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

Forthstack3.svg


La palabra + suma los dos valores superiores, empujando la suma. CR (retorno de carro) inicia la salida en una nueva línea. Finalmente, . imprime el resultado. Como todo se ha completado con éxito, el sistema Forth imprime OK.

Las características estructurales de Even Forth están basadas en pilas. Por ejemplo:

 : FLOOR5 (n... n') DUP 6 . IF DROP 5 ELSE 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 usado para una subrutina) llamada FLOOR5. El texto entre paréntesis es un comentario que advierte que esta palabra espera un número en la pila y devolverá un número posiblemente modificado (en la pila).

La subrutina usa los siguientes comandos: DUP duplica el número en la pila; 6 empuja un 6 en la parte superior de la pila; < compara los dos primeros números en la pila (6 y la entrada DUPed), y los reemplaza con un valor verdadero o falso; IF toma un valor de verdadero o falso y elige ejecutar comandos inmediatamente después o saltar a ELSE; DROP descarta el valor en la pila; 5 empuja un 5 en la parte superior de la pila; y THEN finaliza el condicional.

La palabra FLOOR5 es equivalente a esta función escrita en el lenguaje de programación C usando el operador ternario '?:'

int piso 5()int v) {} retorno ()v . 6) ? 5 : ()v - 1);}

Esta función se escribe de manera más sucinta como:

 : FLOOR5 (n... n') 1- 5 MAX ;

Esto se puede ejecutar de la siguiente manera:

 1 FLOOR5 CR . 5 Ok 8 FLOOR5 CR . 7 Ok

Primero se empuja un número (1 u 8) a la pila, se llama a FLOOR5, que vuelve a sacar el número y empuja el resultado. CR mueve la salida a una nueva línea (nuevamente, esto solo está aquí para facilitar la lectura). Finalmente, una llamada a . muestra el resultado y lo imprime.

Instalaciones

La gramática de Forth no tiene especificaciones oficiales. 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 en busca de una palabra usando espacios como delimitador; algunos sistemas reconocen caracteres de espacios 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 con la palabra y luego regresa para analizar el resto del flujo de entrada. Si no se encuentra la palabra, se supone que es un número y se intenta convertirla en un número y colocarla en la pila; si tiene éxito, el intérprete continúa analizando el flujo de entrada. De lo contrario, si tanto la búsqueda como la conversión de números fallan, 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 la nueva entrada del usuario.

La definición de una nueva palabra comienza con la palabra : (dos puntos) y termina con la palabra ; (punto y coma). Por ejemplo,

 : X DUP 1+ . . ;

compilará la palabra X y hará que el nombre se pueda encontrar en el diccionario. Cuando se ejecuta escribiendo 10 X en la consola, imprimirá 11 10.

La mayoría de los sistemas de Forth incluyen un ensamblador para escribir palabras utilizando las instalaciones del procesador. Los ensambladores de Forth a menudo usan una sintaxis polaca inversa en la que los parámetros de una instrucción preceden a la instrucción. Un ensamblador polaco inverso típico prepara los operandos en la pila y el mnemónico copia toda la instrucción en la memoria como último paso. Un ensamblador Forth es por naturaleza un ensamblador de macros, por lo que es fácil definir un alias para los registros según su función en el sistema Forth: p. "dsp" para el registro utilizado como puntero de la pila de datos.

Sistema operativo, archivos y multitarea

La mayoría de los sistemas de Forth se ejecutan en un sistema operativo host, como Microsoft Windows, Linux o una versión de Unix, y utilizan el sistema de archivos del sistema operativo host para los archivos de origen y de datos; el estándar ANSI Forth describe las palabras utilizadas para E/S. Todos los sistemas modernos de Forth usan archivos de texto normales como fuente, incluso si están incrustados. Un sistema embebido con un compilador residente obtiene su fuente a través de una línea serial.

Los sistemas Classic Forth tradicionalmente no utilizan ni sistema operativo ni sistema de archivos. En lugar de almacenar código en archivos, el código fuente se almacena en bloques de disco escritos en direcciones de disco físico. La palabra BLOCK se emplea para traducir el número de un bloque de espacio en disco del tamaño de 1K en la dirección de un búfer que contiene los datos, que es administrado automáticamente por el sistema Forth. El uso de bloques se ha vuelto raro desde mediados de la década de 1990. En un sistema alojado, esos bloques también se asignan en un archivo normal en cualquier caso.

La multitarea, más comúnmente la programación cooperativa por turnos, está normalmente disponible (aunque las palabras multitarea y el soporte no están cubiertos por el estándar ANSI Forth). La palabra PAUSE se usa para guardar el contexto de ejecución de la tarea actual, para ubicar 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 borrador. El intercambio de tareas es simple y eficiente; como resultado, los multitarea de Forth están disponibles incluso en microcontroladores muy simples, como Intel 8051, Atmel AVR y TI MSP430.

Otras funciones no estándar incluyen un mecanismo para emitir llamadas al sistema operativo host o sistemas de ventanas, y muchas proporcionan extensiones que emplean la programación proporcionada por el sistema operativo. Por lo general, tienen un conjunto de palabras más grande y diferente de la palabra independiente PAUSE de Forth para la creación, suspensión, destrucción y modificación de prioridad de tareas.

Autocompilación y compilación cruzada

Un sistema Forth completo con todo el código fuente se compilará solo, una técnica comúnmente llamada metacompilación o alojamiento propio, por parte de los programadores de Forth (aunque el término no coincide exactamente con la metacompilación como se suele llamar). definido). El método habitual es redefinir el puñado de palabras que colocan los bits compilados en la memoria. Las palabras del compilador utilizan versiones de búsqueda y almacenamiento con nombres especiales que se pueden redirigir 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 de la computadora de destino como a la memoria de la computadora host (compiladora).

Después de redefinir las operaciones de búsqueda y almacenamiento para el espacio de código, el compilador, el ensamblador, etc. se vuelven a compilar utilizando las nuevas definiciones de búsqueda y almacenamiento. Esto reutiliza efectivamente todo el código del compilador y del intérprete. Luego, se compila el código del sistema Forth, pero esta versión se almacena en el búfer. El búfer en la memoria se escribe en el disco y se proporcionan formas de cargarlo temporalmente en la memoria para realizar pruebas. Cuando la nueva versión parece funcionar, se escribe sobre la versión anterior.

Existen numerosas variaciones de dichos compiladores para diferentes entornos. Para los sistemas integrados, el código se puede escribir en otra computadora, una técnica conocida como compilación cruzada, a través de un puerto serie o incluso un solo bit TTL, mientras se mantienen los nombres de las palabras y otras partes del diccionario que no se ejecutan en la compilación original. computadora. 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 más lenta de escribir un puerto remoto es construir el programa inicial para implementar la búsqueda, el almacenamiento y la ejecución, pero muchos microprocesadores modernos tienen funciones de depuración integradas (como el Motorola CPU32) que eliminan esta tarea.

Estructura del lenguaje

La estructura de datos básica de Forth es el "diccionario" que mapea "palabras" a código ejecutable o estructuras de datos con nombre. El diccionario se presenta en la memoria como un árbol de listas enlazadas con los enlaces que van desde la última (más reciente) palabra definida hasta la más antigua, hasta que se encuentra un valor centinela, normalmente un puntero NULL. Un cambio de contexto hace que una búsqueda de lista comience en una hoja diferente. La búsqueda en una lista enlazada continúa a medida que la rama se fusiona con el tronco principal y finalmente regresa al centinela, la raíz. Puede haber varios diccionarios. En casos raros, como la metacompilación, un diccionario puede estar aislado e independiente. El efecto se parece al de los espacios de nombres anidados y puede sobrecargar las palabras clave según el contexto.

Una palabra definida generalmente consiste en cabeza y cuerpo con la cabeza que consiste en el campo de nombre (NF) y el enlace campo (LF), y cuerpo formado por el campo de código (CF) y el campo de parámetros (PF).

El encabezado y el cuerpo de una entrada de diccionario se tratan por separado porque es posible que no sean contiguos. Por ejemplo, cuando se vuelve a compilar un programa Forth para una nueva plataforma, la cabeza puede permanecer en la computadora compiladora, mientras que el cuerpo va a la nueva plataforma. En algunos entornos (como los sistemas integrados), las cabezas ocupan memoria innecesariamente. Sin embargo, algunos compiladores cruzados pueden poner cabezas en el objetivo si se espera que el objetivo en sí admita un Forth interactivo.

Entrada de diccionario

No se prescribe el formato exacto de una entrada de diccionario y las implementaciones varían. Sin embargo, ciertos componentes casi siempre están presentes, aunque el tamaño y el orden exactos pueden variar. Descrito como una estructura, una entrada de diccionario podría tener este aspecto:

 estructura byte: bandera  longitud del nombre de palabra Char-array: Nombre  nombre de duración del tiempo de ejecución no se conoce en el tiempo de compilación dirección: anterior  campo de enlace, ptr atrasado a palabra anterior dirección: code  ptr al código para ejecutar esta palabra cualquier radio: parameterfield  longitud desconocida de datos, palabras o opcodes estructura final palabra

El campo de nombre comienza con la longitud del nombre de la palabra seguido de la representación de caracteres del nombre.

El campo de enlace contiene un puntero a la palabra definida anteriormente. El puntero puede ser un desplazamiento relativo o una dirección absoluta que apunte al siguiente hermano mayor.

El puntero del campo de código será la dirección de la palabra que ejecutará el código o los datos en el campo de parámetro o el comienzo del código de máquina que el procesador ejecutará directamente. Para las palabras definidas por dos puntos, el puntero del campo de código apunta a la palabra que guardará el puntero de instrucción (IP) Forth actual en la pila de retorno y cargará la IP con la nueva dirección desde la que continuar la ejecución de las palabras. Esto es lo mismo que hacen las instrucciones de llamada/devolución de un procesador.

Estructura del compilador

El compilador en sí no es un programa monolítico. Consiste en cuartas palabras visibles para el sistema y utilizables por un programador. Esto permite que un programador cambie las palabras del compilador para propósitos especiales.

El "tiempo de compilación" la marca en el campo de nombre está configurada para palabras con "tiempo de compilación" comportamiento. La mayoría de las palabras simples ejecutan el mismo código, ya sea que se escriban en una línea de comando o se incrusten en el código. Al compilarlos, el compilador simplemente coloca código o un puntero enhebrado a la palabra.

Los ejemplos clásicos de palabras en tiempo de compilación son las estructuras de control como IF y WHILE. Casi todas las estructuras de control de Forth y casi todo su compilador se implementan como palabras en tiempo de compilación. Aparte de algunas palabras de flujo de control de uso poco frecuente que solo se encuentran en algunas implementaciones, como la palabra de retorno condicional ?EXIT utilizada en el preForth de Ulrich Hoffmann, todas las palabras de flujo de control de Forth se ejecutan durante la compilación para compilar varias combinaciones de palabras primitivas junto con sus direcciones de rama. Por ejemplo, IF y WHILE, y las palabras que coinciden con ellas, configuran BRANCH (rama incondicional) y ?BRANCH< /code> (extrae un valor de la pila y bifurca si es falso). Las palabras de flujo de control de bucle contado funcionan de manera similar, pero configuran combinaciones de palabras primitivas que funcionan con un contador, y así sucesivamente. Durante la compilación, la pila de datos se utiliza para respaldar el equilibrio de la estructura de control, el anidamiento y el parcheo inverso de las direcciones de las sucursales. El fragmento:

 ... DUP 6 . IF DROP 5 ELSE 1 - Entonces ...

se compilaría en la siguiente secuencia dentro de una definición:

 ... DUP LIT 6 . ? BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...

Los números después de BRANCH representan direcciones de salto relativas. LIT es la palabra primitiva para empujar un "literal" número en la pila de datos.

Estado de compilación y estado de interpretación

La palabra : (dos puntos) analiza un nombre como un 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 delimitadas por espacios desde el dispositivo de entrada del usuario. Si se encuentra una palabra, el intérprete ejecuta la semántica de compilación asociada con la palabra, en lugar de la semántica de interpretación. La semántica de compilación predeterminada de una palabra consiste en agregar su semántica de interpretación a la definición actual.

La palabra ; (punto y coma) finaliza la definición actual y vuelve 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 las definiciones y no en la línea de comando interactiva..

El estado del intérprete se puede cambiar manualmente con las palabras [ (paréntesis izquierdo) y ] (paréntesis derecho) que ingresan al estado de interpretación o estado de compilación, respectivamente. Estas palabras se pueden usar con la palabra LITERAL para calcular un valor durante una compilación y para insertar el valor calculado en la definición de dos puntos actual. LITERAL tiene la semántica de compilación para tomar un objeto de la pila de datos y agregar la 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 desde el indicador STATE 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 con un comportamiento que cambia según el estado actual del intérprete.

Palabras inmediatas

La palabra IMMEDIATE marca 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. Las palabras inmediatas normalmente se ejecutan durante la compilación, no se compilan, pero el programador puede anular esto en cualquier estado. ; es un ejemplo de una palabra inmediata. En ANS Forth, la palabra POSTPONE toma 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 se marcó como inmediata. Forth-83 definió palabras separadas COMPILE y [COMPILE] para forzar la compilación de palabras inmediatas y no inmediatas, respectivamente.

Palabras sin nombre y tokens de ejecución

En ANS Forth, las palabras sin nombre se pueden definir con la palabra :NONAME que compila las siguientes palabras hasta el siguiente ; (punto y coma) y deja un < i>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 EXECUTE toma un token de ejecución de la pila de datos y realiza la semántica asociada. La palabra COMPILE, (compilar-coma) 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, ' EJECUTAR PALABRA ALEATORIA es equivalente a PALABRA ALEATORIA.

Análisis de palabras y comentarios

Las palabras : (dos puntos), POSTPONE, ' (marca) son ejemplos de palabras de análisis. i> que toman sus argumentos del dispositivo de entrada del usuario en lugar de la pila de datos. Otro ejemplo es la palabra ( (paren) que lee e ignora las siguientes palabras hasta el siguiente paréntesis derecho incluido y se usa para colocar comentarios en una definición de dos puntos. De manera similar, la palabra (barra invertida) se usa para comentarios que continúan hasta el final de la línea actual. Para que se analicen correctamente, ( (paren) y (barra invertida) deben estar separados por espacios en blanco del siguiente texto de comentario.

Estructura del código

En la mayoría de los sistemas Forth, el cuerpo de una definición de código consta de lenguaje de máquina o alguna forma de código enhebrado. El Forth original que sigue el estándar informal FIG (Forth Interest Group), es un TIL (lenguaje interpretativo por hilos). Esto también se denomina código de subprocesos indirectos, pero los Forth de subprocesos directos y de subrutinas también se han vuelto populares en los tiempos modernos. Los Forth modernos más rápidos, como SwiftForth, VFX Forth e iForth, compilan Forth en código de 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 de definición que lo creó. Una palabra definitoria tiene una característica "comportamiento definitorio" (crear una entrada de diccionario más posiblemente asignar e inicializar espacio de datos) y también especifica el comportamiento de una instancia de la clase de palabras construidas por esta palabra definitoria. Ejemplos incluyen:

VARIABLE
Nombra una ubicación de memoria no inicializada de una célula. Comportamiento de urgencia de un VARIABLE devuelve su dirección en la pila.
CONSTANT
Nombra un valor (se especifica como un argumento para CONSTANT). El comportamiento de urgencia devuelve el valor.
CREATE
Nombra una ubicación; el espacio se puede asignar en esta ubicación, o se puede establecer para contener una cadena u otro valor inicializado. El comportamiento de urgencia devuelve la dirección del comienzo de este espacio.

Forth también proporciona una función mediante la cual un programador puede definir nuevas palabras de definición específicas de la 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 proporcionada por las variables locales en otros idiomas la proporciona la pila de datos en Forth (aunque Forth también tiene variables locales reales). El cuarto estilo de programación utiliza muy pocos objetos de datos con nombre en comparación con otros lenguajes; por lo general, estos objetos de datos se utilizan para contener datos que utilizan varias palabras o tareas (en una implementación multitarea).

Forth no impone coherencia en el uso de tipos de datos; es responsabilidad del programador utilizar los operadores apropiados para obtener y almacenar valores o realizar otras operaciones en los datos.

Ejemplos

“¡Hola, mundo!”

 : HELLO (...) CR ." ¡Hola, Mundo!" ;
HELLO
¡Hola, Mundo!

La palabra CR (retorno de carro) hace que el siguiente resultado se muestre en una nueva línea. La palabra de análisis ." (punto-comilla) lee una cadena delimitada por comillas dobles y agrega código a la definición actual para que la cadena analizada se muestre en la ejecución. El carácter de espacio que separa la palabra ." de la cadena Hello, World! no se incluye como parte de la cadena. Es necesario para que el analizador reconozca ." como una cuarta palabra.

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 de 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 espacio el carácter que separa .( de Hello, World! no forma parte de la cadena.

La palabra CR viene antes del texto a imprimir. Por convención, el intérprete de Forth no inicia la salida en una nueva línea. También por convención, el intérprete espera la entrada al final de la línea anterior, después de un aviso ok. No hay un "flush-buffer" implícito. action en CR de Forth, como a veces ocurre en otros lenguajes de programación.

Combinar estados de compilación e interpretación

Aquí está la definición de una palabra EMIT-Q que cuando se ejecuta emite el carácter único Q:

 : EMIT-Q 81 (el valor ASCII para el personaje 'Q') EMIT ;

Esta definición fue escrita para usar el valor ASCII del carácter Q (81) directamente. El texto entre paréntesis es un comentario y el compilador lo ignora. La palabra EMIT toma un valor de la pila de datos y muestra el carácter correspondiente.

La siguiente redefinición de EMIT-Q utiliza las palabras [ (paréntesis izquierdo), ] (paréntesis derecho), CHAR y LITERAL para cambiar temporalmente al estado de intérprete, calcular el valor ASCII del carácter Q, volver al estado de compilación y agregar el valor calculado al actual colon definicion:

 : EMIT-Q [ CHAR Q ] LITERAL EMIT ;

La palabra de análisis CHAR toma una palabra delimitada por espacios como parámetro 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-Q podría reescribirse así:

 : EMIT-Q [CHAR] Q EMIT ;  Emitir el único personaje 'Q'

Esta definición usó (barra invertida) para el comentario descriptivo.

Tanto CHAR como [CHAR] están predefinidos en AND Forth. Usando IMMEDIATE y POSTPONE, [CHAR] podría haberse definido así:

 : [CHAR] CHAR POSTPONE LITERAL ; IMMEDIATE

Un completo programa 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 una serie de 256 bytes, todos diferentes. Cada vez que se utiliza el array cambia intercambiando dos bytes. Los swaps son controlados por contadores i y j, cada uno inicialmente Para conseguir un nuevo i, añadir 1. Para conseguir un nuevo j, añadir el byte array en el nuevo i. Cambiar los bytes de matriz i y j. El código es el byte array en la suma de los bytes array en i y j. Esto es XORed con un byte del texto llano para encriptar, o el cifrado para descifrar. El array se inicializa por primera vez fijando a 0 a 255. Luego paso a través de él i y j, conseguir el nuevo j añadiendo a él el byte array en i y un byte clave, y cambiar los bytes de la matriz i y j. Finalmente, i y j están listos para 0. Todas las adiciones son modulo 256.

La siguiente versión Standard Forth solo usa palabras básicas y de extensión básica.

0 valor ii 0 valor jj0 valor KeyAddr 0 valor KeyLencrear SArray 256 allot  matriz de estado de 256 bytes: KeyArray KeyLen mod KeyAddr ;: get_byte + c@ ;: set_byte + ¡C! ;: as_byte 255 y ;: reset_ij 0 TO ii 0 TO jj ;: i_update 1 + as_byte TO ii ;: j_update ii SArray get_byte + as_byte TO 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 TO KeyLen TO KeyAddr 256 0 Sí. i i SArray set_byte LOOP reset_ij BEGIN ii KeyArray get_byte jj + j_update swap_s_ij ii 255 . WHILE ii i_update REPEAT 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 de las muchas maneras de probar el código:

Hexcrear AKey 61 c, 8A c, 63 c, D2 c, FB c,: prueba cr 0 Sí. rc4_byte . LOOP cr ;AKey 5 rc4_init2C F9 4C EE DC 5 prueba  salida debe ser: F1 38 29 C9 DE

Implementaciones

Debido a que Forth es fácil de implementar y no tiene una implementación de referencia estándar, existen numerosas versiones del lenguaje. Además de admitir las variedades estándar de sistemas informáticos de escritorio (POSIX, Microsoft Windows, macOS), muchos de estos sistemas Forth también se dirigen a una variedad de sistemas integrados. A continuación se enumeran algunos de los sistemas que cumplen con el estándar ANS Forth de 1994.