Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:27

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 117 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8  След.
Автор Сообщение
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вт май 12, 2015 21:41 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Hishnik писал(а):
SMUDGE - да, упоминается в большинстве источников. Оставляем. Хотя если уж совсем придираться, зависит от реализации. Оно нужно, чтобы можно было внутри определения слова с имеющимся именем пользоваться старой версией того же слова. Например, для добавления функциональности. Но оставляем

SMUDGE - плохая идея. Нужно просто добавлять имя в два этапа. CREATE расщепить на две половины. При исполнении ":" выполнить первую половину CREATE и в ней указатель на новое имя скопировать в некую переменную LAST. А по ";" выполнить вторую половину CREATE - скопировать содержимое LAST по адресу CURRENT @ . Т.е. добавить имя к словарю только при исполнении ";" . При этом слово LATEST должно возвращать содержимое LAST . И SMUDGE окажеся не нужна.

При инициализации Форта выполнять
FORTH DEFINITIONS
CURRENT @ @ LAST !
для определенности значения LAST при старте


Последний раз редактировалось Ethereal Вт май 12, 2015 21:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вт май 12, 2015 21:54 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Такой подход дает еще вот какой плюс. При определении слова по ":" CURRENT @ @ и LATEST будут различаться, а при определении по ":NONAME" будут равны. А есть одно слово для которого большая разница используется оно внутри определения по ":" или по ":NONAME". Это слово RECURSE и его можно определить, например, так
Код:
: RECURSE                                                       \ CORE
\ Итерпретация: семантика не определена.
\ Компиляция: ( -- )
\ Добавить семантику выполнения текущего определения в текущее определение.
\ Неоднозначная ситуация возникает, если RECURSE используется после DOES>.
  CURRENT @ @ LATEST =
  IF ( for ":NONAME" ) DUP ELSE ( for ":" ) LATEST NAME> THEN COMPILE,
; IMMEDIATE COMPILE-ONLY


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вт май 12, 2015 22:08 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
VoidVolker писал(а):
В общем случае:
Поле связи | Поле флагов | Поле имени | Поле кода | Возврат
Традиционно длина имени в Форт-системах до 31 символа включительно. Значит в байте длины в поле имени под эту длину уйдет 5 бит. Остаются 3 бесхозных бита :
- Немедленного исполнения
- Только в режиме компиляции
- Словарь
И все. Поле флагов не нужно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Ср май 13, 2015 00:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ethereal писал(а):
SMUDGE - плохая идея. Нужно просто добавлять имя в два этапа.

У меня вообще нет этого флажка. Не критично.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Ср май 13, 2015 01:17 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Ethereal писал(а):
VoidVolker писал(а):
В общем случае:
Поле связи | Поле флагов | Поле имени | Поле кода | Возврат
Традиционно длина имени в Форт-системах до 31 символа включительно. Значит в байте длины в поле имени под эту длину уйдет 5 бит. Остаются 3 бесхозных бита :
- Немедленного исполнения
- Только в режиме компиляции
- Словарь
И все. Поле флагов не нужно.

Но оно все равно есть. Даже один бит - это все равно уже поле флагов. Т.е., граница между полями не обязана совпадать с границами между байтами. Просто так удобнее.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Ср май 13, 2015 12:02 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Длина имени у меня 255 символов. До SMUG руки не дошли, да и надобности в этом признаке я не вижу, пока по крайней мере.

Объясните мне на "пальцах", что такое векторное слово, в чем его смысл?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Ср май 13, 2015 13:56 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
mgw писал(а):
Длина имени у меня 255 символов. До SMUG руки не дошли, да и надобности в этом признаке я не вижу, пока по крайней мере.

Объясните мне на "пальцах", что такое векторное слово, в чем его смысл?

Это по сути переменная, которая хранит исполняемый токен какого-либо другого слова. Но поведение слегка отличается от обычных переменных тем, что по умолчанию оно не кладет этот адрес на стек, а делает безусловный переход по этому адресу.
Вот пример:
Код:
VECT vv
SEE vv

572B8F E854F5FDFF       CALL    5520E8  ( _VECT-CODE )
572B94  A;   5528A4 ,  \ NOOP Ok \ <- токен

0xABCDEF VALUE val
SEE val

572BAF E888F4FDFF       CALL    55203C  ( _CONSTANT-CODE )
572BB4  A;   ABCDEF , Ok


Чуть глубже:
Код:
SEE _VECT-CODE

5520E8 5B               POP     EBX
5520E9 FF23             JMP     [EBX]
END-CODE   Ok

SEE _CONSTANT-CODE

55203C 8D6DFC           LEA     EBP , FC [EBP]
55203F 894500           MOV     0 [EBP] , EAX
552042 58               POP     EAX
552043 8B00             MOV     EAX , [EAX]
552045 C3               RET     NEAR
END-CODE   Ok


Вот так и устроены VALUE переменные и векторы в СПФ. В первой ячейке - вызов кода по извлечению значения переменной, во второй ячейке - само значение. В момент вызова _VECT-CODE на стеке возвратов уже лежит адрес следющей ячейки, а в ней - токен. А обычные переменные просто извлекают значение на стек. После самого значения (кроме констант), в третьей ячейке ссылка на код для записи значения. Вот, смотрим в исходники:
Код:
: CONSTANT ( x "<spaces>name" -- ) \ 94
  [T] HEADER [I]
  CONSTANT-CODE COMPILE, ,
;
: VALUE ( x "<spaces>name" -- ) \ 94 CORE EXT
  [T] HEADER [I]
  CONSTANT-CODE COMPILE, ,
  TOVALUE-CODE COMPILE,
;
: USER-VALUE ( "<spaces>name" -- ) \ 94 CORE EXT
  [T] HEADER [I]
  USER-VALUE-CODE COMPILE,
  TC-USER-ALIGNED SWAP ,
  CELL+ TC-USER-ALLOT
  TOUSER-VALUE-CODE COMPILE,
;

: USER-VECT ( "<spaces>name" -- ) \ 94 CORE EXT
  [T] HEADER [I]
  USER-VECT-CODE COMPILE,
  TC-USER-ALIGNED SWAP ,
  CELL+ TC-USER-ALLOT
  TOUSER-VALUE-CODE COMPILE,
;

: VECT ( -> )
  [T] HEADER [I]
  VECT-CODE COMPILE, NOOP-CODE >VIRT ,
  TOVALUE-CODE COMPILE,
;
: ->VECT ( x -> )
  [T] HEADER [I]
  VECT-CODE COMPILE, ,
  TOVALUE-CODE COMPILE,
;

Чуть сложнее с USER-переменными и векторами - они хранят смещение в хипе.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc



За это сообщение автора VoidVolker поблагодарил: mgw
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Сб май 16, 2015 06:55 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mgw писал(а):
Объясните мне на "пальцах", что такое векторное слово, в чем его смысл?

векторное слово - это обычное слово, у которого можно менять поведение.
Т.е. хранит указатель на код а не сам код.
Используется там, где нужно\хочется оставить возможность менять поведение системы.
Скажем, есть такое слово OК , которое выводит сообщение об успешном завершении трансляции строки и приглашение ко вводу новой. Сам код определен так:
Код:
: (OK) ( --> ) state IFNOT ."  Ok" THEN PROMPT ;


если захочется изменить сообщение или вообще его убрать, достаточно сделать так:

Код:
:> NoMsg ;  NoMsg IS OK


и система перестанет Ok-ать и приглашать ввести еще одну строку.
Реализация возможна разная, всвязи с тем, что в форке используется простой JMP (безусловный переход на адрес) - с помощью IS меняется адрес (указатель) на код. А для того, чтобы можно было отличить тип вектора(глобальный\локальный для потока) перед глобальным переходом компилируется NOP. И IS различает, можно ли присвоить значение вектору и как это делать:
Код:
\ присвоить значение исполнимого токена xt векторной переменной
: IS ( xt / name --> )
     ' DUP W@ 0xE990 = IF 1 +   literal ['] TOKEN! REGULAR ;THEN
       DUP W@ 0xB7FF = IF 2 + @ literal ['] UA!    REGULAR ;THEN
     ERROR" ожидается переменная-вектор!" ; IMMEDIATE


Имена всех определений, адреса которых присваивается векторам, в форке взяты в круглые скобки, т.е.: (OK) (TYPE) (ACCEPT) и другие. Правда, есть еще ряд определений, которые никогда не вызываются по своему имени, например, (ABORT) - поэтому тоже пишется в скобках. Вообще в форке я старался следовать соглашениям по оформлению кода "\_\doc\agreements.txt".

И, да, таки надо почистить тему, т.к. я уже просто не вижу нужные сообщения из-за кучи жирных сообщений не о том

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur



За это сообщение автора mOleg поблагодарил: mgw
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Сб май 16, 2015 14:17 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Векторные слова позади. Всем спасибо за разъяснение довольно трудного материала!

Реализовал общую область памяти (массив) между D и F.
Это позволяет читать и писать переменные как D из F так и наоборот.

Пример D:
Код:
import forth;
int main(string[] args) {
    int t1 = 7;
    initForth();
    setCommonAdr(0, cast(pp)&t1);  // Сохранить адрес на t1 в 0 ячейке
    File f1 = File(args[1], "r");
    foreach(line; f1.byLine()) evalForth(cast(string)line);
    writeln(toCON("Итого t1 = "), t1);
}


На F меняем значение переменной с 7 на 9:
Код:
0 COMMONADR@ . \ читаю переменную t1 из D адрес которой в 0 ячейке общего массива
9 0 COMMONADR!  \ пишу в t1 = 9


На выходе получаем "Итого t1 = 9"


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вс май 17, 2015 20:05 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Основная часть позади. Форт в базовом варианте работает нормально. Очень приятно, что ассемблером можно "играть" не выходя за рамки D.
В качестве примера снимок с экрана. Это Linux 32 Fedora 19. На нём окна с основными кусками проекта. В частности, смоделирован вызов
функции Qt из Forth в рамках D программы.
Изображение



За это сообщение автора mgw поблагодарил: mOleg
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Пн май 25, 2015 00:23 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Реализован вызов форт слов из D.

Forth
Код:
Lib" CRTDLL.DLL" CrtDll  \ Будем грузить CRTDLL.DLL
Library@ CrtDll 1 CDECL-Call" strlen"  strlen 
Library@ CrtDll 2 CDECL-Call" strcmp"  strcmp
Library@ CrtDll 1 CDECL-Call" strncmp" strncmp
LibraryLoad CrtDll  \ Непосредственно загрузка и поиск адресов функций

\ Слово strlen  - это форт слово, в качестве основы использует
\ функцию из CRTDLL.DLL
S” ABCD” 1+ strlen .  \  На выходе 4.

\ Отдадим адрес Форт слова strlen в D через общию таблицу
' strlen 1 COMMONADR!


Сам вызов из D. В Форт передаётся список параметров из D и возвращается результат
Код:
// Вызов форт слова strlen из D функции executeForth()
writeln("Forth strlen =  ", executeForth(
    getCommonAdr(1),    //  ' strcmp
    1,                                 //  количество параметров
    "AБC".ptr                   // сам параметр  char* на "AБC"
));

Таким образом, есть возможность использовать форт слова из D.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вт май 26, 2015 03:08 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Library@ CrtDll -> CrtDLL SetActiveLibrary, и дальше можно не перечислять Library@ CrtDll перед каждой функцией.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Вт май 26, 2015 11:13 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Hishnik писал(а):
Library@ CrtDll -> CrtDLL SetActiveLibrary, и дальше можно не перечислять Library@ CrtDll перед каждой функцией.


:) Логично! Надо исправить!

Думаю, как реализовать "настоящий" CALLBACK, сейчас он "кривой". Переключение контекста с D (C) - на F осуществляется в D. А по правильному надо все сделать в F.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Пт июн 05, 2015 22:47 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Добавил ещё одну "фишку". Правда не могу пока понять, как это повлияет на дальнейшее программирование словарей. Пока полноценный стек словарей я так и не реализовал (всё время основная работа отнимает :) ... )
В общем сейчас пока у меня всего один словарь, где всё свалено в кучу. По классическому варианту слово CONTEXT должно показывать на список (цепочку) слов в словаре. При таком подходе, поиск при самом неудачном варианте будет перебирать все слова в словаре.

Сейчас я сделал так: CONTEXT указывает на массив CELL в количестве 256 штук. При поиске первый символ (его код) из искомого слова является индексом в данном массиве, и уже из найденного таким способом элемента массива начинается перебор и поиск нужного слова. Таким образом список всех слов, например на 'D' - ( DUP, Dump, DROP .... ) будет начинаться в 68 ячейке массива. Среднее количество "переборов" при поиске уменьшилось в 10 раз, соответственно ускорив загрузку и компиляцию.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth на inline asm. Это реально?
СообщениеДобавлено: Пт июн 05, 2015 23:18 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Оригинальный вариант. Правда, надо иметь достаточно большую программу, чтобы время компиляции стало заметным.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 117 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB