¿Cuáles son los primitivos operadores Forth?


Estoy interesado en implementar un sistema Forth, solo para poder obtener algo de experiencia en la construcción de una máquina virtual simple y tiempo de ejecución.

Al comenzar en Forth, uno típicamente aprende sobre la pila y sus operadores (DROP, DUP, SWAP, etc.).) en primer lugar, por lo que es natural pensar en estos como estar entre los operadores primitivos. Pero no lo son. Cada uno de ellos se puede dividir en operadores que manipulan directamente la memoria y los punteros de pila. Más tarde uno aprende acerca de la tienda (!) y fetch ( @ ), que puede ser se utiliza para implementar DUP, SWAP, etc. (¡ja!).

Entonces, ¿cuáles son los operadores primitivos? ¿Cuáles deben implementarse directamente en el entorno de tiempo de ejecución desde el que se pueden construir todos los demás? No me interesa el alto rendimiento; quiero algo de lo que yo (y otros) podamos aprender. La optimización del operador puede venir más tarde.

(Sí, soy consciente de que puedo comenzar con una máquina de Turing e ir desde allí. Eso es un poco extremo.)

Editar: Lo que estoy apuntando es similar a bootstrapping un sistema operativo o un nuevo compilador. ¿Qué necesito implementar, como mínimo, para poder construir el resto del sistema a partir de esos bloques de construcción primitivos? No implementaré esto en hardware desnudo; como un ejercicio educativo, escribiría mi propia máquina virtual mínima.

Author: Seki, 2009-01-02

7 answers

Este hilo cubre tu pregunta exacta. Aquí hay una implementación de soup-to-nuts con documentación completa.

Escribí una subrutina enhebrada hacia68K cuando estaba en la universidad. Definí el entorno de tiempo de ejecución y el formato del diccionario, luego escribí un código C que arrancaba una aplicación Macintosh que cargaba un diccionario predeterminado, rellenaba algunos vectores de E/S y ejecutaba el código. Luego tomé el libro de Leo Brodie Comenzando Forth y comenzó a implementar el diccionario básico en lenguaje ensamblador 68K. Comencé con palabras aritméticas/lógicas, luego controlé estructuras y luego palabras de definición/manipulación. Mi entendimiento es que como mínimo necesitas @, !, +, -, * y /. El resto se puede implementar en términos de esos, pero eso es como intentar escribir una biblioteca de gráficos completa basada en SetPixel y GetPixel: funcionará, pero vaya, ¿por qué?

Disfruté el proceso, ya que hubo algunos realmente interesantes rompecabezas, como hacer DOES> exactamente bien (y una vez que tuve una implementación sólida DOES>, estaba creando cierres que se convirtieron en pequeñas cantidades de código).

 21
Author: plinth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-29 01:56:02

Hace mucho tiempo, tuve un libro llamado "Threaded Interpretive Languages", publicado creo por Byte, que discutía cómo implementar un lenguaje tipo Forth (no creo que nunca lo llamaran) en el ensamblaje Z80.

Puede que no tenga un Z80 a mano, o quiera uno, pero el libro puede ser instructivo.

 9
Author: David Thornley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-02 21:13:10

Este post en comp.lang.forth enumera algunos "fuertes mínimos".

Http://groups.google.com/group/comp.lang.forth/msg/10872cb68edcb526

¿por Qué sé esto? Mi hermano, Mikael, escribió #3 y también escribió undocumento sobre hacer un "mínimo Forth" (en sueco, sin embargo). Si no recuerdo mal, quería obtener un conjunto mínimo de operadores que pudieran construirse en silicio.

 8
Author: epatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 21:29:41

Todavía no estoy convencido de que la pregunta esté bien formada. Por ejemplo, las instrucciones de Plinth se pueden reducir; después de todo, * y / se pueden implementar en términos de + y -, pero luego '+' se puede implementar en términos de una función sucesora (ver los axiomas de Peano .) Que te pone en el vecindario de una máquina de Turing. ¿Cómo sabes dónde parar?

 4
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-02 23:19:01

Es posible que también desee echar un vistazo a Hans Bezemer 4th compiler.

 3
Author: bugmagnet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-03 13:29:31

¿Qué implementación Forth está utilizando que no proporciona esta información en la documentación? Dada la naturaleza de Forth, podría depender de la implementación. Hay un conjunto estándar de palabras en el diccionario, pero si llegaron allí por assembly/C/whatever o por Forth no debería importar, ya que Forth es por definición un lenguaje autoextensible.

 2
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-02 21:01:00

Contrariamente a lo que usted dice, generalmente DROP SWAP etc se consideran operaciones Forth básicas. La razón es que si los implementa usando operaciones de memoria como sugiere, el sistema en general se vuelve más, no menos complicado. Tampoco hay una clara distinción en Adelante entre lo que es básico y lo que no. En los años 80 una búsqueda de diccionario sería básica, y codificada en ensamblador para la velocidad, mientras que un linux moderno alojado puede permitirse el lujo de codificar en el llamado alto nivel. También los Forthers tienden a rutinariamente recodificar palabras ensambladoras en alto nivel, y palabras de alto nivel en ensamblador. Soy el autor de ciforth y yourforth. Es posible definir not " como lo hice en ciforth . Pero en yourforth decidí que tener todas las >= como rutinas de ensamblador pequeñas similares, de aspecto uniforme, era efectivamente más simple. Es una llamada de juicio, y una cuestión de gusto, ciertamente no una cuestión de principios.

En el contexto interpreto la pregunta como: "¿Cuál es un tamaño razonable para el ¿número de operaciones primitivas para llegar a un Forth razonable y potente con una velocidad razonable?" Claramente no estás interesado en trucos inteligentes para deshacerte de una palabra ensambladora a expensas de una enorme sobrecarga como se encuentra en algunos de los hilos que discuten este tema.

Ahora puedes mirar un número de pequeños Forth como jonesforth yourforth eforth y concluir que en su mayoría uno llega a alrededor de 50 a 100 primitivos. Esos Forth se definen en ensamblador. Si quieres definir sus primitivos en c, python o Java, la situación es otra vez diferente. Ahora, por ejemplo, para la búsqueda del diccionario anterior, puede elegir entre c y Forth. Consideraciones que no tienen nada que ver con el diseño del lenguaje entran en juego. Puede ser un prolífico programador c, o puede insistir en codificarlo en Forth porque es un proyecto de aprendizaje.

 1
Author: Albert van der Horst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 15:41:59