в принципе, даже всякий WHILE можно заменить на IF и GOTO. Только GOTO для использования человеком запрещён
(из-за злоупотреблений). В старейших и простейших версиях BASIC циклы выглядели так:
a la WHILE:
<метка1> IF NOT <while-условие> THEN GOTO <метка2>
<тело цикла>
<метка...> GOTO <метка1>
<метка2> ...
[/code]
a la UNTIL:
<метка1> ...
<тело цикла>
<метка...> IF NOT <until-условие> THEN GOTO <метка1>
такие записи непосредственно преобразуются в ассемблер или машинный код, поэтому интерпретатор BASIC был прост и занимал очень мало памяти (что для объёма в 64 Кб было очень полезно)
перевод вышеприведённого в asm 8086 даст примерно следующее
WHILE:
label1:
<while-условие>
jne label2
<тело цикла>
jmp label1
label2:
UNTIL:
label1:
<тело цикла>
<until-условие>
jne label1