Работа с доступной для записи памятью в Haskell — реализация виртуальной машины Z-Machine от Infocom

Многие компьютерные энтузиасты в 80-х слышали о серии интерактивных фантастических игр Infocom, особенно о таких, как «Zork», «Автостопом по галактике», «Planetfall», «A Mind Forever Voyaging», и т. д..

Эти игры были реализованы поверх виртуальной машины "Z-Machine". Машина реализована в виде блока оперативной памяти, стека и виртуального процессора. Процесс выполняет инструкции, которые могут динамически читать и записывать в ОЗУ.

Мой вопрос заключается в следующем: оперативная память виртуальных машин является динамической. Каков эффективный и достаточно идиоматический способ представления этой оперативной памяти (и более целостной структуры виртуальной машины), чтобы я мог реализовать программное обеспечение для запуска этих игр? Например, должен ли я использовать Data.Array для представления ОЗУ и монады состояния?


person Muchin    schedule 17.01.2011    source источник
comment
Вы когда-нибудь реализовывали это?   -  person amindfv    schedule 29.03.2013
comment
Мне самому любопытно, может быть очень интересно.   -  person Textmode    schedule 29.08.2013


Ответы (2)


Haskell имеет различные типы массивов с различными уровнями управления побочными эффектами как в упакованном, так и в неупакованном вариантах. Упакованный массив — это массив указателей на значения, неупакованные массивы — это массивы непрерывных блоков памяти. Для оперативной памяти вы просто хотите рассматривать это как блок непрерывной памяти, поэтому вы, вероятно, захотите использовать неупакованный тип массива, такой как STUARray или IOUArray или StorableArray или аналогичный.

person snk_kid    schedule 17.01.2011

Я бы рассмотрел стек преобразователя монад с вводом-выводом внизу и одним или несколькими изменяемые векторы для представления оперативной памяти.

person Thomas M. DuBuisson    schedule 17.01.2011
comment
Неупакованные версии в Data.Vector.Unboxed, вероятно, более подходят. - person snk_kid; 17.01.2011
comment
Если вам нужны только изменяемые массивы, вам не нужен весь ввод-вывод; монада ST подходит лучше. - person Joachim Breitner; 08.10.2012