Кіріспе

Бағдарламаның бастапқы коды функцияларды шақырудан ғана тұратын болса, онда компьютер ғылымында мұндай код "тізбекті код" деп аталады. Бұл бағдарламалау әдісі кодтың негізінен ішкі бағдарламаларды шақырудан құралған түрін білдіреді. Ол көбінесе компиляторларда қолданылады, олар кодты осы форматта жасайды немесе өздері осы форматта іске асырылады. Кодты интерпретатор өңдей алады, немесе ол машиналық кодты шақыру командаларының тізбегі болуы мүмкін. Тізбекті кодтың тығыздығы, баламалы генерациялау әдістерімен және шақыру конвенцияларымен жасалған кодқа қарағанда артық. Кэштелген архитектураларда оның орындалуы сәл баяу болуы мүмкін. Дегенмен, компьютер процессорының кэшіне сыйып қана қоймайтын, кэш қатесі көп болатын үлкен бағдарламадан кішкентай бағдарлама жылдам жұмыс істеуі мүмкін. Кішкентай бағдарламалар, басқа бағдарламалар кэшті толтырған кезде, тізбелерді ауыстыруда да жылдам болуы мүмкін. Тізбекті код, Forth, BASIC-тің көптеген нұсқалары, COBOL-дың кейбір нұсқалары, B-нің алғашқы нұсқалары, сондай-ақ кішкентай миникомпьютерлер мен радио әуесқойларының спутниктері үшін арналған басқа тілдердің компиляторларында кеңінен қолданылады.

Тарих

Компьютерлік бағдарламаларды жасаудың қалыпты жолы – бастапқы кодты (кейбір символдық тілде жазылған) машиналық кодқа аудару үшін компиляторды пайдалану. Нәтижесіндегі орындалатын файл әдетте жылдам болады, бірақ ол аппараттық платформаға қатысты болғандықтан, портативті емес. Басқа бір тәсіл – виртуалды машина үшін нұсқаулар жасау және әрбір аппараттық платформада интерпретаторды қолдану. Интерпретатор виртуалды машина ортасын құрады және нұсқауларды орындайды. Осылайша, тек интерпретатор ғана құрастырылуы керек. Алғашқы компьютерлерде жад көлемі шектеулі болды. Мысалы, Data General Nova, IBM 1130 және көптеген алғашқы микрокомпьютерлерде тек 4 кБ жедел жад орнатылған. Сондықтан, бағдарламаның мөлшерін азайтудың жолдарын іздеуге көп уақыт жұмсалды, осылайша қол жетімді жадқа сыйып қалуға тырысты. Бір шешім – символдық тілді бөліктеп оқитын және әрекеттерді орындау үшін функцияларды шақыратын интерпретаторды пайдалану. Бастапқы код әдетте алынған машиналық кодтан гөрі тығыз болғандықтан, бұл жалпы жадты пайдалануды азайтуға мүмкіндік береді. Microsoft BASIC интерпретатор болып табылуының себебі: оның өзінің коды Altair 8800 сияқты машиналардың 4 кБ жадын пайдаланушының бастапқы кодымен бөлісуі керек болды. Компилятор бастапқы тілден машиналық кодқа аударады, сондықтан компилятор, бастапқы код және нәтиже бір уақытта жадта болуы тиіс. Интерпретаторда нәтиже болмайды. Сызықты код – жадты үнемдеуге бағытталған компиляцияланған кодты форматтау стилі. Мысалы, макроассемблерлердегідей, бағдарламадағы әрбір операцияның әрбір қадамын жазудың орнына, компилятор әрбір жиі кездесетін код бөлігін қосалқы бағдарламаға жазады. Осылайша, әрбір бөлік жадта тек бір жерде ғана сақталады ("Өзіңді қайталама" дегенді қараңыз). Бұл бағдарламалардың жоғарғы деңгейдегі қолданбасы тек қосалқы бағдарламаларды шақырудан ғана тұруы мүмкін. Көптеген қосалқы бағдарламалардың өзі, өз кезегінде, төменгі деңгейдегі қосалқы бағдарламаларды шақырудан басқа ештеңеден тұрмайды. Мейнфреймдер және RCA 1802 сияқты кейбір алғашқы микропроцессорлар қосалқы бағдарламаны шақыру үшін бірнеше нұсқауларды қажет етті. Жоғарғы деңгейдегі қолданбаларда және көптеген қосалқы бағдарламаларда бұл тізбек үнемі қайталанады, тек қосалқы бағдарламаның мекенжайы бір шақырудан екіншісіне өзгереді. Бұл көптеген функцияларды шақыратын бағдарламада көптеген қайталама кодтар болуы мүмкін дегенді білдіреді. Осы мәселені шешу үшін желілік код жүйелері функцияны шақыруды бір операторда көрсету үшін псевдокодты пайдаланды. Орындалу кезінде шағын "интерпретатор" жоғарғы деңгейдегі кодты қарап, жадтағы қосалқы бағдарламаның мекенжайын анықтап, оны шақырады. Басқа жүйелерде осы негізгі ұғым филиалдық кесте, жіберу кестесі немесе виртуалды әдіс кестесі ретінде іске асырылады, олардың барлығы қосалқы бағдарламалардың мекенжайларынан тұрады. 1970 жылдары аппараттық дизайнерлер қосалқы бағдарламаларды шақыруды жылдамдату және жеңілдету үшін көп күш жұмсады. Жақсартылған жобаларда қосалқы бағдарламаны шақыру үшін тек бір нұсқау қолданылады, сондықтан псевдо-нұсқауды пайдалану орынды үнемдемейді. Сонымен қатар, мұндай шақырулардың өнімділігінде қосымша шығындар болмайды. Бүгінде барлық бағдарламалау тілдері кодты қосалқы бағдарламаларға бөлуге басымдық береді, бірақ олар мұны кеңістікті үнемдеу үшін емес, кодтың түсініктілігі мен күтілуі үшін жасайды. Желілік код жүйелері кеңістікті үнемдеу үшін функцияларды шақыру тізімін, тек қосалқы бағдарламаның мекенжайы бір шақырудан екіншісіне өзгеретін жағдайда, орындалу белгілерінің тізімімен алмастырады, бұл функцияларды шақырулардың опкодтарын алып тастағаннан кейін қалған адрестердің тізімі. Соңғы жылдарда бағдарламашылар осы "интерпретатордың" немесе "кішкентай таңдаушының" көптеген нұсқаларын жасады. Тізімдегі нақты мекенжай индекс, жалпы мақсаттағы тізілім немесе сілтемеші арқылы анықталуы мүмкін. Мекенжайлар тікелей немесе жанама, жалғасқан немесе жалғаспаған (сілтемелер арқылы байланысты), салыстырмалы немесе абсолютті, компиляция кезінде шешілген немесе динамикалық түрде құрылған болуы мүмкін. Ешбір нұсқа барлық жағдайлар үшін "жақсы" деп айтуға болмайды.

Сызықтарды салу үлгілері

Іс жүзінде барлық орындалатын жіптік код кіші бағдарламаларды шақыру үшін осы әдістердің бірін немесе екіншісін пайдаланады (әр әдіс "жіптік модель" деп аталады).

Субпрограмманың желісі

Сонымен аталатын "подпрограммалық желілік код" (сондай-ақ "шақыру желілік коды") машина тіліндегі "шақыру" нұсқауларының (немесе "шақыруға" арналған функциялардың адрестерінің) тізбегінен тұрады, бұл тікелей желілік кодтың "секіру" пайдалануынан өзгеше. ALGOL, Fortran, Cobol және кейбір Forth жүйелері үшін жасалған алғашқы компиляторлар көбінесе подпрограммалық желілік кодты жасады. Бұл жүйелердің көптеген кодтары операндардың соңғы кірген, бірінші шыққан (LIFO) стегінде жұмыс істеді, осыған қатысты компилятор теориясы жақсы дамыған. Көптеген қазіргі процессорлар подпрограмманы "шақыру" және "қайтару" нұсқауларын арнайы аппараттық қолдаумен қамтамасыз етеді, сондықтан бір жөнелту үшін бір қосымша машиналық нұсқаудың қосымша шығыны азаяды. Gforth компиляторының бір авторы Антон Эртл: "көптеген қате түсініктерге қарамастан, подпрограммалық желілік код көбінесе тікелей желілік кодтан баяу болады" деді. Дегенмен, Эртлдің соңғы сынақтары смарт-карталар, ойыншықтар, калькуляторлар және сағаттарда жүргізілді. PBASIC-те қолданылатын биттерге бағытталған токенді кодты Хэффман желілік кодынң бір түрі деп қарастыруға болады.

Аз пайдаланылатын жіптер

Мысал ретінде, операциялар тізбектермен анықталады, олар көбінесе хэш-кесте арқылы ізделіп табылады. Бұл Шарль Х. Мурдың алғашқы Forth жүзеге асыруларында және Иллинойс университетінің эксперименталды аппараттық түсіндірілетін компьютерлік тілінде қолданылған. Сондай-ақ, ол Bashforth-та да қолданылады.