СГ>Вы определили i внутри for, а надо было определить ее снаружи так как в Delphi, иначе смысл сравнения отсутствует.
Если неправ, то пусть в меня кинут помидором, но АФАИК по стандарту это совершенно эквивалентные определения, которые обязаны порождать одинаковый код.
СГ>Почему сишный for медленнее дельфийского я уже объяснил: 1) в Delphi значение переменной цикла for не определено после его завершения, 2) значение переменной цикла запрещено самому менять.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Вопрос такой: Вы допустили ошибку и посетовали, что Оберон бы такого не допустил. Я взял да и написал аналог на обероне тут
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Вопрос такой: Вы допустили ошибку и посетовали, что Оберон бы такого не допустил. Я взял да и написал аналог на обероне тут
Здравствуйте, Пацак, Вы писали:
П>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Вы определили i внутри for, а надо было определить ее снаружи так как в Delphi, иначе смысл сравнения отсутствует.
П>Если неправ, то пусть в меня кинут помидором, но АФАИК по стандарту это совершенно эквивалентные определения, которые обязаны порождать одинаковый код.
СГ>>Почему сишный for медленнее дельфийского я уже объяснил: 1) в Delphi значение переменной цикла for не определено после его завершения, 2) значение переменной цикла запрещено самому менять.
П>Не вижу тут поводов для ускорения.
Повод есть, если переменная используется только как счетчик, то делфя создаст приблизительно такой вод код:
mov edx, _count_
@@repeat:
...
_чото_делаем_
...
dec edx
jne repeat
Здравствуйте, Сергей Губанов, Вы писали:
СГ>В Ада — понятия не имею.
В Аде правила к циклу с переменной применяются очень строгие. Во-первых, имя переменной цикла вводится инструкцией FOR, за пределами цикла переменная не существует. Во-вторых, шаг приращения может быть равен только 1 или -1. В-третьих, внутри цикла переменная считается константой.
Здравствуйте, Mamut, Вы писали:
СГ>>В Си-образных языках, циклы while/do не удовлетворяют этим определениям так как могут быть завершены еще и по break и goto.
M>Не соглашусь.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Ну, конкчно кроме случаев, когда из REPEAT ... UNTIL можно выйти по EXIT.
СГ>Выход выходу рознь. http://www.rsdn.ru/Forum/Message.aspx?mid=1239021&only=1
Знаете, вчера проичитал чтатью в Википедии о структурном програмировании. Там ничего не говорится о разных типах выхода.
Вот как определяется структурное програмирование?
1. Jackson Structured Programming, which is based on aligning data structures with program structures,
2. Dijkstra's structured programming, which is based on splitting programs into sub-sections, each with a single point of entry and of exit,
3. and a view derived from Dijkstra's which also advocates splitting programs into sub-section with a single point of entry, but is strongly opposed to the concept of a single point of exit.
Я так понимаю мы о втором определении говорим ? Один вход, один выход. Никаких "Выход выходу рознь", "те выходы более выходистые" и т.п. Так что, давайте не будем изобретать специальных версий структурного програмирования, которые удобно ложится под Оберон.
Скажем просто. Оберон не соответсвует принципам структурного програмирования.
Здравствуйте, merlin.fs, Вы писали:
П>>Не вижу тут поводов для ускорения.
MF>Повод есть, если переменная используется только как счетчик, то делфя создаст приблизительно такой вод код:
MF>
MF> mov edx, _count_
MF>@@repeat:
MF> ...
MF> _чото_делаем_
MF> ...
MF> dec edx
MF> jne repeat
MF>
Ну, что-ж. Хоть кто-то возразил аргументированно.
Однако, вот во что превращается следующий код:
#include <stdio.h>
int f()
{
int i;
for(i=10;i>0;i--)
puts("+");
return 0;
}
_f PROC NEAR ; COMDAT
; 6 : {
push esi
; 7 : int i;
; 8 : for(i=10;i>0;i--)
mov esi, 10 ; 0000000aH
$L863:
; 9 : puts("+");
push OFFSET FLAT:??_C@_01MIFGBAGJ@?$CL?$AA@
call _puts
add esp, 4
dec esi
jne SHORT $L863
; 10 :
; 11 : return 0;
xor eax, eax
pop esi
; 12 : }
ret 0
_f ENDP
Здравствуйте, Сергей Губанов, Вы писали:
СГ>В одном случае есть выбор использовать блок BEGIN END или не использовать, а в другом случае этого блока просто нет.
Сериозно чтоль?
PROCEDURE Test*();
VAR i: INTEGER; END{тело процедуры начинается здесь}
......
......
{тело процедуры заканчивается здесь}END Test;
И где здесь необходимость использования BEGIN? Нема таковой, окромя продиктованной желанием величественной виртовской левой пятки.
СГ>Сам по себе блок BEGIN END отсутсвуют напрочь.
Присутствует. В составе описания модулей и процедур. Про то, что "там без него нельзя" петь военных песен не надо — пример выше.
СГ>Стоило. В си-образном синтаксисе это невозможно даже на синтетических тестах.
Ибо программисты на C++ пишут программы, а не синтетические тесты. И программы-то, как это тут не раз показывалось, уделывают обероновские как по лексемному оверхеду, так и по банальной длине кода.
СГ>Кстати, а возможно ли, добиться того чтобы звездочное чередование всегда было бы правильным? Наверное нет
Ах какое озарение! Жаль, что оно не посетило автора перед тем, как он начал обгаживать C++.
Здравствуйте, Sergey J. A., Вы писали:
SJA> Вот как определяется структурное програмирование?
Я его определяю буквально: структурное оно и значит структурное. Например, инструкция try ... finnaly ... end наверняка ведь у Дейкстры ни где не упоминается, а структурная. В будущем может быть еще какая-нибудь структурная инструкция появится которой у Дейкстры не было, и что, теперь?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, qwertyuiop, Вы писали: Q>>Большинство современных компиляторов выдают на такую строчку предупреждение S>А большинство совремнных PM заставляют компилять с treat warnings as errors ;)
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Здравствуйте, Sergey J. A., Вы писали:
SJA>>>Ну, конкчно кроме случаев, когда из REPEAT ... UNTIL можно выйти по EXIT.
СГ>>Выход выходу рознь. http://www.rsdn.ru/Forum/Message.aspx?mid=1239021&only=1
SJA>Знаете, вчера проичитал чтатью в Википедии о структурном програмировании.
О! Наконец-то! Хоть один человек!!! Я-то ссылку на эту статью уже, наверное, в четырех местах привожу
SJA>Я так понимаю мы о втором определении говорим ? Один вход, один выход. Никаких "Выход выходу рознь", "те выходы более выходистые" и т.п. Так что, давайте не будем изобретать специальных версий структурного програмирования, которые удобно ложится под Оберон.
SJA>Скажем просто. Оберон не соответсвует принципам структурного програмирования.
О!!! Я буду на вас молиться!! Конечно не соответствует. Но при этом заставляет циклы while и for соответствовать —
СГ>>>В Си-образных языках, циклы while/do не удовлетворяют этим определениям так как могут быть завершены еще и по break и goto.
M>>Не соглашусь.
СГ>Не соглашусь с несоглашением...
И все же, свою точку зрения я подтвердил фактами. Ваш ход
Здравствуйте, Sergey J. A., Вы писали:
SJA>Ну, что-ж. Хоть кто-то возразил аргументированно. SJA>Однако, вот во что превращается следующий код:
[skip]
SJA>
SJA>_f PROC NEAR ; COMDAT
SJA>; 6 : {
SJA> push esi
SJA>; 7 : int i;
SJA>; 8 : for(i=10;i>0;i--)
SJA>mov esi, 10 ; 0000000aH
SJA>$L863:
SJA>; 9 : puts("+");
SJA> push OFFSET FLAT:??_C@_01MIFGBAGJ@?$CL?$AA@
SJA> call _puts
SJA> add esp, 4
SJA>dec esi
SJA> jne SHORT $L863
SJA>; 10 :
SJA>; 11 : return 0;
SJA> xor eax, eax
SJA> pop esi
SJA>; 12 : }
SJA> ret 0
SJA>_f ENDP
SJA>
SJA>Как видим — практически один в один.
Согласен, только почему esi? для счетчиков естественей edx использовать, моя информация наверно устарела
(давно не изучал эту тему), но на сколько я помню, проц inc/dec с edx, eax, ebx и ecx выполняет быстрее чем esi, edi.
Здравствуйте, Сергей Губанов, Вы писали:
SJA>> Вот как определяется структурное програмирование?
СГ>Я его определяю буквально: структурное оно и значит структурное.
Дайте догадатся. Не структурное оно и значит не структурное. Гм. Ну тогда ясно !
Оберон он структурный, потому что структурный.
Ну а С не структурный, потому что он не структурный. Буквально.
СГ>Например, инструкция try ... finnaly ... end наверняка ведь у Дейкстры ни где не упоминается, а структурная. В будущем может быть еще какая-нибудь структурная инструкция появится которой у Дейкстры не было, и что, теперь?
Оотлично. Ну, раскажите почему try ... finnaly ... end структурная конструкция, а С-шный while — нет.
Подсказка:
throw -> break.
А ?
И кстати, почему замечательно структурной try ... finnaly ... end нет в Обероне ?
З.Ы. Хотелось бы получить ответы на ОБА вопроса, а не на один по выбору.
Здравствуйте, Mamut, Вы писали:
SJA>>Знаете, вчера проичитал чтатью в Википедии о структурном програмировании.
M>О! Наконец-то! Хоть один человек!!! Я-то ссылку на эту статью уже, наверное, в четырех местах привожу
Не подумайте про меня хорошо. Я её почитал только из желания ввязаться в спор
Здравствуйте, merlin.fs, Вы писали:
MF>Согласен, только почему esi? для счетчиков естественей edx использовать, моя информация наверно устарела MF>(давно не изучал эту тему), но на сколько я помню, проц inc/dec с edx, eax, ebx и ecx выполняет быстрее чем esi, edi.
Я тож не очень в курсе, но мне казалось что новые процессоры большинство команд выполняют в 1 такт...
Но не столь важно. Думаю компиляторо-писатели знали, что делают...