Programowanie proceduralne

Programowanie proceduralne to paradygmat programowania wywodzący się z programowania imperatywnego , oparty na koncepcji wywołania procedury . Procedury (rodzaj procedury lub podprogramu ) zawierają po prostu serię kroków obliczeniowych do wykonania. Dowolna dana procedura może zostać wywołana w dowolnym momencie wykonywania programu, w tym przez inne procedury lub samą siebie. Pierwsze główne języki programowania proceduralnego pojawiły się około 1957-1964, w tym Fortran , ALGOL , COBOL , PL/I i PODSTAWOWE . Pascal i C zostały opublikowane około 1970–1972.

Procesory komputerowe zapewniają sprzętową obsługę programowania proceduralnego za pośrednictwem rejestru stosu i instrukcji dotyczących wywoływania procedur i powrotu z nich. Możliwe jest wsparcie sprzętowe dla innych rodzajów programowania, ale żadna próba nie zakończyła się sukcesem komercyjnym (na przykład maszyny Lisp lub procesory Java ). [ sprzeczne ]

Procedury i modułowość

Modułowość jest ogólnie pożądana, zwłaszcza w dużych, skomplikowanych programach. Dane wejściowe są zwykle określane składniowo w postaci argumentów , a dane wyjściowe są dostarczane jako wartości zwracane .

Scoping to kolejna technika, która pomaga zachować modułowość procedur. Uniemożliwia procedurze dostęp do zmiennych innych procedur (i vice versa), w tym poprzednich wystąpień samej siebie, bez wyraźnej autoryzacji.

Mniej modułowe procedury, często używane w małych lub szybko napisanych programach, mają tendencję do interakcji z dużą liczbą zmiennych w środowisku wykonawczym , które inne procedury również mogą modyfikować.

Ze względu na możliwość określenia prostego interfejsu, bycia samowystarczalnym i wielokrotnego użytku, procedury są wygodnym narzędziem do tworzenia fragmentów kodu napisanych przez różne osoby lub różne grupy, w tym za pośrednictwem bibliotek programistycznych .

Porównanie z innymi paradygmatami programowania

Programowanie imperatywne

Proceduralne języki programowania są również językami imperatywnymi , ponieważ zawierają wyraźne odniesienia do stanu środowiska wykonawczego. Może to być wszystko, od zmiennych (które mogą odpowiadać rejestrom procesora ) po coś w rodzaju pozycji „żółwia” w języku programowania Logo .

Często terminy „programowanie proceduralne” i „programowanie imperatywne” są używane zamiennie. Jednak programowanie proceduralne w dużej mierze opiera się na blokach i zakresie , podczas gdy programowanie imperatywne jako całość może mieć takie funkcje lub nie. Jako takie, języki proceduralne generalnie używają zarezerwowanych słów, które działają na blokach, takich jak if , while i for , aby zaimplementować przepływ sterowania , podczas gdy nieustrukturyzowane języki imperatywne używają instrukcji goto i tabel rozgałęzień w tym samym celu.

Programowanie obiektowe

Celem programowania proceduralnego jest rozbicie zadania programistycznego na zbiór zmiennych , struktur danych i podprogramów , podczas gdy w programowaniu obiektowym jest to rozbicie zadania programistycznego na obiekty, które ujawniają zachowanie (metody) i dane (elementy lub atrybuty) za pomocą interfejsów. Najważniejszą różnicą jest to, że podczas gdy programowanie proceduralne wykorzystuje procedury do operowania na strukturach danych, programowanie obiektowe łączy je razem, więc „obiekt”, który jest instancją klasy , działa na „własnej” strukturze danych.

Nazewnictwo różni się między nimi, chociaż mają podobną semantykę:

Proceduralny Zorientowany obiektowo
Procedura metoda
Nagrywać Obiekt
Moduł Klasa
Wywołanie procedury Wiadomość

Programowanie funkcjonalne

Zasady modułowości i ponownego wykorzystania kodu w praktycznych językach funkcjonalnych są zasadniczo takie same jak w językach proceduralnych, ponieważ oba wywodzą się z programowania strukturalnego . Więc na przykład:

  • Procedury odpowiadają funkcjom. Oba pozwalają na ponowne użycie tego samego kodu w różnych częściach programu iw różnych punktach jego wykonania.
  • Z tego samego powodu wywołania procedur odpowiadają zastosowaniu funkcji.
  • Funkcje i ich modułowe oddzielenie od siebie w ten sam sposób, poprzez użycie argumentów funkcji, wartości zwracanych i zakresów zmiennych.

Główna różnica między stylami polega na tym, że funkcjonalne języki programowania usuwają lub przynajmniej zmniejszają imperatywne elementy programowania proceduralnego. Zestaw funkcji języków funkcyjnych jest zatem zaprojektowany tak, aby w jak największym stopniu wspierać pisanie programów pod względem czystych funkcji :

  • Podczas gdy języki proceduralne modelują wykonanie programu jako sekwencję imperatywnych poleceń, które mogą niejawnie zmieniać wspólny stan, funkcjonalne języki programowania modelują wykonanie jako ocenę złożonych wyrażeń, które zależą od siebie tylko pod względem argumentów i zwracanych wartości. Z tego powodu programy funkcjonalne mogą mieć dowolną kolejność wykonywania kodu, a języki mogą oferować niewielką kontrolę nad kolejnością wykonywania różnych części programu; na przykład argumenty wywołania procedury w Scheme są oceniane w dowolnej kolejności.
  • Funkcjonalne języki programowania obsługują (i intensywnie używają) funkcje pierwszej klasy , funkcje anonimowe i domknięcia , chociaż koncepcje te zostały również uwzględnione w językach proceduralnych co najmniej od czasów Algola 68 .
  • Funkcjonalne języki programowania zwykle polegają na optymalizacji wywołań końcowych i funkcjach wyższego rzędu zamiast imperatywnych konstrukcji pętli.

Jednak wiele języków funkcjonalnych jest w rzeczywistości nieczysto funkcjonalnych i oferuje konstrukcje imperatywne/proceduralne, które pozwalają programiście pisać programy w stylu proceduralnym lub w kombinacji obu stylów. Często zdarza się, że wejścia/wyjścia w językach funkcjonalnych jest pisany w stylu proceduralnym.

Istnieje kilka ezoterycznych języków funkcjonalnych (takich jak Unlambda ), które unikają zasad programowania strukturalnego ze względu na to, że są trudne do programowania (a zatem stanowią wyzwanie). Języki te stanowią wyjątek od wspólnej płaszczyzny między językami proceduralnymi i funkcjonalnymi.

Programowanie logiczne

W programowaniu logicznym program jest zbiorem przesłanek, a obliczenia są wykonywane poprzez próbę udowodnienia twierdzeń kandydujących. Z tego punktu widzenia programy logiczne są deklaratywne , koncentrując się na tym, na czym polega problem, a nie na tym, jak go rozwiązać.

Jednak technika wnioskowania wstecznego , zaimplementowana przez rozwiązanie SLD , używana do rozwiązywania problemów w logicznych językach programowania, takich jak Prolog , traktuje programy jako procedury redukcji celu. Zatem klauzule postaci:

H:- B 1 , …, B n .

mają podwójną interpretację, obie jako procedury

pokazać/rozwiązać H , pokazać/rozwiązać B 1 i … i B n

oraz jako implikacje logiczne:

B 1 i … i B n implikuje H .

Doświadczeni programiści logiki używają interpretacji proceduralnej do pisania programów, które są skuteczne i wydajne, a interpretacji deklaratywnej używają, aby zapewnić poprawność programów.

Zobacz też

Linki zewnętrzne