GNU MIX Development Kit (mdk): mixguile
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8. mixguile, виртуальная машина на основе Scheme
Эта глава содержит описание использования mixguile и библиотеки
функций Scheme, дающих доступ к виртуальной машине MIX в эмуляторах
MDK (mixguile, mixvm и gmixvm). См. в
3.4 Использование mixguile учебное пошаговое введение в mixguile
и использование Scheme как языка расширения виртуальных машин MIX MDK.
8.1 Вызов mixguileПараметры командной строки. 8.2 Описание функций Scheme
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.1 Вызов mixguile
При вызове mixguile без аргументов она после загрузки файла
инициализации `~/.mdk/mixguile.scm' (если он существует), войдёт
в Guile REPL (read-eval-print loop, цикл ввода, обработки и вывода).
mixguile принимает те же параметры командной строки, что и
Guile:
mixguile [-s SCRIPT] [-c EXPR] [-l FILE] [-e FUNCTION] [-qhv]
[--help] [--version]
|
Значение этих параметров таково:
- User Option: -h
- User Option: --help
- Вывести краткое описание использования программы и завершить работу.
- User Option: -v
- User Option: --version
- Вывести версию и информацию об авторских левах и завершить работу.
- User Option: -s SCRIPT
- Загрузить код Scheme из файла script, обработать его и завершить работу. Этот параметр может быть использован для написания исполняемых скриптов Scheme, как описано в 3.4.5 Скрипты Scheme.
- User Option: -c EXPR
- Вычислить заданное выражение Scheme и завершить работу.
- User Option: -l FILE
- Загрузить заданный файл Scheme и войти в REPL (цикл ввода, обработки и вывода).
- User Option: -e FUNCTION
- После чтения скрипта, вызвать заданную функцию с аргументами, указанными
в командной строке. Например, вы можете написать следующий скрипт Scheme:
сохранить её в файле, скажем, `foo', сделать его исполняемым и выполнить:#! /usr/bin/mixguile \ -e main -s !# ;;; выполнить заданную программу и вывести содержимое регистров. (define main (lambda (args) ;; загрузить файл, указанный в аргументе командной строки (mix-load (cadr args)) ;; выполнить его (mix-run) ;; вывести содержимое регистров (mix-pall)))
Такой вызов запустить вычисление функции$ ./foo hello
mainсо списком параметров командной строки в качестве аргумента (в вышеприведённом примере("./foo" "hello)). Заметьте, что параметры командной строки для mixguile должны находиться в отдельной строке после символа\.
- User Option: -q
- Не загружать пользовательский файл инициализации. При запуске
mixguileона проверяет наличие файла `mixguile.scm' в каталоге конфигурации `~/.mdk' и, если он существует, загружает его. Этот параметр велитmixguileне загружать файл инициализации.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.2 Описание функций Scheme
Как мы указали выше, mixguile содержит встроенную виртуальную
машину MIX, доступ к которой возможен через набор функций Scheme,
т.е. через библиотеку Scheme. С другой стороны, mixvm и
gmixvm содержат интерпретатор Guile и могут использовать
ту же библиотеку Scheme, равно как и все остальные примитивы Guile/Scheme
и любые определённые пользователем функции. Поэтому в вашем распоряжении
находится мощный язык программирования -- Scheme -- позволяющий расширять
возможности эмуляторов виртуальной машины в составе MDK (см. примеры
в 3.5 Использование Scheme в mixvm и gmixvm).
Следующие подразделы описывают доступные функции библиотеки MIX/Scheme.
8.2.1 Оболочка команд mixvmФункции, вызывающие команды mixvm. 8.2.2 Функции-ловушки Добавление ловушек к командам mixvm. 8.2.3 Дополнительные функции ВМ Функции доступа к виртуальной машине MIX.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.2.1 Оболочка команд mixvm
Каждой из команд mixvm, перечисленных в 6.2 Интерактивные команды, соответствует
функция Scheme, название которой образовано добавлением к имени команды
префикса mix- (например, mix-load, mix-run и т.д.).
Эти оболочки команд реализованы единой функцией передачи команды:
- Function: mixvm-cmd command argument
- Передаёт указанную команду command и аргументы виртуальной машине
MIX. И command, и
argumentдолжны быть строками. Результат будет тот же, что и выполнение "command argument" из командной строкиmixvmилиgmixvm.
Например, вы может вызвать команду run из приглашения mixvm
тремя разными способами:
MIX > run hello MIX > (mix-run "hello") MIX > (mixvm-cmd "run" "hello") |
mixguile или в скрипте Scheme могут быть
использованы только две последние формы).
Функции mix- не вычисляют значений. Если вы хотите проверять
результаты вызова команд mixvm, используйте функцию
mix-last-result:
- Function: mix-last-result
- Возвращает #t, если последнее выполнение команды
mixvmбыло успешным, #f в противном случае.
#! /usr/bin/mixguile \
-e main -s
!#
;;; выполнить заданную программу и вывести содержимое регистров.
(define main
(lambda (args)
;; загрузить файл, указанный в аргументе командной строки
(mix-load (cadr args))
;; выполнить его, если команда mix-load сработала
(if (mix-last-result) (mix-run))
;; вывести содержимое регистров, если вышеприведённые
;; команды успешно завершили работу
(if (mix-last-result) (mix-pall))))
|
Список доступных команд см. в 6.2 Интерактивные команды. Там дано описание команд
mixvm, соответствующие команды Scheme используются точно так же,
и поэтому мы не приводим здесь полного описания этих функций. Вместо
этого мы лишь укажем те оболочки, поведение которых чем-то отличается от
соответсвующих команд.
- Function: mix-preg [register]
- Function: mix-sreg register value
- Аргумент register этих функций может быть либо строкой, либо
символом, представляющим регистр. Например, следующие вызовы
эквивалентны:
(mix-preg 'I1) (mix-preg "I1")
- Function: mix-pmem from [to]
- Команда
pmemпринимает один аргумент -- либо номер ячейки, либо диапазон в видеFROM-TO. Функция же принимает один аргумент, если запрашивается содержимое одной ячейки памяти, и два, если запрашивается диапазон. Например, следующие команды эквивалентны:MIX > pmem 10-12 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX > (mix-pmem 10 12) 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX >
- Function: mix-sover #t|#f
- Команда
soverпринимает в качестве аргумента либо строкуT, либо строкуF, чтобы установить, соответственно, триггер переполнения истинным или ложным. Соответствующая функция Scheme,mix-sover, принимает в качестве аргумента логическое значение Scheme:#t(истина) или#f.
С остальными функциями достаточно принимать в расчёт, что когда аргументами команды служат числа, соответствующая функция Scheme принимает в качестве аргументов числовые литералы Scheme. В то же время, если аргументом команды служит строка, аргументом связанной с ней функции Scheme будет строка Scheme. Например, следующие вызовы попарно эквивалентны:
MIX > load ../samples/hello MIX > (mix-load "../samples/hello) MIX > next 5 MIX > (mix-next 5) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.2.2 Функции-ловушки
Ловушки -- это функции, вычисляемые перед выполнением команды mixvm
(или соответствующей функции-оболочки Scheme) или после него, либо
после обнаружения во время выполнения программы MIX обязательной или
условной точки останова. Следующие функции позволяют устанавливать
ловушки:
- Function: mix-add-pre-hook command hook
- Добавляет функцию в список ловушек перед командой, связанных с данной
командой. command -- строка, называющая соответствующую
команду
mixvm, а hook -- функция, принимающая в качестве единственного аргумента строку-список аргументов команды. Следующий код Scheme определяет простую ловушку и связывает её с командойrun:(define run-hook (lambda (args) (display "argument list: ") (display args) (newline))) (mix-add-pre-hook "run" run-hook)Ловушки перед командой выполняются в порядке, в котором они были добавлены, перед вызовом соответствующей команды (или связанной с ней функции-оболочки Scheme).
- Function: mix-add-post-hook command hook
- Добавляет функцию в список ловушек после команды, связанных с
данной командой. Аргументы имеют то же значение, что и в случае
mix-add-pre-hook.
- Function: mix-add-global-pre-hook hook
- Function: mix-add-global-post-hook hook
- Глобальные ловушки перед/после команд выполняются перед/после вызова
любой команды
mixvmили функции-оболочки. В этом случае hook принимает два аргумента: строку с именем вызванной команды и строку-список её аргументов.
- Function: mix-add-break-hook hook
- Function: mix-add-cond-break hook
- Добавляет функцию-ловушку, выполняемую при обнаружении в ходе выполнения
программы обязательной (соответственно, условной) точки останова.
hook -- функция, принимающая два аргумента: номер строки исходного
текста, откуда вызывается ловушка, и текущее значение счётчика программы.
Следующий код показывает пример определения и установки ловушки останова:
(define break-hook (lambda (line address) (display "Breakpoint at line ") (display line) (display " and address ") (display address) (newline))) (mix-add-break-hook break-hook)Функции-ловушки остановов реализованы в Scheme через обычные ловушки после команды для команд
nextиrun. Если вас это удивляет, вы можете посмотреть исходный код Scheme в файле `префикс/share/mdk/mixguile-vm-stat.scm' (где префикс соответствует корневому каталогу установки, обычно/usrили/usr/local).
См. другие примеры использования функций-ловушек в 3.4.4 Функции-ловушки.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.2.3 Дополнительные функции ВМ
При написании нетривиальных расширений Scheme с использованием библиотеки
MIX/Scheme, вам, вероятно, будет нужно определять содержимое компонентов
виртуальной машины (регистры, ячейки памяти и т.д.). Например, вам может
понадобиться сохранить содержимое регистра A в переменной.
Функции Scheme, описанные до сих пор, не помогут -- вы можете вывести
содержимое A функцией (mix-preg 'A), но не можете присвоить
значение A переменной. Для решения этой проблемы библиотека
MIX/Scheme предоставляет следующие дополнительные функции:
- Function: mixvm-status
- Function: mix-vm-status
- Возвращает текущий статус виртуальной машины в виде числа
(
mixvm-status) или символа (mix-vm-status). Возможные возвращаемые значения:(mixvm-status)(mix-vm-status)0 MIX_ERROR Ошибка загрузки или выполнения 1 MIX_BREAK Обнаружена точка останова 2 MIX_COND_BREAK Условная точка останова 3 MIX_HALTED Выполнение прервано 4 MIX_RUNNING Выполнение по nextостановлено5 MIX_LOADED Программа успешно загружена 6 MIX_EMPTY Программа не загружена
- Function: mix-vm-error?
- Function: mix-vm-break?
- Function: mix-vm-cond-break?
- Function: mix-vm-halted?
- Function: mix-vm-running?
- Function: mix-vm-loaded?
- Function: mix-vm-empty?
- Предикаты, проверяющие равенство текущего статуса виртуальной
машины
MIX_ERROR,MIX_BREAKи т.д.
- Function: mix-reg register
- Function: mix-set-reg! register value
mix-regвозвращает содержимое указанного регистра в виде числа.mix-set-regприравнивает значение указанного регистра заданному. Регистр может быть задан либо в виде строки ("A","X"и т.д.), либо в виде символа ('A,'Xи т.д.). Например:guile> (mix-reg 'A) 2341 guile> (mix-set-reg! "A" 2000) ok guile> (define reg-a (mix-reg 'A)) guile> (display reg-a) 2000 guile>
- Function: mix-cell cell_no
- Function: mix-set-cell! cell_no value
- Возвращает и устанавливает содержимое ячейки памяти номер cell_no соответственно. И cell_no, и value -- числа Scheme.
- Function: mix-loc
- Возвращает значение счётчика положения (т.е. адрес следующей выполняемой инструкции).
- Function: mix-over
- Function: mix-set-over! #t|#f
mix-overвозвращает#t, если триггер переполнения установлен, и#fв противном случае. Значение триггера переполнения может быть изменено функциейmix-set-over!.
- Function: mix-cmp
- Function: mix-set-cmp! 'L|'E|'G
- Возвращает и устанавливает флаг сравнения соответственно. Возможные
значения -- символы Scheme
L(меньше),E(равно) иG(больше).
- Function: mix-up-time
- Возвращает текущее время работы виртуальной машины.
- Function: mix-lap-time
- Возвращает текущее прошедшее время виртуальной машины, т.е. время,
прошедшее после последней команды
runилиnext.
- Function: mix-prog-time
- Возвращает общее время выполнения загруженной в данный момент программы.
- Function: mix-prog-name
- Возвращает строку, содержащую базовое имя (без пути) загруженной в данный момент программы MIX.
- Function: mix-prog-path
- Возвращает строку, содержащую полный путь к загруженной в данный момент программе MIX.
- Function: mix-src-path
- Возвращает строку, содержащую полный путь к исходному файлу загруженной в данный момент программы MIX.
- Function: mix-src-line [lineno]
- Function: mix-src-line-no
mix-src-line-noво время выполнения программы возвращает номер текущей строки исходного кода.mix-src-lineвозвращает строку, содержащую строку исходного файла номер lineno, а при вызове без аргументов возвращает(mix-src-line (mix-src-line-no)).
- Function: mix-ddir
- Возвращает строку, содержащую полный путь к текущему каталогу устройств.
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on June, 9 2003 using texi2html
