Re[11]: Ссылки по Форту
От: Gaperton http://gaperton.livejournal.com
Дата: 10.03.05 12:00
Оценка:
Здравствуйте, DJ KARIES, Вы писали:
G>>2-я реализация — если так можно назвать — курсовая в универе сделаная за пару дней — SQL Server (спокойно!) реализующий подмножество SQL. Времени было мало (по разгильдяйству), и в качестве рантайма для выполения запросов была за несколько часов (рука уже набита — почти по памяти) реализована простая минимально необходимая форт-машина на С. Подход себя оправдал — дешево, и очень быстро. Проект не сохранился — учебная задача на выброс.
DK>Зато какой опыт!
Да, я был страшно горд — уж очень просто и красиво получилось .

G>>3-я реализация — подсистема выполнения встроенного языка системы CQG (простой язык обработки временных рядов).

DK>Что за язык обработки временных рядов.
Очень простой декларативный язык. Основа грамматики — язык арифметических выражений с присваиваниями и вызовами функций/макросов. Задача, в том, чтобы определяеть функции для трансформации (типа бесконечных) последовательностей чисел. Каждая функция является "чистой" (без побочных эффектов) в пределах рассчета одного значения последовательности.

Довольно интересно писать к нему рантайм, в частности, возникают интересные моменты при попытке ввести теорию типа для этого языка, ввести императивные конструкции (надо преобразовывать программу для сохранения функциональной чистоты, вынося побочный эффект наверх, иначе работать не будет), и прочее. В общем, довольно интересно все получается. Это отдельная и большая тема, я сам в нюансы очень долго вникал.

G>>А как насчет стека — делает ли он честную раскладку по регистрам для арифметики?

DK>Вершина стека в регистре EAX, второй элемент в [ESI].
DK>Т.е. например для сложения мы делаем вот что:
DK>
  add eax,[esi]
DK>    sub esi,4
DK>

DK>Либо инлайним 3 байта макросом на Форте:
DK>
: + $ad0601 3, ;


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

В сети я встречал статью (в контексте Форт), где предлагался подобный алгоритм определения раскладки регистров для стековой арифметики — работает как оптимизация на байт-коде отдельным проходом (т. е. при кодогенерации опять рассматривается группа операций одновременно). В retroforth применяются подобные оптимизации?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.