ß Основные
характеристики
языка
программирования
FORTH
Редакторы языка, версии языка, установка и компиляция программ
Адрес
документа: |
http://90.189.213.191:4422/temp/gr_mi38_37_mp5_sh/gr_mi38_37_mp5_sh.doc
инд 2-95-л5 |
В данной
лекции
рассматривается язык
программирования
forth.
История
создания.
Версии.
Особенности.
Установка и
компиляция
программ.
Содержание:
В
начале
появились
универсальные
языки программирования.
·
Фортран
В 1954 году
в недрах
корпорации IBM
группой
разработчиков
во главе с
Джоном
Бэкусом (John Backus)
был создан
язык
программирования
Fortran. Значение этого
события
трудно
переоценить.
Это первый
язык
программирования
высокого
уровня.
Впервые
программист
мог
по-настоящему
абстрагироваться
от
особенностей
машинной
архитектуры.
Ключевой
идеей,
отличающей новый
язык от
ассемблера,
была
концепция подпрограмм.
Напомним, что
это
современные компьютеры
поддерживают
подпрограммы
на
аппаратном уровне,
предоставляя
соответствующие
команды и
структуры
данных (стек)
прямо на уровне
ассемблера, в
1954 же году это
было совершенно
не так.
Поэтому
компиляция
Fortran’а была процессом
отнюдь не
тривиальным.
Кроме того, синтаксическая
структура
языка была
достаточно
сложна для
машинной
обработки в
первую
очередь из-за
того, что
пробелы как
синтаксические
единицы
вообще не
использовались.
Это
порождало
массу
возможностей
для скрытых
ошибок,
таких,
например:
В
Фортране
следующая
конструкция
описывает
«цикл for до
метки 10 при
изменении
индекса от 1
до 100»: DO 10 I=1,100 Если
же здесь
заменить
запятую на
точку, то получится
оператор
присваивания:
DO10I = 1.100 Говорят,
что такая
ошибка
заставила
ракету взорваться
во время
старта!
Язык
Фортран
использовался
(и
используется
по сей день)
для научных
вычислений.
Он страдает
от
отсутствия
многих привычных
языковых
конструкций
и атрибутов,
компилятор
практически
никак не
проверяет
синтаксически
правильную
программу с
точки зрения
семантической
корректности
(соответствие
типов и проч.).
В нем нет
поддержки
современных
способов
структурирования
кода и
данных. Это
осознавали и
сами
разработчики.
По признанию
самого
Бэкуса, перед
ними стояла
задача
скорее
разработки
компилятора,
чем языка.
Понимание
самостоятельного
значения
языков
программирования
пришло позже.
Появление
Фортрана
было
встречено
еще более
яростной
критикой, чем
внедрение
ассемблера.
Программистов
пугало
снижение эффективности
программ за
счет
использования
промежуточного
звена в виде
компилятора.
И эти опасения
имели под
собой
основания:
действительно,
хороший
программист,
скорее всего,
при решении
какой-либо
небольшой
задачи вручную
напишет код,
работающий
быстрее, чем
код,
полученный
как
результат
компиляции.
Через
некоторое
время пришло
понимание того,
что
реализация
больших
проектов
невозможна
без
применения
языков
высокого
уровня.
Мощность
вычислительных
машин росла,
и с тем
падением
эффективности,
которое раньше
считалось
угрожающим,
стало
возможным смириться.
Преимущества
же языков
высокого
уровня стали
настолько
очевидными,
что побудили
разработчиков
к созданию
новых языков,
все более и
более
совершенных.
·
Cobol
В 1960 году
был создан
язык
программирования
Cobol. Он
задумывался
как язык для
создания
коммерческих
приложений, и
он стал
таковым. На Коболе
написаны
тысячи
прикладных
коммерческих
систем.
Отличительной
особенностью
языка
является
возможность
эффективной
работы с
большими
массивами
данных, что
характерно
именно
коммерческих
приложений. Популярность
Кобола столь
высока, что
даже сейчас,
при всех его
недостатках
(по структуре
и замыслу Кобол
во многом
напоминает
Фортран)
появляются
новые его
диалекты и
реализации.
Так недавно
появилась
реализация
Кобола, совместимая
с Microsoft .NET, что
потребовало,
вероятно, внесения
в язык
некоторых
черт объектно-ориентированного
языка.
·
PL/1
В
1964 году все та
же
корпорация IBM
создала язык
PL/1, который был
призван
заменить Cobol и Fortran
в большинстве
приложений.
Язык обладал
исключительным
богатством
синтаксических
конструкций.
В нем впервые
появилась
обработка
исключительных
ситуаций и
поддержка
параллелизма.
Надо
заметить, что
синтаксическая
структура
языка была
крайне сложной.
Пробелы уже
использовались
как синтаксические
разделители,
но ключевые
слова не были
зарезервированы.
В
частности,
следующая
строка — это
вполне
нормальный
оператор на PL/1:
IF ELSE=THEN THEN THEN; ELSE ELSE
В
cилу таких
особенностей
разработка
компилятора
для PL/1 была
исключительно
сложным делом.
Язык так и не
стал
популярен
вне мира IBM.
·
BASIC
В 1963 году
в
Дартмурском
колледже (Dartmouth College)
был создан
язык
программирования
BASIC (Beginners’ All-Purpose Symbolic Instruction Code —
многоцелевой
язык
символических
инструкций
для
начинающих).
Язык
задумывался
в первую
очередь как
средство
обучения и
как первый
изучаемый
язык программирования.
Он
предполагался
легко интерпретируемым
и
компилируемым.
Надо сказать,
что BASIC
действительно
стал языком,
на котором
учатся
программировать
(по крайней
мере, так
было еще
несколько
лет назад; сейчас
эта роль
отходит к Pascal).
Было создано
несколько
мощных
реализаций BASIC,
поддерживающих
самые
современные
концепции
программирования
(ярчайший
пример — Microsoft Visual Basic).
·
Algol
В 1960 году
командой во
главе с
Петером
Науром (Peter Naur) был
создан язык
программирования
Algol. Этот язык
дал начало
целому
семейству
Алгол-подобных
языков
(важнейший
представитель
— Pascal). В 1968 году
появилась
новая версия
языка. Она не
нашла столь
широкого
практического
применения,
как первая
версия, но
была весьма
популярна в
кругах
теоретиков.
Язык был
достаточно
интересен,
так как
обладал многими
уникальными
на так момент
характеристиками.
Язык программирования
Форт
был разработан
Чарльзом
Муром в 1960..1970 гг.
Первоначально язык
назывался FOURTH,
однако на
ЭВМ, на
которой он
работал, символьные
имена могли иметь
только пять букв.
Так язык
стал
называться FORTH.
Несмотря на
конкуренцию
других
языков
программирования,
в частности
языка Си, Форт
мало-помалу
сал
завоевывать
популярность,
особенно при
решении
задач
управления
сложными
объектами в
реальном
времени. Характерные
черты языка
Форт:
стек
-
единственная
структура
данных;
основной
тип данных - целый;
простой
синтаксис и
компактная
запись;
малая
потребность
в ресурсах;
быстрая
интерпретация
на основе
машинного
кода;
отсутствие
контроля за
переменными.
Язык
Форт использовался для математического
обеспечения корабля
многоразового
использования
типа Шаттл,
спутников
Земли, для
разработки
телеигр, при
создании
мультфильмов
Stars Wars и т.д. В 1976г.
Комитет
международного
астрономического
союза принял
Форт в
качестве стандартного
языка
программирования.
Позднее Форт
применялся
для создания
экспертных
систем,
систем
искусственного
зрения,
автоматизации
анализа
крови и
кардиологического
контроля.
В США создано
общество пользователей Форта
(FIG, FORTH Interesting Group). В РФ на
настоящий
момент
существует
большое сообщество
пользователей
языка.
По
словам Ч.
Мура,
основной
целью
создания нового
языка было
повышение
собственной
производительности.
Он пишет: "Традиционные
языки
программирования
не обеспечивали
желаемой для
меня
мощности, легкости
и гибкости. Я
подсчитал,
что за 40 лет очень
хороший
программист
может
написать 40 программ,
а мне
хотелось
гораздо
больше. В мире
столько
вещей,
которые
нужно
сделать, что
мне
требовался
инструмент,
способный помочь
в этом" (по
словам Мура,
в своем окончательном
виде язык
повысил его
производительность
в 10 раз).
Первым
применением
языка ФОРТ
стала созданная
в 1971 году
Муром
программа
для
Национальной
радиоастрономической
обсерватории
в г. Китт-Пик,
шт. Аризона,
которая в
реальном
масштабе
времени
управляла
системой
наведения
11-метрового
телескопа.
Затем им был
разработан
первый
компилятор,
заменивший
используемый
для этого
кросс-ассемблер.
В 1973 году
Ч. Мур, Э. Разер
и Н. Конклин
основали фирму
Forth Inc., которая
тиражировала
системы, пригодные
не только для
обсерваторий,
но и для других
специальных
применений. В
середине 70-х
годов фирма
представляла
язык ФОРТ на
гибких
магнитных
дисках для реализации
на
микропроцессорах
Intel 8080, 8086, Z80, LSI-11, Motorola 6800, TI 9900, а
также для
мини-ЭВМ PDP-11
фирмы DEC, Nova и Eclipse
фирмы Data General и др.
Что
же такое
ФОРТ? "ФОРТ -
необычный
язык. Он "попирает"
многие
устоявшиеся
правила
программирования"
- начинает
свою книгу по
ФОРТу Л.
Броуди.
Основным
понятием
ФОРТа
является слово,
под которым
понимается
любая последовательность
символов
(включая и
знаки препинания),
отличных от
пробелов.
Язык
имеет
простой
синтаксис.
Программа
представляет
собой
последовательность
отдельных
слов,
воспринимаемых
как текст
печатного
издания.
Семантика отдельного
слова в
программе на
момент ее исполнения
определена
либо реализацией
(множеством
обязательных
слов согласно
существующему
стандарту),
либо программистом,
который
может
определять
новые слова,
пользуясь
уже
известными
системе.
Это
определение,
помеченное
специальным символом,
записывается
как обычная
последовательность
в тексте.
ФОРТ
допускает
использование
кириллицы,
символьную
обработку,
рекурсию,
работу с
любыми
внешними
устройствами
и обладает
возможностями
ряда других
языков.
Из
характерных
особенностей
языка ФОРТ выделяют
следующие:
·
наличие
стека данных,
применяемого
для обмена
аргументами
и отдельными
словами-функциями;
возможность
работы с
объектами
типа "словарь",
описывающими
активный в
данный момент
список слов,
известный
системе;
·
динамическое
(в момент
использования)
переключение
режимов
"интерпретация-компиляция",
которое
позволяет
реализовать
сложные
структуры
памяти и
управления;
·
наличие
двух уровней
расширения языка
с помощью так
называемых
определяющих
слов и с
помощью
специального
слова ":" (двоеточие);
·
встроенный
в ФОРТ язык
Ассемблер
позволяет эффективно
реализовывать
аппаратно
зависимые
функции
сопряжения с
другими
системами
программирования.
·
К
трудности
обучению языку относят:
Появление
ФОРТа, как
отмечают
некоторые ученые,
в частности
А. Вулф, было
воспринято профессионалами
неоднозначно.
Одни высказывали
сомнение, а
язык ли это
вообще и если
язык, то
низкого или
высокого
уровня;
вторые считали
ФОРТ вехой в
развитии
языков программирования;
третьи -
шагом в
сторону.
Достойное
место среди
языков
программирования
он занял
после ряда
успешных
реализаций на
мини- и
микро-ЭВМ. С
появлением
персональных
компьютеров
кривая
популярности
ФОРТа резко
подскочила
вверх, и по
некоторым
утверждениям,
вывела его к
середине 80-х
годов на
третье место
после
БЕЙСИКа и
ПАСКАЛя.
В 1977 году
Ким Харрис из
Кремниевой
долины организовал
группу под
названием
ФИГ (FORTH Interest Group), которая
в следующем
году создала
упрощенный интерпретатор
языка для
персональных
компьютеров
под
названием
ФИГ-ФОРТ (FIG-FORTH),
продававшийся
по очень
низкой цене.
ФИГ-ФОРТ
завоевал огромную
популярность
у массового
пользователя.
У
нас в стране
система
ФИГ-ФОРТ
реализована
на мини-ЭВМ
СМ-4 с
операционными
системами ОС
РВ и РАФОС.
Язык
ФОРТ нашел
применение
во многих
областях
науки и
техники, в
частности
при
разработке
трансляторов
и
операционных
систем; для
сбора и
анализа данных;
в системах
машинной
графики; при
создании
экспертных
систем; для
управления станками
и роботами и
т.д.
Хорошая
реклама
ФОРТу была
сделана
летом 1985 года,
когда после 16
дней упорных
поисков франко-американская
научная
экспедиция с
помощью
подводного
аппарата
"Арго" в водах
Северной
Атлантики на
глубине
более
В
настоящее
время как за
рубежом, так
и в нашей
стране
осуществлены
и успешно
развиваются
аппаратные реализации
языка ФОРТ,
так
называемые
ФОРТ-процессоры
(один из
первых
выпустил Ч.
Мур), которые
выполняют
слова ФОРТа
как машинные
команды.
В 1983 году
был выпущен
стандарт на
язык ФОРТ - "ФОРТ-83".
В
США с 1978 года
издается
периодический
журнал "FORTH Dimensions",
предназначенный
для
массового
пользователя.
А для программистов-профессионалов
с 1983 года
выходит
журнал "The Journal of Forth
Application and Research".
Начиная с конца
70-х годов
проводятся
ежегодные
конференции,
посвященные
проблемам
развития ФОРТ-систем.
В
нашей стране
первая книга
по языку ФОРТ
вышла в 1988 году,
хотя работы
по
реализации
языка на отечественных
компьютерах
начались
раньше.
Среди
реализованных
систем
необходимо отметить
следующие.
При
комиссии по
технологии
программирования
при ГКНТ в
рамках
рабочей
группы по технологии
программирования
в 1985 году
была создана
целевая
подгруппа по
языку ФОРТ, в
задачи
которой
входило
распространение
опыта
использования
ФОРТ-систем.
В
последние
годы
ленинградские
разработчики
ФОРТ-систем
создали
научно-производственный
кооператив
"ФОРТ-Инфо"
для развития
и
распространения
ФОРТ-Систем в
различных
областях
человеческой
деятельности.
Приведем в заключение одно высказывание автора языка: "ФОРТ представляет человеку удобные средства общения "умными машинами", которыми он себя окружает. Следовательно, этот язык должен обладать свойствами естественных языков, включая компактность, разносторонность и расширяемость. Я считаю его лучшим языком для написания программ, изложения алгоритмов или объяснения работы компьютера...".
Для
кафедры ТЭ СибГУТИ
язык
программирования
форт в обучении
программированию
микропроцессорных
систем был
выбран по
следующим
причинам и
ограничениям
системного
администратора.
Предлагаемый
инструмент
программирования
полностью укладывается
в требования
компьютера.
Написание
версий форт sp-f
начато
Андреем
Черезовым в
1992.
Сейчас
существует
уже 4-ая
версия spf4
В
архиве две
версии
компилятора
- spf4.exe –
оригинальная
версия
автора языка,
возможна
компиляция
программ
размером до 512
кб.
- 100_spf4.exe –
версия spf4.exe
модифицирована
для
компиляции
файлов программ
до 100 мб.
Развитие
компьютерных
технологий
часто
опережает
программное
обеспечение.
На момент 1992
года
программы в 512
кб считались
очень
большими. Мы
говорим о исполняемых
файлах
формата *.exe. Но
поскольку,
сейчас
память в гигобайты
считается
нормой, то и
программы
так же могут
быть таких
размеров.
Подготовить
версию
компилятора
с другим
размером
возможной
компиляции
предусмотрено
в языке
программирования.
Об этом будет
рассказано
далее.
Порядок
установки
для работы
следующий:
Таким
образом, при
выборе
мышкой файла
текста
программы,
произойдет
его компиляция. Подготовиться
или нет
исполняемый
файл -
будет
сообщение об
ошибке.
В этом
случае в
начале
редактирования файл
текста
программы открывается
вкладкой с
=помощью= как
показано
ниже на
рисунке.
Внимание!
Необходимо
помнить о файловой
структуре.
Рекомендуется
использовать
подкаталоги,
в которых
отлаживать
программы. А
в «вершине»
находится
компилятор.
Для более
удобной и
наглядной
работы с программами и
текстом
удобно
пользоваться
файловой оболочкой
Total_Commander
– версия без
установки.
Скачать в
рабочий
каталог
своих
програм и
выполнить
файл
Totalcmd.exe показан
ниже на
рисунке.
Если
при
выполнении файла
с расширением
*.f подключается
компилятор,
то
установка
языка
программирования
считается законченной.
Весь
словарь spf
можно
получить
если выполнить
слово WORDS. На
экране
выглядит так:
Чтобы
получить эти
данные в лог
файле, необходимо
предварительно
набрать
команду выдачи
файла лога
STARTLOG ( ВКЛЮЧИТЬ
ФАЙЛ ОТЧЕТА SPF.LOG ) ENDLOG (
выключить
файл отчета )
В
данном
компиляторе
945 СЛОВ,
которые
можно использовать
в
программировании.
И даже написать
свой язык
программирования.
Вероятно,
все возможности
языка не
охватить. Но
требуется
научиться пользоваться
лишь
малой частью
этого
богатства. Рассмотрим
кратко
основные
конструкции.
Полное
описание
смотрите в
прилагаемой литературе.
Переменные.
Переменные
для хранения
числовых
значений
создаются с
помощью
слова VARIABLE:
VARIABLE <var_name>
Определить
переменную
можно до
начала задания, : , а
заносить и
извлекать из
нее значение
можно внутри
раздела ;. При
создании
переменной в
нее
заносится
значение 0.
Значение
заносится в
переменную с
помощью
слова ! (восклицательный
знак):
<var_value>
<var_name> !
Пример:
\
теперь
переменная my_var
содержит
число '12'
12 my_var !
Чтобы
"извлечь"
значение
переменной
используется
слово @:
<var_name>
@
Пример:
\
прибавляем '10'
к значению
переменной my_var
('12')
\
результат - '22'
my_var @ 10 +
Обратите
внимание, что
слова @ и ! фактически
работают с
адресом
переменной,
который
остается на
стеке после
указания
(выполнения)
ее имени:
простое
употребление
имени переменной
оставляет на
стеке ее
адрес в оперативной
памяти
компьютера.
Пример:
\
создаем две
переменные
VARIABLE
first_var
VARIABLE
second_var
\
заносим
число '18' в
переменную
'first_var'
18 first_var !
\
прибавляем '4'
к значению
переменной
'first_var'
\ и
заносим
результат в
переменную
'second_var'
\ (4 + 18 = 22)
4 first_var @ + second_var !
\
выводим
значение
переменной
'second_var' на экран
."second_var
TYPE second_var @ .
Создание
и
использование
новых слов
Создание
новых
форт-слов
очень
напоминает создание
переменных,
только
используется
при этом
другой синтаксис:
:
<имя_слова>
<тело слова> ;
Вы
обратили
внимание на
пробелы
после ':' и перед
';'
пробел - это
разделитель
слов. Форт
воспримет
имя,
содержащее
пробел как два разных идентификатора).
Пример:
\
создаем
новое слово 'x2',
которое
будет удваивать
\
верхний
элемент
стека
:
x2 2 * ;
\
теперь
попробуем 'x2' в
действии:
2
x2 \
теперь на
стеке
хранится
результат
умножения 2 * 2
16
x2 \
теперь на
стеке
хранится результат
умножения 16 * 2
Новые
слова можно
определять
не только с помощью
чисел, но и
используя
ранее
определенные
слова.
Пример:
\
если слово 'x2'
уже
определено,
то мы можем
\
создать
новое слово,
которое
будет,
скажем,
\
отнимать '4' от
результата
работы слова
'x2'.
\
назовем
новое слово
'x2minus4'
:
x2minus4 x2 4 - ;
\
пробуем 'x2minus4' в
действии:
8
x2minus4 \
теперь на
стеке
хранится
результат
\ выражения '(8 *
2) - 4'
1
x2minus4 \
теперь на
стеке
хранится
результат
\ выражения '(1 *
2) - 4'
Новые
слова
создаются в
начале
задачи (:), а использовать
их можно
внутри
самого раздела :.
\
создаем два
новых слова
:
x2 2 * ;
:
x2minus4 x2 4 - ;
\
выводим на
экран
результат
работы '3 x2'
." 3 x2 = “ 3 x2
.
\
выводим на
экран
результат
работы '6 x2minus4'
." 6 x2minus4 =
“ 6 x2minus4 .
\
выводим на
экран
результат
работы '1 x2minus4'
." 1 x2minus4 =
“ 1 x2minus4 .
Созданные
вами новые
форт-слова
являются глобальными,
т. е. они видны
из дpугих
слов и разделяются
всеми
словами.
Следите за
уникальностью
имени новых
слов - во избежание
дополнительной
путаницы.
Некоторые
слова Форта
возвращают
числа двойной
длины, т. е.
число,
представление
которого
занимает 64
бита вместо 32.
Число двойной
длины
занимает в
стеке место
двух чисел
одинарной
длины.
Для
работы со
числами
двойной
длины в Форте
есть
специальные
слова:
D.
выведение
числа
двойной
длины на консоль
D+
сложение
двух чисел
двойной
длины
D-
вычитание
одного числа
двойной
длины из
другого (d1 - d2)
DNEGATE
изменение
знака числа
двойной
длины на противоположный
D<
занесение в
стек истины,
если d1 меньше d2
D=
занесение в
стек истины в
случае
равенства d1 и d2
D0=
занесение в
стек истины,
если d равно
нулю
Константы
двойной
длины
записываются
с точкой на
конце. Чтобы
конвертировать
число
одинарной
длины в число
двойной
длины
используется
слово S>D. Чтобы
конвертировать
число
двойной
длины в число
одинарной
длины
используется
слово D>S.
Примеры:
\
складываем
два числа
двойной длины
1000000.
2000000. D+
\
сравниваем
два числа
двойной
длины и выдаем
сообщение
10240.
90000. D<
IF ." < "
ELSE ." > "
THEN
Для
лучшего
понимания
конструкций,
далее будем
изучать их на
конкретных
примерах.
Пример1 из
лекции 4 –
формирование
звуковых
сообщений на
компьютере
\ начало
текста
программы
на языке forth -
пример
программирования
звуков
через системных
динамик \
подключение
функций
системы для
формирования
звуковых
колебаний,
т.е.
генерации
сигналов. WINAPI: MessageBeep USER32.DLL (
пищание
системного
динамика ) WINAPI: Beep KERNEL32.DLL (
ФУНКЦИЯ т-МС F-ГЦ -- ) : PAUSE1 ( N --> пауза в N
милисекунд
0> ) Sleep DROP ;
(
формирование
паузы ) : ZWUK (
Т-мс F-гц --- ) Beep DROP ; : BEEP_M2 (
цыганочка
с входом ) [ DECIMAL ] 100 2500 ZWUK 100 2000 ZWUK 100 2500 ZWUK 100 2000 ZWUK [ HEX ] ; : TEST (
Выполнение
пищания в цикле
10 раз с паузой
в 100
милисекунд ) 10 0 DO (
Начало
цикла )
CR (
ОТОБРАЖЕНИЕ
С НОВОЙ
СТРОКИ )
I . (
ВЫДАЕТСЯ
ЧИСЛО В
ЦИКЛЕ ОТ 1 ДО 10 )
0x40 MessageBeep DROP (
ВЫДАЕТСЯ
ЗВУК
ПИЩАЛКИ
ДИНАМИКА )
100 PAUSE1 ( задаем
паузу в 100 мс ) LOOP ( ЦИКЛ
ОКОНЧЕН ) ; : MAIN (
основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до нажатия
клавиши на
клавиатуре ) BEGIN TEST (
Выполнение
пищания в
цикле 10 раз с паузой
в 100
миллисекунд
) CR S" Для
выхода из
программы
нажать клавишу
1, для
продолжения
любую
другую " ANSI>OEM TYPE (
ВОЗМОЖНО
ОТОБРАЖЕНИЕ
НЕПРАВИЛЬНОЕ
ИЗ-ЗА КОДИРОВОК
РЕДАКТОРА
ПЕРЕВОД ANSI В DOS ) KEY [CHAR] 1 = UNTIL (
ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД
СОВПАЛ И
ВЫХОДИМ ) BEEP_M2 (
цыганочка
с входом -
окончание
программы
звук с
другим формированием ) ; \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO SPF-INIT? ( в
переменную
записываем код
0 – означает
что
инициализация
выполняется
) ' NOOP MAINX ! ( в
переменную
записываем
адрес выхода
) ' MAIN TO <MAIN> ( в
переменную
записываем старт
программы
со слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 2
формирование
повторения
нажатий на
компьютере.
\ начало
текста \
формирование
повторения
нажатий на
компьютере. : MAIN
( основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре ) CR S" Для
выхода из
программы
нажать клавишу
1, для
продолжения
любую
другую " ANSI>OEM TYPE [CHAR] 1 ( K -- ) BEGIN
EMIT ( выдается
код нажатой
клавиши )
KEY DUP [CHAR] 1 = UNTIL ( ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД СОВПАЛ
И ВЫХОДИМ ) ; \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO
SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы
со слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 3
формирование
таблицы
умножения на
компьютере.
\ начало
текста \
формирование
таблицы
умножения : .R ( n1 n2 --
форматный
вывод n1 по
размеру n2 ) >R DUP >R ABS S>D <# #S R> SIGN #> R> OVER - 0 MAX
SPACES TYPE ; : MAIN
( основное слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре ) CR S" Для
выхода из программы
нажать
клавишу 1, для
продолжения
любую
другую "
ANSI>OEM TYPE BEGIN 10 1 DO CR 10 1 DO J I * 3 .R LOOP LOOP KEY [CHAR] 1 = UNTIL (
ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД
СОВПАЛ И
ВЫХОДИМ ) ; \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO
SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы со
слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 4 формирование
разных
цветов
отображения
экрана
по нажатию
клавиши.
\ начало
текста \
Формирование
на
разных
цветов
отображения
экрана по
нажатию
клавиши WINAPI: SetConsoleTextAttribute KERNEL32.DLL : TEXT-ATTR ( fg bg --
установка
цвета знака fg
фона bg )
0x10 * + H-STDOUT SetConsoleTextAttribute DROP ; : UST_ATR_LIM_CMD 0xF 8
TEXT-ATTR ( fg bg --
установка цвета
знака fg фона bg ) ; VARIABLE CWET : MAIN
( основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре )
CR S" Для
выхода из программы
нажать
клавишу 1, для
продолжения
любую
другую " ANSI>OEM TYPE
BEGIN
0 CWET @ TEXT-ATTR ( fg bg -- )
CR S" Меняем
цвет фона = " ANSI>OEM TYPE CWET @ . CWET 1+! CWET DUP @ 0x10 = IF 0! ELSE DROP THEN KEY [CHAR] 1 = UNTIL ( ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД СОВПАЛ
И ВЫХОДИМ ) ; \
подготавливаем
переменные и
текст
программы
записываем
в
исполняемый
файл. 0 TO
SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы
со слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 5 выполнение
музыкального
нажатия
клавиш.
\ начало
текста \
Выполнение
музыкального
нажатия
клавиш \
подключение
функций
системы для
формирования
звуковых
колебаний,
т.е.
генерации
сигналов. WINAPI: MessageBeep USER32.DLL (
пищание
системного
динамика ) WINAPI: Beep KERNEL32.DLL (
ФУНКЦИЯ т-МС F-ГЦ -- ) : ZWUK (
Т-мс F-гц --- ) Beep DROP ; DECIMAL : MAIN (
основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре ) CR S" Для
выхода из
программы
нажать клавишу
ПРОБЕЛЛ, для
продолжения
любую
другую " ANSI>OEM TYPE 1
( K -- ) BEGIN
0x10 * 100 SWAP
2DUP . . ZWUK
KEY DUP 0x20 = UNTIL (
ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД
СОВПАЛ И
ВЫХОДИМ ) ; \
подготавливаем
переменные и текст
программы
записываем
в
исполняемый
файл. 0 TO SPF-INIT? ( в
переменную
записываем код
0 – означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес выхода
) '
MAIN TO <MAIN> ( в
переменную
записываем старт
программы
со слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 6 при
нажатии
клавиш
перейти и
открыть заданные
web страницы.
\ начало
текста \ При
нажатии
клавиш
перейти -
открыть
заданные web
страницы 5 CONSTANT SW_SHOW WINAPI: ShellExecuteA shell32.dll : START_link_clik_V2 ( An n -
PZout - выход да
или нет )
\ на входе
адр
выполнения
сайта DROP SW_SHOW ( =5 ) 0 0 ( An K1 ( K1 S" open"
DROP 0
ShellExecuteA ( pz- --- ) ; : START_S ( An n -
) START_link_clik_V2 ( An n -
PZout - выход да или нет )
DROP ; : ST1 S" https://www.yandex.ru/" START_S ( An n -
) ; : ST2 S"
http://www.rambler.ru/"
START_S ( An n - ) ; : ST3 S"
http://te.sibsutis.ru/"
START_S ( An n - ) ; : MAIN
( основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия клавиши
на
клавиатуре ) CR
S"
Для выхода
из
программы нажать
клавишу ESC, для
продолжения
любую другую
" ANSI>OEM TYPE CR
S"
клавиша 1 -
перейти на yandex " ANSI>OEM TYPE CR
S"
клавиша 2 -
перейти на rambler " ANSI>OEM TYPE CR
S" клавиша
3 - перейти
сайт
кафедры ТЭ СибГУТИ
" ANSI>OEM TYPE CR 0 BEGIN DUP [CHAR] 1 = IF ST1 THEN DUP [CHAR] 2 = IF ST2 THEN DUP [CHAR] 3 = IF ST3 THEN DROP
KEY DUP 0x1B = UNTIL (
ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД
СОВПАЛ И
ВЫХОДИМ ) ; \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO
SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы со
слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример 7 формируется
экран меню и
клавишами
меняем место
курсора.
\ начало
текста \
Формируется
экран меню и
клавишами q w
a s
меняем
место метки отображаемого
тремя
знаками <#> WINAPI: SetConsoleCursorPosition
KERNEL32.DLL : GotoXY ( x y -- ) \
установка
координаты
курсора в
консоли. 0x10000 * + H-STDOUT
SetConsoleCursorPosition DROP ; : ?KEY1 ( K --> код клавиши ) KEY? ( читать признак события ) IF KEY
( PENDING-CHAR @ -->
действие читать код )
ELSE 0 THEN ; : FIX
( M --> ) 0x100 /MOD
GotoXY ( x y --
установить
курсор в
место на
экране ) ; \
контрольки
для точек
останова и
для
контроля
переполнения
стека : STOP1 BEGIN ?KEY1 DUP
0x1B = IF BYE THEN 0x20 = UNTIL ; CREATE KKS_B
0 , : KKS (
распечака
штатными
средствами ) \
добавили
предупреждение
о
исчерпании
стека BASE
@ KKS_B ! ( систему
счисления на сохранение
) CR
." ctk,N--> " DECIMAL DEPTH DUP 1 < IF DUP 0= IF . S"
Стек
пустой!" ( при 0
)
ELSE DROP S"
ОШИБКА - СТЕК
ИСЧЕРПАН !!! "
THEN ANSI>OEM TYPE
ELSE DUP .
HEX ." = "
.SN
THEN
S" -->
верх " ANSI>OEM TYPE KKS_B @
BASE ! ( вернули
систему
счисления ) ; 0x100 CONSTANT KY1 CREATE MST 0x800 , : MST_PKZ MST @ FIX S" <#>" TYPE \ MST @ KKS DROP ( убрали контрольку ) ; : MENU
( МЕНЮ ) 0 FIX
( установка
места на
экране ) S" Для
выхода из
программы
нажать
клавишу ESC, для
продолжения
любую
другую " ANSI>OEM TYPE CR
S"
клавиша 1 -
перейти " ANSI>OEM TYPE CR
S"
клавиша 2 -
уйти
" ANSI>OEM
TYPE CR
S"
клавиша 3 -
найти
" ANSI>OEM
TYPE CR
S"
клавиша 4 -
выйти
" ANSI>OEM
TYPE CR S"
клавиша 4 -
зайти
" ANSI>OEM
TYPE CR
S"
" ANSI>OEM
TYPE CR
S"
" ANSI>OEM
TYPE CR
S"
" ANSI>OEM
TYPE CR
S"
" ANSI>OEM
TYPE CR
S"
клавиша 0 -
обновить
экран " ANSI>OEM TYPE CR
S"
клавиши q w a s -
управление
меткой " ANSI>OEM TYPE MST_PKZ ; : IZM_MESTA_KURSORA ( K -- ) \ 0x800 FIX
DUP 0<> IF KKS DROP
STOP1 ELSE DROP THEN \
сдвиг по
горизонтали
DUP [CHAR] q = OVER [CHAR] Q = OR IF MST 1+! MST_PKZ THEN DUP [CHAR] w = OVER [CHAR] W = OR IF -1 MST +! MST_PKZ THEN
\
сдвиг по
вертикали
DUP [CHAR] a = OVER [CHAR] A = OR IF KY1
MST +! MST_PKZ THEN DUP [CHAR] s = OVER [CHAR] S = OR IF KY1 NEGATE MST +! MST_PKZ THEN
DROP ; : MAIN
( основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре ) MENU ( МЕНЮ ) 0 BEGIN DUP [CHAR] 1 = IF THEN DUP [CHAR] 2 = IF THEN DUP [CHAR] 3 = IF THEN DUP [CHAR] 0 = IF MENU THEN IZM_MESTA_KURSORA ( K
-- ) ?KEY1 DUP 0x1B = UNTIL (
ПРОВЕРКА
НАЖАТИЯ
КЛАВИШИ, ЕСЛИ
НАЖАЛИ 1 ТО
КОД СОВПАЛ И
ВЫХОДИМ ) ; \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO
SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы
со слова MAIN ) S" test2.exe" SAVE (
сохраняем
файл
исполнения с
именем test2.exe ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \
текст
программы
окончен. |
Пример
8 При
нажатии
разных
клавиш
формируется
разное
звуковое
подтверждение.
\ начало
текста
программы WINAPI: mciSendStringA
WINMM.DLL WINAPI: Beep KERNEL32.DLL WINAPI: ShellExecuteA SHELL32.DLL CREATE ADR1 0x100 ALLOT : CONCAT-TO >R 2SWAP SWAP OVER R@ SWAP MOVE R> + SWAP MOVE ; : CONCAT 2OVER NIP OVER + DUP >R 1+
ALLOCATE THROW DUP >R CONCAT-TO R> R> 2DUP + 0 SWAP C! ; : MID1
0 0x100 ADR1 S" OPEN
muz.mid ALIAS MUSIC" DROP
mciSendStringA 0= IF
CR S" OK muz.mid " TYPE 0 0x100 ADR1 S" PLAY MUSIC"
DROP mciSendStringA DROP ELSE S" ? muz.mid" TYPE THEN ; : MID2 CR S" stop muz.mid " TYPE 0 0x100 ADR1 S" STOP
MUSIC" DROP mciSendStringA DROP 0
0x100 ADR1 S" CLOSE MUSIC" DROP mciSendStringA DROP ; : DIRM ( An n -- ) DROP 5 0 0 3 ROLL S" OPEN" DROP 0 ShellExecuteA DROP ; : DIR1 S" http://90.189.213.191:"
S"
4422/poteha/mid/muz.mid" CONCAT DIRM ; : DIR2 S" https://disk.yandex."
S" ru/d/duzQ8WKSeH4opA"
CONCAT DIRM ; : ZWUK Beep DROP ; : ZW1 DUP 0x10 * 0x100 SWAP 2DUP . . ZWUK ; DECIMAL : PIK_OT_KEY CR S" Выход - ПРОБЕЛ" S" продолжить - любая другая"
2SWAP ANSI>OEM TYPE ANSI>OEM TYPE 1 BEGIN ZW1 DUP [CHAR] 0 = IF MID1 THEN DUP [CHAR] 9 = IF MID2 THEN DUP [CHAR] 8 = IF DIR1 THEN DUP [CHAR] 7 = IF DIR2 THEN DROP KEY DUP 0x20 = UNTIL ; \ ------------------------------------- 0
TO SPF-INIT? '
NOOP MAINX ! '
PIK_OT_KEY TO
<MAIN> S" test2.exe" SAVE BYE \
окончание
текста программы |
Пример 9 При
нажатии
разных
клавиш
выполняется
переход и
восстановление
текста
примера и компилятора
языка
программирования.
·
Данный
пример
показывает
возможность
создания
новых
программ на
основе
старых текстов;
·
Все
присутствует
для дальнейшего
развития;
·
Пример
из программ
по работе с
термометрией
элеваторов в
оболочке с
браузерами.
·
Скачать
пример адрес
перехода
·
Для компиляции
текста
примера в
программу
использовать
spf4.exe и
обязательно
использовать
имена файлов
из примера. Т.к.
эти имена
компилируются
в тело exe.
Если у Вас
другие имена NAME1-3, то
и файлы тоже
должны быть
такими.
\
программа формирует
приложение exe
для
открывания
в браузере
всех
элеваторов \
начало
текста \
При нажатии
клавиш
перейти -
открыть
заданные web
страницы \
различные
средства
диагностики
к уже имеющимся
тоже
добавляем : ?KEY1 ( K --> код
клавиши без
останова ) KEY? IF PENDING-CHAR @ ELSE 0 THEN ; : ?KEY0! PENDING-CHAR 0! ;
(
сбрасываем
полученный
код клавиши ) : STOP1 BEGIN ?KEY1 DUP 0x1B = IF BYE THEN 0x20 = UNTIL ( останов, выход по нажатию ESC
продолжить -
Пробел ) ; CREATE KKS_B 0 , (
переменная
для
временного
хранения
системы
счисления ) : 4+ 4 + ; : KKS (
контроль
стека с
предупреждением
о
исчерпании
стека ) BASE @ KKS_B ! (
систему
счисления на сохранение
) CR ." ctk,N-->
" DECIMAL DEPTH DUP 1 < IF DUP 0= IF .
." STEK PUSTO!"
( при 0 )
ELSE DROP ." ОШИБКА! - СТЕК ИСЧЕРПАН !!! "
THEN
ELSE DUP .
HEX ." = " .SN
THEN ." --> " KKS_B @
BASE ! ( вернули
систему
счисления ) ; : KKT CR ." tib,N--> " HEX #TIB @ . HEX ." ==> " #TIB @ DUP 0= IF 1+ THEN 0 DO TIB I + C@ EMIT
LOOP ; ( ----> показ из входного буфера TIB ) : S+++ ( A1 N1 A2 N2 -- A1' N1+N2 --
аналог
сложения
адресов из
вторичнок к
первичному
т.е
первичынй
должен быть
всегда с
запасом ) 2OVER + ( A1 N1 A2 N2 A3 -- ) OVER ( A1 N1 A2 N2 A3 N2 -- ) 3 ROLL ( A1 N1 N2 A3 N2 A2 -- ) -ROT ( A1 N1 N2 A2 A3 N2--- ) CMOVE + ( A1 N1+N2 --- ) ; \
далее слова
для выполнения
действий по
программе ---------------------------- 5 CONSTANT SW_SHOW WINAPI: SetConsoleTitleA KERNEL32.DLL WINAPI:
ShellExecuteA
shell32.dll WINAPI: GetConsoleScreenBufferInfo KERNEL32.DLL WINAPI: SetConsoleWindowInfo
KERNEL32.DLL WINAPI: SetConsoleTextAttribute KERNEL32.DLL WINAPI: SetConsoleCursorPosition KERNEL32.DLL \ ------------------ создание - удаление дирректорий 1 CONSTANT MOVEFILE_REPLACE_EXISTING 2 CONSTANT MOVEFILE_COPY_ALLOWED WINAPI: CreateDirectoryA
KERNEL32.DLL WINAPI: RemoveDirectoryA KERNEL32.DLL : START_link_clik_V2
( An n - PZout -
выход да или
нет ) \ на
входе адр
выполнения
сайта DROP SW_SHOW
( =5 ) 0
0 ( An K1
K2 K3 -- ) 3 ROLL ( K1 K2
K3 An -- ) S"
open" DROP 0
ShellExecuteA ( pz- --- ) ; CREATE DNx 0 , CREATE DNy 0 , CREATE BUF1 0 , CREATE CONSOLE_SCREEN_BUFFER_INFO
22 ALLOT \
структура
буфера \ 0 1 2 3 4 5 6 7 8 9 a b c d e f \ - - - - x : UST_RAZMEROV_CMD_N1
( Dx Dy -- добавляем
к сущ 8 строк ) DNy ! DNx !
CONSOLE_SCREEN_BUFFER_INFO H-STDOUT GetConsoleScreenBufferInfo
DROP ( OK- информацию в буфер
http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_setconsolewindowinfo.htm ) 8 ALLOCATE THROW BUF1
!
CONSOLE_SCREEN_BUFFER_INFO
7 2* + DUP W@ ( A dX -- РАЗМЕР КОНСОЛИ ПО ГОРИЗОНТАЛИ )
SWAP
2+ W@ ( dX dY -
РАЗМЕР
КОНСОЛИ ВЕРТ
И
ГОРИЗОНТАЛЬ
)
SWAP DNx @ + BUF1 @ 2 2* + W! (
записали
новое значение
консоли по X ) ( dY -- ) DNy @ + BUF1 @ 3 2* + W! (
записали
новое
значение
консоли по Y с
увеличением
на +0x8
для
значения 800*600 больше
нельзя ) BUF1 @ 1 ( уст разм окна ) H-STDOUT SetConsoleWindowInfo DROP ( 0<> OK ) BUF1 @ FREE DROP ; DECIMAL (
АТРИБУТЫ
ПЕРЕПИСЫВАЮТСЯ
НАДО
ОСТАВЛЯТЬ
ДВА
ПРОБЕЛЛА ДО
ЗАПЯТОЙ ) CREATE ATRT 00 , (
атрибут
текста = 0 черный
) CREATE ATRF 15 , (
атрибут
фона = 7
белый-серый
ПО
УМОЛЧАНИЮ В
СТАНДАРТЕ
ВИНДОВС МНЕ
ПОСОВЕТОВАЛИ
БИРЮЗУ ЭТО 10 ) HEX (
атрибут
текста и
фона
) : ?WinError 0= IF
GetLastError THROW THEN ; : TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg ) 0x10 * +
H-STDOUT SetConsoleTextAttribute ?WinError ; : UST_ATR_LIM_CMD
0xF 8 TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg ) ; : UST_ATR_LIM1_CMD
0xF 5 TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg ) ; : UST_ATR_LIM2_CMD
0xF 0xA TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg ) ; : UST_ATR_NORM_CMD
ATRT @ ATRF @ TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg 0xF - больая яркость знака ) ; : COORD ( x y --
COORD ) ( 65536 ) 0x10000 *
+ ( всe в HEX
перевод в 32х
разрядность
) ; : GotoXY ( x y
--
установка
координаты
курсора в
консоли ) COORD H-STDOUT
SetConsoleCursorPosition ERR THROW ; : FIX ( M --> ) 0x100 /MOD GotoXY ( x y --
Установить
курсор в
нужное
место
консоли по x- y ) ; : AR1
UST_ATR_NORM_CMD 0 FIX HEX \ 0 >R RP@ 0
MAX-XY * BL H-STDOUT
FillConsoleOutputCharacterA R> 2DROP 0x60 0x4F * DUP ALLOCATE
THROW ( N A ) 2DUP SWAP 0x20 ( N
A A N K -- ) FILL ( N A -- ) SWAP ( A N ) OVER ( A N A
-- ) SWAP ( A A N -- ) TYPE ( A - )
FREE DROP ( так быстрее получается значительно чем циклами ) ; : AR2 0xF ( ЗН ) 0x1 ( ФОН ) TEXT-ATTR 0 FIX HEX 0x60 0x4F * DUP ALLOCATE
THROW ( N A ) 2DUP SWAP 0x20 ( N
A A N K -- ) FILL ( N A -- ) SWAP ( A N ) OVER ( A N A
-- ) SWAP ( A A N -- ) TYPE ( A - )
FREE DROP ( так быстрее получается значительно чем циклами ) ; : CREATE-DIRECTORY ( addr u -- ior ) DROP 0 SWAP CreateDirectoryA ( fr -- 0=ERR 0<>=OK если ужо есть такая ) ; : DELETE-DIRECTORY ( addr u -- ior ) DROP RemoveDirectoryA ( fr ) ; : START_S ( An n - ) START_link_clik_V2 ( An
n - PZout - выход да или нет ) DROP ; : ST1 S"
http://90.189.164.185:4422/silos_v3/otchet_togo.html"
START_S ( An n - ) ; : ST2 S"
http://212.20.49.15:4422/silos_v3/otchet-berdsk-okno-grafik.html" START_S ( An n -
) ; : ST3 S" http://87.103.250.73:4423/silos_v3/otchet_bagan.html" START_S ( An n -
) ; : ST4 S"
http://90.189.213.191:4422/temp/gr_mi38_37_mp5_sh/" START_S ( An n -
) ; CREATE WOST_MEM_TKS 0
, 0 , ( память here где
будет
храниться
текст ) : NAME1 S" start_www_elevatorov_all_v1.f" ; CREATE WOST_MEM_SPF 0 , 0 , ( память here где будет храниться SPF4 ) : NAME2 S" spf4.exe" ; CREATE FR1 0 , \ CНАЧАЛА СОХРАНЯЕМ В ТЕЛЕ 1УЮ NAME1 R/O OPEN-FILE-SHARED DROP ( fr - без проверки ) FR1 ! FR1 @ FILE-SIZE 2DROP DUP ( Nb Nb --> получил кол-во байт ) HERE WOST_MEM_TKS !
(
записали
начало
памяти ) ALLOT ( Nb -
заняли в
теле
программы ) WOST_MEM_TKS 4 + ! ( Nb
кол-во
записали ) WOST_MEM_TKS DUP @ SWAP 4 + @ (
An n - ) FR1 @ READ-FILE ( Nb PZ -
считали в
буфер
и убрали ) 2DROP FR1 CLOSE-FILE ( fileid -- ior )
DROP ( и
закрыли тот
файл для
чтения ) \
СОХРАНЯЕМ
В ТЕЛЕ
2УЮ NAME2 R/O OPEN-FILE-SHARED DROP ( fr - без
проверки ) FR1 ! FR1 @ FILE-SIZE 2DROP DUP ( Nb Nb -->
получил
кол-во байт ) HERE WOST_MEM_SPF ! (
записали
начало
памяти ) ALLOT ( Nb -
заняли в
теле
программы ) WOST_MEM_SPF 4 + ! ( Nb
кол-во
записали ) WOST_MEM_SPF DUP @ SWAP 4 + @ (
An n - ) FR1 @ READ-FILE ( Nb PZ -
считали в
буфер
и убрали ) 2DROP FR1 CLOSE-FILE ( fileid -- ior )
DROP ( и
закрыли тот
файл для
чтения ) : NAME_K S"
ishodniki\" ; ( каталог
сохранения
исходных
файлов ) : WOSTANOVLENIE ( --
восстановление
файлов ) \
первый
файл
восстанавливаем NAME_K CREATE-DIRECTORY DROP \
файлы надо
записывать
в
директории
и поэтому
формируем
составное
имя
каталог\имя_файла 0x100 ALLOCATE DROP DUP BUF1 ! 0 ( Aрд N=0 -- в
памяти для
построения
длинного
пути ) NAME_K S+++ ( An1 N1 -
сложили с
буфером каталог
) NAME1 S+++ ( An2 N2 - сложили имя ) W/O CREATE-FILE-SHARED
DROP ( FR БЕЗ ПРОВЕРКИ НА СОЗАДНИЕ ) FR1 ! WOST_MEM_TKS DUP @
SWAP 4+ @ ( An n -- ) FR1 @ WRITE-FILE ( c-addr u fileid -- ior ) DROP FR1 CLOSE-FILE (
fileid -- ior ) DROP ( и
закрыли тот
файл для
чтения ) BUF1 @ FREE DROP ( - и
память
освободили ) \ второй файл восстанавливаем NAME_K
CREATE-DIRECTORY DROP 0x100 ALLOCATE DROP
DUP BUF1 ! 0
( Aрд N=0 -- в памяти
для
построения
длинного
пути ) NAME_K S+++ ( An1 N1 -
сложили с
буфером каталог
) NAME2 S+++ ( An2 N2 - сложили имя ) W/O CREATE-FILE-SHARED DROP ( FR БЕЗ ПРОВЕРКИ НА СОЗАДНИЕ ) FR1 ! WOST_MEM_SPF DUP @
SWAP 4+ @ ( An n -- ) FR1 @ WRITE-FILE ( c-addr u fileid -- ior ) DROP FR1 CLOSE-FILE (
fileid -- ior ) DROP ( и
закрыли тот
файл для
чтения ) ; : MAIN (
основное
слово
выполняется
постоянно в
цикле, а для
выхода
останов до
нажатия
клавиши на
клавиатуре ) \ UST_ATR_NORM_CMD AR2 0 FIX S"
Переход на
сайты
объектов
термоконтроля
в НСО
подготовленные ОАО = Агромонтаж=
г.
Новосибирск,
2020-2023 " ANSI>OEM
DROP
SetConsoleTitleA DROP ( работает новое
окно
консоли тут
вывод ) 0x20 NEGATE ( dX ) 0xD NEGATE ( Yd ) UST_RAZMEROV_CMD_N1 CR S"
Переход на
сайты
объектов
термоконтроля
в НСО "
ANSI>OEM TYPE CR S"
подготовленные ОАО =
Агромонтаж=
г.
Новосибирск,
2020-2023 " ANSI>OEM TYPE
CR S"
-----------------------------------------------------
" ANSI>OEM TYPE CR S" Для
выхода из
программы нажать
клавишу ESC.
Цифровые
клавиши: " ANSI>OEM TYPE CR S" 1 - открыть
элеватор
=Тогучин= " ANSI>OEM TYPE CR S" 2 -
открыть
элеватор
=Бердск= " ANSI>OEM TYPE CR S" 3 -
открыть
элеватор
=Баган= " ANSI>OEM TYPE CR S"
клавиша
ПРОБЕЛ -
открыть все
адреса
объектов и
выйти из
программы " ANSI>OEM TYPE CR S"
------------------------------------------------------- " ANSI>OEM TYPE CR S" Дополнительно: " ANSI>OEM TYPE CR S" g -
извлечь
текст этой
программы и
компилятор
языка FORTH " ANSI>OEM TYPE CR S" h - сайт
по языку
программирования
FORTH, для
самостоятельного
редактирования.
" ANSI>OEM TYPE CR S"
Успехов и
здровья!
Подготовил -
Шабронов А.А.
тс+7-913-905-8839 "
ANSI>OEM TYPE \
---------------------------------------------------------------------- 0 BEGIN DUP
[CHAR] 1 = IF ST1 EXIT THEN DUP
[CHAR] 2 = IF ST2 EXIT THEN DUP
[CHAR] 3 = IF ST3 EXIT THEN DUP
0x20 = IF ST1 ST2 ST3 EXIT THEN DUP
[CHAR] g = OVER [CHAR] G = OR IF WOSTANOVLENIE EXIT THEN DUP
[CHAR] h = OVER [CHAR] H = OR IF ST4 EXIT THEN DROP KEY DUP 0x1B = UNTIL (
ПРОВЕРКА
НАЖАТИЯ КЛАВИШИ,
ЕСЛИ НАЖАЛИ 1
ТО КОД
СОВПАЛ И
ВЫХОДИМ ) ; : NAME3 S"
start_www_elevatorov_all_v1.exe" ; ( имя
исполняемого
файла ) \
подготавливаем
переменные и
текст
программы
записываем
в исполняемый
файл. 0 TO SPF-INIT? ( в
переменную
записываем
код 0 –
означает
что
инициализация
выполняется
) '
NOOP MAINX ! ( в
переменную
записываем
адрес
выхода ) '
MAIN TO
<MAIN> ( в
переменную
записываем старт
программы со
слова MAIN ) NAME3 SAVE (
сохраняем
файл
исполнения с
именем NAME3 ) BYE (
выходим из
режима
редактирования
и
компиляция,
т.е. все
бай-бай ) \ текст
программы
окончен. |
1.
Изменить
Пример_1 - звуки
формируются
разные при
отображении
чисел от 1 до 16.
Нажимаем
клавишу 1..F и
выдается
звук
2.
Изменить
Пример_1 - звуки
формируются
только 3
частоты и
разной
длительности
при
отображении
чисел от 1 до 16.
Нажимаем
клавишу 1..F
и
выдается
звук.
3.
Изменить
Пример_1 – звуки
выдаются
постоянно, с
разной
частотой. В
звуках
определить
простейшую
гармоническую
мелодию. Выход
по нажатию
клавиши ESC.
4.
Изменить
Пример_2 -
выдается
серия 40 кодов
на экране одной
нажатой
клавиши в
одной строке.
5.
Изменить
Пример_2 -
выдать все
возможные
коды
комбинаций
отображений
от 0 до 0xFF в виде
таблицы;
6.
Изменить
Пример_2 –
выдать все
коды комбинаций
отображений
от 0..0xFF
в файл
7.
Изменить
Пример_3 –
выдать
таблицу
умножения до
100 в формате 10-и
таблиц
8.
Изменить
Пример_3 -
выдать
таблицу сложения
до 100 в формате
10-и таблиц.
9.
Изменить
Пример_3 -
выдать
таблицу умножения
в интервале 0x10000…0x10040
числами
двойной
длинны
в формате
читаемых на
экране таблиц;
10.
Изменить
Пример_4 –
выдать
таблицу 0x10 на 0x10
где по
вертикали
меняется
цвет фона, а
по
горизонтали
цвет знака
11.
Изменить
Пример_4 –
выдать 2-е
строки,
которые с
интервалом 1
секунда,
меняют в
первой – фон
знака, а во
второй цвет
знака. Выход
по нажатию
клавиши ESC
12.
Изменить
Пример_4 –
Выдать цифру
кода цвета фона
и цифру кода
цвета знака,
обозначить
их,
установить
цвет, с звуковым
сопровождением.
Нажимаем
любую
клавишу и
получаем
выдаваемое.
Выход по
клавише ESC
13.
Изменить
Пример_5 –
Выдавать
звук только
при нажатии
цифровых
клавиш 0…9
14.
Изменить
Пример_5 –
Выдавать
звук только
при нажатии
текстовых
клавиш
строчных. Т.е.
«а» «s» и т.д.
15.
Изменить
Пример_5 –
Выдавать три
звука при нажатии,
которые бы
составляли
повышение тона(частоты).
Нажимаем
клавишу и
слышим, выход
по клавише ESC
16.
Изменить
Пример_6 –
Открыть и
перейти к
программе Paint
данного
компьютера
17.
Изменить
Пример_6 –
Открыть и
перейти к
адресу сайта
института, и
выйти из
программы примера
18.
Изменить
Пример_6 - Меню
программы содержит
текст адреса
перехода и
так же выполняется
при нажатии
соответствующей
клавиши.
19.
Изменить
Пример_7 –
Изменить
клавиши
управления
меткой на русские
буквы
20.
Изменить
Пример_7 –
Ввести
отображения
места метки в
виде числа
номера
строки и
столбца
21.
Изменить
Пример_7 –
Ввести в меню
отображения
адреса
перехода на
сайт
института и
при выборе и
нажатии,
программа
должна
спрашивать
подтверждение
и только
потом
переходить.
22.
Изменить
Пример_8 -
Ввести меню
для
действий
оператора, с
описанием
сохранения
файла и
выполнение
звуковых
сообщений.
23.
(с)Изменить
Пример_9
–Ввести
другие имена
для сохранения
файлов и
проверять на
достоверность
по
контрольной
сумме. Т.е.
если файл EXE
искажен, то
об этом
сообщается и
не выполняется
извлечение
из тела.
24.
(сс)Повторить
свой вариант
программы расчета
коэффициентов
гармоник для
импульсных
усилителей DFT-Berg.zip так,
что бы она
работала 32х-64х
разрядной
системе Windows и в
любых
кодировках.
Примечания:
-c –
задача
повышенной
сложности
-
сс – задача
сильно
повышенной
сложности. Если
есть
ограничения,
которые надо
обосновать,
то
разрешается
перейти к
менее
сложным
задачам.
Наименование |
Адрес |
|
Учебное
пособие 1 по
языку ФОРТ |
||
Учебное
пособие 2 по
языку ФOPT |
||
Учебное
пособие 2 по
языку ФОРТ |
||
Программирование
на языке ForthLogic |
||
История
Forth |
||
Книги
по форт |
||
Версии
форт
русскоязычные |
||
Графические
оболочки |
||
Версия
spf |
http://iweb.dl.sourceforge.net/project/spf/sp-forth4/sp-forth
4 build 16/spf4-016.exe |
|
Справочник
spf-4 |
||
Форум по
форту |
||
Примеры
программ
простые |
||
Дневник
изучения
Форта |
||
nnCron
и язык
программирования
Форт |
||
История
от
А.Черезова
создания spf4 |
||
Форт-язык
для
микропроцессоров |
||
Литература
по форт |
||
Пример
для
выполнения
файлов –mid-
-kar= |
https://www.soel.ru/online/chetyryekhkanalnyy-retranslyator-1-wire-na-osnove-12f629/ |
Автор Шабронов Андрей Анатольевич тс. +7-913-905-8839
Ред. 2023-11-25