2011-01-17 19 views
6

Muchas personas entusiastas de la informática en los 80 han oído hablar de la serie Infocom de juegos de ficción interactivos, notablemente como "Zork", "Guía del autoestopista" Galaxy ',' Planetfall ',' A Mind Forever Voyaging ', etc.Tratando con memoria escriturable en Haskell - Implementación de Z-Machine VM de Infocom

Estos juegos se implementaron en la parte superior de la máquina virtual "Z-Machine". La máquina se implementa como un bloque de RAM, una pila y un procesador virtual. El proceso ejecuta instrucciones que pueden leer y escribir dinámicamente en la RAM.

Mi pregunta es esta: la memoria RAM de las máquinas virtuales es dinámica. ¿Cuál es una forma eficiente y razonablemente idiomática de representar esta memoria RAM (y más holísticamente la estructura de la máquina virtual) para poder implementar software para ejecutar estos juegos? Por ejemplo, ¿debería usar Data.Array para representar la RAM y la mónada de estado?

+0

¿Alguna vez implementó esto? – amindfv

+0

Tengo curiosidad por mí mismo, podría ser muy interesante. – Textmode

Respuesta

5

Haskell tiene varios tipos de matriz con diferentes niveles de control de efectos secundarios y en variantes en caja y sin caja. Una matriz en caja es una matriz de punteros a valores, las matrices no compartidas son matrices de bloques contiguos de memoria. Para la memoria RAM, solo debe tratar esto como un bloque de memoria contigua, por lo que probablemente desee utilizar un tipo de matriz sin caja como STUARray o IOUArray o StorableArray o similar.

3

Consideraría una pila de transformador de mónada con IO en la parte inferior y uno o más mutable vectors para representar la RAM.

+0

Las versiones sin contenedor en Data.Vector.Unboxed es probablemente más apropiado. –

+1

Si solo quieres matrices mutables, no necesitas todo IO; la mónada ST es un ajuste más puro. –

Cuestiones relacionadas