Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования (и ОС) ФОРТ (FORTH) PM-Forth v.1.2


Информационный Канал Subscribe.Ru

http://www.forth.org.ru/forths/PMForth/PMforth.htm

PM-Forth v.1.2

краткое описание



--------------------------------------------------------------------------------


 

Данный файл представляет собой краткую справку по транслятору языка Форт, разработанному
И.Е. Тарасовым. Автор - кандидат технических наук, преподаватель кафедры физики
Ковровской государственной технологической академии. Представляемый здесь транслятор
Форта с 1999 года является основным рабочим инструментом научно-исследовательской
работы кафедры. PM-Forth является сокращением от Protected Mode Forth и отражает
ориентацию этой серии трансляторов на работу в защищенном режиме под управлением
сервера DPMI.

 

Содержание 

Краткая характеристика транслятора.

Основные области применения.

Условия использования

Назначение транслятора и история создания

Системные требования

Основные особенности и отличия от стандарта

Загрузка Форта и программ пользователя.

Плавающая точка.

Память защищенного режима и системные команды.

Векторизованные слова.

Работа с графикой и линейный кадровый буфер.

Работа на уровне устройств ввода-вывода.

Файловые операции.

Контекстные словари

Неподдерживаемые операции.

Дальнейшее развитие.

 

Краткая характеристика транслятора:

 совместимость с ANS 94;

 32-разрядный защищенный режим работы;

 операционная система MS-DOS или окно DOS в Win9x;

 встроенный DOS-экстендер (wdosx 0.95 by M.Tippach);

 раздельные сегменты кода и данных;

 компиляция 32-разрядного машинного кода;

 размер памяти кода - 512 кб, размер памяти данных ограничен только физической
памятью компьютера;

 встроенная поддержка плавающей точки с использованием сопроцессора;

 набор слов для управления дескрипторами защищенного режима и работы с портами
ввода-вывода;

 векторизация основных словарных статей;

 наличие контекстных словарей;

 встроенная в ядро поддержка графики SVGA в режиме линейного кадрового буфера.

 

Основные области применения:

 обработка больших массивов данных;

 связь с нестандартным оборудованием в режиме реального времени;

 интенсивные вычисления с плавающей точкой;

 быстрое построение оболочек для интерактивного управления экспериментом;

 высокопроизводительные графические операции в SVGA-режимах;

 удаленная отладка микропроцессорных устройств.

 

Условия использования: 

PM-Forth v.1.2 предлагается для свободного использования. Это означает возможность
разработки программного обеспечения с использованием представляемой версии языка
при условии сохранения информации об авторских правах. Свободная разработка включает
право создания коммерческих программных продуктов на основе данного транслятора
(при условии, что сам транслятор не будет являться предметом продажи). В соответствии
с принципом "AS IS" автор не несет ответственности за прямой или косвенный ущерб,
причиненный в связи
с использованием данного программного продукта.

При разработке коммерческих программ желательно поставить автора в известность
о факте использования PM-Форта. 

Примечание: право свободного использования транслятора не распространяется автоматически
на все библиотеки, созданные автором. В настоящее время с транслятором свободно
поставляются библиотеки ext-key.pm и video.pm

 

Назначение транслятора и история создания

Форт является уникальной в своем роде системой программирования. В то время как
создание программ на любом другом языке подразумевает использование компилятора,
разработанного какой-либо фирмой, Форт в силу своей исключительной простоты и
интуитивной понятности вполне доступен для самостоятельного освоения и разработки
собственного транслятора. Здесь, однако, таится опасность получить узкоспециализированную
версию языка, пригодную для использования только автором, но результат стоит
потраченных усилий. К тому
же, открытая архитектура и возможность корректировки уже созданных слов позволяют
квалифицированному фортеру в короткие сроки адаптировать имеющийся у него транслятор
для своих нужд. Соответственно, наиболее критичными характеристиками транслятора
становятся не имеющиеся в его составе библиотеки, а эффективность доступа к аппаратным
средствам компьютера и интерфейсным функциям операционной системы. Немаловажна
также используемая модель памяти и способ компиляции кода, которые в конечном
итоге и определяют эффективность
разрабатываемых программных продуктов. 

Для иллюстрации данного вопроса несколько слов стоит сказать об истории разработки
PM-Форта. Сам по себе Форт является мощнейшим инструментом в научных исследованиях,
обеспечивающим интерактивное управление экспериментом. Как показал опыт работы
с Фортом, ни один язык программирования не может сравниться с ним по скорости
адаптации программы к непрерывно меняющимся условиям эксперимента. Действительно,
на стадии исследования (или же конструкторской разработки) часто бывает весьма
и весьма трудно определить
требуемые алгоритмы работы. Бывают необходимы также пошаговая отладка, включение
и выключение отдельных устройств, в том числе с весьма экзотическими интерфейсами,
просмотр внутренних переменных программы, и, что самое главное, необходимость
всего перечисленного может возникнуть совершенно внезапно. В этом случае от системы
программирования требуется как можно быстрее адаптироваться к новой ситуации.
Традиционные языки программирования зачастую малоэффективны, поскольку даже изменение
одной константы требует
перекомпиляции всего проекта. Альтернативой, конечно, может быть построение сложной
управляющей оболочки, допускающей изменение констант, просмотр переменных, управление
отдельными цифровыми линиями и т.п., однако сама эта оболочка может содержать
труднообнаружимые ошибки (а значит, программисту нужно будет предоставить исключительный
доступ к разрабатываемой системе только для отладки управляющей оболочки), к
тому же при завершении разработки она станет совершенно бесполезной.

По сравнению с этим Форт позволяет начать работу, имея только минимальный набор
слов, обеспечивающих выполнение элементарных операций с аппаратной частью разрабатываемой
системы. Это набор вполне может быть написан разработчиком аппаратуры, имеющим
хотя бы элементарные навыки работы с Фортом. В дальнейшем управление может осуществляться
в интерактивном режиме, в результате чего будут выявлены основные закономерности
работы системы и получен алгоритм управления. Сказанное в полной мере относится
и к разработке
программных продуктов - на первом этапе разрабатывается минимальный набор словарных
статей, и после пробных запусков в интерактивном режиме, продемонстрирующих все
тонкости разработанной программы, можно будет перейти к окончательной компоновке
проекта.

 

Как правило, базовые алгоритмы, имеющие в своей основе абстрагированную от конкретного
языка программирования математику, можно написать на любом языке, в том числе
на любом трансляторе Форта. В этом случае на первый план выходят следующие вопросы:

1) В какой операционной системе можно запускать полученную программу?

Операционная система Win9x очень широко распространена, и совместимость программ
с ней - вопрос элементарного удобства (по крайней мере, процесса разработки программ).
Однако программа, работающая также в среде ДОС, и умещающаяся на одной дискете,
позволяет использовать в готовом устройстве жесткий диск небольшого объема, и
даже отказаться от его использования, заменив, например, флэш-диском, или даже
дисководом в качестве системы загрузки. Кроме того, программы на основе однозадачной
операционной системы обладают
гораздо более высокой надежностью.

2) Сколько будет доступно памяти для размещения обрабатываемых данных? 

Здесь следует заметить, что компьютер является идеальным цифровым осциллографом
- довольно высокая скорость обмена по стандартным шинам и громадный объем физической
памяти позволяют запоминать сигналы с частотой дискретизации до нескольких мегагерц.
Используемые объемы памяти соответственно составляют десятки мегабайт.

3) Какие средства обработки данных будут доступны программисту?

В составе системы имеются математический сопроцессор, графический видеоадаптер
и жесткий диск. Следовательно, мы ожидаем увидеть мощную математическую обработку,
включающую вычисления с плавающей точкой, удобное графическое представление результатов
и их сохранение на диск. Кроме того, общим требованием к программам является
высокая производительность.

С учетом всего вышеизложенного автором были сформулированы черты Форт-транслятора,
призванного обеспечить максимальное удобство разработки программ в сочетании
с высокой производительностью.

1) Работа в 32-разрядном защищенном режиме с использованием интерфейса DPMI.


DPMI (DOS Protected Mode Interface) является удобным и мощным средством разработки.
Это один из немногих интерфейсов, позволяющих реализовать собственные менеджеры
памяти, использующие к тому же защищенный режим процессоров 386+. Интерфейс DPMI
позволяет запускать программы как в окне Windows, так и в системе MS-DOS, в любом
случае предоставляя возможность переключения в защищенный режим работы. В настоящее
время существуют свободно распространяемые DOS-экстендеры, обеспечивающие интерфейс
DPMI при весьма небольшом
объеме (загрузчик PM-Форта занимает всего лишь 30 кбайт, однако он позволяет
при загрузке компьютера с дискеты перейти в защищенный режим работы с нулевым
(наивысшим) приоритетом).

2) Компиляция машинного кода.

Комментарии, вероятно, излишни. Машинный код является наиболее эффективной версией
создаваемого Фортом кода, а при больших объемах памяти (тем более при ее 32-разрядной
адресации) экономия памяти, присущая шитому коду, уже не является актуальной.

3) Реализация вычислений с плавающей точкой и работа с оборудованием на уровне
прямой адресации памяти и портов ввода-вывода.

4) Векторизация ключевых словарных статей.

Многие слова Форта несут на себе очень большую функциональную нагрузку. Например,
печать символа словом EMIT можно реализовать десятками способов, начиная от вызова
сервисной функции операционной системы, и заканчивая прямой отрисовкой символа
на экране в графическом режиме. Эти способы различаются как по быстродействию,
так и по надежности, и однозначно выбрать один из них на этапе разработки Форт-системы
означает серьезно ограничить возможности пользователей. Поэтому ряд важных слов
необходимо сделать векторными,
чтобы в процессе работы можно было легко заменить их новой версией, учитывающей
все тонкости разрабатываемой программы. При достижении определенной "критической
массы" векторизованных слов транслятор становится по сути дела открытой системой
- весь процесс его работы, включая и сам цикл QUERY-INTERPRET, доступен для изменения
пользователем.

 

К сожалению, на момент создания PM-Форта автору не удалось найти транслятора,
в полной мере отвечающего всем перечисленным требованиям. Хотелось бы отметить
серию трансляторов SP-Forth, разработки А.Ю. Черезова, однако последние версии
предназначены для работы в среде Windows, что лежит несколько в стороне от потребностей
автора. Возможности 32-битного транслятора smal32 А. Ларионова также выглядят
весьма впечатляюще, однако основные области его использования видятся лежащими
в стороне от описанных задач. Ввиду
этого в начале 1999 года была начата разработка транслятора PM-Forth, завершившаяся
к лету того же года выходом предварительной версии 0.9.

 

Системные требования.

1) Процессор не ниже 80386 (рекомендуется 80486).

2) Как минимум 2 Мбайта физической памяти.

3) Математический сопроцессор. 

PM-Forth способен работать с видеоадаптером в режиме линейного кадрового буфера
(LFB - Linear Frame Buffer). Как правило, эту возможность предоставляют современные
видеокарты, поддерживающие стандарт VBE2.0. Использование линейного кадрового
буфера существенно ускоряет вывод на экран в графических режимах с высоким разрешением.

 

Основные особенности и отличия от стандарта.

 

Загрузка Форта и программ пользователя.

Минимальная конфигурация включает в себя всего два файла - pmforth.exe и pmforth.cod.
Последний представляет собой собственно код транслятора. При запуске exe-файла
в командной строке может быть передано имя файла, который будет интерпретироваться
сразу после старта Форта. Расширение файла может быть любым, однако оно должно
быть указано явно. Автор использует следующую систему расширений:

fpm - для исходных текстов;

pm - для стандартных библиотек;

cpm - для загрузочных модулей.

Ввиду того, что в командной строке может быть передано только одно имя файла
(остальные параметры игнорируются), имеет смысл передавать имя файла типа cpm,
выполняющего загрузку остальных модулей проекта.

Ввиду того, что PM-Форт поддерживает как строки со счетчиком, так и строки типа
(с-addr, u), загрузка файла для интерпретации может быть выполнена одним из трех
способов:

1) " FILENAME.EXT" L - единственный способ, существовавший в версиях 0.9 - 1.1.

2) S" FILENAME.EXT" INCLUDED - в соответствии с ANS 94

3)  INCLUDE-FILE - загрузка файла, представленного номером на стеке
данных

 

Плавающая точка.

Плавающая точка использует математический сопроцессор, поэтому возможности PM-Форта
по поддержке плавающей точки обусловлены исключительно его архитектурой. В качестве
стека чисел с плавающей точкой используется стек сопроцессора. Он имеет размер
8 ячеек, однако две из них используются при печати и форматном преобразовании
чисел. Список поддерживаемых операций можно найти в файле pmforth.log, (который
полностью игнорируется Фортом и является выходным файлом целевого компилятора,
а включен в состав пакета только
в качестве листинга имеющихся слов).

Нестандартным словом является X*X (ADR[x], ADRf, count --> F: линейная свертка
массивов )

В приведенной стековой нотации ADR[x] - начальный адрес массива двухбайтовый
чисел (например, считанных с АЦП); ADRf - начальный адрес массива чисел в формате
short float (представляющих собой базисную функцию линейной свертки); count -
количество чисел, подлежащих свертке. После выполнения слова на стеке сопроцессора
остается сумма произведений элементов этих двух массивов, имеющих одинаковые
индексы, т.е. x[0]*f[0]+x[1]*f[1]+ ...

Слово может быть использовано, например, для спектрального анализа (в случае,
когда массив f - ряд Фурье). 

Поскольку PM-Форт является полностью 32-разрядной системой, в его состав не входят
слова для работы с числами двойной длины. Соответственно, точка в записи числа
больше не является признаком целого числа двойной длины и может быть использована
для задания признака числа с плавающей точкой. При преобразовании строки в число
с плавающей точкой учитывается состояние следующих логических переменных:

E-REQUIRED - ненулевое значение по этому адресу означает, что для начала преобразования
строка должна содержать символ e(E);

DOT-REQUIRED - "-" содержать точку;

EDOT-REQUIRED - "-" содержать одновременно точку и символ e(E).

По умолчанию в ИСТИНУ установлена только переменная DOT-REQUIRED, поэтому числа
вида -1.023 1.23e4 будут восприняты как вещественные.

 

Память защищенного режима и системные команды.

При старте загрузчик выделяет сегмент объемом 512 кбайт для хранения кода, и
всю оставшуюся память - для хранения данных. Объем памяти данных может быть приблизительно
оценен как "физическая память - 2 Мб". Предел памяти данных (т.е. максимально
допустимый адрес) записывается в системную переменную LIMIT.

В защищенном режиме сегментные регистры хранят не адрес параграфа, а селектор
- указатель на 8-байтную структуру данных, содержащую информацию о физическом
адресе сегмента, его размере и правах доступа. Поэтому содержимое сегментных
регистров нельзя изменять напрямую. PM-Форт использует следующее распределение
сегментных регистров:

Регистр
 Команды
 Описание
 
CS
 CS@
 сегмент кода
 
DS
 DS@
 сегмент данных
 
SS
 SS@
 сегмент стека
 
FS
 FS@
 алиас сегмента кода (сегмент данных, полностью совпадающий с сегментом кода
и служащий для его модификации)
 
ES
 ES@ ES!
 свободный регистр
 
GS
 GS@ GS!
 свободный регистр (используется библиотекой видеоадаптера в качестве указателя
на видеопамять в режиме линейного кадрового буфера).
 


 

Для доступа к служебным областям памяти создаются специальные сегменты защищенного
режима.

Переменная
 Команда помещения на стек
 Описание
 
[0000]
 [0000]:
 сегмент для доступа к служебной области ДОС
 
[A000]
 [A000]:
 сегмент для доступа к видеопамяти 
 
[LFB]
 [LFB]:
 сегмент для доступа к видеопамяти в режиме линейного кадрового буфера (инициализируется
библиотекой видеоадаптера)
 


 

Особый интерес представляет команда CS@, кладущая на стек селектор сегмента кода.
Младшие два бита этого селектора соответствуют уровню привилегий сегмента кода.
При нулевом уровне привилегий (который запрашивается Фортом и обычно предоставляется
ему при запуске из ДОС или в режиме эмуляции MS-DOS) становится доступной команда
CLEAR-CACHE, выполняющая очистку внутренней и внешней кэш-памяти процессора.
Эта команда весьма эффективна перед выполнением вложенных циклов, поскольку команды
и данные, выполняющиеся
сразу после очистки кэша, попадают в него, и ускорение доступа к ним бывает весьма
заметным. Команда CLEAR-CACHE вызовет ошибку при попытке выполнения ее на процессоре
80386 и не выполнит никаких действий, если уровень привилегий не равен нулю.

 

Векторизованные слова.

В PM-Форте векторными являются следующие слова:

 EMIT KEY ?KEY CR TYPE EXPECT ACCEPT BYE OK PIXEL GETPIXEL LINE CIRCLE
ELLIPSE VIDEO

NUMBER LITERAL ERROR ERR# ABORT PROMPT QUIT   


   K_ENTER K_ESC DISPATCH-NUMBER DISPATCH-STRING

 

Интересно слово DISPATCH-NUMBER. Оно вызывается словом NUMBER каждый раз после
обработки числа. При этом переменная LASTFLOAT содержит ИСТИНУ, если только что
преобразованное число было воспринято как число с плавающей точкой. Приведенный
ниже пример заставит Форт каждый раз при вводе числа удалять его со стека и печатать
в формате с плавающей точкой.

 

: DROP&PRINT

LASTFLOAT @ NOT IF S>F THEN \ перенести число на стек сопроцессора, если оно
не вещественное

F.

;

' DROP&PRINT TO DISPATCH-NUMBER

 

По умолчанию DISPATCH-NUMBER содержит указатель на NOOP

Для того, чтобы константы ( 0 1 2 и т.п.) также были переданы слову DISPATCH-NUMBER,
в состав флагов введен флаг NUMERICAL. Любое слово, имеющее этот флаг, выполнит
при своем исполнении (не компиляции!) слово DISPATCH-NUMBER. Установить флаг
NUMERICAL можно аналогично установке флага IMMEDIATE - поставив NUMERICAL после
завершения текущего определения. Все константы PM-Форта имеют этот признак, поэтому
ввод 1, 2 или PI также вызовет для обработки DISPATCH-NUMBER.

 

Библиотека ext-key.pm дополнительно определяет несколько десятков векторных слов,
каждое из которых выполняется при нажатии соответствующей клавиши с расширенным
кодом. Например K_F1 K_SHIFT_F10 K_ALT_F (полный список и логику работы можно
посмотреть в исходных текстах библиотеки). В результате существенно упрощается
построение интерфейсов, основанных на использовании "горячих клавиш". Достаточно
написать слово-обработчик нажатой клавиши и подключить его к соответствующему
векторному слову.

 

Работа с графикой и линейный кадровый буфер.

Основные операции с графикой определены в библиотеке video.pm. Библиотека пока
находится в стадии доработки и приведена как пример возможностей PM-Форта при
работе с видеопамятью в защищенном режиме. Переключение видеорежима выполняется
векторизованным словом VIDEO, которое в библиотеке video.pm заменяется достаточно
мощной версией, позволяющей переключаться в VESA-видеорежимы. Если в затребованном
видеорежиме поддерживается линейный кадровый буфер, он автоматически используется.
Режим линейного кадрового буфера
представляет собой отображение видеопамяти в непрерывный сегмент защищенного
режима (объемом до нескольких мегабайт). Селектор такого сегмента записывается
в регистр GS, в результате чего вся видеопамять становится доступной с использованием
только смещения. Переключение банков памяти при этом не требуется, и наблюдается
весьма существенное ускорение вывода графики (до 10-12 млн. точек в секунду).


Библиотека video.pm использует также векторное слово RGB ( R, G, B --> Color
), которое заменяет составляющие цвета (от 0 до 255) на номер цвета для непосредственной
записи в видеопамять. Выполнение 100 100 255 0 0 RGB PIXEL выводит красную точку
в любом видеорежиме.

Примечание: RGB пока не реализовано для 256- цветных видеорежимов. Не реализованы
также слова для построения окружности и эллипса. Соответствующие векторные слова
не выполняют никаких действий.

 

Работа на уровне устройств ввода-вывода.

Для работы с устройствами ввода-вывода используются следующие слова.

INPORT ( ADR --> DATA )
 считывает байт из порта с адресом ADR
 
OUTPORT ( DATA, ADR --> )
 записывает байт DATA в порт с адресом ADR
 
~OUTPORT (DATA, ADR --> )
 то же, что OUTPORT, но данные инвертируются
 
INPORTW ( ADR --> DATA )
 считывает два байта из портов с адресами ADR и ADR+1
 
OUTPORTW ( DATA, ADR --> )
 записывает два младших байта числа DATA в порты с адресами ADR и ADR+1
 


 

Файловые операции.

Кроме файловых операций в соответствии со стандартом ANS 94 в PM-Форте имеются
слова, оставленные для совместимости с его предыдущими версиями. (Не реализовано
слово RESIZE-FILE).

" FILENAME.EXT" OPEN ( --> HANDLE ) открывает существующий файл

" FILENAME.EXT" NEWFILE ( --> HANDLE ) создает файл

CLOSE ( HANDLE --> ) закрывает файл

MEM->DISK ( handle, BUF, COUNT --> ) записывает содержимое памяти с адреса BUF
длиной COUNT в файл handle

DISK->MEM ( handle, BUF, COUNT --> ) записывает COUNT байт из файла handle в
память с адреса BUF 

LSEEK ( Handle, Mode, Delta --> ) перемещает указатель чтения/записи файла handle
на Delta байт в соответствии со значением режима Mode ( 0 - от старта, 1 - от
текущей позиции, 2 - от конца файла).

 

Контекстные словари.

Словарь PM-Форта представляет собой альтернативный список поиска. Имя словаря
- это просто слово в словаре-родителе. При исчерпании списка в контекстном словаре
поиск продолжается в родительском. Порядок поиска определяется иерархией создания
словарей; список поиска отсутствует. Однако число словарей практически неограничено.

 

Неподдерживаемые операции.

В настоящий момент:

 Не полностью поддерживается набор FLOATING (хотя основные операции поддерживаются
в полном объеме).

 Отсутствует механизм обработки ошибок через CATCH/THROW (вместо него используется
векторное слово ERROR, получающее на стеке код ошибки).

 Отсутствуют слова для работы с числами двойной длины (по понятным причинам).
Ввиду этого операции деления ограничены словами / MOD /MOD.

 Отсутствует сохранение наработанной программы в exe-файл. Основная причина -
полученный файл может достигать нескольких десятков мегабайт. Необходимо заметить,
что интерпретация исходных текстов выполняется достаточно быстро.

 

Дальнейшее развитие.

В ближайшее время планируется:

Выпуск документации. 
Доработка библиотеки video.pm 
Разработка встроенного ассемблера.
 

 

С автором можно связаться по адресу tile@kc.ru

 

Почтовый адрес: 

601910 г. Ковров Владимирской обл.

ул. Маяковского, 19, 

Ковровская государственная технологическая академия

кафедра физики

 

24 февраля 2001 г.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.forth
Архив рассылки
Отписаться
Вспомнить пароль

В избранное