(решено) GoTo или repeat until?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 05.09.2015 12:51:43

Снег Север писал(а):используют не TPicture, а функции DirectX или OpenGL.

Хм... интересная мысль... а вот их то, я тогда кажется и не пробовал протестировать на скорость (хотя и не факат)... Однако, если они не используют стандартный Tbitmap и Tpicture в родителях, то есть шанс на ускорение процесса загрузки картинок.

скалогрыз писал(а):i:=1;
whileloop:
  if (i<=length(s)) then begin
    if not (s[i] in 'a') then begin
      inc(i);
      goto whileloop;
    end;
  end;

С репит антил в аналогичной раскладке - всё понятно...
А вот как компилятор раскладывает на язык GoTo оператор for?

Добавлено спустя 7 минут 77 секунд:
Кстати: try finally exception - ведь тоже можно разложить на язык GoTo?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 05.09.2015 16:39:07

vitaly_l писал(а):Однако, если они не используют стандартный Tbitmap и Tpicture в родителях
Безусловно DirectX и OpenGL не используют стандартный Tbitmap и Tpicture :lol:
Но проблема загрузки файла и его разжатия для форматов типа jpeg никуда не девается (а у вас, помнится, именно в этом были тормоза). Ускоряется на порядки вывод на экран большого количества графики.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3048
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 06.09.2015 13:24:27

Снег Север писал(а):Но проблема загрузки файла и его разжатия для форматов типа jpeg (а у вас, помнится, именно в этом были тормоза)

Вы невнимательно читали тот топик, перечитайте! Там очень хорошо описаны все эксперименты. А по существу, что-бы Вы не вводили людей в заблуждение, там суть проблемы вот в этом: В TStream - файл картинки грузится моментально (любой формат). Проблемы с декодированием, тоже не возникает, особенно у *.bmp ..., на декодирование тратятся доли наносекунд - замеряли. Но есть какой-то баг, который "по пути" данных из TStream в TBitmap и TPicture, абсолютно для всех модулей по обработке графики (в том числе и сторонних) - делает задержку по времени загрузки в два и более раза (т.к. TBitmap и TPicture - общий предок/родитель, для всех модулей) и это только в Лазарусе (в других IDE/FPC всё работает как надо). На маленьких картинках этого не видно, а на больших заметно (я сверял 10 000 * 10 000 картинок и время мне было важно). Проверял, не я, а несколько довольно сильных программистов, баг - тогда не нашли.

Касаемо темы топика, вот этот вопрос всё ещё в силе:

vitaly_l писал(а):А вот как компилятор раскладывает на язык GoTo оператор for?

Добавлено спустя 7 минут 77 секунд:
Кстати: try finally exception - ведь тоже можно разложить на язык GoTo?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение bormant » 06.09.2015 19:26:33

vitaly_l писал(а):как компилятор раскладывает на язык GoTo оператор for?

Тестовый пример:
Код: Выделить всё
var i, j: Integer;
begin
  j:=0;
  for i:=0 to 4 do
    Inc(j);
end.

Компилируем с -al, смотрим вывод, видим там что-то вроде:
Код: Выделить всё
...
# Var i located in register dx
# Var j located in register ax
...
# [4] for i:=0 to 4 do
   movw   $0,%dx
   decw   %dx
   .balign 4,0x90
.Lj7:
   incw   %dx
# [5] Inc(j);
   incw   %ax
   cmpw   $4,%dx
   jl   .Lj7
# [6] end.
...

Восстанавливаем логику:
Код: Выделить всё
  i:=нач_значение;
  Dec(i);
LoopBody:
  Inc(i);
  { тело цикла }
  if i<кон_значение then
    goto LoopBody;
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 06.09.2015 19:44:42

bormant писал(а):Тестовый пример:

Спасибо, добрый мультиуважаемый bormant!!! Благодаря Вам, ложная информация восстановлена в нужное русло.
Из Вашего примера, я установил, что практически полностью, забыл ассемблер ( правило: Используй или забудешь - работает 100% ).

Вопрос:
Кто нить, может разложить: try finally exception - на язык GoTo? ( в пояснении bormant: "язык GoTo" - называется "псевдопаскаль" )
Суть, в том что, выше говорили что, у оператора GoTo, будут существенные проблемы при скачках по try finally exception.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение bormant » 06.09.2015 19:55:57

vitaly_l писал(а):практически полностью, забыл ассемблер

Возможно, MASM-синтаксис вам более привычен, если звать fpc с ключами -Amasm -al, получится что-то вроде:
Код: Выделить всё
; Var i located in register dx
; Var j located in register ax
; [4] for i:=0 to 4 do
      mov   dx,0
      dec   dx
   ALIGN 4
@@j7:
      inc   dx

; [5] Inc(j);
      inc   ax

      cmp   dx,4
      jl   @@j7
; [6] end.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 06.09.2015 20:04:33

А... да... Вы правы... этот ассемблер - мне более понятен ( там просто операторы переименованы ) :P .
Попробую позвать fpc с -Amasm -al, может даже и сам прочитаю :oops: :cry: , суть работы: try finally exception.
:roll: СПАСИБО!


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение vada » 07.09.2015 10:26:16

GoTo в моём примере прыгает из цикла в цикл...

Нет печатных слов. Только матерные. :)
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 10:44:41

vada, расслабься и кушай попкорн. Ну нравится людям извращения. Это их проблемы.

vitaly_l писал(а):Кто нить, может разложить: try finally exception - на язык GoTo? ( в пояснении bormant: "язык GoTo" - называется "псевдопаскаль" )
Суть, в том что, выше говорили что, у оператора GoTo, будут существенные проблемы при скачках по try finally exception.


почти точно так же, но куча if и пустых операторов. (ну или обработчиков). Это если Вам чисто не нравится вызов функций.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vada » 07.09.2015 11:02:17

Лекс Айрин
vada, расслабься и кушай попкорн. Ну нравится людям извращения. Это их проблемы.

Я как-то ехал в электричке, пришлось полтора часа слушать двух умников.
Они спорили как "лучше" сделать вечный двигатель из электро двигателя и электро генератора на одной оси ротора.
Мне этот треш про GOTO очень напоминает этот спор. :)
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 11:17:12

vada, действительно, похоже... я, кстати, удивляюсь, почему не вспомнили исконно ассемблерную конструкцию loop и то, что в нем же можно иметь в процедуре/функции более одного оператора возврата. Последнее, видимо, потому что это чисто хакерский ход.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 12:12:55

vada писал(а):Нет печатных слов. Только матерные.

vada писал(а):как "лучше" сделать вечный двигатель из электро двигателя и электро генератора на одной оси ротора

Лекс Айрин писал(а):Ну нравится людям извращения. Это их проблемы.

Лекс Айрин писал(а):почему не вспомнили исконно ассемблерную конструкцию loop

Я это спрашиваю, потому что, хочу понять как раскладывает код компилятор, мне стало интересно, почему из try finally exception нельзя выпрыгнуть с помощью GoTo? Ассемблер, я априори не люблю (я ещё не смотрел код про try finally exception), но такой несложный код наверное смогу понять и поэтому просил перевести на язык GoTo (псевдопаскаля).

А вот кстати касаемо вечных двигателей, то они невозможны - это признано Академией наук, наравне с тем что, до "большого взрыва" вселенной не существовало и скорость света по Академическим постулатам - тоже неизменна ( хотя есть признанные научные награды за эксперименты, в которых двигаются быстрее света и т.д. ). Не волнуйтесь, никто ничего не изобретает, я просто изучаю: "Почему GoTo - зло, а repeat until - добро?"...

То что, любой GoTo - можно заменить на цикл или переходом в другую процедуру, не говорит в пользу того что - это обязательно нужно делать. А вот ошибки компилятора, при таких переходах - это важно знать, т.к. художникам иногда лень следовать скучным Академическим постулатам и они потом не могут разобраться почему их программа выдаёт не совсем, то, чего хотели художники... А выяснилось, что это компилятор виноват, т.к. не фиксирует ошибки при GoTo-прыжках.

Лучше дайте примеров и доказательств про зло от использования GoTo, т.к. с GoTo иногда конструкции выглядят проще чем с выносом функций и десятком дополнительных вложенных циклов.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Снег Север » 07.09.2015 12:51:54

Почему нельзя ковырять в левой ноздре большим пальцем правой ноги? Кто запретил? Да никто не запрещает. Кому так удобнее - пусть ковыряет, на здоровье...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3048
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 13:01:42

vitaly_l писал(а):мне стало интересно, почему из try finally exception нельзя выпрыгнуть с помощью GoTo? Ассемблер, я априори не люблю (я ещё не смотрел код про try finally exception), но такой несложный код наверное смогу понять и поэтому просил перевести на язык GoTo (псевдопаскаля).


Вот если бы Вы знали хотя бы основы ассемблера, то не задавали бы этого вопроса. Дело в том, что try finally exception это вызов обработчика прерывания.
1) обработка идет (в идеале) во внутреннем кольце процессора.
2) сохраняется куча данных в стеке... в том числе и адрес возврата. (фактически, это вызов процедуры)
3) запрещаются прерывания
вот как раз эти причины не дают применять Goto. Если уж это действительно необходимо, то надо, как минимум, разрешить прерывания и сбросить "конверт" созданный вызовом прерывания. Иначе это приведет к разбалансировке стека, зависанию и/или срабатыванию прерывания общей защиты. Вплоть до BSODa.

Добавлено спустя 3 минуты:
vitaly_l писал(а):А вот кстати касаемо вечных двигателей, то они невозможны - это признано Академией наук,


Кстати, возможны. Второго рода. А вот вечный двигатель первого рода действительно невозможен.

vitaly_l писал(а):А выяснилось, что это компилятор виноват, т.к. не фиксирует ошибки при GoTo-прыжках.


Это не ошибка компилятора... это ошибка программиста.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 13:34:47

Лекс Айрин писал(а):Кстати, возможны. Второго рода.

Это что ещё за второй род? ( я про такое не слышал ).

А вот это реально круто:
Лекс Айрин писал(а):Вот если бы Вы знали хотя бы основы ассемблера, то не задавали бы этого вопроса. Дело в том, что try finally exception это вызов обработчика прерывания.
1) обработка идет (в идеале) во внутреннем кольце процессора.
2) сохраняется куча данных в стеке... в том числе и адрес возврата. (фактически, это вызов процедуры)
3) запрещаются прерывания
вот как раз эти причины не дают применять Goto. Если уж это действительно необходимо, то надо, как минимум, разрешить прерывания и сбросить "конверт" созданный вызовом прерывания. Иначе это приведет к разбалансировке стека, зависанию и/или срабатыванию прерывания общей защиты. Вплоть до BSODa.


Художники напуганы... художники в страхе... художники в ужасе... когда упоминают страшного и коварного: BSODa... художники бессильны оспорить... художники признают поражение... Есть кто-то кто может оспорить страшные и коварные аргументы уважаемого Лекс Айрин?

Добавлено спустя 3 минуты 4 секунды:
Лекс Айрин писал(а):разрешить прерывания и сбросить "конверт" созданный вызовом прерывания

Вот этот кусочек можно поподробнее? Это реально интересно.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru