stringtranslate.com

Adelante (lenguaje de programación)

Forth es un lenguaje de programación procedimental , concatenativo , orientado a pilas y un entorno de desarrollo 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 escribía en todas las letras mayúsculas como ADELANTE . 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ó una estandarización oficial del lenguaje como ANS Forth. Existió una amplia gama de derivados de Forth antes y después de ANS Forth. La implementación del software libre Gforth se mantiene activamente, al igual que varios sistemas con soporte comercial.

Forth normalmente combina un compilador con un shell de comandos integrado, [a] donde el usuario interactúa a través de subrutinas llamadas palabras . Las palabras se pueden definir, probar, redefinir y depurar sin tener que volver a compilar 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 genera un estilo de notación polaca inversa .

Durante gran parte de la existencia de Forth, la técnica estándar fue 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 el compilador, el editor y los programas de usuario, podría caber en la memoria de un sistema de 8 bits o similarmente limitado. Ya sin limitaciones de espacio, existen implementaciones modernas que generan código de máquina optimizado como otros compiladores de lenguajes. La relativa simplicidad de crear un sistema Forth básico ha dado lugar a muchas variantes personales y patentadas, como el Forth personalizado utilizado para implementar el videojuego más vendido de 1986, Starflight , de Electronic Arts . [1]

Forth se utiliza en el cargador de arranque Open Firmware , en aplicaciones de vuelos espaciales [2] como la nave espacial Philae , [3] [4] y en otros sistemas integrados que implican interacción con hardware.

Moore desarrolló una serie de microprocesadores para ejecutar código compilado similar a Forth directamente y experimentó con lenguajes más pequeños basados ​​en conceptos de Forth, incluidos cmForth y colorForth . La mayoría de estos lenguajes fueron diseñados para respaldar los propios proyectos de Moore, como el diseño de chips.

Usos

Forth tiene un nicho en aplicaciones astronómicas y espaciales [5] , 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 generar hardware nuevo. 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. [6]

Atari, Inc. utilizó una elaborada demostración animada escrita en Forth para mostrar las capacidades de las computadoras Atari 400 y 800 en los grandes almacenes. [7] Electronic Arts publicó varios videojuegos en la década de 1980 escritos en Forth, incluido Worms? (1983), [8] Adventure Construction Set (1984), [9] Amnesia (1986), [10] Starflight (1986), [1] y Lords of Conquest (1986). El juego de codificación de robots ChipWits (1984) fue escrito en MacFORTH. [11]

RapidFile de Ashton-Tate (1986), un programa de base de datos de archivos planos, y VP-Planner [12] de Paperback Software International (1983), un programa de hoja de cálculo que compite con Lotus 1-2-3 , se escribieron en Forth.

Canon Cat (1987) utiliza 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. [13]

Historia

Forth evolucionó a partir del sistema de programación personal de Charles H. Moore , que había estado en continuo desarrollo desde 1968. [6] Forth estuvo expuesto por primera vez 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). [6] 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 siguiente década.

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

El microFORTH de FORTH, Inc. fue desarrollado 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 el 6502 en 1978. El Forth Interest Group se formó en 1978. [15] Promovió y distribuyó su propia versión del lenguaje, FIG-Forth, para la mayoría de los fabricantes de computadoras domésticas.

Forth fue popular a principios de la década de 1980, [16] porque se adaptaba bien a la memoria limitada de las microcomputadoras . La facilidad de implementación del lenguaje llevó a muchas implementaciones. [17] La ​​computadora doméstica 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. [18]

La práctica común fue codificada en las normas de facto FORTH-79 [19] y FORTH-83 [20] en los años 1979 y 1983, respectivamente. Estos estándares fueron unificados por ANSI en 1994, comúnmente conocidos como ANS Forth. [21] [22]

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

Descripción general

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 y cada una de ellas cumple 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, se pueden crear prototipos, construir y probar 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. Forth ha sido denominado lenguaje de metaaplicación : un lenguaje que se puede utilizar para crear lenguajes orientados a problemas . [24]

Forth se basa en el uso explícito de una pila de datos y de la notación polaca inversa que se utiliza habitualmente 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. Ampliar el compilador solo requiere escribir una nueva palabra, en lugar de modificar una gramática y cambiar la implementación subyacente.

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

 25 10 * 50 + RC . 300 bien        

Primero se ponen 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 +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 correctamente, el sistema Forth imprime OK. [25]

Incluso las características estructurales de Forth se basan en pilas. Por ejemplo:

 : FLOOR5 ( n -- n' ) DUP 6 < SI GOTA 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 utiliza los siguientes comandos: DUPduplica el número en la pila; 6empuja un 6 encima de la pila; <compara los dos primeros números de la pila (6 y la DUPentrada ed) y los reemplaza con un valor de verdadero o falso; IFtoma un valor de verdadero o falso y elige ejecutar comandos inmediatamente después o saltar al ELSE; DROPdescarta el valor en la pila; 5empuja un 5 encima de la pila; y THENtermina el condicional.

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

int piso5 ( int v ) { retorno ( v < 6 ) ? 5 : ( v - 1 ); }             

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

 : PISO5 ( n -- n' ) 1- 5 MÁX ;      

Esto se puede ejecutar de la siguiente manera:

 1 PLANTA5 CR . 5 ok 8 PISO5 CR . 7 bien           

Primero se inserta un número (1 u 8) en la pila, FLOOR5se llama, lo que hace aparecer el número nuevamente y envía el resultado. CRmueve la salida a una nueva línea (nuevamente, esto está aquí solo para facilitar la lectura). Finalmente, una llamada a .muestra el resultado y lo imprime.

Instalaciones

La gramática de Forth no tiene ninguna 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 en busca de una palabra utilizando espacios como delimitador ; Algunos sistemas reconocen 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 fallan tanto la búsqueda como la conversión de números, 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. [26]

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 Xy hará que el nombre se pueda encontrar en el diccionario. Cuando se ejecuta escribiendo 10 Xen la consola, se imprimirá 11 10. [27]

La mayoría de los sistemas Forth incluyen un ensamblador para escribir palabras utilizando las instalaciones del procesador. Los ensambladores Forth suelen utilizar una sintaxis polaca inversa en la que los parámetros de una instrucción preceden a la instrucción. Un típico ensamblador polaco inverso 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 macroensamblador, por lo que es fácil 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. [28]

Sistema operativo, archivos y multitarea

La mayoría de los sistemas Forth se ejecutan bajo 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 fuente y de datos; El estándar ANSI Forth describe las palabras utilizadas para E/S. Todos los sistemas Forth modernos utilizan archivos de texto normales como fuente, incluso si están incrustados. Un sistema integrado con un compilador residente obtiene su 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 código en archivos, el código fuente se almacena en bloques de disco escritos en direcciones de disco físico. La palabra BLOCKse emplea para traducir el número de un bloque de espacio en disco de tamaño 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 , normalmente está disponible (aunque las palabras y el soporte de multitarea no están cubiertos por el estándar ANSI 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 temporal. Intercambiar tareas es simple y eficiente; Como resultado, las multitarea de Forth están disponibles incluso en microcontroladores muy simples , como Intel 8051 , Atmel AVR y TI MSP430 . [29]

Otras instalaciones 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 amplio y diferente de la palabra independiente de Forth PAUSEpara creación, suspensión, destrucción y modificación de prioridad de tareas.

Autocompilación y compilación cruzada.

Un sistema Forth con todas las funciones y todo el código fuente se compilará solo, una técnica comúnmente llamada metacompilación o autohospedaje por los programadores de Forth (aunque el término no coincide exactamente con metacompilación como se define normalmente). El método habitual consiste en redefinir el puñado de palabras que colocan los bits compilados en la memoria. Las palabras del compilador utilizan versiones de fetch y store con nombres especiales 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 de la computadora de destino como a la memoria de la computadora host (compiladora). [30]

Después de redefinir las operaciones de búsqueda y almacenamiento para el espacio de código, el compilador, ensamblador, etc. se vuelven a compilar utilizando las nuevas definiciones de búsqueda y almacenamiento. Esto reutiliza efectivamente todo el código del compilador e 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 puede escribirse 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 dicho compilador Forth son las palabras que recuperan y almacenan un byte, y la palabra que ordena la ejecución de una palabra Forth. A menudo, la parte que lleva más tiempo al 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. [31]

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 presenta en la memoria como un árbol de listas enlazadas con los enlaces procedentes de la última palabra definida (la más reciente) a la más antigua, hasta que se encuentra un valor centinela , generalmente un puntero NULL. Un cambio de contexto hace que una búsqueda en la lista comience en una hoja diferente. Una búsqueda en la lista vinculada 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 en el caso de una metacompilación, un diccionario puede estar aislado y ser independiente. El efecto se asemeja al de anidar espacios de nombres y puede sobrecargar palabras clave según el contexto.

Una palabra definida generalmente consta de encabezado y cuerpo , donde el encabezado consta del campo de nombre (NF) y el campo de enlace (LF), y el cuerpo consta del campo de código (CF) y el campo de parámetro (PF).

El encabezado y el cuerpo de una entrada del diccionario se tratan por separado porque es posible que no sean contiguos. Por ejemplo, cuando se recompila 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 ) los cabezales ocupan memoria innecesariamente. Sin embargo, algunos compiladores cruzados pueden poner cabezas en el objetivo si se espera que el propio objetivo admita un Forth interactivo. [32]

El formato exacto de una entrada del diccionario no está prescrito y las implementaciones varían.

Estructura del compilador

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

El indicador "tiempo de compilación" en el campo de nombre está configurado 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 comando o se incrusten en el código. Al compilarlos, el compilador simplemente coloca un código o un puntero a la palabra. [27]

Los ejemplos clásicos de palabras en tiempo de compilación son las estructuras de control como IFy WHILE. Casi todas las estructuras de control de Forth y casi todos sus compiladores se implementan como palabras en tiempo de compilación. Aparte de algunas palabras de flujo de control rara vez utilizadas que solo se encuentran en algunas implementaciones, como la palabra de retorno condicional ?EXIT utilizada en preForth de Ulrich Hoffmann, [33] [34] 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 sucursales. Por ejemplo, IFy WHILEy las palabras que coinciden con ellas, configurar BRANCH(rama incondicional) y ?BRANCH(sacar un valor de la pila y bifurcar si es falso). Las palabras de flujo de control de bucle contadas funcionan de manera similar, pero configuran combinaciones de palabras primitivas que funcionan con un contador, etc. Durante la compilación, la pila de datos se utiliza para respaldar el equilibrio de la estructura de control, el anidamiento y la aplicación de parches de direcciones de sucursales. El fragmento:

 ... DUP 6 < SI GOTA 5 ELSE 1 - ENTONCES ...           

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

 ... DUP LIT 6 < ? RAMA 5 GOTA LIT 5 RAMA 3 LIT 1 - ...               

Los números después 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 más corto usando punteros a constantes en lugar de LITdatos incrustados, si alguno de los números involucrados se hubiera 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 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 es agregar su semántica de interpretación a la definición actual. [27]

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. [27]

El estado del intérprete se puede cambiar manualmente con las palabras [(corchete izquierdo) y ](corchete derecho) que ingresan al estado de interpretación o al estado de compilación, respectivamente. Estas palabras se pueden usar con la palabra LITERALpara calcular un valor durante una compilación y para insertar el valor calculado en la definición actual de dos puntos. 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 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 con un comportamiento que cambia según el estado actual del intérprete.

palabras inmediatas

La palabra IMMEDIATEmarca la definición de dos puntos más reciente como palabra inmediata , reemplazando efectivamente su semántica de compilación con su semántica de interpretación. [35] 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 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 se marcó como inmediata. Forth-83 definió palabras separadas COMPILEy [COMPILE]forzó la compilación de palabras inmediatas y no inmediatas, respectivamente.

En lugar de reservar espacio para un indicador Inmediato en cada definición, algunas implementaciones de Forth usan un Diccionario Inmediato que se verifica primero cuando está en modo de compilación.

Palabras sin nombre y tokens de ejecución

En ANS Forth, las palabras sin nombre se pueden definir con la palabra :NONAMEque compila las siguientes palabras 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,(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, ' RANDOM-WORD EXECUTEequivale a RANDOM-WORD. [36]

Analizar palabras y comentarios.

Las palabras :(dos puntos), POSTPONE( 'marca) son ejemplos de palabras de análisis 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 siguientes palabras hasta el siguiente paréntesis derecho inclusive 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 subproceso . El Forth original, que sigue el estándar informal FIG (Forth Interest Group), es un TIL (Threaded Interpretive Language). Esto también se denomina código de subproceso indirecto, pero los Forth de subproceso directo y de subrutina 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 ejecución asociado con la palabra definitoria que la creó. Una palabra definitoria tiene un "comportamiento definitorio" característico (crear una entrada de diccionario y posiblemente asignar e inicializar espacio de datos) y también especifica el comportamiento de una instancia de la clase de palabras construida por esta palabra definitoria. Ejemplos incluyen:

VARIABLE
Nombra una ubicación de memoria de una celda no inicializada. El comportamiento de la instancia de a 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
Nombra una ubicación; Se puede asignar espacio en esta ubicación o se puede configurar para que contenga una cadena u otro valor inicializado. El comportamiento de la instancia 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 buffers 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; normalmente, estos objetos de datos se utilizan para contener datos que se utilizan en varias palabras o tareas (en una implementación multitarea). [37]

Forth no exige coherencia en el uso del tipo de datos ; Es responsabilidad del programador utilizar operadores apropiados para buscar y almacenar valores o realizar otras operaciones con datos.

Ejemplos

"¡Hola Mundo!"

 : HOLA ( -- ) CR ." ¡Hola Mundo! " ;      
HOLA <cr>¡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 ."(comillas) 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 lo 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-paren) 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 se separa .(no Hello, World!forma parte de la cadena.

La palabra CRva 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 una okindicación. No hay una acción implícita de "vaciar el búfer" en Forth CR, como ocurre a veces en otros lenguajes de programación.

Mezclando estados de compilación e interpretación.

Aquí está la definición de una palabra EMIT-Qque cuando se ejecuta emite un solo carácter Q:

 : EMIT-Q 81 (el valor ASCII para el carácter 'Q') EMIT ;     

Esta definición fue escrita para usar el valor ASCII del Qcarácter (81) directamente. 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 de 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 agregar el valor calculado a la definición actual de dos puntos:

 : EMITIR-Q [ CHAR Q ] EMITIR LITERAL ;        

La palabra de análisis CHARtoma 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 de EMIT-Qpodría reescribirse así:

 : EMITIR-Q [CHAR] Q EMITIR ; \ Emite el carácter único 'Q'      

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

Ambos CHARy [CHAR]están predefinidos en ANS Forth. Usando IMMEDIATEy POSTPONE, [CHAR]podría haberse definido así:

 : [CHAR] CHAR POSPONER LITERAL ; INMEDIATO      

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 un array de 256 bytes, todos diferentes. Cada vez que se utiliza la matriz, cambia intercambiando dos bytes. Los intercambios están controlados por los contadores i y j , cada uno inicialmente 0. Para obtener un nuevo i , agregue 1. Para obtener un nuevo j , agregue el byte de la matriz en el nuevo i . Intercambie los bytes de la matriz en i y j . El código es el byte de la matriz en la suma de los bytes de la matriz en i y j . Esto se aplica mediante XOR con un byte del texto sin formato para cifrar o el texto cifrado para descifrar. La matriz se inicializa configurándola primero entre 0 y 255. Luego, avance usando i y j , obteniendo la nueva j agregando el byte de la matriz en i y un byte clave, e intercambiando los bytes de la matriz 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 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 DO 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 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:

hexadecimal crear AKey 61 c, 8 A c, 63 c, D2 c, FB c ,: prueba cr 0 DO rc4_byte . BUCLE cr ; AKey 5 rc4_init 2 C F9 4 C EE DC 5 test \ la salida debe ser: F1 38 29 C9 DE                             

Implementaciones

Debido a que Forth es simple 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 1994.

Ver también

Notas

  1. ^ Hay excepciones, como preForth [1] [2] de Ulrich Hoffmann y TCOM de Tom Zimmer

Referencias

  1. ^ ab Maher, Jimmy (28 de octubre de 2014). "Vuelo estelar". El anticuario digital . Consultado el 29 de abril de 2023 .
  2. ^ Aplicaciones de la NASA de Forth (el servidor original de la NASA ya no se ejecuta, copia de archive.org)
  3. ^ "Los procesadores RTX de Intersil y el software Forth controlaron el exitoso aterrizaje de Philae" (PDF) . Ingeniería de microprocesadores limitada . 13 de octubre de 2014 . Consultado el 29 de abril de 2023 .
  4. ^ "¡Aquí viene Philae! Desarrollado por un RTX2010". El Museo CPU Shack . 12 de octubre de 2014 . Consultado el 29 de abril de 2023 .
  5. ^ "Aplicaciones de Forth relacionadas con el espacio". Archivado desde el original el 24 de octubre de 2010 . Consultado el 4 de septiembre de 2007 .
  6. ^ a b C Más bien, 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 . Asociación para Maquinaria de Computación. págs. 625–670. doi :10.1145/234286.1057832. ISBN 0201895021.
  7. ^ "Programa de demostración de Atari en la tienda". Atari Manía .
  8. ^ Maynard, David S. "David Maynard: artista de software".
  9. ^ Juan Romero (23 de septiembre de 2020). "Time Warp: Episodio 9 - Stuart Smith" (Pódcast). El evento ocurre a las 29:02.
  10. ^ Aycock, John (2023). Amnesia recordada: ingeniería inversa de un artefacto digital. Libros Berghahn. pag. 79.ISBN _ 978-1800738676.
  11. ^ Sharp, Doug (8 de abril de 2023). "Lenguaje de programación FORTH (en adelante)".
  12. ^ "FORTH OBTIENE SU PROPIO GRUPO DE INTERÉS ESPECIAL". Monitor técnico . 6 de febrero de 1989.
  13. ^ Campbell et al, "En funcionamiento con Asyst 2.0", MacMillan Software Co., 1987
  14. ^ Moore, Charles H (1991). "Cuarto: los primeros años". Archivado desde el original el 15 de junio de 2006 . Consultado el 3 de junio de 2006 .
  15. ^ "Especificación ANS 1994, Anexo C ("Perspectiva")". taygeta.com .
  16. ^ "El cuarto idioma", Revista BYTE , 5 (8), 1980
  17. ^ M. Antón Ertl. "Cuarto árbol genealógico y cronología".
  18. ^ Lutus, Paul (1982). "Manual de idiomas GraFORTH". archivo.org . Insoft.
  19. ^ "El estándar Forth-79" (PDF) . Consultado el 29 de abril de 2023 .
  20. ^ "El estándar Forth-83".
  21. ^ "Lenguajes de programación: adelante". Comité técnico ANSI X3J14. 24 de marzo de 1994 . Consultado el 3 de junio de 2006 .
  22. ^ "Referencia del estándar adelante (ANSI INCITS 215-1994)" (PDF) . Software portátil Quartus. 13 de septiembre de 2005 . Consultado el 29 de abril de 2023 .
  23. ^ Lanzamiento, Carl (2 de marzo de 2018). "Restauración del código fuente original de FORTH en IBM 1130". rescate1130 . Consultado el 30 de julio de 2018 .
  24. ^ Brodie, Leo (1987). Empezando adelante (2ª ed.). Prentice Hall. ISBN 978-0-13-843079-5.
  25. ^ Brodie 1987, pag. 20
  26. ^ Brodie 1987, pag. 14
  27. ^ abcd Brodie 1987, pag. dieciséis
  28. ^ Rodríguez, Brad. "Construya su propio ensamblador, parte 2: un cuarto ensamblador 6809" . Consultado el 29 de abril de 2023 .
  29. ^ Rodríguez, Brad. "Multitarea 8051 CamelForth" (PDF) . Consultado el 29 de abril de 2023 .
  30. ^ Rodríguez, Brad (julio-agosto de 1995). "AVANZANDO, Parte 8: CamelForth para el 6809" . Consultado el 29 de abril de 2023 .
  31. ^ Shoebridge, Peter (21 de diciembre de 1998). "Controlador del modo de depuración en segundo plano de Motorola para Windows NT". Archivado desde el original el 6 de junio de 2007 . Consultado el 19 de junio de 2006 .
  32. ^ Martín, Harold M. (marzo de 1991). "Desarrollo de un modelo Forth atado". Boletín ACM Sigforth . Prensa ACM. 2 (3): 17-19. doi :10.1145/122089.122091. S2CID  26362015.
  33. ^ Diapositivas previas a Forth de Ulrich Hoffmann
  34. ^ PreForth de Ulrich Hoffmann
  35. ^ Brodie 1987, pag. 273
  36. ^ Brodie 1987, pag. 199
  37. ^ "Bajo el capó". Brody 1987 . pag. 241. En resumen, hay tres tipos de variables: Las variables del sistema contienen valores utilizados por todo el sistema Forth. Las variables de usuario contienen valores que son únicos para cada tarea, aunque las definiciones pueden ser utilizadas por todas las tareas del sistema. Se puede acceder a las variables regulares en todo el sistema o dentro de una sola tarea, dependiendo de si están definidas dentro o dentro de una tarea privada.OPERATOR
  38. ^ Harry, David; Oshio, Koichi; Flanagan, Steven D. (1987). "El software ASYST para informática científica". Ciencia . 236 (4805): 1128–32. Código Bib : 1987 Ciencia... 236.1128H. doi : 10.1126/ciencia.236.4805.1128. JSTOR  1699106. PMID  17799670. S2CID  30463062.

enlaces externos