Pregunta

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

Al comenzar en Forth, normalmente uno aprende primero sobre la pila y sus operadores (DROP, DUP, SWAP, etc.), por lo que es natural pensar que estos se encuentran 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 la pila.Más adelante aprendemos sobre store (!) y fetch (@) que pueden usarse para implementar DUP, SWAP, etc. (¡ja!).

¿Cuáles son entonces los operadores primitivos?¿Cuáles deben implementarse directamente en el entorno de ejecución a partir del cual 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 llegar más tarde.

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

Editar:Lo que busco es similar a arrancar un sistema operativo o un nuevo compilador.¿Qué necesito implementar, como mínimo, para poder construir el resto del sistema a partir de esos componentes básicos primitivos?No implementaré esto en hardware básico;Como ejercicio educativo, escribiría mi propia máquina virtual mínima.

¿Fue útil?

Solución

este hilo cubre su pregunta exacta.Aquí hay un implementación de sopa con nueces con documentación completa.

Escribí una subrutina dirigida a Forth. 68K cuando estaba en la universidad.Definí el entorno 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, completaba algunos vectores de E/S y ejecutaba el código.Luego tomé el libro de Leo Brodie. Comenzando hacia adelante y comencé a implementar el diccionario básico en lenguaje ensamblador de 68K.Comencé con palabras aritméticas/lógicas, luego estructuras de control y luego palabras de definición/manipulación de palabras.Tengo entendido que, como mínimo, necesita @,!, +, -, * y /.El resto se puede implementar en términos de eso, pero eso es como intentar escribir una biblioteca de gráficos completa basada en SetPixel y GetPixel:Funcionará, pero ¡ay!, ¿por qué?

Disfruté el proceso ya que había algunos acertijos realmente interesantes, como conseguir DOES> exactamente correcto (y una vez que tuve una sólida DOES> implementación, estaba creando cierres que se convirtieron en pequeñas cantidades de código).

Otros consejos

Hace mucho tiempo, tenía un libro llamado "Lenguajes interpretativos subprocesos", publicado creo que por Byte, que analizaba cómo implementar un lenguaje similar a Forth (creo que nunca lo llamaron Forth) en el ensamblaje Z80.

Es posible que no tenga un Z80 a mano o que no quiera uno, pero el libro puede resultar instructivo.

Esta publicación en comp.lang.forth enumera algunos " minimal Forths " ;.

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

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

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

También es posible que desee echar un vistazo al compilador 4tH de Hans Bezemer.

¿Qué implementación de 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 ensamblado / C / lo que sea o por Forth no debería importar, ya que Forth es, por definición, un lenguaje autoextensible.

Al contrario de lo que dices, generalmente DROP SWAP, etc. se consideran operaciones básicas de Forth. La razón es que si las implementa utilizando operaciones de memoria como sugiere, el sistema general se vuelve más, no menos complicado. Tampoco hay una distinción clara en Forth entre lo que es básico y lo que no. En los años 80, una búsqueda en el diccionario sería básica y codificada en ensamblador para la velocidad, mientras que un Linux moderno alojado puede permitirse codificar eso en el llamado nivel alto. También Forthers tiende a recodificar rutinariamente palabras de ensamblador en alto nivel y palabras de alto nivel en ensamblador. Soy el autor de ciforth y yourforth. Es posible definir & Lt; = como & Quot; & Gt; no " como hice en ciforth. Pero en adelante decidí que tener todo & Lt; < = > > = como rutinas de ensamblador pequeño similares, de aspecto uniforme, era efectivamente más simple. Esa es una decisión, y una cuestión de gustos, ciertamente no es una cuestión de principios.

En el contexto, interpreto la pregunta como: & "; ¿Cuál es un tamaño razonable para que el número de operaciones primitivas llegue a un Forth poderoso razonable con una velocidad razonable? &"; Claramente, no está interesado en trucos ingeniosos para deshacerse de una palabra de ensamblador a expensas de una sobrecarga tremenda como se encuentra en algunos de los hilos que discuten este tema.

Ahora puede ver una serie de pequeños Forth como JonesForth YourForth Eorth y concluir que en su mayoría uno llega a alrededor de 50 a 100 primitivas. Esos Forth se definen en ensamblador. Si desea definir sus primitivas en c, python o Java, la situación es nuevamente diferente. Ahora por ej. la búsqueda en el diccionario anterior le permite elegir entre cy Forth. Las consideraciones que no tienen nada que ver con el diseño del lenguaje entran en juego. Puede ser un prolífico programador en C, o puede insistir en codificarlo en Forth porque es un proyecto de aprendizaje.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top