Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 15:12

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 117 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Forth на inline asm. Это реально?
СообщениеДобавлено: Сб апр 25, 2015 19:35 
Не в сети

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

Пример:

int foo(int x)
{
asm
{
mov EAX,x[EBP] ; // loads value of parameter x into EAX
mov EAX,x ; // does the same thing
}
}

А вот интересно, можно ли портировать 32 разрядный форт, используя
такой встроенный ассемблер? Что бы это был подключаемый модуль.

Особенно интересно, тяжело ли портировать SPF-fork таким способом?

Использование мне видится таким способом:
import spf-fork;	// Подключить модуль 

main() {

// Выделение буферов, инициализация и загрузка всех нужных слов
// При этом, после всей загрузки необходимо выключить цикл интерпретатора.
initSpfFork("Имя_файла.f");

// Вызов нужного слова из уже имеющихся в памяти
// просто как вариант
execWord(АдресCFA_слова, параметр1, параметр2, ...);

// Компиляция и выполнение строки/строк кода.
// Причём аргументы этой функции закладываются в стек,
// а результат возвращается из стека, как возвращаемое значение
// функции
void* evalSpfFork(
"
\ Пример определения и выполнения
: test 10 1 do i . loop ;
test
", параметр1, параметр2, ...);

// Возможно присваивание адресов переменных, констант и функций
// переменным в форте, и наоборот.

.......................

}

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

К тому же, переносимость Windows - Linux достигается автоматом,
так как D работает едино во всех ОС.


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

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

Почему нет?

mgw писал(а):
Особенно интересно, тяжело ли портировать SPF-fork таким способом?

Вопрос, я так понимаю, ко мне.
Невозможного в этом ничего нет, только, вот, слишком объемная работа получится.
В inline режиме легко создается ФВМ - это около 100 определений которые просто тупо переписываются из кода. А вот дальше будут сложности, т.к. сборка происходит с использованием
форта, причем, ЦК (целевой компилятор) частично разделяет собираемый код (дабы не делать одно дело дважды).

В общем, с наскока не получится.

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


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
У меня сейчас появилось время. Хотел его использовать для обучения. Предлагаю
начать работу по переносу SPF-Fork на inlineAsm D.
Олег, с твоей стороны советы, с моей обучение и кодирование.

Как я это вижу: Переносим 100 определений из кода. Сборку будем вести уже
на D, если я правильно понимаю сам процесс. Тут главное начать, там дальше придумаем
что делать.

К чему я стремлюсь. Сейчас у меня в "руках" два универсальных "волшебных камня", это D (маленький, быстрый, понятный, перспективный) и Qt (есть всё, чего пожелает душа). Хотелось бы иметь "клей" - внутренний механизм, частично отладчик, частично скрипт, частично ассемблер на лету, и т.д. Это третий камень (для гармонии). Для этой цели SPF-Fork мне видится наиболее перспективным ввиду огромной проработанности внутренних механизмов. Ну и как дополнительный положительный момент, это разобраться (возможно) в ассемблере, что есть моя "Ахиллесова пята".

Быдлокодерство нужно, но хочется иногда и для души что нибудь :)


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

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

А у меня оно совсем пропало 8(

mgw писал(а):
Предлагаюначать работу по переносу SPF-Fork на inlineAsm D.

уф.
mgw писал(а):
Тут главное начать

как бы не возражаю. На вопросы постараюсь ответить.

mgw писал(а):
Хотелось бы иметь "клей" - внутренний механизм, частично отладчик, частично скрипт, частично ассемблер на лету, и т.д. Это третий камень (для гармонии).

пока не представляю как это может выглядеть.

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


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

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

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

ну а в плане интересности было обсуждение тут.

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


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

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

Посмотрев в dasm код пустой процедуры, типа:

void p() {
}

Вижу код пролога/эпилога. В частности enter/leave. Правильно ли я понимаю, что в hard словах
форта, этот механизм не используется?

Получается, что как только мы "нырнули" с D в ФОРТ, то распределение роли регистров мы делаем
своё. Провел следующий эксперимент:

ubyte[100] buf;   // Моделируем процедуру в памяти. Буфер, куда запишем команды процессора   

int a(void* x) {
asm {
mov EBX, x[EBP]; // В EBX адрес того, что сейчас вызовем командой CALL
mov EAX, 3; // 3 - это параметр, коих в стек можно запихать много
push EAX; // Запихиваем в стек нашу 3
call EBX; // Вызываем функцию по переданному адресу
pop EAX; // Вроде как возвращаем обработанный параметр
}
}

main() {
ubyte* uk = buf.ptr;
*uk = 0x58; uk++; // pop EAX = адрес возврата в a()
*uk = 0x58; uk++; // pop EAX = 3 (параметр)
................ различные действия ...............
*uk = 0xC3; uk++; // ret
// Таким образом подготовили (смоделировали) hard слово форта

// Вызов нашего "самопального" слова
a(cast(void*)buf.ptr); // Возьми адрес буфера, типизируй и вызови a()
}

Вроде как всё работает правильно. Код в buf выполняется.
Правильно ли я понимаю, что те 100 слов, о которых говорил Олег, именно таким образом (или как то похожим) надо сформировать в памяти. Таким образом у нас будет набор hard слов, которые уже возможно
использовать для дальнейшего строительства интерпретатора.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mgw писал(а):
Вижу код пролога/эпилога. В частности enter/leave. Правильно ли я понимаю, что в hard словахфорта, этот механизм не используется?

да, это не нужно, т.к. данные и адреса возвратов в Форте разнесены за счет использования нескольких стеков (как минимум двух: данных, возвратов).
Поэтому сохранять адрес начала фрейма данных нет необходимости.

mgw писал(а):
Получается, что как только мы "нырнули" с D в ФОРТ, то распределение роли регистров мы делаемсвоё

да, и в этом достаточно большая проблема заключается.

mgw писал(а):
Правильно ли я понимаю, что те 100 слов, о которых говорил Олег, именно таким образом (или как то похожим) надо сформировать в памяти.

не обязательно, тут много вариантов может быть. По сути, первое, что надо сделать - это создать виртуальный стековый процессор. Т.е. такую прослойку (набор макросов или процедур) на основе которой дальше будет писаться уже высокоуровневый код (т.е. определения).

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


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

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

Данный пример работает и в Windows и Linux.

import std.stdio;

// Эта функция будет вызвана без пролога/эпилога
void zz() {
asm {
pop EBX;
pop EAX;
add EAX, 1;
push EAX;
push EBX;
ret; // Этот ret не дает выполнится эпилогу
}
}

int a(void* x) {
asm {
mov EBX, x[EBP];
mov EAX, 3;
push EAX;
call EBX;
pop EAX;
}
}

int main(string[] args) {
writeln("Exelent! = ",
// Изврат!
// Вызов функции D, но с обходом кадра стека
// Для этого адрес точки входа смещаем на 4 обходя часть кода.
// Дополнительный ret в zz() не дает выполнится эпилогу
// Это позволяет сделать "плоскую" модель ASM и использоть
// все регистры как в обычном ассемблере
a(cast(void*)(4+(cast(byte*)&(zz))))
);
return 0;
}


Надо, наверное, попробовать определить несколько hard слов. С чего надо начать? Нужен список слов с их кодами на ASM.


Последний раз редактировалось mgw Вс апр 26, 2015 23:14, всего редактировалось 1 раз.

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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Небольшой эксперимент. Попытка смоделировать несколько слов и их использование. Как выяснилось "naked" - отключить пролог/эпилог:

Код:
import std.stdio;

// "DUP"
void dup() {
   void* saveAdrReturn;
   asm {
      naked;      pop saveAdrReturn;
         pop  EAX;
         push EAX;      
         push EAX;      
      push saveAdrReturn; ret;
   }   
}
//  "1+"
void add1() {
   void* saveAdrReturn;
   asm {
      naked;      pop saveAdrReturn;
         pop  EAX;
         inc  EAX;
         push EAX;      
      push saveAdrReturn; ret;
   }   
}
// "+"
void plus() {
   void* saveAdrReturn;
   asm {
      naked;      pop saveAdrReturn;
         pop  EBX;
         pop  EAX;
         add  EAX, EBX;
         push EAX;      
      push saveAdrReturn; ret;
   }   
}
int a(void* x) {
   asm {
      mov  EBX, x[EBP];
      push 3;   // Кладем в стек 3
      call dup;
      call add1;
      call plus;
      pop  EAX;
   }
}

void main() {
   writeln("[ 3 DUP 1+ + ] ===> ", a(&add1));
}

-------------------------------------------
C:\qte>dmd asm1

C:\qte>asm1
[ 3 DUP 1+ + ] ===> 7


Почему D, а не masm32 например.

1 - Хочу получить встроенный форт в D
2 - Хочу изучить inlineAsm в D, т.к. все равно ни какого asm я не знаю
3 - D и C++ не особо различаются, но D отлично переносим Win <--> Linux
4 - не хочу DLL на данном этапе, т.к. это лишние трудности. Может быть потом.

Код:
C++
void(*fword)();
fword = (void(*)())ReadCode(pc);
pc += sizeof(int);
fword();

D
(cast(void function())ReadCode(pc++))();



Хотелось бы "затащить в D" настоящий форт с минимальными изменениями. А это, по моим представлениям, минимальные потери на пролог/эпилог, это подпрограммный код, где вызов hard слова просто CALL, в общем классический компилятор. Ну и совместимость библиотек, не на последнем месте.
Идеал - это SPF-Fork.

Когда то давно была "безумная" идея прицепить Qt к форту. Сейчас работа с Qt хоть с форта, хоть с D не представляет проблем. Теперь хочу в D иметь встроенный форт, что бы в любой момент можно было остановить прогу на D и полазить по её внутренностям (функции отладчика), или схватить объекты D и "подергать" их их форта (встроенный скрипт), а можно оформить этот модуль с фортом как DLL (вот на выходе и та самая DLL для подключения к другим языкам), можно не "парится" по поводу Windows - Linux и т.д. Возможно, потом можно будет и на 64 разряда замахнутся, но это потом.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Верю, что вылетает. И почему вылетает, писал выше - посмотрите, что должно происходить при вызове этим фрагментом IF или EXIT.

То есть кода не будет? Я же сразу попросил - без "как-то так", с рабочим примером. И без RTFM в виде "определения языка". Практика показывает, что толкование подобных определений может быть сколь угодно вольным, но компилятор бесполезно уверять, что корифеи имели в виду вот это, а не вон то.


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Вопрос к Олегу. Может попробуем записать несколько слов? Или куда смотреть и откуда начать. Желательно описать пару тройку слов и их как то проверить.


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

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

ну, тут два варианта:
1. взять СПФ4, открыть файл ./src/spf_forthproc.f и передрать реализацию базовых определений.
2. взять форк, зайти в папку ./kernel/vm/stc/ и посмотреть для начала содержимое

кстати, встроенный асм макросы поддерживает?
да, еще можно посмотреть сюда, хотя пример не полноценный, т.к. не ставилась цель написать окончательный вариант, но вполне собираемый и запускаемый(смотреть начинать можно с '; первое определение')

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


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

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

Можно сделать dll и подключить к форку. Правда, из форка надо будет как-то передать основные структуры - хотя бы стек. Тогда можно будет часть слов вызывать из подключенной dll и смотреть, что они делают со стеком.


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

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

Кстати, отладчик есть у D?

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


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

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

1. Нет макроподстановок. Жаль конечно.
2. Как проверить, то получилось после ассемблирования или не то?

Как сравнить машинные коды после:
Код:
\ установить новое значение указателя стека данных
CODE SP! ( addr --> )
         LEA top , CELL [tos]
         MOV tos , -CELL [top]
       exit
    END-CODE


и после D:
Код:
//  SP! ( addr --> )
const CELL = 4;
void SP_set() {
   asm {
      naked;
          lea  EBP, CELL[EAX];
          mov  EAX, -CELL[EBP];      
          ret;
   }   
}


Каким нибудь dumpobj посмотреть, что ли .... Как увидеть, что в форте стоит на этом слове? Дизассемблер включить что ли?
Отладчик в D есть. Посмотреть код можно.


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

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


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

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


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

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