Jump to content

LOOP (язык программирования)

LOOP — это простой язык регистров, который точно фиксирует примитивные рекурсивные функции . [1] Язык является производным от противомашинной модели . Подобно машинам-счетчикам, язык LOOP содержит набор из одного или нескольких неограниченных регистров , каждый из которых может хранить одно неотрицательное целое число. С регистрами работают несколько арифметических инструкций (например, «CleaR», «INCrement», «DECrement», «CoPY» и т. д.). Единственная потока управления инструкция — это « LOOP x DO END» . Он приводит к повторению инструкций в его области действия x раз. (Изменения содержимого регистра x во время выполнения цикла не влияют на количество проходов.)

Язык LOOP был сформулирован в статье 1967 года Альберта Р. Мейера и Денниса М. Ритчи . [2] Они показали соответствие между языком LOOP и примитивно-рекурсивными функциями .

Язык также был темой неопубликованной докторской диссертации Ричи. [3] [4]

Его также представил Уве Шёнинг вместе с GOTO и WHILE . [5]

Философия дизайна и особенности

[ редактировать ]

В отличие от программ GOTO и WHILE , программы LOOP всегда завершаются . [6] Следовательно, множество функций, вычислимых программами LOOP, является собственным подмножеством вычислимых функций (и, следовательно, подмножеством функций, вычислимых программными функциями WHILE и GOTO). [7]

Мейер и Ритчи доказали, что каждая примитивно-рекурсивная функция LOOP-вычислима, и наоборот. [2] [5]

Примером полностью вычислимой функции, которая не является вычислимой в LOOP, является функция Аккермана . [8]

Формальное определение

[ редактировать ]

Синтаксис

[ редактировать ]

LOOP-программы состоят из символов LOOP, DO, END, :=, + и ; а также любое количество переменных и констант. LOOP-программы имеют следующий синтаксис в модифицированной форме Бэкуса–Наура :

Здесь, являются именами переменных и являются константами.

Семантика

[ редактировать ]

Если P — программа LOOP, P эквивалентна функции . Переменные через в программе LOOP соответствуют аргументам функции и инициализируются перед выполнением программы соответствующими значениями. Всем остальным переменным присваивается начальное нулевое значение. Переменная соответствует значению, которое принимает значения аргументов из через .

Заявление по форме

xi := 0

означает значение переменной установлено на 0.

Заявление по форме

xi := xi + 1

означает значение переменной увеличивается на 1.

Заявление по форме

P1; P2

представляет собой последовательное выполнение подпрограмм и , в таком порядке.

Заявление по форме

LOOP x DO P END

означает повторное выполнение частичной программы в общей сложности раз, где значение, которое has в начале выполнения оператора. Даже если меняет значение , это не повлияет на то, сколько раз выполняется в цикле. Если имеет нулевое значение, то не выполняется внутри оператора LOOP . Это позволяет создавать ветки в программах LOOP, где условное выполнение частичной программы зависит от того, имеет ли переменная значение нулевое или одно.

Создание «удобных инструкций»

[ редактировать ]

Из базового синтаксиса создаются «удобные инструкции». Это не будут подпрограммы в обычном понимании, а скорее LOOP-программы, созданные на основе базового синтаксиса и имеющие мнемонику. Формально для использования этих программ необходимо либо (i) «расширить» их в код – они потребуют использования временных или «вспомогательных» переменных, поэтому это необходимо учитывать, либо (ii) спроектировать синтаксис со «встроенными» инструкциями.

Пример

k-арная проекционная функция извлекает i-ю координату из упорядоченного k-кортежа.

В своей основополагающей статье [2] Мейер и Ричи выполнили задание основное заявление. Как показывает пример, назначение может быть получено из списка основных операторов.

Чтобы создать инструкции используйте блок кода ниже. = экв.

xj := 0;
LOOP xi DO
  xj := xj + 1
END

Опять же, все это только для удобства; ничто из этого не увеличивает внутреннюю мощность модели.

Примеры программ

[ редактировать ]

Добавление

[ редактировать ]

Сложение определяется рекурсивно как:

Здесь S следует читать как «преемник».

В последовательности гипероператоров это функция

может быть реализовано программой LOOP ADD( x 1 , x 2 )

LOOP x1 DO
  x0 := x0 + 1
END;
LOOP x2 DO
  x0 := x0 + 1
END

Умножение

[ редактировать ]

Умножение - это функция гипероперации.

может быть реализован программой LOOP MULT( x 1 , x 2 )

x0 := 0;
LOOP x2 DO
  x0 := ADD( x1, x0)
END

Программа использует программу ADD() в качестве «удобной инструкции». В расширенном виде программа MULT представляет собой программу LOOP с двумя вложенными инструкциями LOOP. ADD считается за единицу.

Больше гипероператоров

[ редактировать ]

Дана программа LOOP для функции гипероперации. , можно построить программу LOOP для следующего уровня

например (что означает возведение в степень ) может быть реализовано с помощью программы LOOP POWER( x 1 , x 2 )

x0 := 1;
LOOP x2 DO
  x0 := MULT( x1, x0 )
END

Расширенная программа возведения в степень имеет три вложенные инструкции LOOP.

Предшественник

[ редактировать ]

Функция-предшественник определяется как

.

Эту функцию можно вычислить с помощью следующей программы LOOP, которая устанавливает переменную к .

/* precondition: x2 = 0 */
LOOP x1 DO
  x0 := x2;
  x2 := x2 + 1
END

В развернутом виде это программа

/* precondition: x2 = 0 */
LOOP x1 DO
  x0 := 0;
  LOOP x2 DO
    x0 := x0 + 1
  END;
  x2 := x2 + 1
END

Эту программу можно использовать как подпрограмму в других программах LOOP. Синтаксис LOOP можно расширить с помощью следующего оператора, эквивалентного вызову приведенного выше подпрограммы:

x0 := x1 ∸ 1

Примечание : Опять же, следует учитывать побочные эффекты. Программа-предшественница изменяет переменную x 2 , которая может использоваться где-то еще. Чтобы расширить оператор x 0 := x 1 ∸ 1, можно инициализировать переменные x n , x n+1 и x n+2 (для достаточно большого n) значениями 0, x 1 и 0 соответственно, запустить код на эти переменные и скопируйте результат (x n ) в x 0 . Компилятор может это сделать.

Вычитание отсечки

[ редактировать ]

Если в программе «сложения», указанной выше, второй цикл уменьшает x 0 вместо увеличения, программа вычисляет разность (обрезанную на 0) переменных и .

x0 := x1
LOOP x2 DO
  x0 := x0 ∸ 1
END

Как и раньше, мы можем расширить синтаксис LOOP с помощью оператора:

x0 := x1 ∸ x2

Если тогда еще

[ редактировать ]

Оператор if-then-else, где if x 1 > x 2 then P1 else P2:

xn1 := x1 ∸ x2;
xn2 := 0;
xn3 := 1;
LOOP xn1 DO
  xn2 := 1;
  xn3 := 0
END;
LOOP xn2 DO
  P1
END;
LOOP xn3 DO
  P2
END;

См. также

[ редактировать ]

Примечания и ссылки

[ редактировать ]
  1. ^ Эндертон 2012 .
  2. Перейти обратно: Перейти обратно: а б с Мейер и Ричи 1967 .
  3. ^ «Обнаружение потерянной диссертации Денниса Ритчи» . ЧМ . 19.06.2020 . Проверено 14 июля 2020 г.
  4. ^ Проект структуры программы и вычислительной сложности | 102790971 | Музей истории компьютеров . 1967 год . Проверено 14 июля 2020 г. {{cite book}}: |website= игнорируется ( помогите )
  5. Перейти обратно: Перейти обратно: а б Шенинг 2008 , с. 105.
  6. ^ Шёнинг 2008 , с. 93.
  7. ^ Шёнинг 2001 , с. 122.
  8. ^ Шёнинг 2008 , с. 112.

Библиография

[ редактировать ]
[ редактировать ]

Освоение искусства циклов в программировании: пошаговое руководство

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 098a754fae0dcf6c5730d1afd6961b59__1708181700
URL1:https://arc.ask3.ru/arc/aa/09/59/098a754fae0dcf6c5730d1afd6961b59.html
Заголовок, (Title) документа по адресу, URL1:
LOOP (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)