Автор Тема: [BlackBox] Compiler trap.  (Прочитано 35329 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
[BlackBox] Compiler trap.
« : Май 18, 2013, 02:19:34 am »
Так, народ, что-то мне с BlackBox "везет" на всякие его особенности.

Вот поймал trap компилятора при попытке собрать простой модуль.

Воспроизводится везде, и в школьной сборке информатики-21 (BB 1.5), и в стоковом BB 1.6, и в красноярской сборке BB.

Исходник модуля и сам трап прикладываю. Также, на всякий случай, вот в интернеточитабельном виде исходник модуля:
MODULE Blur;
   IMPORT Kernel, Out:=StdLog;
   
   CONST
      width = 640;
      height = 480;
      N = 13;
      frames = 1000;
     
      red = 0;
      green = 1;
      blue = 2;
     
   TYPE
      Frame = ARRAY width*height*(blue+1) OF SHORTCHAR;
         
   PROCEDURE Index(x,y,color : INTEGER) : INTEGER;
   BEGIN
      RETURN ((x+y*width)*3+color)
   END Index;
   
   PROCEDURE Blur(IN in : Frame; OUT out : Frame);
   VAR
      x,y,c : INTEGER;
   BEGIN
      FOR y:=1 TO height-2 DO
         FOR x:=1 TO width-2 DO
            FOR c:=red TO blue DO
               out[Index(x,y,c)] := SHORT(CHR( ( ORD(in[Index(x,y-1,c)]) + ORD(in[Index(x,y+1,c)]) +
                                             ORD(in[Index(x-1,y,c)]) + ORD(in[Index(x+1,y,c)]) ) DIV 4  ));
            END;
         END;
      END;
   END Blur;
   
   PROCEDURE Do*;
   VAR
      time : LONGINT;
      f, n : INTEGER;
      a1, a2 : POINTER TO Frame;
   BEGIN
      NEW(a1);
      NEW(a2);
      time := Kernel.Time();
     
      FOR f:=1 TO frames DO
         FOR n:=1 TO N DO           
            Blur(a1,a2);
            Blur(a2,a1)
         END
      END;
     
      Out.Real((Kernel.Time() - time)/1000)
   END Do;   
BEGIN
END Blur.

PS. Это я приводил к единому виду исходники той blur-задачки для всех языков программирования. Это, собственно наиваная читабельная реализация алгоритма. Очень важно чтобы оно заработало на ББ, иначе в статье ББ придется заменить другой реализацией Оберона, а этого сильно хочется избежать по ряду причин.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #1 : Май 18, 2013, 04:41:29 am »
Так, народ, что-то мне с BlackBox "везет" на всякие его особенности.

Ему не нравится DIV 4. Если все выражение из CHR засунуть во временную переменную - начинает компилить. Причем слева у него тоже должно быть что-то сложное - просто CHAR(x DIV 4) нормально отрабатывает.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #2 : Май 18, 2013, 09:49:04 am »
Если out[Index(x,y,c)] заменить на что-то вроде out[10] - то всё компилируется. Видимо баг, пиши в оминк )

DddIzer

  • Гость
Re: [BlackBox] Compiler trap.
« Ответ #3 : Май 18, 2013, 10:37:48 am »
Так, народ, что-то мне с BlackBox "везет" на всякие его особенности.

:) гы,  - приветик мифу (  Инфо21 ) о том, что из идеологической  простоты компилятора следует его "надежная" реализация...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #4 : Май 18, 2013, 01:17:43 pm »
Если out[Index(x,y,c)] заменить на что-то вроде out[10] - то всё компилируется. Видимо баг, пиши в оминк )

Написал.
Y = λf.(λx.f (x x)) (λx.f (x x))

maliya

  • Newbie
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #5 : Май 18, 2013, 01:49:06 pm »
DevCPC486.GetReg
                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 6 IN s THEN n := 6
ELSIF 7 IN s THEN n := 7
ELSIF 1 IN s THEN n := 1
ELSE n := 3
END;
                        ....


change to

                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 1 IN s THEN n := 1
ELSIF 3 IN s THEN n := 3
                        ELSIF 6 IN s THEN n := 6
ELSE n := 7
END;
                        ....


valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #6 : Май 18, 2013, 02:45:17 pm »
DevCPC486.GetReg
                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 6 IN s THEN n := 6
ELSIF 7 IN s THEN n := 7
ELSIF 1 IN s THEN n := 1
ELSE n := 3
END;
                        ....


change to

                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 1 IN s THEN n := 1
ELSIF 3 IN s THEN n := 3
                        ELSIF 6 IN s THEN n := 6
ELSE n := 7
END;
                        ....

Thanks. Can you explain this fix? It is safe?
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #7 : Май 18, 2013, 03:59:55 pm »
Fix от maliya работает. BlackBox после пересборки тоже работает )

maliya

  • Newbie
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #8 : Май 18, 2013, 04:15:28 pm »

Can you explain this fix? It is safe?
[/quote]

it only change the regsiter select order;I think it is safe.




valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #9 : Май 18, 2013, 07:38:02 pm »
Цитировать
Can you explain this fix? It is safe?
it only change the regsiter select order;I think it is safe.
OK. But why this order is better then old one?
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #10 : Май 18, 2013, 11:02:31 pm »
it only change the regsiter select order;I think it is safe.
OK. But why this order is better then old one?

Because it does not fail, dummy! ;)

P.S. Yes, very interesting why this does mattter.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: [BlackBox] Compiler trap.
« Ответ #11 : Май 19, 2013, 08:31:41 am »
DevCPC486.GetReg
                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 6 IN s THEN n := 6
ELSIF 7 IN s THEN n := 7
ELSIF 1 IN s THEN n := 1
ELSE n := 3
END;
                        ....


change to

                        ....
                        IF 0 IN s THEN n := 0
ELSIF 2 IN s THEN n := 2
ELSIF 1 IN s THEN n := 1
ELSIF 3 IN s THEN n := 3
                        ELSIF 6 IN s THEN n := 6
ELSE n := 7
END;
                        ....

А какова гарантия того, что не появятся другие ошибки, связанные с этим исправлением? :)

kkk

  • Гость
Re: [BlackBox] Compiler trap.
« Ответ #12 : Май 19, 2013, 10:26:18 am »
Насколько я понял, суть трапа в том, что в подобной сложной цепочке конверсий почему-то первым вариантом для хранения значения конверсии подбирался внутренний элемент компилятора неверного размера, что и было ограничено трэпом.
Maliya просто поменял последовательность подбора вариантов, которая в принципе, в варианте с ELSIF ветками вообще не должна зависеть от последовательности. Видимо, нет полной однозначности, это исправимо.
Вообще, можно отметить нарочную говнокодную сущность представленного примера, а так же проработанность компилятора, который позволил:
а) не записать мусор в бинарный файл
б) не выпал в шоковом припадке, а корректно остановился на явном и описанном предусловии
в) построен так, что починить его сможет любой китаец, хы-хы :D
:) гы,  - приветик мифу (  Инфо21 ) о том, что из идеологической  простоты компилятора следует его "надежная" реализация...
Учительница рассуждает о том, чего не понимает. Жуть.

DddIzer

  • Гость
Re: [BlackBox] Compiler trap.
« Ответ #13 : Май 19, 2013, 11:04:15 am »

:) гы,  - приветик мифу (  Инфо21 ) о том, что из идеологической  простоты компилятора следует его "надежная" реализация...
Учительница рассуждает о том, чего не понимает. Жуть.
  гыы Петобыдло опять говном зарядилось... повеселимся...  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Compiler trap.
« Ответ #14 : Май 19, 2013, 11:09:00 am »
Вообще, можно отметить нарочную говнокодную сущность представленного примера
Можешь переписать так, чтобы оно перестало быть говнокодом?
На входе для каждого кадра одномерный массив uint8_t.
Y = λf.(λx.f (x x)) (λx.f (x x))