Автор |
Сообщение |
|
|
Заголовок сообщения: |
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 Такая вот шизовая идея самооптимизирующегося подпрограммного шитого кода стек-машины средствами Паскаля.
Более того, эту шизовую идею можно усовершенствовать. Программа выше порождает вот такой подпрограммный шитый код : [code]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[/code] В нем единственная явная кривизна - постоянные возовы подпрограммы NOOP, которая вообще ничего не делает. Неряшливый в итоге получился код.
Но если заметить, что вызовы подпрограммы NOOP в любом случае занимают четыре байта, то возникает идея - пусть подпрограмма NOOP сама свои вызовы и заметает. Если в каком-либо месте кода она вызовется только однократно, то это заметно на быстродействие кода не повлияет. А если этот код выполняется неоднократно, то при первом вызове NOOP собственный вызов затрет nop-ами и дальше код будет исполняться в соптимизированном виде.
Сделаем подпрограмму NOOP такой : [code]Procedure NOOP ; Var I : Integer; Begin LongInt(Pointer(LongInt(Pointer(LongInt(@I) + 4)^) - 4)^) := $90909090 End;[/code]Что породит в ней вот такой компактный код заметания собственных вызовов : [code]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[/code]Здесь чтение [BP+02] и [BP+04] это ничто иное, как чтение адреса возврата.
В результате в процессе исполнения код программы сам превратится в : [code]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 [/code] Такая вот шизовая идея самооптимизирующегося подпрограммного шитого кода стек-машины средствами Паскаля.
|
|
|
|
Добавлено: Ср янв 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. В итоге параметр остается на стеке. DROP ; генерирует CALL без параметров на подпрограмму _DROP , которая ничего не делает, зато завершается по RET_2 . Вот тебе и фортовский DROP EMIT ; генерирует CALL без параметров на подпрограмму _EMIT, которая выводит параметр, который ей не передавался, то есть с вершины стека и завершается по RET_2 удаляя его со стека
Читал и напоролся на вот это :[quote="Mihail"] Вопрос сводится к тому, возможно в рамках прораммы на Си реализовать подпрограммый шитый код с ТОСом. По моему нет.[/quote]Очень интересный вопрос. На Си с его удалением параметров со стека вызывающим кодом похоже, что нет. А вот на Пасцале с удалением параметров вызываемым кодом похоже, что да. Надо только преодолеть строгую типизацию. На поделиях Борланд есть нетипизированный указатель Pointer. Это то, что дохтур прописал.
Вот, только что проверил на Borland Pascal 6.0. И прекрасно работает : [code]{$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.[/code]Выводит символ 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 (проблемно-ориентированный язык), отдаем последний пользователю для решения своих задач.
[quote="Victor__v"]Не в теме работы с win-ресурсами[/quote]Вера не позволяет? Ну, например, в текущем проекте есть много "страниц" - слов, состоящих, в основном из вызовов ." . Срочно понадобилось оглавление - просто добавил слово, ищущее в слове первое вхождение кода (."). [quote="Victor__v"]Библиотеки, не?[/quote]FORTH-библиотека - оксюморон. [quote="Victor__v"]Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет.[/quote]Дык, о том и спич. Когда у меня в данном случае дошло до списков, сразу стало понятно, что применение "стандартных" только усложнит дело. И только в процессе сформировался перечень необходимых операций. [quote="Victor__v"]Как можно перейти с конкретной форт-системы на FORTH?[/quote]Использование "конкретного FORTH" - это, по сути, программирование на BASIC. (Да, конечно, в любой BASIC можно вставлять оптимизированные коды, но FORTH-ом он от этого не становится). FORTH - это не язык, это метод: [b]имеем A (язык машины), пишем на нем на коленке за неделю язык F (FORTH), затем на нем - P (проблемно-ориентированный язык), отдаем последний пользователю для решения своих задач[/b].
|
|
|
|
Добавлено: Пт янв 06, 2017 16:05 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Цитата: Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации? Не в теме работы с win-ресурсами Цитата: работы, сделанной один раз Библиотеки, не? Цитата: Вы долго и нудно создавали списки Да. Дело было и есть. И либа ещё не закончена. Практической потребности в доп.развитии не возникло. Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет. Цитата: Давно пора переходить на FORTH Как можно перейти с конкретной форт-системы на FORTH? Ссылку тогда дайте, скачаю, поюзаю. Как форк Molegа или кварк Хищника.
[quote]Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации?[/quote] Не в теме работы с win-ресурсами [quote]работы, сделанной один раз[/quote] Библиотеки, не? [quote] Вы долго и нудно создавали списки[/quote] Да. Дело было и есть. И либа ещё не закончена. Практической потребности в доп.развитии не возникло. Ещё два примера могу привести, где развить можно и дальше, но необходимости пока нет. [quote]Давно пора переходить на FORTH[/quote] Как можно перейти с конкретной форт-системы на [b]FORTH[/b]? Ссылку тогда дайте, скачаю, поюзаю. Как форк Molegа или кварк Хищника.
|
|
|
|
Добавлено: Пт янв 06, 2017 15:52 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Victor__v писал(а): Приведите примеры. Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации? Victor__v писал(а): Работаю с СПФ Давно пора переходить на FORTH. Victor__v писал(а): Смотря с какой стороны посмотреть. Со стороны: " в [FORTH-]программе нет кода, не написанного под текущую задачу". И нет понятия "работы, сделанной один раз". Victor__v писал(а): В плане написания непойми-чего-непойми-зачем да. Пардон, но именно этим Вы и занимаетесь. Например, Вы долго и нудно создавали списки как "кубического коня в вакууме"... Когда же мне понадобилось быстренько сбацать списково-карточную-машину, оказалось достаточно всего трех недолексикончиков - пары слов добавления элемента по месту курсора, слова, выполняющего ф-ию для всего списка, и слова для извлечения случайного элемента (плюс, десяток слов, естественно родившихся в процессе написания этих)... Причем, этот набор операций выработался в процессе "диалога с системой".
[quote="Victor__v"]Приведите примеры.[/quote]Например, мне понадобилось встроить в свой FOBOS диалоговые WIN-ресурсы. Я распечатал несколько дампов WIN-экзешников с извесными исходниками и тупо их сопоставил. А теперь, представьте себе, что мелко-гибкие свой диалоговый язык оптимизовали... Сколько мне бы пришлось восстанавливать логику такой оптимизации? [quote="Victor__v"]Работаю с СПФ[/quote]Давно пора переходить на FORTH. [quote="Victor__v"]Смотря с какой стороны посмотреть.[/quote]Со стороны: " в [FORTH-]программе нет кода, не написанного под текущую задачу". И нет понятия "работы, сделанной один раз". [quote="Victor__v"]В плане написания непойми-чего-непойми-зачем да.[/quote]Пардон, но именно этим Вы и занимаетесь. Например, Вы долго и нудно создавали списки как "кубического коня в вакууме"... Когда же мне понадобилось быстренько сбацать списково-карточную-машину, оказалось достаточно всего трех недолексикончиков - пары слов добавления элемента по месту курсора, слова, выполняющего ф-ию для всего списка, и слова для извлечения случайного элемента (плюс, десяток слов, естественно родившихся в процессе написания этих)... Причем, этот набор операций выработался в процессе "диалога с системой".
|
|
|
|
Добавлено: Пт янв 06, 2017 15:25 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Цитата: Это делает код менее прозрачным/управляемым Приведите примеры. Работаю с СПФ, чего-то такого не замечаю Цитата: Это лишняя работа Смотря с какой стороны посмотреть. В плане написания непойми-чего-непойми-зачем да. Но работа сделанная один раз. И тут уже есть свои печеньки
[quote] Это делает код менее прозрачным/управляемым[/quote] Приведите примеры. Работаю с СПФ, чего-то такого не замечаю [quote]Это лишняя работа[/quote] Смотря с какой стороны посмотреть. В плане написания непойми-чего-непойми-зачем да. Но работа сделанная один раз. И тут уже есть свои печеньки :)
|
|
|
|
Добавлено: Пт янв 06, 2017 14:57 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Victor__v писал(а): Что плохого в том, чтобы убрать лишний код в программе? 1. Это делает код менее прозрачным/управляемым. 2. Это лишняя работа. Суть FORTH - в программе нет кода, не написанного под текущую задачу. Любой дополнительный код - мусор, снижающий способность решения задачи.
[quote="Victor__v"]Что плохого в том, чтобы убрать лишний код в программе?[/quote]1. Это делает код менее прозрачным/управляемым. 2. Это лишняя работа.
Суть FORTH - в программе нет кода, не написанного под текущую задачу. Любой дополнительный код - мусор, снижающий способность решения задачи.
|
|
|
|
Добавлено: Пт янв 06, 2017 14:14 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Что плохого в том, чтобы убрать лишний код в программе? Если call занимает пять байт, а сам вызываемый код три байта. Что лучше? Вызов или инлайн? Какой переход использовать? Длинный? Короткий? По возможности?
Что плохого в том, чтобы убрать лишний код в программе? Если call занимает пять байт, а сам вызываемый код три байта. Что лучше? Вызов или инлайн? Какой переход использовать? Длинный? Короткий? По возможности?
|
|
|
|
Добавлено: Пт янв 06, 2017 14:09 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Victor__v писал(а): Обоснование? Опыт. См. в той же теме - http://fforum.winglion.ru/viewtopic.php?p=33562#p33562. Я не видел еще ни одной программы, тормоза которой определялись бы ПО - всегда это была вина криворукого программиста. В случае FORTH -тем более - исполняемый код, получаемый на выходе FORTH-системы, буде это кому, в принципе, понадобится, совершенно не обязан иметь FORTH-структуру...
[quote="Victor__v"]Обоснование?[/quote]Опыт. См. в той же теме - [url]http://fforum.winglion.ru/viewtopic.php?p=33562#p33562[/url]. Я не видел еще ни одной программы, тормоза которой определялись бы ПО - всегда это была вина криворукого программиста.
В случае FORTH -тем более - исполняемый код, получаемый на выходе FORTH-системы, буде это кому, в принципе, понадобится, совершенно не обязан иметь FORTH-структуру...
|
|
|
|
Добавлено: Пт янв 06, 2017 13:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Обоснование?
Обоснование?
|
|
|
|
Добавлено: Пт янв 06, 2017 13:37 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Victor__v писал(а): Стоит ли писать оптимизацию под это? Оптимизацию вообще не стоит писать.
[quote="Victor__v"]Стоит ли писать оптимизацию под это?[/quote] Оптимизацию вообще не стоит писать.
|
|
|
|
Добавлено: Пт янв 06, 2017 12:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Mihail писал(а): rvm писал(а): Код: : a 10 DUP + ; a . \ --> 5686777 ИсправилСпасибо, тест проходит. Этим файлом допустимо заменить версию 1.76 в репозитории?
[quote="Mihail"][quote="rvm"][code]: a 10 DUP + ; a . \ --> 5686777 [/code][/quote] [url=http://fpauk.narod.ru/macroopt.f]Исправил[/url][/quote] Спасибо, тест проходит. Этим файлом допустимо заменить версию 1.76 в [url=http://spf.cvs.sourceforge.net/viewvc/spf/src/macroopt.f?view=log]репозитории[/url]?
|
|
|
|
Добавлено: Пт мар 23, 2012 00:36 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
rvm писал(а): Код: : a 10 DUP + ; a . \ --> 5686777 Исправил
[quote="rvm"][code]: a 10 DUP + ; a . \ --> 5686777 [/code][/quote] [url=http://fpauk.narod.ru/macroopt.f]Исправил[/url]
|
|
|
|
Добавлено: Чт мар 22, 2012 12:18 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
rvm писал(а): Еще одна ошибка
Код: : a 10 DUP + ; a . \ --> 5686777 Также неверно работает с OR, XOR, AND(если они стоят на месте + ).
[quote="rvm"]Еще одна ошибка
Код: : a 10 DUP + ; a . \ --> 5686777 [/quote] Также неверно работает с OR, XOR, AND(если они стоят на месте + ).
|
|
|
|
Добавлено: Чт мар 22, 2012 10:18 |
|
|
|
|
|
Заголовок сообщения: |
Re: СПФ и оптимизатор |
|
|
Mihail писал(а): rvm писал(а): слово HASH не работает. ИсправилЕще одна ошибкаКод: : a 10 DUP + ; a . \ --> 5686777
[quote="Mihail"][quote="rvm"]слово HASH не работает.[/quote] [url=http://fpauk.narod.ru/macroopt.f]Исправил[/url][/quote] Еще [url=http://article.gmane.org/gmane.comp.lang.forth.spf/2334]одна ошибка[/url] [code]: a 10 DUP + ; a . \ --> 5686777 [/code]
|
|
|
|
Добавлено: Чт мар 22, 2012 09:22 |
|
|
|
|