![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
while (condition) operator;
и
do operator; while (condition);.
Казалось бы хорошо, симметрично: в обоих случаях цикл выполняется, пока условие истинно. А в Паскале не так: в нём есть
while condition do operator;
и
Здесь из-за того, что операторные скобки в языке Паскаль - аж целые слова begin/end, пришлось ради избежания постоянного "repeat begin" и "end until" пожертвовать стройностью синтаксиса и сделать repeat/until тоже операторными скобками. Это более или менее понятно.
А вот зачем вот это всё repeat и until вместо уже существующих слов do и while?
Разгадка проста: при компиляции операторов с условными переходами, что if, что while, переход за внутренний оператор надо делать по ложности условия. Вот и repeat-until для удобства автора компилятора сделан так, чтобы переходить назад на начало надо было по ложности условия, и можно без труда переиспользовать процедуру, порождающую код для if и while. А в случае do-while, перед тем, как использовать процедуру для if, условие инвертировать приходится.
Навеяно развлекательной активностью по пересобачиванию существующего Паскаль-компилятора (угадайте с трех раз, для какой платформы), написанного на самом себе, в Си-компилятор, стремясь не разбираться, как работает кодогенератор.
no subject
Date: 2025-03-14 07:08 pm (UTC)no subject
Date: 2025-03-14 09:47 pm (UTC)no subject
Date: 2025-03-14 10:35 pm (UTC)no subject
Date: 2025-03-15 03:59 am (UTC)no subject
Date: 2025-03-15 04:18 am (UTC)no subject
Date: 2025-03-16 03:18 am (UTC)no subject
Date: 2025-03-16 04:21 pm (UTC)no subject
Date: 2025-03-16 04:29 pm (UTC)no subject
Date: 2025-03-16 04:36 pm (UTC)no subject
Date: 2025-03-14 07:31 pm (UTC)I don't get it. Why do you invert the condition in do-while?..
while(cond) operator <==> _loop: if(cond) {operator; goto _loop;}
do operator while(cond) <==> goto _body; while(cond) _body: operator
no subject
Date: 2025-03-14 09:45 pm (UTC)compute cond; branch_if_false next; operator; next: ...
while (cond) operator; compiles as
loop: compute cond; branch_if_false next; operator; jump loop; next: ...
repeat operators until cond; compiles as
loop: operators; compute cond; branch_if_false loop;
do operator; while (cond)
optimally compliles to
loop: operator; compute cond; branch_if_true loop;
Which needs extra handling.
no subject
Date: 2025-03-14 10:13 pm (UTC)no subject
Date: 2025-03-15 04:02 am (UTC)no subject
Date: 2025-03-14 08:42 pm (UTC)