У рачунарству, управљање током представља редослед по коме се наредбе, упутства или позиви функција проверавају или извршавају. Експлицитним нагласком на контролу тока се разликују императивни програмски језици од декларативних програмских језика.

У оквиру императивног програмског језика, наредба управљања током својим извршавањем даје одговор на питање којим путем (ако постоје 2 или више) треба наставити извршавање. Код не-стриктних програмских језика, функцијама и језичким конструкцијама се долази до истог резултата, али се то не зове нужно управљање током.

Врсте наредби контроле током које подржавају различити језици се разликују, али се могу поделити по њиховом ефекту: наставак на другој наредби(безусловно гранање или скок), извршавање блока наредби само ако је испуњен одређени услов (избор, односно условна грана), извршавање склопа наредби ниједном или више пута, док се не испуни одређени услов (нпр. петља - исто гао и условна грана), извршавање удаљеног комплета наредби, након којег се углавном ток управљања враћа (потпрограми, копрограми и континуације), заустављање програма, спречавајући даљи рад (безусловни застој).

Скуп наредби је зато генерално структуриран као блок, који поред груписања дефинише и лексички обим.

Прекиди и сигнали су механизми ниског нивоа који мењају ток управљања на сличан начин као и потпрограми, али се пре јављају као одговор на неке екстерне стимулусе (који могу да се десе асинхроно), него на „ин-лајн наредбе управљања током.

На нивоу машине или асемблерског језика, инструкције управљања током раде тако што мењају програмски регистар. За неке процесоре једина упутства за управљање током су условне или безусловне наредбе за гранање (скокови).

Примитиве

Лабеле

Лабела преставља име или број експлицитно додељен фиксној позицији унутар изворног кода, који може бити позван наредбом управљања тока која се налази на неком другом месту унутар изворног кода. Лабела, осим што обележава позицију унутар изворног кода, нема других функција.

Бројеви редова су замена за лабелу са именом (који се користе у неким програмским језицима као што су Фортран и Бејсик), то су цели бројеви постављени на почетак сваког реда текста унутар изворног кода. Програмски језици у којима се ово користи често постављају услов да број сваког новог реда мора бити већи од броја из претходног реда, али не мора нужно бити први узастопни. На пример, у Бејсику:10 LET X = 3 20 PRINT XУ другим језицима као што су C и Ада, лабела је идентификатор који се обично појављује на почетку реда, праћен колоном. На пример, у програмском језику C:Success: printf("The operation was successful.\n");Програмски језик Алгол 60 је дозвољавао како целе бројеве тако и идентификаторе као лабеле (оба закачена за колону са одређеном наредбом), али само неколико у случају да је нека друга варијанта Алгола дозвољавала целе бројеве.

Goto goto наредба (реч настала спајањем енглеских речи гоу и ту) је најједноставнија форма безусловног преноса управљања.

Иако кључна реч може бити састављена и од великих и од малих слова у зависности од програмског језика, обично се записује као: goto labelЦиљ гоуту наредбе је да изазове извршавање наредбе која је дата одређеном лабелом (или следи одмах након ње).

Гоуту наредбе се сматрају штетним од стране многих стручњака из области рачунарства, међу којима је и Едсгер Дајкстра.

Потпрограми

Терминологија речи потпрограм доста варира; алтернативни називи су рутине, процедуре, функције (поготово ако враћају резултате) или методе (посебно ако припадају класама или класама типа).

Током педесетих година двадесетог века, меморије рачунара су биле веома мале у поређењу са данашњим стандардима, па су потпрограми пре свега коришћене ради смањивања величине програма; део кода је био једном написан а онда коришћен много пута из различитих делова програма.

У данашње време, потпрограми се чешће користе са стварање програма који има обимнију структуру, нпр. издвајањем одређеног алгоритма или сакривањем одређене методе прсиступа подацима, потпрограми су један тип модуларности који помаже да се скрати посао.

Минимално структурирано управљање током У мају 1966., Бом и Јакопини су објавили чланак у часопису Комуникације АЦМ-а у којем тврде да било који програм са гоутујем може да се преобрази у програм без гоутуа користећи само избор (IF THEN ELSE) и петље (WHILE услов DO xxx), могуће са дуплираним кодом и/или додавањем Булових варијабли (тачно/нетачно). Касније су аутори доказали да избор може бити замењен петљама (и још више Булових променљивих).

Чињеница да је такав минимализам могућ, не значи и да је пожељан; уосталом, рачунарима је теоретски потребна само једна машинска инструкција (одузми један број од другог и гранај ако је резултат негативан), али практични рачунари имају више десетина или више стотина машинских инструкција.

Бомов и Јакопинијев чланак је показао да сви програми могу бити без гоуту-а. Остала истраживања су показала да су контролне структуре са по једним улазом и излазом биле много лакше за разумевање него било која друга форма, највише због тога што су могле да се користе свуда као наредбе, без ремећења управљања током. Другим речима, биле су композабилне. (Каснија унапређења, као што су не-стриктни програмски језици - или ранија, композабилне софтверске трансакције - су пратиле овај правац мишљења, што је чинило компоненте програма још више композабилним.)

Неки академици су пуристички приступили резултатима Бома и Јакопинија и започели расправу о томе да су чак и break и return наредбе које се налазе у петљама лоше у пракси пошто уопште нису потребне у наведеном доказу, стога су се залагали да све петље треба да имају само један излаз. Овакав пуристички приступ је основа програмског језика Паскал (дизајнираног 1968-1969), који је до средине деведесетих година двадесетог века био префериран језик за програмере почетнике на факултетима.Roberts, E. “Loop Exits and Structured Programming: Reopening the Debate ,” ACM SIGCSE Bulletin, (27)1: 268–272. Директна примена Бом-Јакопини теореме може довести до појаве додатних локалних променљивих у структурираном графикону, и такође довести до понављања у коду. Потоњи проблем се назива петља и по у овом контексту. Паскал је захваћен са оба наведена проблема и судећи по емпиријским истраживањима Ерика С. Робертса, студенти су имали потешкоћа са формулацијом тачних решења за неколицину простих проблема, укључујући писање функције која тражи елемент у низу. У истраживању Хенрија Шапира из 1980. наведеног од стране Робертса, стоји податак да користећи само контролне структуре које нуди Паскал, само 20% субјеката је дало тачан одговор, док ниједан субјекат није написао погрешан код за решење проблема ако му је било дозвољено да напише return наредбу у телу петље.

Контролне структуре у пракси Већина програмских језика који садрже контролне структуре поседују и иницијалну кључну реч која казује који тип контролне структуре је садржан. Језици се тада деле на оне чије контролне структуре имају односно немају финалну кључну реч.

Без финалне кључне речи: Алгол 60, C, C++, Хаскел, Јава, Паскал, Перл, PHP, ПЛ/И, Пајтон, ПауерШел. Оваквим језицима је потребан неки начин груписања изјава: Алгол 60 и Паскал : begin ... end C, C++, Јава, Перл, PHP и ПауерШел: витичасте заграде { ... } ПЛ/1: DO ... END Пајтон: користи ниво увлачења (види правило са-стране) Хаскел: могу се користити и метод увлачења и витичасте заграде, уз слободу да се мешају Финалне кључне речи: Ада, Алгол 68, Модула-2, Фортран 77, Митрил, Вижуал бејсик. Форме финалних кључних речи: Ада: Финална кључна реч је end + спејс + иницијална кључна реч нпр. if ... end if, loop ... end loop Алгол 68, Митрил: иницијална кључна реч писана отпозади нпр. if ... fi, case ... esac Фортран 77: финална кључна реч је end + иницијална кључна реч нпр. IF ... ENDIF, DO ... ENDDO Модула-2: иста финална кључна реч END за све Вижуал бејсик: свака контролна структура има своју кључну реч. If ... End If; For ... Next; Do ... Loop; While ... Wend

Избор

If-then-(else) наредбе Условни изрази и условне конструкције су одлике програмског језика који извршава различите операције у зависности да ли Булов услов враћа true или false.

IF..GOTO. Форма која се среће у неструктурираним програмским језицима која имитира обичну инструкцију машинског кода, би требало да скочи (GOTO) до ознаке или линијског броја када се услов испуни.

IF..THEN..(ENDIF). Уместо да буду ограничене на скок, било која проста наредба или угнежђени би могли да прате THEN кључну реч. Ово је структурирана форма.

IF..THEN..ELSE..(ENDIF). Као горенаведено, али предузимајући другу радњу уколико је услов false. Ово је једна од најзаступљенијих форми, са много варијација. Неке захтевају завршно ENDIF, неке не. C и слични језици не захтевају завршну кључну реч, или 'then', али захтевају заграде око услова.

Условне наредбе су често угнежђене унутар условних наредби. Неки језици дозвољавају ELSE и IF да се комбинују у ELSEIF, избегавајући потребуза већим бројем ENDIF или осталих финалних наредби на крају сложене наредбе.

Мање познате варијације укључују:- Неки језици, као што је Фортран, имају "троструко" или "аритметичко if", тестирање, које проверава да ли је нумеричка вредност позитивна, негативна или нула..

Неки језици поседују функционалну форму "if" наредбе, на пример Lispов cond.

Неки језици поседују операторску форму "if" наредбе, као на пример тројни оператор у језику C.

Перл пружа if са when и unless по узуру на C.

Smalltalk користи ifTrue и ifFalse поруке за имплементацију кондиционала, радије него неке основне језичке конструкције.

Наредбе замене и предмета Наредбе замене (или наредбе предмета, или вишеструке гране) пореде задату вредност са одређеним константама и започињу извршавање у зависности од прве константе са којом се поклопе. Обично постоји ограничен број уобичајених акција ("else", "otherwise") које се предузимају ако се ниједно поклапање не догоди. Наредбе замене дозвољавају оптимизацију компајлера, као што су лукап табеле. У динамичким језицима, предмети не морају бити ограничени константним изразима, и могуће је да се продуже до поклапања шаблона, као у примеру шел скрипте са десне стране, где *) имплементира уобичајени случај као глоб који се поклапа са било којим стрингом. Логика случаја се такође може имплементирати у функционалну форму, као у SQL-овој decode наредби.

Pascal: Ada: C: Shell script: Lisp:case someChar of 'a': actionOnA; 'x': actionOnX; 'y','z':actionOnYandZ; else actionOnNoMatch; end;case someChar is when 'a' => actionOnA; when 'x' => actionOnX; when 'y' | 'z' => actionOnYandZ; when others => actionOnNoMatch; end;switch (someChar) { case 'a': actionOnA; break; case 'x': actionOnX; break; case 'y': case 'z': actionOnYandZ; break; default: actionOnNoMatch; }case $someChar in a) actionOnA ;; x) actionOnX ;; [yz]) actionOnYandZ ;; *) actionOnNoMatch ;; esac(case someChar ((#\a) actionOnA) ((#\x) actionOnX) ((#\y #\z) actionOnYandZ) (else actionOnNoMatch))

Петље Петља представља низ наредби који се дефинише једном али се може извршите више пута узастопно. Код "унутар" петље (тело петље, испод приказано као ххх) се извршава одређен број пута, или једанпут за колекцију ставки, или док се не испуни одређени услов, или неограничено мого пута.

У функционалним програмским језицима, као што су Хаскел и Scheme, петље се могу исказати помоћу рекурзије или итерације са задатом тачком боље него експлицитним конструкцијама петље. Репна рекурзија представља специјални случај рекурзије која се лако може претворити у итерацију.

Петље контролисане бројањем

Већина програмских језика поседује конструкције за понављање петље одређен број пута. Треба запазити да, ако је N мање од 1 у овим случајевима, онда језик заправо спецификује да тело треба потпуно прескочити, или извршити једанпут ако је N=1. У већини случајева, бројање је могуће и уназад, а не мора ни бити узастопно. FOR I = 1 TO N | for I := 1 to N do begin xxx | xxx