WinForth32

[ Download Документы ]

Наконец-то! Появился порт SMAL32 для Win32. Это даже не совсем порт, но тем не менее...

WinForth32 v1.00a (с) Горчаков Г.Ю. 1999
32-разрядный Форт для платформы Win32

Создан на базе SMAL32 http://ht.psy.msu.ru/smal32
и под влиянием SPF315 http://www.eserv.ru

Компилятор, интерпретатор.

Реализация:

  • В FW32 используется прямой шитый код;
  • интерпретатор работает в консольном варианте, если запустить FW32.EXE без параметров;
  • при указании в командной строке имени файла, выполнится его компиляция и завершение работы (если нет ошибок в тексте);
  • максимальная длина строки со счетчиком - 255;
  • максимальная длина строки в тексте - 1023;
  • в качестве разделителя слов используется BL и TAB;
  • в именах определений могут использоваться любые символы;
  • при поиске в словаре прописные и строчные символы не различаются;
  • встроенный ассембер перенесен из Smal32 Ver 97.11.1.

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

В отличие от SMAL32:

  • Нет слов USE, MAKEUNIT ( адреса работы слов в библиотеках от SMAL32 не совместимы ).
  • Нет встроенной мультизадачности.
  • Вместо переменных MinMem, MaxMem введена одна переменная UpMem на основании которой заполняются поля о размере необходимой памяти в заголовке .EXE файла. Смысл такой-же как в MinMem.
  • Введена переменная Warning. Если в эту переменную записано True, перед создании новой словарной статьи будет выполнена попытка найти это имя в словаре. При удачном поиске выдается предупреждающее сообщение.
  • В создаваемую Defer переменную первоначально записывается адрес NOOP.
  • Через Defer переменные определены слова: Restart, >Upper, >Lower, Key, ?Key, Bye, Error, Type.
  • В переменной Tabbing записано количество пробелов заменяющих символ Tab в тексте.
  • При работе слова Word и при форматном преобразовании чисел используется область памяти WordBuf размером 256 байт, а не свободная часть словаря.
  • Переменная отвечающая за совместимость слова EndCase с ANS стандартом называется ANS и является Value переменной.
  • Слово SEE теперь дизассемблирует и Code-слова

Для генерации исполняемого файла можно использовать слова Save и Build:

Save
"FileName" -->
Cохранение текущего состояния Forth системы со всеми определенными словами (генерация новых версий). Пример:
Save newforth - будет записана новая версия "newforth.exe"

Build
C-Adr "FileName[.exe]" ["FileName[.map]]" -->
C-Adr - ASCIIz строка с именем значка который будет ассоциироваться с данной программой. В исполняемый модуль будут включены только те слова которые используются в проекте. Пример:
A" ico\\myprg" Build myprg myprg - построение файла myprg.exe с значком myprg.ico и создание файла ссылок myprg.map

Созданный файл настороен на работу как GUI приложение. Если необходимо работать как консольное приложение выполните слово InitConsole.
ASCIIz -->
Пример: A" Консоль" InitConsole
ASCIIz строка параметров - это имя окна консоли.

Процесс запуска определяется Defer переменной Restart. В интерпретаторе в этой переменной записан адрес слова System. При генерации исполняемого модуля словом Build в эту переменную записывается исполняемый адрес последнего определенного слова.

Импорт API функций выполняется создающим словом ImportDLL в контексте:
AdrNameLib "Word" "NameProc" -->
Со стека снимается адрес строки с именем библиотеки создается словарная статья с именем "Word" в поле параметров которого записываются ссылка на имя библиотеки, адрес вызова процедуры и имя прцедуры "NameProc". Адрес вызова будет заполнен после первого выполнения созданного слова. Определить имя библиотеки можно примерно так:
Create USER32.DLL A" USER32.DLL" A, Create;
В WF32 уже определены следующие имена библиотек: KERNEL32.DLL, USER32.DLL, GDI32.DLL, COMCTL32.DLL.
Используются API функции:

   Библиотека                      Слово           Имя функции
   KERNEL32.DLL    ImportDLL       GetStdHandle    GetStdHandle
   KERNEL32.DLL    ImportDLL       SetConsoleTitle SetConsoleTitleA
   KERNEL32.DLL    ImportDLL       AllocConsole    AllocConsole

   KERNEL32.DLL    ImportDLL       CloseHandle     CloseHandle
   KERNEL32.DLL    ImportDLL       CreateFile      CreateFileA
   KERNEL32.DLL    ImportDLL       DeleteFile      DeleteFileA
   KERNEL32.DLL    ImportDLL       SetFilePointer  SetFilePointer
   KERNEL32.DLL    ImportDLL       ReadFile        ReadFile
   KERNEL32.DLL    ImportDLL       WriteFile       WriteFile
   KERNEL32.DLL    ImportDLL       GetFileSize     GetFileSize

   KERNEL32.DLL    ImportDLL       ExitProcess     ExitProcess
   KERNEL32.DLL    ImportDLL       ?InConsole      GetNumberOfConsoleInputEvents
   KERNEL32.DLL    ImportDLL       InConsole       ReadConsoleInputA
   KERNEL32.DLL    ImportDLL       GetCommandLine  GetCommandLineA

В заголовке EXE файла явным образом импортируются следующие функции:

LoadLibraryA, GetProcAddress - для загрузки функций API. GetLastError, FormatMessageA, MessageBoxA - для сообщения об ошибках загрузки функций.

По умолчанию в WF32 значения переменных следующие:

   RStackSize, StackSize  - 16 Kbytes
   LStackSize             - 256 KBytes
   UpMem                  - 1 MBytes
   Tabbing                - 8
   Warning                - False
   ANS                    - False

Заранее благодарен за все замечания и пожелания.
Геннадий Горчаков. G.Gorchakov@rostuzes.elektra.ru


WinForth32 Version 1.00a (73Kb)


Полезная документация собрана здесь.
Beej's Guide to Network Programming - очень хороший туториал о сокетах. Примеры программ можно найти на www.forth.org.ru/~mda.
Windows Sockets An Open Interface for Network Programming under Microsoft Windows


Возврат


RU FIG