Forth http://fforum.winglion.ru/ |
|
Forth на inline asm. Это реально? http://fforum.winglion.ru/viewtopic.php?f=2&t=3044 |
Страница 1 из 8 |
Автор: | mgw [ Сб апр 25, 2015 19:35 ] |
Заголовок сообщения: | Forth на inline asm. Это реально? |
Сейчас почти все компиляторы C++ имеют встроенный ассемблер. Это касается и D. Пример: int foo(int x) А вот интересно, можно ли портировать 32 разрядный форт, используя такой встроенный ассемблер? Что бы это был подключаемый модуль. Особенно интересно, тяжело ли портировать SPF-fork таким способом? Использование мне видится таким способом: import spf-fork; // Подключить модуль Сам по себе чистый EXEшник форта вещь состоявшиеся, а хотелось бы слить воедино программу и форт, как универсальный отладчик - скрипт. К тому же, переносимость Windows - Linux достигается автоматом, так как D работает едино во всех ОС. |
Автор: | mOleg [ Вс апр 26, 2015 12:32 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): А вот интересно, можно ли портировать 32 разрядный форт, используятакой встроенный ассемблер? Что бы это был подключаемый модуль. Почему нет? mgw писал(а): Особенно интересно, тяжело ли портировать SPF-fork таким способом? Вопрос, я так понимаю, ко мне. Невозможного в этом ничего нет, только, вот, слишком объемная работа получится. В inline режиме легко создается ФВМ - это около 100 определений которые просто тупо переписываются из кода. А вот дальше будут сложности, т.к. сборка происходит с использованием форта, причем, ЦК (целевой компилятор) частично разделяет собираемый код (дабы не делать одно дело дважды). В общем, с наскока не получится. |
Автор: | mgw [ Вс апр 26, 2015 13:18 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
У меня сейчас появилось время. Хотел его использовать для обучения. Предлагаю начать работу по переносу SPF-Fork на inlineAsm D. Олег, с твоей стороны советы, с моей обучение и кодирование. Как я это вижу: Переносим 100 определений из кода. Сборку будем вести уже на D, если я правильно понимаю сам процесс. Тут главное начать, там дальше придумаем что делать. К чему я стремлюсь. Сейчас у меня в "руках" два универсальных "волшебных камня", это D (маленький, быстрый, понятный, перспективный) и Qt (есть всё, чего пожелает душа). Хотелось бы иметь "клей" - внутренний механизм, частично отладчик, частично скрипт, частично ассемблер на лету, и т.д. Это третий камень (для гармонии). Для этой цели SPF-Fork мне видится наиболее перспективным ввиду огромной проработанности внутренних механизмов. Ну и как дополнительный положительный момент, это разобраться (возможно) в ассемблере, что есть моя "Ахиллесова пята". Быдлокодерство нужно, но хочется иногда и для души что нибудь |
Автор: | mOleg [ Вс апр 26, 2015 14:45 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): У меня сейчас появилось время. Хотел его использовать для обучения. А у меня оно совсем пропало 8( mgw писал(а): Предлагаюначать работу по переносу SPF-Fork на inlineAsm D. уф. mgw писал(а): Тут главное начать как бы не возражаю. На вопросы постараюсь ответить. mgw писал(а): Хотелось бы иметь "клей" - внутренний механизм, частично отладчик, частично скрипт, частично ассемблер на лету, и т.д. Это третий камень (для гармонии). пока не представляю как это может выглядеть. |
Автор: | mOleg [ Вс апр 26, 2015 17:01 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): Как таковойфорт реализовать на чистом D возможно, но хочется сохранить быстродействие, нуи библиотеки оригинального форта. вообще, косвенный шитый код не сильно быстрый. Хотя, конечно, имеется зависимость от используемой архитектуры. в СПФе остановились на подпрограммном ШК, который по сути и не интерпретируется. Для реализации в Сях была где-то статейка навскидку похоже и бенчмарки различных вариантов ШК ну а в плане интересности было обсуждение тут. |
Автор: | mgw [ Вс апр 26, 2015 21:04 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
Вот и первые вопросы. Посмотрев в dasm код пустой процедуры, типа: void p() { } Вижу код пролога/эпилога. В частности enter/leave. Правильно ли я понимаю, что в hard словах форта, этот механизм не используется? Получается, что как только мы "нырнули" с D в ФОРТ, то распределение роли регистров мы делаем своё. Провел следующий эксперимент: ubyte[100] buf; // Моделируем процедуру в памяти. Буфер, куда запишем команды процессора Вроде как всё работает правильно. Код в buf выполняется. Правильно ли я понимаю, что те 100 слов, о которых говорил Олег, именно таким образом (или как то похожим) надо сформировать в памяти. Таким образом у нас будет набор hard слов, которые уже возможно использовать для дальнейшего строительства интерпретатора. |
Автор: | mOleg [ Вс апр 26, 2015 22:23 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): Вижу код пролога/эпилога. В частности enter/leave. Правильно ли я понимаю, что в hard словахфорта, этот механизм не используется? да, это не нужно, т.к. данные и адреса возвратов в Форте разнесены за счет использования нескольких стеков (как минимум двух: данных, возвратов). Поэтому сохранять адрес начала фрейма данных нет необходимости. mgw писал(а): Получается, что как только мы "нырнули" с D в ФОРТ, то распределение роли регистров мы делаемсвоё да, и в этом достаточно большая проблема заключается. mgw писал(а): Правильно ли я понимаю, что те 100 слов, о которых говорил Олег, именно таким образом (или как то похожим) надо сформировать в памяти. не обязательно, тут много вариантов может быть. По сути, первое, что надо сделать - это создать виртуальный стековый процессор. Т.е. такую прослойку (набор макросов или процедур) на основе которой дальше будет писаться уже высокоуровневый код (т.е. определения). |
Автор: | mgw [ Вс апр 26, 2015 23:01 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
Пример ниже, позволяет обойти пролог/эпилог, как бы "расчистив" работу с регистрами. Грубо, но работает. В С++ кажется есть прагма позволяющая отключать пролог/эпилог. Здесь я этого пока не нашел. Предполагаю, что набор hard слов, вполне реально написать используя данный механизм. Данный пример работает и в Windows и Linux. import std.stdio; Надо, наверное, попробовать определить несколько hard слов. С чего надо начать? Нужен список слов с их кодами на ASM. |
Автор: | mgw [ Пн апр 27, 2015 08:46 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
Небольшой эксперимент. Попытка смоделировать несколько слов и их использование. Как выяснилось "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 разряда замахнутся, но это потом. |
Автор: | Hishnik [ Пн апр 27, 2015 11:02 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
gudleifr писал(а): Верю, что вылетает. И почему вылетает, писал выше - посмотрите, что должно происходить при вызове этим фрагментом IF или EXIT. То есть кода не будет? Я же сразу попросил - без "как-то так", с рабочим примером. И без RTFM в виде "определения языка". Практика показывает, что толкование подобных определений может быть сколь угодно вольным, но компилятор бесполезно уверять, что корифеи имели в виду вот это, а не вон то. |
Автор: | mgw [ Пн апр 27, 2015 17:56 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
Вопрос к Олегу. Может попробуем записать несколько слов? Или куда смотреть и откуда начать. Желательно описать пару тройку слов и их как то проверить. |
Автор: | mOleg [ Пн апр 27, 2015 18:28 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): Надо, наверное, попробовать определить несколько hard слов. С чего надо начать? Нужен список слов с их кодами на ASM. ну, тут два варианта: 1. взять СПФ4, открыть файл ./src/spf_forthproc.f и передрать реализацию базовых определений. 2. взять форк, зайти в папку ./kernel/vm/stc/ и посмотреть для начала содержимое кстати, встроенный асм макросы поддерживает? да, еще можно посмотреть сюда, хотя пример не полноценный, т.к. не ставилась цель написать окончательный вариант, но вполне собираемый и запускаемый(смотреть начинать можно с '; первое определение') |
Автор: | Hishnik [ Пн апр 27, 2015 20:05 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): Желательно описать пару тройку слов и их как то проверить. Можно сделать dll и подключить к форку. Правда, из форка надо будет как-то передать основные структуры - хотя бы стек. Тогда можно будет часть слов вызывать из подключенной dll и смотреть, что они делают со стеком. |
Автор: | mOleg [ Пн апр 27, 2015 20:13 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
mgw писал(а): Желательно описать пару тройку слов и их как то проверить. Кстати, отладчик есть у D? |
Автор: | mgw [ Пн апр 27, 2015 20:15 ] |
Заголовок сообщения: | Re: Forth на inline asm. Это реально? |
вскрылось несколько проблем: 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 есть. Посмотреть код можно. |
Страница 1 из 8 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |