Кіріспе

Компьютерлік бағдарламадағы нұсқаулардың тармақталуы – компьютерлік бағдарламадағы нұсқау, ол компьютердің басқа нұсқаулар тізбесін орындауын бастауына және осылайша нұсқауларды ретпен орындаудың әдепкі мінез-құлқынан ауытқуына мүмкіндік береді. Тармақталу (немесе тармақталу әрекеті, тармақталған) – тармақталу нұсқауын орындау нәтижесінде орындауды басқа нұсқаулар тізбегіне ауыстыруды да білдіреді. Тармақталу нұсқаулары бағдарламаның циклдары мен шарттық операторларын іске асыру үшін қолданылады (яғни, нұсқаулардың белгілі бір тізбесі тек белгілі бір шарттар орындалғанда ғана орындалады). Тармақталу нұсқаулары шартты емес, яғни әрқашан тармақталуға әкелетін, немесе шартты болуы мүмкін, ол қандай да бір шартқа байланысты тармақталуға немесе тармақталмауға мүмкіндік береді. Сонымен қатар, жаңа нұсқаулар тізбегінің ("мақсатты" мекенжайы) мекенжайын қалай анықтайтынына қарай, тармақталу нұсқаулары тікелей, жанама немесе салыстырмалы болып жіктеледі. Яғни, нұсқау мақсатты мекенжайды тікелей қамтиды, мақсатты мекенжайдың қайда екенін көрсетеді (мысалы, тіркеуіш немесе жад орны) немесе ағымдағы және мақсатты мекенжайлар арасындағы айырмашылықты көрсетеді.

Іске асыру

Бранч нұсқаулары CPU-ның бағдарламалық тіркеуішінің (немесе PC) (немесе Intel микропроцессорларындағы нұсқаулар көрсеткіші) мазмұнын өзгерте алады. PC келесі машиналық нұсқаудың жад мекенжайын сақтайды, оны алу және орындау керек. Сондықтан, бранч орындалса, CPU жаңа жад мекенжайынан кодты орындауға көшеді, бағдарламаның логикасын бағдарламашы жоспарлаған алгоритмге сәйкес өзгертеді. Машиналық деңгейдегі бранчтың бір түрі – секіру нұсқаулығы. Бұл нұсқаулар PC-нің әдеттегіден өзге жаңа мәнмен жүктелуіне немесе өзгеруіне (ағымдағы нұсқаудан кейінгі нұсқауға көшу үшін) себеп болуы мүмкін немесе себеп болмауы мүмкін. Секіру нұсқауларының шартты және шартсыз түрлері болады, соңғысы белгілі бір шартқа байланысты орындалуы немесе орындалмауы мүмкін (PC өзгертіледі немесе өзгертілмейді). Машиналық деңгейдегі бранчтың екінші түрі – қосалқы бағдарламаларды іске асыру үшін қолданылатын шақыру нұсқаулығы. Секіру нұсқаулары сияқты, шақырулар да шартты кодтарға сәйкес PC-ні өзгерте алады немесе өзгерте алмайды, бірақ сонымен қатар қайтару мекенжайы жадтағы қауіпсіз жерде сақталады (әдетте стек деп аталатын жадтағы дерек құрылымында). Қосалқы бағдарлама аяқталғаннан кейін бұл қайтару мекенжайы PC-ге қалпына келтіріледі, сондықтан бағдарламаның орындалуы шақыру нұсқаулығынан кейінгі нұсқаулықпен жалғасады. Машиналық деңгейдегі бранчтың үшінші түрі – қайтару нұсқаулығы. Бұл нұсқау стектегі қайтару мекенжайын алып, оны PC тіркеуішіне жүктейді, осылайша шақырушыға басқаруды қайтарады. Қайтару нұсқаулары да шартты түрде орындалуы мүмкін. Бұл сипаттама әдеттегі жағдайға қатысты, бірақ машина бағдарламалаушысы стектегі қайтару мекенжайын манипуляциялауға мүмкіндік алады, соның арқасында бағдарламаның орындалуын әртүрлі жолдармен өзгерте алады. Процессорға байланысты, секіру және шақыру нұсқаулары PC тіркеуішінің мазмұнын әртүрлі жолдармен өзгерте алады. Абсолюттік мекенжай жүктелуі мүмкін, немесе PC-нің ағымдағы мазмұнына белгілі бір мән (немесе ығысу) қосылуы немесе алынып тасталуы мүмкін, соның арқасында бағытталған мекенжай бағдарламадағы ағымдағы орынға қатысты болады. Ығысу мәнінің көзі әртүрлі болуы мүмкін, мысалы, нұсқаудың ішінде орналастырылған тікелей мән, процессор тіркеуішінің немесе жад орнының мазмұны, немесе индекс мәніне қосылған кейбір орналасудың мазмұны. "Бранч" термині жоғары деңгейдегі бағдарламалау тілдеріндегі бағдарламаларға қатысты да қолданылуы мүмкін. Мұндай бранчтар әдетте шарттар орындалған жағдайда орындалатын нұсқаулар тізбесін қамтитын шартты операторлар түрінде болады. GOTO сияқты шартсыз бранч нұсқаулары басқа нұсқаулар тізбесіне шартсыз секіру үшін қолданылады. Егер алгоритм шартты бранчты қажет етсе, GOTO (немесе GOSUB қосалқы бағдарлама шақыруы) алдында шартты анықтайтын IF THEN операторы орналасады. Барлық жоғары деңгейдегі тілдер кодты цикл ретінде қайта пайдалана алатын алгоритмдерді қолдайды, бұл циклдің аяқталуына себеп болатын шарт орындалғанша нұсқаулар тізбесін қайталайтын басқару құрылымы. Циклдар да бранч нұсқаулары болып саналады. Машиналық деңгейде циклдар қайталанатын кодқа орындауды қайта бағыттайтын қарапайым шартты секірулер ретінде іске асырылады. Флаг тіркеуіштері бар CPU-ларда, алдыңғы нұсқау флаг тіркеуішінде шартты белгілейді. Алдыңғы нұсқау арифметикалық немесе логикалық нұсқау болуы мүмкін. Бұл нұсқау бранчқа жақын орналасқан, бірақ міндетті түрде бранчтан бірден бұрын емес. Сақталған шарт, мысалы, ашылу жалаушасы орнатылған болса, секіру сияқты бранчта қолданылады. Бұл уақытша ақпарат көбінесе флаг тіркеуішінде сақталады, бірақ басқа жерде де орналасуы мүмкін. Флаг тіркеуішінің дизайны баяу, қарапайым компьютерлерде қарапайым. Жылдам компьютерлерде флаг тіркеуіші жылдамдыққа кедергі келтіруі мүмкін, өйткені басқаша параллель жұмыс істейтін нұсқаулар (бірнеше орындау бірліктерінде) флаг биттерін белгілі бір реттілікпен орнатуы керек. Сондай-ақ, жағдайды секіру нұсқаулығының өзімен тексеруге болатын машиналар (немесе арнайы нұсқаулар) бар, мысалы, егер X теріс болса, <белгіге> бранч. Қарапайым компьютерлік жобаларда салыстыру бранчтары көбірек арифметикалық операцияларды орындайды және флаг тіркеуішіндегі бранчтардан көбірек қуатты пайдалана алады. Жылдам компьютерлік жобаларда салыстыру бранчтары флаг тіркеуішіндегі бранчтардан жылдам жұмыс істей алады, өйткені салыстыру бранчтары тіркеуіштерге көбірек параллелизммен қол жеткізе алады, есептеулерге арналған CPU механизмдерін пайдаланады. Кейбір ерте және қарапайым CPU архитектуралары, әлі де микроконтроллерлерде кездесетін, шартты секіруді іске асырмауы мүмкін, бірақ керісінше, тек "келесі нұсқауды өткізіп жіберу" операциясын ғана іске асырады. Шартты секіру немесе шақыру осылайша шартты түрде секіру арқылы немесе шақыру нұсқаулығын өткізіп жіберу арқылы іске асырылады.

Филиал нұсқауларының орындалуындағы мәселелер

Жоғары өнімділікке қол жеткізу үшін қазіргі заманғы процессорлар конвейерлік болып келеді. Олар әрқайсысы бір нұсқауды жартылай өңдейтін, нәтижелерін конвейердің келесі сатысына жіберіп, бағдарламадағы келесі нұсқаумен жұмыс істей бастайтын бірнеше бөлімдерден тұрады. Бұл конструкция нұсқаулардың белгілі бір, өзгермейтін ретпен орындалуын талап етеді. Шартты тармақталу нұсқаулары осы реттілікті болжау мүмкін емес етеді. Сондықтан шартты тармақталулар конвейерді бағдарламаның басқа бөлігінен қайта іске қосуды қажет ететін "тоқтауларды" тудыруы мүмкін.

Филиалдардағы жұмыс орындарын қысқарту арқылы өнімділікті арттыру

Бірнеше техникалар шартты тармақтардан туындайтын тоқтауларды азайту арқылы жылдамдықты арттырады.

Филиал болжамы туралы кеңестер

Тарихи тұрғыдан алғанда, тармақты болжау статистиканы пайдаланып, кодты оңтайландыру үшін оның нәтижелерін қолданды. Бағдарламашы бағдарламаның сынақ нұсқасын жинап, оны сынақ деректерімен іске қосатын. Сынақ коды тармақтардың қалай орындалғанын санайтын. Сынақ кодынан алынған статистика компиляторға жарияланған кодтың тармақтарын оңтайландыру үшін пайдаланылды. Оптимизация ең жылдам тармақ бағытының (орындалған немесе орындалмаған) әрқашан ең көп қолданылатын бақылау ағыны болуын қамтамасыз етеді. Мұғаны іске асыру үшін процессорлар болжамды тармақ уақытын (немесе кемінде) қолдауы керек. Кейбір процессорларда нұсқаулар жиынтығы бар (мысалы, Power ISA), олар "тармақ кеңестерімен" жабдықталған, бұл компиляторға әр тармақты қалай орындау керектігін процессорға хабарлауға мүмкіндік береді. Бағдарламалық тармақты болжаудың қиындығы – бұл күрделі бағдарламалық жасақтаманы әзірлеуді қажет етеді.

Жабдықтық тармақ болжаушылары

Кез келген бағдарламалық жасақтаманы іске қосу үшін аппараттық тармақ болжаушылары статистиканы электроникаға жылжытты. Тармақ болжаушылар – процессордың шартты тармақтың нәтижесін болжайтын бөліктері. Содан кейін процессордың логикасы күтілетін нұсқаулар ағынын орындау арқылы болжамға сенеді. Аппараттық тармақ болжаудың қарапайым схемасының мысалы – барлық кері тармақтар (яғни, кіші бағдарлама санағына) орындалады деп есептеледі (өйткені олар циклдің бөлігі), ал барлық алға тармақтар (үлкен бағдарлама санағына) орындалмайды деп есептеледі (өйткені олар циклден шығады). Жақсы тармақ болжаушылар әртүрлі сынақ бағдарламаларында модельдеу арқылы статистикалық түрде әзірленеді және тексеріледі. Жақсы болжаушылар әдетте тармақтың бұрынғы орындалуларының нәтижелерін санайды. Жылдам және қымбат компьютерлер жақсы тармақ болжау электроникасына инвестиция жасау арқылы одан да жылдам жұмыс істей алады. Аппараттық тармақ болжауы бар процессорда тармақ кеңестері компилятордың, болжам бойынша, артық тармақ болжауын аппараттың қарапайым тармақ болжауын күштен шығаруға мүмкіндік береді.

Филиалдан тыс код

Кейбір логика тармақтарсыз немесе азырақ тармақтармен жазылуы мүмкін. Көп жағдайда тармақтардың орнына биттік операцияларды, шартты жылжуларды немесе басқа да шартты орындауды қолдануға болады. Шындығында, уақыттық шабуылдарға қарсы тұру үшін криптографияда тармақтарсыз код қажет.

Келесі уақыт аралығы

Тағы бір әдіс – тармақты кідірту терезесі. Бұл тәсілде, тармақтан кейін келетін кем дегенде бір нұсқау әрқашан орындалады, бірақ MIPS архитектурасының ықтималды/ықтимал емес тармақ нұсқауы сияқты кейбір ерекшеліктер бар. Сондықтан, компьютер өз құбыр желісі тоқтап тұрса да, тұрмаса да, осы нұсқауды пайдалы жұмыс істеу үшін пайдалана алады. Бұл тәсіл тарихи түрде RISC компьютерлерінде кең таралған. Үйлесімді процессорлар отбасында ол көп циклды процессорларды (құбырсыз), күтілгеннен ұзақ құбырлары бар жылдам процессорларды және суперскалярлы процессорларды (нұсқауларды ретінсіз орындай алады) қиындатады.