Przejdź do zawartości

Przepływ sterowania

Z Wikipedii, wolnej encyklopedii

Przepływ sterowania (ang. control flow) – zbiór instrukcji i wyrażeń uporządkowanych w kolejności wykonania. W języku programowania instrukcja przepływu sterowania może zmienić przepływ sterowania tak, aby wyrażenia wykonywane były w innej kolejności niż ta, w jakiej są wypisane w kodzie źródłowym. Pojęcie przepływu danych jest prawie zawsze ograniczane do pojedynczego wątku aplikacji, ponieważ dotyczy ono wykonywania instrukcji jednej po drugiej[potrzebny przypis].

Rodzaje instrukcji przepływu sterowania różnią się w zależności od języka, ale mogą być pogrupowane ze względu na efekt, jaki powodują:

  • Kontynuacja od innego punktu programu (skok)
  • Warunkowe wykonanie grupy wyrażeń (wybór)
  • Powtarzanie wykonywania grupy wyrażeń (pętla, odpowiednik skoku do wcześniejszego miejsca w kodzie)
  • Wykonywanie grupy odległych wyrażeń, po których sterowanie powraca do miejsca wywołania (podprogram)
  • Wyjątki – przejście w górę stosu wywołań programu do miejsca w którym dany wyjątek jest obsługiwany, z możliwością przenoszenia dodatkowych informacji
  • Systemy efektów – podobnie do wyjątków z tą różnicą, że po obsłużeniu (ang. handling) efektu program jest kontynuowany od momentu w którym efekt został wywołany
  • Zupełne przerwanie wykonywania programu

Przerwanie (ang. interrupt) to kolejny mechanizm zmieniający przepływ sterowania do określonego podprogramu, lecz dzieje się to w odpowiedzi na sygnały lub zdarzenia zewnętrzne, a nie na stan samej aplikacji.

Samomodyfikowanie kodu źródłowego może być również użyte do zmiany przepływu sterowania, lecz przeważnie nie wiąże się ono z wykonaniem żadnej konkretnej instrukcji przepływu sterowania (wyjątek to ALTER w COBOLu).

Systemy efektów przez wykorzystywanie kontynuacji pozwalają m.in. na wykonywanie asynchronicznych operacji w synchronicznym kontekście[1]. Są one dodawane do nowoczesnych języków funkcyjnych i eksperymentalnych, takich jak OCaml (od wersji 5)[2] czy Koka[3].

Na najniższym poziomie języka maszynowego lub asemblera, zmianę przepływu sterowania realizuje się poprzez ingerowanie w licznik programu. W wielu procesorach jedynymi dostępnymi instrukcjami zmiany przepływu są skoki warunkowe i bezwarunkowe. Kompilatory języków wysokopoziomowych muszą zatem przetłumaczyć wszystkie istniejące w nich instrukcje sterujące, wykorzystując wyłącznie ten ograniczony i uproszczony zestaw, nie zniekształcając przy tym zapisanego za ich pomocą programu[potrzebny przypis].

Przypisy

[edytuj | edytuj kod]
  1. ↑ Algebraic Effects for the Rest of Us — overreacted [online], overreacted.io [dostęp 2026-06-13] (ang.).
  2. ↑ OCaml - Language extensions [online], ocaml.org [dostęp 2026-06-13].
  3. ↑ The Koka Programming Language [online], koka-lang.github.io [dostęp 2026-06-13] (ang.).