Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт июн 19, 2018 16:39

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 05, 2009 21:00 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Да, хороший текст :)
Цитата:
Компиляция - конкатенативная (за исключением вялотекущих замечаний Михаила, что он может написать любой оптимизатор, вот только пока получаются полуфабрикаты), а значит, программа состоит преимущественно из вызовов подпрограмм.

этот полуфабрикат даёт в отдельном случае до 3-5 кратного прироста производительности


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 05, 2009 22:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
вопрос писал(а):
этот полуфабрикат даёт в отдельном случае до 3-5 кратного прироста производительности

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 05, 2009 23:20 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Хищник писал(а):
вопрос писал(а):
этот полуфабрикат даёт в отдельном случае до 3-5 кратного прироста производительности

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

За это спасибо и я думаю, что интересно всем.
Насчёт случаев - я не могу ничего сказать точно, действительно, разница между случаями велика и уступает С++ . Я тоже удивился, не может, думаю, быть 5-кратной разницы, может неправильно сравнивал, но неоднократно


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 05, 2009 23:48 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
вопрос писал(а):
Насчёт случаев - я не могу ничего сказать точно, действительно, разница между случаями велика и уступает С++ . Я тоже удивился, не может, думаю, быть 5-кратной разницы, может неправильно сравнивал, но неоднократно

Я не пытаюсь сейчас говорить о конкретном оптимизаторе. Я просто предостерегаю от попыток уйти в мечтания о супернаворотах, которые когда-нибудь в будущем превратят планируемый кросс-транслятор в чудо из чудес. Данное предостережение актуально для любых продуктов на базе Форта (да и других редких языков). Правильно спланировать предполагаемые результаты я считаю не менее важным, чем заниматься собственно техникой программирования, потому что вполне можно прочитать вот это все и сказать "да-да, конечно, добавляю в свою копилку как-бы-мыслей, и продолжаю их как-бы-обдумывать, ура Форту, а поскольку я его знаю, я - крутой программист". А это будет означать, что время на чтение потрачено впустую.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 06, 2009 00:11 
Не в сети
Moderator
Moderator
Аватара пользователя

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

h: FFDC d: 1239
и т.д.
он же повзоляет достаточно легко ввести контроль разрядности чисел, а так же контроль адресов при необходимости.

ну и словари никто не отменял 8) в некоторых системах.
а еще в том же СПФ можно использовать NOTFOUND , и числа писать, к прмеру в виде t123452 thFD4

вобщем числа не должны вызывать проблем.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 06, 2009 00:18 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
mOleg писал(а):
да, по поводу номеров, имхо, мне больше нравится префиксный вариант:

h: FFDC d: 1239
и т.д.
он же повзоляет достаточно легко ввести контроль разрядности чисел, а так же контроль адресов при необходимости.

Да, действительно, это тоже можно использовать.

mOleg писал(а):
вобщем числа не должны вызывать проблем.

Под проблемой я имел в виду только вынужденное отличие от стандартной для Форта формы записи. Получается, что если мы берем некий "усредненный" транслятор для PC, то не так-то просто передать числа в МК. Хотя, разумеется, эта проблема имеет целый ряд решений.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 06, 2009 09:51 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Хищник писал(а):
Под проблемой я имел в виду только вынужденное отличие от стандартной для Форта формы записи. Получается, что если мы берем некий "усредненный" транслятор для PC, то не так-то просто передать числа в МК. Хотя, разумеется, эта проблема имеет целый ряд решений.

Форма представления чисел для МК в тексте программ может быть и стандартной.
Дело в том, что сами по себе числовые литералы не нужны. Они используются
внутри процедур. Сами процедуры-слова форта для МК могут включать обработчик для нестандартной интерпретации числовых литералов. Опять решают не сами данные(их представление), а то как(чем) они будут обработаны(форт - бестиповый язык).

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 06, 2009 15:18 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
chess писал(а):
Форма представления чисел для МК в тексте программ может быть и стандартной.
Дело в том, что сами по себе числовые литералы не нужны. Они используются
внутри процедур. Сами процедуры-слова форта для МК могут включать обработчик для нестандартной интерпретации числовых литералов. Опять решают не сами данные(их представление), а то как(чем) они будут обработаны(форт - бестиповый язык).

Вчитываемся, вчитываемся :) Замечание оказалось совершенно не в тему.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 07, 2009 12:44 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Ну почему не в тему, вот вчитываемся вот в это:
Хищник писал(а):
Некрасиво, зато дешево и сердито.



Код:function test

2 # 2 # +

end-function

В нашем примере слово # (это слово не Форт-МК, а Форта в нашем кросс-компиляторе) будет компилировать код, который поместит число на стек МК.


Смысл того, что я писал сводится к тому, что
запись 2 # 2 # + сводится к записи 2 2 +,
а все преобразования делаются внутри слова + .

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 07, 2009 18:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
chess писал(а):
Смысл того, что я писал сводится к тому, что
запись 2 # 2 # + сводится к записи 2 2 +,
а все преобразования делаются внутри слова + .

Ну и как это организовать на практике? Заставлять + принудительно забирать со стека инструментального Форта два числа? :) И каждому слову забирать требуемое число параметров? Элементарный пример

Код:
get-first get-second +


Оба слова положили по числу. Но + все равно полезет в инструментальный транслятор за аргументами?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 08, 2009 11:53 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Хищник писал(а):
Ну и как это организовать на практике?

Достаточно просто.
Код:
: inv-iS  DEPTH 0 ?DO I ROLL LOOP ;     \ инверсия инструментального стека
: iS>tS   inv-iS DEPTH 0 ?DO # LOOP ;   \ перенос чисел с инструментального стека на целевой

: s:  \ определение процедуры
CREATE t-adr ,                 \ t-adr - указатель на первый свободный байт целевого пространства кода
DOES>  iS>tS                   \ перенос чисел с инструментального стека на целевой
       lcall                   \ формирование кода вызова процедуры
;

При компиляции любой процедуры параметры с инструментального стека (если они там есть) "переносятся" на целевой стек.
Целевой код каждой процедуры работает с параметрами на целевом стеке.
PS. Примерно так я сделал в своем компиляторе.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 08, 2009 20:25 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
chess писал(а):
При компиляции любой процедуры параметры с инструментального стека (если они там есть) "переносятся" на целевой стек.
Целевой код каждой процедуры работает с параметрами на целевом стеке.

Это именно то решение, на проблематичность которого я и хотел обратить внимание. А с чего вдруг
1) Все числа инструментального стека должны попасть в целевой? А если у нас внизу лежит что-то еще?
2) Остается нерешенной проблема отказа от переноса, если числа на целевом стеке уже будут находиться в результате действий предыдущих слов.

Код:
get-first get-second +


Еще раз повторяю вопрос: + заберет два числа с инструментального стека? Даже несмотря на то, что забирать их не надо?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 09, 2009 07:54 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Хищник писал(а):
1) Все числа инструментального стека должны попасть в целевой? А если у нас внизу лежит что-то еще?

Ну один пример того, что на дне инструментального стека лежит что-то уже есть - там лежит адрес кода процедуры в целевом пространстве.
Этот момент легко обходится(уменьшением DEPTH на 1, или пересылкой адреса на стек возвратов).
Хищник писал(а):
2) Остается нерешенной проблема отказа от переноса, если числа на целевом стеке уже будут находиться в результате действий предыдущих слов.

Какой отказ. Перенос уже сделан. На инструментальном стеке ничего нет, значит на целевой ничего уже переноситься не будет.
Стек хоть и целевой, но по-прежнему остается глобальной структурой данных.
Вообщем вопросы типа А если у нас внизу лежит что-то еще? вопросы, на которые надо сначала ответить себе самому.
Хищник писал(а):
Еще раз повторяю вопрос: + заберет два числа с инструментального стека? Даже несмотря на то, что забирать их не надо?

В данном случае + ничего не заберет, так как инструментальный стек пуст.
Если бы было
Код:
5 6 get-first get-second +

то + взял бы 5 6 с инструментального стека заполнил целевую память кодом
Код:
положить числа 5 и 6 на целевой стек
, но при исполнении сложил бы числа, оставленные
словами get-first get-second.
Да еще для конкретности как выглядит определение самого + ( 16-разрядный компилятор для MCS-51)
Код:
s: +   \ n1 n2 --> n1+n2
a=@r0  r0++  a+dpl  dpl=a
a=@r0  r0++  ac+dph dph=a
ret

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 09, 2009 08:48 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
chess писал(а):
Если бы было

Код:5 6 get-first get-second +

то + взял бы 5 6 с инструментального стека заполнил целевую память кодом Код:положить числа 5 и 6 на целевой стек, но при исполнении сложил бы числа, оставленные

словами get-first get-second.

Написал неправильно, на самом деле слово get-first снимет числа 5 6 с инструментального стека и положит их на целевой.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 09, 2009 08:49 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6328
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
chess писал(а):
Ну один пример того, что на дне инструментального стека лежит что-то уже есть - там лежит адрес кода процедуры в целевом пространстве.
Этот момент легко обходится(уменьшением DEPTH на 1, или пересылкой адреса на стек возвратов).

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

Вот именно.

Код:
1 2 3 4 5 6 + - * AND OR

На 6 операндов вполне корректные 5 операций, т.е. выражение вообще корректно. Но каждое из 5 слов заберет с инструментального стека по 2 операнда! То есть уже AND не заберет ничего.
chess писал(а):
Вообщем вопросы типа А если у нас внизу лежит что-то еще? вопросы, на которые надо сначала ответить себе самому.

А чего тут отвечать-то? Я хочу скомпилировать код для МК в соответствии с правилами Форта. Если особенности (читай - глюки) инструментального транслятора не дают мне это сделать - это плохой транслятор, и плохой кросс-компилятор на нем. Как обойти это ограничение - я написал. Конечно, если хочется потом помучаться, вылавливая глюки, можно ответить "да-да, но ведь можно еще и так", и продолжать писать некорректно работающий код.
chess писал(а):
Если бы было
Код:
5 6 get-first get-second +

то + взял бы 5 6 с инструментального стека заполнил целевую память кодом Код:
положить числа 5 и 6 на целевой стек
, но при исполнении сложил бы числа, оставленные
словами get-first get-second.

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


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

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


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

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


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

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