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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 366 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25
Автор Сообщение
 Заголовок сообщения: Re: СПФ и оптимизатор
СообщениеДобавлено: Пт янв 06, 2017 14:57 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
Это делает код менее прозрачным/управляемым

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

Смотря с какой стороны посмотреть. В плане написания непойми-чего-непойми-зачем да. Но работа сделанная один раз. И тут уже есть свои печеньки :)

_________________
Цель: сделать 64-битную Нову под Винду


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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: СПФ и оптимизатор
СообщениеДобавлено: Пт янв 06, 2017 15:52 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации?

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

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

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

Как можно перейти с конкретной форт-системы на FORTH? Ссылку тогда дайте, скачаю, поюзаю. Как форк Molegа или кварк Хищника.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: СПФ и оптимизатор
СообщениеДобавлено: Пт янв 06, 2017 16:05 
Victor__v писал(а):
Не в теме работы с win-ресурсами
Вера не позволяет? Ну, например, в текущем проекте есть много "страниц" - слов, состоящих, в основном из вызовов ." . Срочно понадобилось оглавление - просто добавил слово, ищущее в слове первое вхождение кода (.").
Victor__v писал(а):
Библиотеки, не?
FORTH-библиотека - оксюморон.
Victor__v писал(а):
Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет.
Дык, о том и спич. Когда у меня в данном случае дошло до списков, сразу стало понятно, что применение "стандартных" только усложнит дело. И только в процессе сформировался перечень необходимых операций.
Victor__v писал(а):
Как можно перейти с конкретной форт-системы на FORTH?
Использование "конкретного FORTH" - это, по сути, программирование на BASIC. (Да, конечно, в любой BASIC можно вставлять оптимизированные коды, но FORTH-ом он от этого не становится). FORTH - это не язык, это метод: имеем A (язык машины), пишем на нем на коленке за неделю язык F (FORTH), затем на нем - P (проблемно-ориентированный язык), отдаем последний пользователю для решения своих задач.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: СПФ и оптимизатор
СообщениеДобавлено: Вт янв 17, 2017 19:33 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Читал и напоролся на вот это :
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


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Более того, эту шизовую идею можно усовершенствовать.
Программа выше порождает вот такой подпрограммный шитый код :
Код:
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            

Такая вот шизовая идея самооптимизирующегося подпрограммного шитого кода стек-машины средствами Паскаля.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 366 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25

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


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

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


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

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