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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - СПФ и оптимизатор
Автор Сообщение
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Более того, эту шизовую идею можно усовершенствовать.
Программа выше порождает вот такой подпрограммный шитый код :
Код:
14A3:00DE B83000        MOV   AX,0030   
14A3:00E1 50            PUSH   AX       
14A3:00E2 FF1E4800      CALL   FAR [0048] ; call_косвенный NOOP ... ret
14A3:00E6 B80500        MOV   AX,0005   
14A3:00E9 50            PUSH   AX       
14A3:00EA FF1E4800      CALL   FAR [0048] ; call_косвенный NOOP ... ret
14A3:00EE FF1E5400      CALL   FAR [0054] ; call_косвенный _PLUS ... ret 4
14A3:00F2 50            PUSH   AX       
14A3:00F3 FF1E4800      CALL   FAR [0048] ; call_косвенный NOOP ... ret
14A3:00F7 B83800        MOV   AX,0038   
14A3:00FA 50            PUSH   AX       
14A3:00FB FF1E4800      CALL   FAR [0048] ; call_косвенный NOOP ... ret
14A3:00FF FF1E4C00      CALL   FAR [004C] ; call_косвенный _DROP ... ret 2
14A3:0103 FF1E5000      CALL   FAR [0050] ; call_косвенный _EMIT ... ret 2
14A3:0107 0E            PUSH   CS       
14A3:0108 E8F5FE        CALL   0000       ; call_прямой NOOP ... ret

В нем единственная явная кривизна - постоянные возовы подпрограммы NOOP,
которая вообще ничего не делает. Неряшливый в итоге получился код.

Но если заметить, что вызовы подпрограммы NOOP в любом случае занимают
четыре байта, то возникает идея - пусть подпрограмма NOOP сама свои
вызовы и заметает. Если в каком-либо месте кода она вызовется только
однократно, то это заметно на быстродействие кода не повлияет. А если этот
код выполняется неоднократно, то при первом вызове NOOP собственный вызов
затрет nop-ами и дальше код будет исполняться в соптимизированном виде.

Сделаем подпрограмму NOOP такой :
Код:
Procedure NOOP ;
Var I : Integer;
Begin
   LongInt(Pointer(LongInt(Pointer(LongInt(@I) + 4)^) - 4)^) := $90909090
End;
Что породит в ней вот такой компактный код заметания собственных вызовов :
Код:
14A3:000E 8B4602        MOV   AX,[BP+02]           
14A3:0011 8B5604        MOV   DX,[BP+04]           
14A3:0014 2D0400        SUB   AX,0004             
14A3:0017 83DA00        SBB   DX,+00               
14A3:001A 89C7          MOV   DI,AX               
14A3:001C 8EC2          MOV   ES,DX               
14A3:001E 26            ES:                        
14A3:001F C7059090      MOV   WORD PTR [DI],9090   
14A3:0023 26            ES:                        
14A3:0024 C745029090    MOV   WORD PTR [DI+02],9090
Здесь чтение [BP+02] и [BP+04] это ничто иное, как чтение адреса возврата.

В результате в процессе исполнения код программы сам превратится в :
Код:
14A3:00FF B83000        MOV   AX,0030   
14A3:0102 50            PUSH   AX       
14A3:0103 90            NOP            
14A3:0104 90            NOP            
14A3:0105 90            NOP            
14A3:0106 90            NOP            
14A3:0107 B80500        MOV   AX,0005   
14A3:010A 50            PUSH   AX       
14A3:010B 90            NOP            
14A3:010C 90            NOP            
14A3:010D 90            NOP            
14A3:010E 90            NOP            
14A3:010F FF1E5400      CALL   FAR [0054] <- вызов _PLUS
14A3:0113 50            PUSH   AX       
14A3:0114 90            NOP            
14A3:0115 90            NOP            
14A3:0116 90            NOP            
14A3:0117 90            NOP            
14A3:0118 B83800        MOV   AX,0038   
14A3:011B 50            PUSH   AX       
14A3:011C 90            NOP            
14A3:011D 90            NOP            
14A3:011E 90            NOP            
14A3:011F 90            NOP            
14A3:0120 FF1E4C00      CALL   FAR [004C] <- вызов _DROP
14A3:0124 FF1E5000      CALL   FAR [0050] <- вызов _EMIT
14A3:0128 90            NOP            
14A3:0129 90            NOP            
14A3:012A 90            NOP            
14A3:012B 90            NOP            

Такая вот шизовая идея самооптимизирующегося подпрограммного шитого кода стек-машины средствами Паскаля.
Сообщение Добавлено: Ср янв 18, 2017 00:19
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Читал и напоролся на вот это :
Mihail писал(а):
Вопрос сводится к тому, возможно в рамках прораммы на Си реализовать подпрограммый шитый код с ТОСом. По моему нет.
Очень интересный вопрос. На Си с его удалением параметров со стека вызывающим кодом похоже, что нет. А вот на Пасцале с удалением параметров вызываемым кодом похоже, что да. Надо только преодолеть строгую типизацию. На поделиях Борланд есть нетипизированный указатель Pointer. Это то, что дохтур прописал.

Вот, только что проверил на Borland Pascal 6.0. И прекрасно работает :
Код:
{$F+}
Type _   = Procedure            ;
     n_  = Procedure(I:Integer) ;
     f   = Function:Integer     ;
Var  ptr  : Pointer ;

(* Форт слова не изменяющие глубину стека : *)

Procedure NOOP ;
Begin
End;

(* Форт слова    изменяющие глубину стека : *)

Var tos  : n_ ; (* уложение на стек результата функции *)
    DROP : _  ;
    EMIT : _  ;
    PLUS : f  ;

Procedure _DROP(I:Integer) ;
Begin
End;

Procedure _EMIT(I:Integer) ;
Begin
   Write(Chr(I))
End;

Function _PLUS(I,J:Integer):Integer ;
Begin
   _PLUS := I + J
End;

(* Внутренняя кухня работы со стеком и преодоление типизации : *)

Begin
   ptr := @NOOP  ; tos  := n_(ptr) ;
   ptr := @_DROP ; DROP :=  _(ptr) ;
   ptr := @_EMIT ; EMIT :=  _(ptr) ;
   ptr := @_PLUS ; PLUS :=  f(ptr) ;

(* Подпрограммный шитый код : *)

   tos ( $30  ) ; (* [ HEX ] 30 5 + 38 DROP EMIT NOOP *)
   tos ( 5    ) ;
   tos ( PLUS ) ;
   tos ( $38  ) ;
         DROP   ;
         EMIT   ;
         NOOP   ;
End.
Выводит символ 5

Единственное, я здесь расщепил слова принимающие данные со стека и возвращающие их на стек (в даннос случае слово + ) на два действия :
- сначала забрать со стека, подсчитать и вернуть результат как значение функции
- а потом уложить значение функции на стек

Смешно самому как это работает.
tos ( ) ; здесь генерирует CALL с параметром на подпрограмму NOOP , которая ничего не делает и завершается RET. В итоге параметр остается на стеке. :D
DROP ; генерирует CALL без параметров на подпрограмму _DROP , которая ничего не делает, зато завершается по RET_2 . Вот тебе и фортовский DROP :D
EMIT ; генерирует CALL без параметров на подпрограмму _EMIT, которая выводит параметр, который ей не передавался, то есть с вершины стека и завершается по RET_2 удаляя его со стека :D
Сообщение Добавлено: Вт янв 17, 2017 19:33
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Victor__v писал(а):
Не в теме работы с win-ресурсами
Вера не позволяет? Ну, например, в текущем проекте есть много "страниц" - слов, состоящих, в основном из вызовов ." . Срочно понадобилось оглавление - просто добавил слово, ищущее в слове первое вхождение кода (.").
Victor__v писал(а):
Библиотеки, не?
FORTH-библиотека - оксюморон.
Victor__v писал(а):
Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет.
Дык, о том и спич. Когда у меня в данном случае дошло до списков, сразу стало понятно, что применение "стандартных" только усложнит дело. И только в процессе сформировался перечень необходимых операций.
Victor__v писал(а):
Как можно перейти с конкретной форт-системы на FORTH?
Использование "конкретного FORTH" - это, по сути, программирование на BASIC. (Да, конечно, в любой BASIC можно вставлять оптимизированные коды, но FORTH-ом он от этого не становится). FORTH - это не язык, это метод: имеем A (язык машины), пишем на нем на коленке за неделю язык F (FORTH), затем на нем - P (проблемно-ориентированный язык), отдаем последний пользователю для решения своих задач.
Сообщение Добавлено: Пт янв 06, 2017 16:05
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Цитата:
Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации?

Не в теме работы с win-ресурсами
Цитата:
работы, сделанной один раз

Библиотеки, не?
Цитата:
Вы долго и нудно создавали списки

Да. Дело было и есть. И либа ещё не закончена. Практической потребности в доп.развитии не возникло. Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет.
Цитата:
Давно пора переходить на FORTH

Как можно перейти с конкретной форт-системы на FORTH? Ссылку тогда дайте, скачаю, поюзаю. Как форк Molegа или кварк Хищника.
Сообщение Добавлено: Пт янв 06, 2017 15:52
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Victor__v писал(а):
Приведите примеры.
Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации?
Victor__v писал(а):
Работаю с СПФ
Давно пора переходить на FORTH.
Victor__v писал(а):
Смотря с какой стороны посмотреть.
Со стороны: " в [FORTH-]программе нет кода, не написанного под текущую задачу". И нет понятия "работы, сделанной один раз".
Victor__v писал(а):
В плане написания непойми-чего-непойми-зачем да.
Пардон, но именно этим Вы и занимаетесь. Например, Вы долго и нудно создавали списки как "кубического коня в вакууме"... Когда же мне понадобилось быстренько сбацать списково-карточную-машину, оказалось достаточно всего трех недолексикончиков - пары слов добавления элемента по месту курсора, слова, выполняющего ф-ию для всего списка, и слова для извлечения случайного элемента (плюс, десяток слов, естественно родившихся в процессе написания этих)... Причем, этот набор операций выработался в процессе "диалога с системой".
Сообщение Добавлено: Пт янв 06, 2017 15:25
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Цитата:
Это делает код менее прозрачным/управляемым

Приведите примеры. Работаю с СПФ, чего-то такого не замечаю
Цитата:
Это лишняя работа

Смотря с какой стороны посмотреть. В плане написания непойми-чего-непойми-зачем да. Но работа сделанная один раз. И тут уже есть свои печеньки :)
Сообщение Добавлено: Пт янв 06, 2017 14:57
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Victor__v писал(а):
Что плохого в том, чтобы убрать лишний код в программе?
1. Это делает код менее прозрачным/управляемым.
2. Это лишняя работа.

Суть FORTH - в программе нет кода, не написанного под текущую задачу. Любой дополнительный код - мусор, снижающий способность решения задачи.
Сообщение Добавлено: Пт янв 06, 2017 14:14
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Что плохого в том, чтобы убрать лишний код в программе?
Если call занимает пять байт, а сам вызываемый код три байта. Что лучше? Вызов или инлайн?
Какой переход использовать? Длинный? Короткий? По возможности?
Сообщение Добавлено: Пт янв 06, 2017 14:09
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Victor__v писал(а):
Обоснование?
Опыт. См. в той же теме - http://fforum.winglion.ru/viewtopic.php?p=33562#p33562. Я не видел еще ни одной программы, тормоза которой определялись бы ПО - всегда это была вина криворукого программиста.

В случае FORTH -тем более - исполняемый код, получаемый на выходе FORTH-системы, буде это кому, в принципе, понадобится, совершенно не обязан иметь FORTH-структуру...
Сообщение Добавлено: Пт янв 06, 2017 13:46
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Обоснование?
Сообщение Добавлено: Пт янв 06, 2017 13:37
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Victor__v писал(а):
Стоит ли писать оптимизацию под это?

Оптимизацию вообще не стоит писать.
Сообщение Добавлено: Пт янв 06, 2017 12:58
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Mihail писал(а):
rvm писал(а):
Код:
: a 10 DUP + ; a . \ --> 5686777

Исправил

Спасибо, тест проходит. Этим файлом допустимо заменить версию 1.76 в репозитории?
Сообщение Добавлено: Пт мар 23, 2012 00:36
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
rvm писал(а):
Код:
: a 10 DUP + ; a . \ --> 5686777

Исправил
Сообщение Добавлено: Чт мар 22, 2012 12:18
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
rvm писал(а):
Еще одна ошибка

Код:
: a 10 DUP + ; a . \ --> 5686777

Также неверно работает с OR, XOR, AND(если они стоят на месте + ).
Сообщение Добавлено: Чт мар 22, 2012 10:18
  Заголовок сообщения:  Re: СПФ и оптимизатор  Ответить с цитатой
Mihail писал(а):
rvm писал(а):
слово HASH не работает.

Исправил

Еще одна ошибка
Код:
: a 10 DUP + ; a . \ --> 5686777
Сообщение Добавлено: Чт мар 22, 2012 09:22

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


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