Страница 2 из 2

Re: Обратный ход

СообщениеДобавлено: 19.09.2008 22:04:46
B4rr4cuda
Эх, люди.
Линкера нормального нет, дебагер тупит, IDE временами тупит дико, смартлинк пришибленый,
виджетсеты не добиты, а вы о бэктрейстинге....

Re: Обратный ход

СообщениеДобавлено: 19.09.2008 22:10:41
shade
alexs писал(а):всю трассу исполнения программы писать несколько накладно - ты не находиш?

А всю и не надо, хватит от бряка до бряка :) Ведь всегда можно с той или иной степенью локализовать проблему.

Повторное проигрывание, типа откатились и снова пошли исполнять - не всегда возможно. Ведь кроме того, что контролирует наш код, есть еще и библиотеки и системные вызовы. А вот записать кусок трассы и просматривать её назад/вперед вполне можно.

Добавлено спустя 1 минуту 18 секунд:
B4rr4cuda писал(а):Эх, люди. Линкера нормального нет, дебагер тупит, IDE временами тупит дико, смартлинк пришибленый, виджетсеты не добиты, а вы о бэктрейстинге....

У полёта мысли супремум бесконечен :lol:

Re: Обратный ход

СообщениеДобавлено: 19.01.2009 19:37:03
utkin
А как быть с условными переходами?

Re: Обратный ход

СообщениеДобавлено: 20.01.2009 00:20:43
*vmr
А можно ли со стоящим на борту жедезом работать в обратном направлении?

Re: Обратный ход

СообщениеДобавлено: 20.01.2009 03:06:15
bw
При чем здесь железо?
Я никогда не говорил об обратной трассировке машинного кода. Вы же не воспринимаете программу на Pascal как набор машинных кодов, наверное для вас это всё же код на Pascal. Почему, когда речь идет об обратном разборе этого кода, вы воспринимаете эту операцию буквально и пытаете представить обратный разбор инструкций с непонятной обработкой стека и регистров. Просто представьте, что тот же код на Pascal перевернут с ног на голову (не машинные инструкции, а операторы Pascal), хотя это упрощенное представление. Можно даже добавить такие вещи:
Код: Выделить всё
begin
  Inc(x);
back
  Dec(x);
end;

Где Inc(x) выполняется при прямом проходе, а Dec(x) - при обратном.

Вопрос состоит в том, как это можно использовать? Фактически я предложил инструмент, осталось найти ему применение :-).

Что касается переходов, надеюсь речь не о goto. В любом случае, есть два варианта; (1) это запомнить точку, откуда совершен переход и, при достижении метки, вернуться к этой точке, в момент обратного прохода, или (2) "по всем правилам", пройти мимо метки (как и при прямом проходе).

..bw

Re: Обратный ход

СообщениеДобавлено: 21.01.2009 14:41:56
utkin
Ваша точка зрения на проблему не решает вопрос условных переходов.
Как откатить назад:
if x>0 then
begin
write(x);
end
ELSE
begin
write(y);
end;

Re: Обратный ход

СообщениеДобавлено: 21.01.2009 22:04:31
bw
Один из вариантов должен подойти:

1. Условие игнорируется. Будут выполняться операторы в обратном порядке из блока, который выполнялся при прямом проходе.
2. Условие игнорируется. Будут выполняться операторы в прямом порядке из блока, который выполнялся при прямом проходе.
3. Выполняется условие. Операторы в блоке выполняются в прямом порядке.

Мне кажется, это должен быть третий.

..bw

Re: Обратный ход

СообщениеДобавлено: 22.01.2009 09:41:51
utkin
Все равно непонятно. Усложним пример.
If x>0 then
begin
y:=y*7-8;
end
Else
begin
y:=8*y-7;
end;

Какой у до выполнения?
Не подумайте, что я придираюсь. Просто меня заинтересовала Ваша идея. Если решить некторые тонкости, то такой механизм можно будет использовать для несложных языков программирования (на мой взгляд).

Re: Обратный ход

СообщениеДобавлено: 26.04.2013 18:50:51
Alex2013
О легендарный анстрим ? В чистом виде идея практически не реализуема хотя можно наверное написать или специальный "полиндромный" компилятор генерирующий "обратимый код" или для ЯВУ особый интерпретатор позволяющий ограниченно запускать "обратный режим" . То есть грубо говоря поменять входящие и выходящие данные местами . (Ужасы функционального программирования лучше вообще не вспоминать потому что это на самом деле страшно ... как минимум для моей "крыши" )

Re: Обратный ход

СообщениеДобавлено: 01.07.2019 21:46:00
Ildus
Есть идея, можно используя goto и label, создать обратный порядок прохода по коду.
Это будет выглядеть примерно так:
Код: Выделить всё
program BackCompile;
label goback1,goback2;
var
y,x:integer;
back1:boolean;

procedure back;
begin
back1:=true;
goto goback2;
end;

begin
goback1;
y:=4+x;
if back1=false then
begin
goback2;
x:=y+5*2;
if back1 then goto goback1;
x:=5+y;
back;
end;
end.


Но при большом коде, это будет довольно муторно, но можно в самом Lazarus сделать так, что бы все это не было видно, кроме функции back.
(Честно, никогда не пользовался goto и label)

Добавлено спустя 2 минуты 12 секунд:
Также есть еще одна идея для улучшения IDE: добавить возможность присваивания нескольким переменным одно значение, если такой нет конечно.

Пример:
Код: Выделить всё
var
x,y:integer;
begin
x,y:=0;
end.

Или так:
Код: Выделить всё
(x,y):=0;