spamsink: (Default)
[personal profile] spamsink
Все мы знаем™, что в языке Си есть операторы простого цикла
while (condition) operator;
и
do operator; while (condition);.

Казалось бы хорошо, симметрично: в обоих случаях цикл выполняется, пока условие истинно. А в Паскале не так: в нём есть
while condition do operator;
и

repeat sequence of operators until condition;

Здесь из-за того, что операторные скобки в языке Паскаль - аж целые слова begin/end, пришлось ради избежания постоянного "repeat begin" и "end until" пожертвовать стройностью синтаксиса и сделать repeat/until тоже операторными скобками. Это более или менее понятно.

А вот зачем вот это всё repeat и until вместо уже существующих слов do и while?

Разгадка проста: при компиляции операторов с условными переходами, что if, что while, переход за внутренний оператор надо делать по ложности условия. Вот и repeat-until для удобства автора компилятора сделан так, чтобы переходить назад на начало надо было по ложности условия, и можно без труда переиспользовать процедуру, порождающую код для if и while. А в случае do-while, перед тем, как  использовать процедуру для if, условие инвертировать приходится.

Навеяно развлекательной активностью по пересобачиванию существующего Паскаль-компилятора (угадайте с трех раз, для какой платформы), написанного на самом себе, в Си-компилятор, стремясь не разбираться, как работает кодогенератор. 


Date: 2025-03-14 07:08 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Душевный язык. Я так с ним отдохнул когда-то, переключившись на него с деревянного C.

Date: 2025-03-14 10:35 pm (UTC)
fatoff: What? (Default)
From: [personal profile] fatoff
Объектно-ориентированным Паскаль стал не сразу по желанию Никлауса Вирта? Как сейчас помню, на работе разбирал документацию на новый ООП Паскаль, который Turbo или Borland, но тоже не в первой версии их адаптации. Где-то в районе 1990-го, первая работа.
Edited Date: 2025-03-14 10:36 pm (UTC)

Date: 2025-03-15 04:18 am (UTC)
fatoff: What? (Default)
From: [personal profile] fatoff
"with someVar do" -- указатель на объект подсовывают. Далее неоднозначная польза с доступом к вложенным членам объекта.

Date: 2025-03-16 04:21 pm (UTC)
fatoff: What? (Default)
From: [personal profile] fatoff
Ну да, когда анализ только от прямой декларации намерений в исходном коде. А для современных компиляторов давно уже вчерашний день, проблема-то.
Edited Date: 2025-03-16 04:22 pm (UTC)

Date: 2025-03-16 04:36 pm (UTC)
fatoff: What? (Default)
From: [personal profile] fatoff
Для драйверо-писателей конца прошлого века, когда сложность низкоуровневого кода уже поддавливала использование plain-C, а C++ им никак нельзя, они действительно создавали структуры-классы с многими указателями на функции, и вот там бы да такую радость!

Date: 2025-03-14 07:31 pm (UTC)
From: [personal profile] sassa_nf
> А в случае do-while, перед тем, как использовать процедуру для if, условие инвертировать приходится.

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

Date: 2025-03-14 10:13 pm (UTC)
From: [personal profile] sassa_nf
Ok. In practice support for inverted condition is needed anyway, as when the operator is big enough, short jumps don't work, and we end up with inverted condition to jump over a long jump.

Date: 2025-03-14 08:42 pm (UTC)
ircicq: (Default)
From: [personal profile] ircicq
на два goto больше чем реализация в лоб: "body, branch", для тех времён существенно

Edited Date: 2025-03-14 09:29 pm (UTC)
Page generated Apr. 23rd, 2025 07:10 am
Powered by Dreamwidth Studios