PĘTLA (język programowania)

LOOP to prosty język rejestrów, który precyzyjnie oddaje prymitywne funkcje rekurencyjne . Język wywodzi się z modelu przeciw-maszyny . Podobnie jak liczniki, język LOOP zawiera zestaw jednego lub więcej nieograniczonych rejestrów , z których każdy może przechowywać jedną nieujemną liczbę całkowitą. Kilka instrukcji arytmetycznych (takich jak „ClearR”, „INCrement”, „DECrement”, „CoPY”, ...) działa na rejestrach. Jedyna przepływu sterowania to „ LOOP x DO KONIEC' . Powoduje, że instrukcje w swoim zakresie są powtarzane x razy. (Zmiany zawartości rejestru x podczas wykonywania pętli nie wpływają na liczbę przebiegów.)

Historia

Język LOOP został sformułowany w artykule z 1967 roku przez Alberta R. Meyera i Dennisa M. Ritchiego . Pokazali zgodność między językiem LOOP a prymitywnymi funkcjami rekurencyjnymi .

Język ten był również tematem niepublikowanej rozprawy doktorskiej Ritchiego.

Zaprezentował go także Uwe Schöning wraz z GOTO i WHILE .

Filozofia projektowania i funkcje

W przeciwieństwie do programów GOTO i programów WHILE , programy LOOP zawsze kończą działanie . Dlatego zbiór funkcji obliczalnych przez programy LOOP jest właściwym podzbiorem funkcji obliczalnych (a zatem podzbiorem funkcji obliczalnych przez programy WHILE i GOTO).

Meyer i Ritchie udowodnili, że każda prymitywna funkcja rekurencyjna jest obliczalna metodą LOOP i odwrotnie.

Przykładem całkowitej obliczalnej funkcji, która nie jest obliczalna w LOOP, jest funkcja Ackermanna .

Definicja formalna

Składnia

Programy LOOP składają się z symboli LOOP , DO , END , := , + i ; jak również dowolną liczbę zmiennych i stałych. Programy LOOP mają następującą składnię w zmodyfikowanej formie Backusa – Naura :

Tutaj zmiennych i stałymi.

Semantyka

Jeśli P jest programem LOOP, P jest odpowiednikiem funkcji . Zmienne w programie LOOP odpowiadają argumentom funkcji do i są inicjowane przed wykonaniem programu odpowiednimi wartościami. Wszystkim pozostałym zmiennym nadawana jest wartość początkowa zero. Zmienna odpowiada wartości, którą przyjmuje po wartości argumentów od do .

Oświadczenie o formie

 x  ja  := 0 

oznacza, że ​​wartość zmiennej jest ustawiona na 0.

Oświadczenie o formie

 x  ja  := x  ja  + 1 

oznacza, że ​​wartość zmiennej jest zwiększana o 1.

Oświadczenie o formie

 P  1  ;  P  2 

sekwencyjne wykonywanie podprogramów i w tej kolejności

Oświadczenie o formie

   PĘTLA  x  DO  P  KONIEC 

programu częściowego razy , gdzie używana wartość, którą na początku wykonywania instrukcji jeśli zmieni wartość nie wpłynie to na to, ile razy pętli. Jeśli wartość zero, nie jest wykonywany wewnątrz instrukcji LOOP . Pozwala to na rozgałęzienia w programach LOOP, gdzie warunkowe wykonanie częściowego programu zależy od tego, czy zmienna ma wartość zero, czy jeden.

Tworzenie „wygodnych instrukcji”

Z podstawowej składni tworzy się „wygodne instrukcje”. Nie będą to podprogramy w konwencjonalnym sensie, ale raczej programy LOOP utworzone z podstawowej składni i wyposażone w mnemonik. W sensie formalnym, aby korzystać z tych programów, należy albo (i) „rozszerzyć” je w kodzie – będą one wymagały użycia zmiennych tymczasowych lub „pomocniczych”, więc trzeba to wziąć pod uwagę, albo (ii) zaprojektować składnia z instrukcjami „wbudowanymi”.

Przykład

Funkcja projekcji k-ary wyodrębnia i-tą współrzędną z uporządkowanej k-krotki.

Ritchie przyjęli zadanie stwierdzenie Jak pokazuje przykład, przypisanie można wyprowadzić z listy podstawowych instrukcji.

Aby utworzyć instrukcję użyj poniższego bloku kodu. = równoważne

 x  j  := 0; PĘTLA x   i  DO x  j  := x  j  + 1 KONIEC 

Ponownie, wszystko to jest tylko dla wygody; nic z tego nie zwiększa wewnętrznej mocy modelu.

Przykładowe programy

Dodatek

Dodawanie jest rekurencyjnie definiowane jako:

Tutaj S należy czytać jako „następca”.

W sekwencji hiperoperatora jest to funkcja

mogą być realizowane przez program LOOP ADD ( x 1 , x 2 )

 00 00 PĘTLA  x  1  DO  x  := x  + 1  KONIEC  ;  PĘTLA  x  2  DO  x  := x  + 1  KONIEC 

Mnożenie

Mnożenie jest funkcją hiperoperacji

mogą być realizowane przez program LOOP MULT ( x 1 , x 2 )

0 00 x  := 0;  PĘTLA  x  2  DO  x  := DODAJ( x  1  , x  )  KONIEC 

Program wykorzystuje program ADD() jako „instrukcję wygodną”. Rozwinięty program MULT jest programem LOOP z dwoma zagnieżdżonymi instrukcjami LOOP. ADD liczy się za jeden.

Więcej hiperoperatorów

Mając program LOOP dla funkcji hiperoperacji , można skonstruować program LOOP dla następnego poziomu.

(co oznacza potęgowanie ) może być realizowane przez program LOOP POWER ( x 1 , x 2 )

0 00 x  := 1;  LOOP  x  2  DO  x  := MULT( x  1  , x  )  KONIEC 

Rozwinięty program do potęgowania ma trzy zagnieżdżone instrukcje LOOP.

Poprzednik

Funkcja poprzednika jest zdefiniowana jako

.

można obliczyć za pomocą następującego programu LOOP, który ustawia zmienną na .

 0 /* warunek wstępny: x2 = 0 */  LOOP  x  1  DO  x  := x  2  ; x   2  := x  2  + 1  KONIEC 

Rozszerzony, to jest program

 0 00 /* warunek wstępny: x  2  = 0 */  LOOP  x  1  DO  x  := 0;  PĘTLA  x  2  DO  x  := x  + 1  KONIEC  ; x   2  := x  2  + 1  KONIEC 

Ten program może być używany jako podprogram w innych programach LOOP. Składnię LOOP można rozszerzyć za pomocą następującej instrukcji, co jest równoznaczne z wywołaniem powyższej procedury jako podprogramu:

0 x  := x  1  ∸ 1 

00 Uwaga : Ponownie należy pamiętać o skutkach ubocznych. Poprzedni program zmienia zmienną x 2 , która może być używana gdzie indziej. Aby rozwinąć instrukcję x := x 1 ∸ 1, można zainicjalizować zmienne x n , x n+1 i x n+2 (dla wystarczająco dużego n) odpowiednio na 0, x 1 i 0, uruchomić na nich kod zmienne i skopiuj wynik (x n ) do x . Kompilator może to zrobić.

Odejmowanie odcięte

0 Jeśli w programie „dodawanie” nad drugą pętlą zmniejsza x zamiast zwiększać, program oblicza różnicę (odcięta na 0) zmiennych i i .

0
 00 x  := x  1  PĘTLA  x  2  DO  x  := x  ∸ 1  KONIEC 

Podobnie jak poprzednio, możemy rozszerzyć składnię LOOP za pomocą instrukcji:

0 x  := x  1  ∸ x  2 

Jeśli to inaczej

Instrukcja if-then-else z if x 1 > x 2 then P1 else P2:

    x  n1  := x  1  ∸ x  2  ; x   n2  := 0; x   n3  := 1;  PĘTLA  x  n1  DO  x  n2  := 1; x   n3  := 0  KONIEC  ;  PĘTLA  x  n2  DO  P1  KONIEC  ;  PĘTLA  x  n3  DO  P2  KONIEC  ; 

Zobacz też

Uwagi i odniesienia

Bibliografia

Linki zewnętrzne