Бағдарлама - Subroutine

Жылы компьютерлік бағдарламалау, а ішкі программа бұл белгілі бір тапсырманы орындайтын, бірлік ретінде оралған бағдарламалық нұсқаулықтың кезектілігі. Содан кейін бұл қондырғыны қай жерде болмасын бағдарламаларда қолдануға болады тапсырма орындалуы керек.

Бағдарламалар бағдарламада немесе бөлек анықталуы мүмкін кітапханалар оны көптеген бағдарламалар қолдана алады. Әр түрлі бағдарламалау тілдерінде ішкі бағдарламаны а деп атауға болады күнделікті, кіші бағдарлама, функциясы, әдіс, немесе рәсім. Техникалық тұрғыдан алғанда, бұл терминдердің әр түрлі анықтамалары бар. Жалпы, қолшатыр мерзімі шақырылатын қондырғы кейде қолданылады.[1]

Аты кіші бағдарлама кіші бағдарламаның өзін үлкен бағдарламаның немесе басқа ішкі бағдарламаның бір сатысы ретінде қолданылатын компьютерлік бағдарлама сияқты әрекет етуін ұсынады. Бағдарламаны бірнеше рет және бағдарламаның бір орындалуы кезінде бірнеше жерден, соның ішінде басқа ішкі бағдарламалардан бастауға болатындай етіп кодтайды, содан кейін қайтадан тармақталады (қайтукейін келесі нұсқаулыққа қоңырау, ішкі бағдарламаның тапсырмасы орындалғаннан кейін. Бағдарлама идеясын бастапқыда ойлап тапқан Джон Маучли жұмыс барысында ENIAC,[2] және 1947 жылы қаңтарда Гарвард симпозиумында «EDVAC типті машиналарға есептер дайындау» туралы жазылған.[3] Морис Уилкс, Дэвид Уилер, және Стэнли Гилл әдетте олар а деп аталатын осы тұжырымдаманың ресми өнертабысымен есептеледі жабық ішкі бағдарлама,[4][5] қарама-қарсы ашық ішкі бағдарлама немесе макро.[6]Алайда, Тьюринг Бағдарламалық жасақтаманы жобалық ұсыныстар туралы 1945 жылғы мақаласында ішкі бағдарламаларды талқылады ACE, қайтарылатын мекен-жайлар стегінің тұжырымдамасын ойлап тапқанға дейін.[7]

Ішкі бағдарламалар қуатты бағдарламалау құрал,[8] және синтаксис көптеген бағдарламалау тілдері оларды жазуға және қолдануға қолдауды қамтиды. Бағдарламаларды ақылға қонымды пайдалану (мысалы, арқылы құрылымдық бағдарламалау тәсіл) көбінесе үлкен бағдарламаны әзірлеу мен ұстауға кететін шығындарды айтарлықтай төмендетеді, сонымен бірге оның сапасы мен сенімділігін арттырады.[9] Ішіне жиі жиналатын ішкі бағдарламалар кітапханалар, бағдарламалық жасақтаманы бөлудің және сауда жасаудың маңызды механизмі болып табылады. Пәні объектіге бағытталған бағдарламалау негізделген нысандар және әдістер (олар осы объектілерге немесе объектіге бекітілген ішкі бағдарламалар сыныптар ).

Ішінде құрастыру әдісі деп аталады бұрандалы код, орындалатын бағдарлама негізінен ішкі бағдарламалық қоңыраулар тізбегі болып табылады.

Негізгі түсініктер

Ішкі бағдарламаның мазмұны оның денесі болып табылады, ол ішкі программа шақырылған немесе шақырылған кезде орындалатын бағдарлама кодының бөлігі болып табылады.

Бағдарлама шақырылатын бағдарламадан бір немесе бірнеше деректер мәндерін алуды күткендей етіп жазылуы мүмкін (оны ауыстыру үшін) параметрлері немесе формальды параметрлер). Шақырушы бағдарлама осы параметрлер үшін шақырылған нақты мәндерді ұсынады дәлелдер. Әр түрлі бағдарламалау тілдері аргументтер беру үшін әртүрлі шартты белгілерді қолдана алады:

КонвенцияСипаттамаЖалпы қолдану
Мәні бойынша қоңырау шалыңызАргумент бағаланады және мәннің көшірмесі ішкі бағдарламаға беріледіКейін көптеген алгол тілдеріне ұқсас тілдерде әдепкі Алгол 60, мысалы, Паскаль, Дельфи, Симула, CPL, PL / M, Modula, Oberon, Ada және басқалары. C, C ++, Java (нысандар мен массивтерге сілтемелер мәні бойынша да беріледі)
Анықтама арқылы қоңырау шалыңызДәлелге сілтеме, әдетте оның мекен-жайы жіберіледіСодан кейін көптеген алгол тілдерінде таңдалады Алгол 60, мысалы, Algol 68, Pascal, Delphi, Simula, CPL, PL / M, Modula, Oberon, Ada және басқалары. C ++, Fortran, PL / I
Нәтижесі бойынша қоңырау шалыңызПараметр мәні ішкі бағдарламадан қайтару аргументіне көшіріледіAda OUT параметрлері
Нәтиже бойынша қоңырау шалыңызПараметр мәні ішкі программаға кіргеннен кейін және қайтып оралғаннан кейін көшіріледіАлгол, Свифт кіріс параметрлері
Аты бойынша қоңырау шалыңызМакро сияқты - параметрлерді бағаланбаған аргументтік өрнектермен ауыстырыңызАлгол, Скала
Тұрақты мән бойынша қоңырау шалыңызПараметр тұрақты ретінде қарастырылатынды қоспағанда, мәні бойынша қоңырау сияқтыPL / I NONASSIGNABLE параметрлері, Ada IN параметрлері

Ішкі программа қоңырау шалушыға есептелген мәнді қайтара алады (оның қайтару мәні ), немесе әртүрлі нәтиже мәндерін немесе шығыс параметрлерін қамтамасыз етіңіз. Шынында да, ішкі бағдарламаларды кеңінен қолдану - енгізу математикалық функциялар, онда ішкі бағдарламаның мақсаты тек ішкі бағдарламаға берілген аргументтермен толық анықталатын бір немесе бірнеше нәтижелерді есептеу болып табылады. (Мысалдарға есептеуді қамтуы мүмкін логарифм санның немесе анықтауыш а матрица.) Бұл тип функция деп аталады.

Бағдарламалық қоңырау да болуы мүмкін жанама әсерлері өзгерту сияқты мәліметтер құрылымы ішінде компьютер жады, а-дан оқу немесе жазу перифериялық құрылғы, құру файл, бағдарламаны немесе машинаны тоқтату немесе тіпті белгілі бір уақытқа бағдарламаның орындалуын кейінге қалдыру. Жанама әсерлері бар ішкі бағдарлама шақырылған сайын әр түрлі нәтиже беруі мүмкін, тіпті егер ол бірдей аргументтермен шақырылса да. Мысал ретінде а кездейсоқ санның ішкі бағдарламасы, көптеген тілдерде бар, ол шақырылған сайын әр түрлі жалған кездейсоқ санды береді. Жанама әсерлері бар ішкі бағдарламаларды кеңінен қолдану тән императивті бағдарламалау тілдер.

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

Мақсаты біреуін есептеу болып табылатын ішкі программа логикалық функция (яғни иә / жоқ сұрағына жауап беру) кейде предикат деп аталады. Жылы логикалық бағдарламалау тілдер, жиі[бұлыңғыр ] барлық ішкі бағдарламалар предикаттар деп аталады, өйткені олар бірінші кезекте[бұлыңғыр ] сәттілікті немесе сәтсіздікті анықтау.[дәйексөз қажет ]

Ешқандай мән бермейтін немесе нөлдік мәнді беретін ішкі бағдарламаны кейде процедура деп атайды. Әдетте процедуралар олардың дәлелдерін өзгертеді және оның негізгі бөлігі болып табылады процедуралық бағдарламалау.

Тілдерді қолдау

Бағдарламалаудың жоғары деңгейлі тілдері әдетте келесі құрылымдарды қамтиды:

  • Бағдарламаның (дененің) ішкі программасын құрайтын бөлігін бөліңіз
  • Тағайындаңыз идентификатор ішкі программаға (аты)
  • Және есімдерін көрсетіңіз деректер түрлері оның параметрлері және қайтару мәндері
  • Жеке қамтамасыз етіңіз атау ауқымы ол үшін уақытша айнымалылар
  • Ішкі программа ішінен қол жетімді айнымалыларды анықтаңыз
  • Бағдарламаны шақырыңыз
  • Оның параметрлеріне мән беріңіз
  • Негізгі бағдарлама ішкі бағдарламаның мекен-жайын қамтиды
  • Ішкі бағдарлама негізгі бағдарламада функционалды шақырудың келесі нұсқауының мекен-жайын қамтиды
  • Оның денесінің ішінен қайтарылатын мәндерді көрсетіңіз
  • Қайту қоңырау шалу бағдарламасына
  • Қоңырау арқылы қайтарылған мәндерді тастаңыз
  • Кез келгенін өңдеңіз ерекше жағдайлар қоңырау кезінде кездесті
  • Бағдарламалық жасақтаманы а модуль, кітапхана, объект, немесе сынып

Кейбіреулер бағдарламалау тілдері, сияқты Паскаль, Фортран, Ада және көптеген диалектілер туралы НЕГІЗГІ, шақыратын бағдарламаға қайтарудың нақты мәнін беретін функциялар немесе функциялардың ішкі бағдарламалары мен жоқ бағдарламалар мен процедуралар арасындағы айырмашылықты анықтаңыз. Бұл тілдерде функционалды қоңыраулар әдетте ендірілген өрнектер (мысалы, а кв функциясы деп аталуы мүмкін y = z + sqrt (x)). Процедуралық қоңыраулар синтаксистік түрде әрекет етеді мәлімдемелер (мысалы, а басып шығару процедура деп аталуы мүмкін егер x> 0 болса, онда (x) басып шығарыңыз немесе сияқты мәлімдемелермен айқын шақырылады ҚОҢЫРАУ немесе GOSUB (мысалы, қоңырау басып шығару (x)). Сияқты басқа тілдер C және Лисп, функциялар мен ішкі бағдарламаларды ажыратпаңыз.

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

Жылы бағдарламалау тілдері сияқты C, C ++, және C #, ішкі бағдарламаларды жай функциялар деп те атауға болады, оларды шатастыруға болмайды математикалық функциялар немесе функционалды бағдарламалау, әр түрлі ұғымдар.

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

Артықшылықтары

Бағдарламаны ішкі бағдарламаларға бөлудің артықшылықтары:

  • Ыдырау қарапайым бағдарламаларға арналған күрделі бағдарламалау тапсырмасы: бұл екі негізгі құралдың бірі құрылымдық бағдарламалау, бірге мәліметтер құрылымы
  • Төмендету кодтың көшірмесі бағдарлама шеңберінде
  • Қосу кодты қайта пайдалану бірнеше бағдарламалар бойынша
  • Үлкен бағдарламалау тапсырмасын әртүрлі бағдарламашыларға немесе жобаның әр түрлі кезеңдеріне бөлу
  • Іске асыру мәліметтерін жасыру ішкі бағдарламаны пайдаланушылардан
  • Код блогын функционалды шақырумен ауыстыру арқылы кодтың оқылуын жақсарту сипаттама функция атауы код блогын сипаттауға қызмет етеді. Бұл функция қайта пайдалануға арналмаған болса да, қоңырау кодын қысқа әрі оқылатын етеді.
  • Жақсарту қадағалау (яғни тілдердің көпшілігі қатысатын ішкі бағдарламалардың аттарын және файл атаулары мен жол нөмірлері сияқты одан да көп ақпаратты қамтитын қоңырау ізін алу тәсілдерін ұсынады); кодты ішкі бағдарламаларға бөлмей, күйін келтіру айтарлықтай нашарлайды

Кемшіліктері

Ішкі кодты қолданумен салыстырғанда ішкі бағдарламаны шақыру кейбіреулерін жүктейді есептеу үстеме ақысы шақыру механизмінде.

Ішкі программа әдетте стандартты талап етеді үй шаруашылығы код - функцияға кіргенде де, шыққаннан кейін де (функция прологы және эпилог - әдетте үнемдеу жалпы мақсаттағы регистрлер және қайтару мекен-жайы ең аз).

Тарих

Бағдарлама идеясы есептеу машиналары бұрыннан жұмыс істеп болғаннан кейін әзірленді, арифметикалық және шартты секіру нұсқаулары алдын-ала жоспарланып, шамалы өзгерді, бірақ процедуралық қоңыраулар үшін қолданылатын арнайы нұсқаулар жылдар өте өзгерді. Сияқты алғашқы компьютерлер мен микропроцессорлар Manchester Baby және RCA 1802, подпрограммаларды іске асыруға болатын жалғыз бағдарлама болған жоқ, бірақ бағдарламашылардан шақырулар тізбегін - нұсқаулардың әрқайсысын қолдануды талап етті сайтты шақыру.

Ішкі бағдарламалар іске асырылды Конрад Зусе Келіңіздер Z4 1945 ж.

1945 жылы, Алан М. Тюринг подпрограммаларды шақыру және оралу құралы ретінде «жерлеу» және «unbury» терминдерін қолданды.[10][11]

1947 жылы қаңтарда Джон Маучли Гарвард Университеті мен Орднанс Бюросының, АҚШ-тың Әскери-теңіз күштерінің бірлескен демеушілігімен 'Ірі масштабты сандық есептеу машиналарының симпозиумында' жалпы ескертулер ұсынды. Мұнда ол сериялық және параллель операцияны ұсынады

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

Басқаша айтқанда, А кіші бағдарламасын бөлу ретінде және В ішкі программасын күрделі көбейту ретінде және С ішкі программасын сандар тізбегінің стандартты қателігін бағалау ретінде тағайындауға болады және т.с.с. белгілі бір мәселе үшін қажет ішкі программалар тізімі арқылы. ... Содан кейін барлық осы ішкі бағдарламалар құрылғыда сақталады, ал оларға тек кодта көрсетілгендей нөмір бойынша қысқаша сілтеме жасау керек.[3]

Кей МакНулти Джон Маучлимен тығыз жұмыс істеді ENIAC командасына кіріп, подпрограммалар үшін идея дамытты ENIAC ол екінші дүниежүзілік соғыс кезінде бағдарламалаған.[12] Ол және басқа ENIAC бағдарламашылары ішкі бағдарламаларды зымыран траекториясын есептеуге көмектесті.[12]

Голдстин және фон Нейман ішкі бағдарламаларды қолдану туралы 1948 жылы 16 тамызда қағаз жазды.[13]

Сияқты өте ертедегі компьютерлер мен микропроцессорлар IBM 1620, Intel 4004 және Intel 8008, және PIC микроконтроллерлері, қайтару мекен-жайларын сақтау үшін арнайы аппараттық буманы қолданатын бір командалық ішкі бағдарламалық қоңырауға ие болыңыз - мұндай аппараттық ішкі бағдарламаның ұя салудың бірнеше деңгейін ғана қолдайды, бірақ рекурсивті ішкі бағдарламаларды қолдай алады. 60-жылдардың ортасына дейінгі машиналар, мысалы UNIVAC I, ПДП-1, және IBM 1130 - әдеттегідей a шақыру конвенциясы бұл команданың есептегішін шақырылған ішкі бағдарламаның бірінші жадында сақтады. Бұл ішкі бағдарламаның ұя деңгейінің терең орналасуына мүмкіндік береді, бірақ рекурсивті ішкі бағдарламаларды қолдамайды. The ПДП-11 (1970) - топтаманы итеріп жіберетін подпрограммалық шақыру нұсқаулығы бар алғашқы компьютерлердің бірі; бұл функция ерікті түрде терең ішкі бағдарламаның ұя салуын қолдайды, сонымен қатар рекурсивті ішкі бағдарламаларды қолдайды.[14]

Тілдерді қолдау

Ерте құрастырушыларда подпрограмманы қолдау шектеулі болды. Ішкі бағдарламалар бір-бірінен немесе негізгі бағдарламадан айқын түрде бөлінбеген, және ішкі бағдарламаның бастапқы кодын басқа ішкі бағдарламалармен қиыстыруға болады. Кейбір құрастырушылар алдын-ала анықталған ұсыныс жасайды макростар қоңырау және қайтару ретін құру үшін. 1960 ж.ж. ассемблерлер бір-бірімен байланыстыруға болатын кірістірілген және бөлек жинақталған ішкі бағдарламаларды әлдеқайда күрделі қолдауға ие болды.

Бағдарламалық кітапханалар

Бұл қиын тәсілдің өзінде ішкі бағдарламалар өте пайдалы болды. Біріншіден, олар әр түрлі бағдарламаларда бір кодты пайдалануға мүмкіндік берді. Сонымен қатар, жад ерте компьютерлерде өте тапшы ресурс болды, ал ішкі программалар бағдарламалар көлемін айтарлықтай үнемдеуге мүмкіндік берді.

Көптеген алғашқы компьютерлер бағдарламалық нұсқаулықты жадқа а перфорацияланған қағаз таспа. Әрбір ішкі бағдарламаны негізгі бағдарламаға (немесе «магистральға» дейін немесе одан кейін жүктелген немесе біріктірілген жеке таспа бөлігімен қамтамасыз етуге болады)[15]); және сол подпрограммалық таспаны әр түрлі бағдарламалар қолдана алады. Ұқсас тәсіл қолданылған компьютерлерде қолданылады перфокарталар олардың негізгі кірісі үшін. Аты ішкі кітапхана бастапқыда сөзбе-сөз мағынада, лента немесе карт-палубаның индекстелген коллекциясын ұжымдық пайдалану үшін сақтайтын кітапхананы білдіреді.

Жанама секіру арқылы оралу

Қажеттілікті жою үшін өзін-өзі өзгертетін код, компьютер дизайнерлері ақыр соңында жанама секіру нұсқау, оның операндасы, орнына қайтару мекен-жайы өзі, айнымалы немесе процессор тіркелімі қайтару мекен-жайы бар.

Бұл компьютерлерде подпрограмманың қайтару секіруін өзгертудің орнына, шақыру бағдарламасы қайтарылатын адресті айнымалыда сақтайтын, сондықтан ішкі бағдарлама аяқталғаннан кейін, орындалуды алдын ала анықталған айнымалы берген орынға бағыттайтын жанама секіруді орындайтын.

Бағдарламаға өту

Тағы бір аванс болды ішкі бағдарламаға секіру қайтару мекен-жайын сақтауды қоңырау секіруімен біріктіретін нұсқаулық, осылайша минимизациялау үстеме айтарлықтай.

IBM-де Жүйе / 360 мысалы, процедураны шақыруға арналған BAL немесе BALR тармақтық нұсқаулары қайтару мекен-жайын нұсқаулықта көрсетілген процессор регистрінде, конвенциялық регистрде 14 сақтайтын еді. Қайтару үшін ішкі программа жанама тармақ нұсқауын (BR) ғана орындауы керек еді. ) сол тізілім арқылы. Егер подпрограммаға осы регистр басқа мақсатта қажет болса (мысалы, басқа ішкі программаны шақыру), бұл регистрдің мазмұнын жеке жад орнына немесе регистрге сақтайтын еді стек.

Сияқты жүйелерде HP 2100, JSB нұсқауы ұқсас тапсырманы орындайды, тек қайтару адресі филиалдың мақсаты болған жад орнында сақталған. Процедураның орындалуы шынымен келесі жад орнынан басталады. HP 2100 құрастыру тілінде, мысалы, жазу керек

       ... JSB MYSUB (MYSUB ішкі бағдарламасын шақырады.) BB ... (MYSUB аяқталғаннан кейін осында оралады.)

негізгі бағдарламадан MYSUB деп аталатын ішкі бағдарламаны шақыру. Ішкі программа келесідей кодталатын еді

 MYSUB NOP (MYSUB-тың қайтарылатын мекен-жайы үшін қойма.) AA ... (MYSUB денесінің басталуы.) ... JMP MYSUB, I (Шақырушы бағдарламаға оралады.)

JSB командасы NEXT командасының мекен-жайын (атап айтқанда, BB) оның операндасы ретінде көрсетілген жерге орналастырды (атап айтқанда, MYSUB), содан кейін келесі орынға тармақталды (атап айтқанда, AA = MYSUB + 1). Содан кейін ішкі программа MYSUB орнында сақталған орынға тармақталған JMP MYSUB жанама секіруін орындау арқылы негізгі бағдарламаға оралуы мүмкін.

Фортран және басқа тілдерге арналған компиляторлар осы нұсқаулықтарды қол жетімді болған жағдайда оңай пайдалана алады. Бұл тәсіл бірнеше деңгейлі қоңырауларды қолдады; дегенмен, ішкі бағдарламаның қайтару адресі, параметрлері және қайтару мәндері бекітілген жад орындары тағайындалғандықтан, рекурсивті қоңырауларға жол бермеді.

Айтпақшы, ұқсас әдісті Лотос 1-2-3, 1980 жылдардың басында электрондық кестеде қайта есептеу тәуелділіктерін табу. Атап айтқанда, сақтау үшін әр ұяшықта орын сақталған қайту мекен-жайы. Бастап айналма сілтемелер табиғи қайта есептеу үшін рұқсат етілмейді, бұл жадтағы жинақ үшін орын сақтамай ағашты серуендеуге мүмкіндік береді, бұл шағын компьютерлерде өте шектеулі болды. IBM PC.

Қоңырау стегі

Бағдарламалық шақырудың заманауи бағдарламаларының көпшілігінде a қолданылады шақыру стегі, ерекше жағдай стек деректер құрылымы, қосалқы қоңыраулар мен қайтаруларды іске асыру үшін. Әрбір процедуралық шақыру а деп аталатын жаңа жазба жасайды стек жақтауы, стектің жоғарғы жағында; процедура қайтарылған кезде оның стек жақтауы стектен жойылады және оның кеңістігі басқа процедуралық шақырулар үшін пайдаланылуы мүмкін. Әр стек жақтауында жеке деректер әдетте процедураның параметрлері мен ішкі айнымалыларын және қайтару адресін қамтитын сәйкес шақырудың.

Қоңырау тізбегін кәдімгі нұсқаулар тізбегімен жүзеге асыруға болады (әлі күнге дейін қолданылатын тәсіл қысқартылған нұсқаулар жиынтығы (RISC) және өте ұзақ нұсқаулық (VLIW) архитектурасы), бірақ 1960 жылдардың соңынан бастап жасалған көптеген дәстүрлі машиналар осы мақсатқа арналған арнайы нұсқаулықтарды қамтыды.

Әдетте қоңыраулар стегі жадының сабақтас аймағы ретінде іске асырылады. Стек жадыда алға немесе артқа өсуі үшін стектің төменгі жағы осы аймақтағы ең төменгі немесе ең жоғары адрес бола ма, жоқ па, оны таңдаудың ерікті нұсқасы; дегенмен көптеген архитектуралар соңғысын таңдады.[дәйексөз қажет ]

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

Стекке негізделген процедуралық қоңыраулар алғаш рет енгізілген кезде, маңызды мотивация құнды жадыны сақтау болды.[дәйексөз қажет ] Бұл схеманың көмегімен компиляторға әр процедураның жеке деректері (параметрлер, қайтарылатын адрес және жергілікті айнымалылар) үшін жадында бөлек кеңістікті сақтау қажет емес. Кез-келген сәтте стекте тек ағымдағы уақытта болатын қоңыраулардың жеке деректері болады белсенді (атап айтқанда, олар шақырылған, бірақ әлі оралмаған). Бағдарламаларды әдетте кітапханалардан жинау тәсілдеріне байланысты, кез-келген сәтте саусақпен санарлық белсенді бағдарламалардан тұратын мыңдаған ішкі бағдарламаларды қамтитын бағдарламаларды табу сирек емес еді (және әлі де).[дәйексөз қажет ] Мұндай бағдарламалар үшін қоңыраулар стегі механизмі жадтың айтарлықтай көлемін үнемдей алады. Шынында да, қоңыраулар стегінің механизмі ең ерте және қарапайым әдіс ретінде қарастырылуы мүмкін автоматты жадыны басқару.

Алайда, қоңырау стегі әдісінің тағы бір артықшылығы - бұл мүмкіндік береді ішкі рекурсивті шақырулар, сол процедураның әрбір кірістірілген қоңырауы жеке деректердің жеке данасын алады.

Кейінге қалау

Қоңыраулар стегі механизмінің бір кемшілігі - процедуралық шақырудың қымбаттауы және оның сәйкес келуі.[түсіндіру қажет ] Қосымша шығынға стек көрсеткішін ұлғайту және азайту кіреді (және кейбір архитектураларда тексеру) толып кету ), және жергілікті айнымалылар мен параметрлерге абсолютті адрестердің орнына кадрға қатысты адрестер бойынша қол жеткізу. Құны орындалу ұзақтығында немесе процессордың күрделілігінің жоғарылауында немесе екеуінде де жүзеге асырылуы мүмкін.

Бұл қосымша шығындар ең айқын және қарсылық тудырады жапырақ процедуралары немесе жапырақ функциялары, олар ешқандай процедураларсыз өздерін шақырады.[16][17][18]Бұл шығындарды азайту үшін көптеген заманауи компиляторлар қоңырау бумасын пайдалануды шынымен қажет болғанша кешіктіруге тырысады.[дәйексөз қажет ] Мысалы, процедураны шақыру P қайтарылатын адресті және шақырылған процедураның параметрлерін белгілі бір процессор регистрлерінде сақтай алады және басқаруды процедураның корпусына қарапайым секіру арқылы бере алады. Егер рәсім болса P басқа қоңырау шалмай-ақ оралады, қоңыраулар стегі мүлдем қолданылмайды. Егер P басқа процедураны шақыру керек Q, содан кейін ол кез келген регистрлердің мазмұнын (мысалы, қайтару мекен-жайы) сақтау үшін қоңыраулар стегін пайдаланады. Q қайтарады.

C және C ++ мысалдары

Ішінде C және C ++ бағдарламалау тілдері, кіші бағдарламалар терминделеді функциялары (бұдан әрі ретінде жіктеледі мүше функциялары байланысты болған кезде сынып, немесе тегін функциялар[19] жоқ кезде). Бұл тілдерде арнайы кілт сөз қолданылады жарамсыз функцияның ешқандай мән бермейтінін көрсету үшін. C / C ++ функцияларының жанама әсерлері болуы мүмкін екенін ескеріңіз, оның ішінде адрестері параметр ретінде берілген кез келген айнымалыларды өзгерту. Мысалдар:

жарамсыз Функция1() { / * кейбір кодтар * / }

Функция мәнді қайтармайды және оны дербес функция деп атауға тура келеді, мысалы, Функция1 ();

int Функция2() {  қайту 5;}

Бұл функция нәтижені қайтарады (5 саны), ал қоңырау өрнектің бөлігі бола алады, мысалы, x + функция2 ()

char Функция3(int нөмір) {  char таңдау[] = {«S», «М», 'T', 'W', 'T', 'F', «S»};  қайту таңдау[нөмір];}

Бұл функция 0 мен 6 арасындағы санды аптаның тиісті күнінің бастапқы әрпіне, яғни 0-ден 'S' -ге, 1-ден 'M', ..., 6-ға 'S' -ге айналдырады. Оны шақырудың нәтижесі айнымалыға берілуі мүмкін, мысалы. num_day = Функция3 (сан);.

жарамсыз Функция4(int* нұсқаушы_to_var) {  (*нұсқаушы_to_var)++;}

Бұл функция мәнді қайтармайды, бірақ адресі параметр ретінде берілген айнымалыны өзгертеді; деп аталатын еді Функция4 (& айнымалыға_қосылу);.

Шағын негізгі мысал

Мысал()                               'Бағдарламаны шақырадыҚосымша Мысал                             'Бағдарламаны бастайды    TextWindow.WriteLine(«Бұл Microsoft Small Basic ішіндегі ішкі бағдарламаның мысалы.»)  'Бағдарлама не істейдіEndSub                                  'Бағдарламаны аяқтайды

Жоғарыдағы мысалда, Мысал () ішкі программаны шақырады.[20] Нақты ішкі бағдарламаны анықтау үшін Қосымша ішкі сөз атымен бірге кілт сөзі қолданылуы керек Қосымша. Мазмұннан кейін, EndSub терілген болуы керек.

Visual Basic 6 мысалдары

Ішінде Visual Basic 6 тіл, қосалқы бағдарламалар терминге жатады функциялары немесе қосалқы (немесе әдістер сыныппен байланысты болған кезде). Visual Basic 6 әр түрлі терминдерді қолданады түрлері параметр ретінде не берілетінін анықтау үшін. Әдепкі бойынша, анықталмаған айнымалы а ретінде тіркеледі нұсқа түрі және ретінде берілуі мүмкін ByRef (әдепкі) немесе ByVal. Сондай-ақ, функция немесе қосымша жарияланғанда, оған жария, жеке немесе достық белгісі беріледі, ол оған модульден немесе ол жарияланған жобадан тыс қол жетімділікті анықтайды.

  • Мәні бойынша [ByVal] - адресаттың орнына аргументтің мәнін мәннің көшірмесін беру арқылы процедураға беру тәсілі. Нәтижесінде айнымалының нақты мәнін ол берілген процедурамен өзгерту мүмкін емес.
  • Сілтеме бойынша [ByRef] - аргумент мәнін оның мәнінің көшірмесін берудің орнына, айнымалының адресін беру арқылы процедураға беру тәсілі. Бұл процедураға нақты айнымалыға қол жеткізуге мүмкіндік береді. Нәтижесінде айнымалының нақты мәнін ол берілген процедура арқылы өзгертуге болады. Егер өзгеше көрсетілмесе, дәлелдер сілтеме арқылы беріледі.
  • Қоғамдық (қосымша) - функционалдық процедураның барлық модульдердегі барлық басқа процедураларға қол жетімді екендігін көрсетеді. Егер Private Option бар модульде қолданылса, процедура жобадан тыс жерде қол жетімді емес.
  • Жеке (міндетті емес) - функция процедурасына модульдегі ол жарияланған басқа процедураларға ғана қол жетімді екендігін көрсетеді.
  • Дос (міндетті емес) - тек сынып модулінде қолданылады. Функция процедурасы бүкіл жоба бойынша көрінетінін, бірақ объект данасының контроллеріне көрінбейтінін көрсетеді.
Жеке Функция Функция1()    'Мұнда кейбір кодтарСоңы Функция

Функция мәнді қайтармайды және оны дербес функция деп атауға тура келеді, мысалы, Функция1

Жеке Функция Функция2() сияқты Бүтін    Функция2 = 5Соңы Функция

Бұл функция нәтижені қайтарады (5 саны), ал қоңырау өрнектің бөлігі бола алады, мысалы, x + функция2 ()

Жеке Функция Функция3(ByVal ішкі мән сияқты Бүтін) сияқты Жол    Күңгірт strArray(6) сияқты Жол    strArray = Массив(«М», «T», «W», «T», «F», «S», «S»)    Функция3 = strArray(ішкі мән)Соңы Функция

Бұл функция 0 мен 6 арасындағы санды аптаның тиісті күнінің бастапқы әрпіне айналдырады, атап айтқанда 0-ден 'M' -ге, 1-ден 'T', ..., 6-ға 'S' дейін. Оны шақырудың нәтижесі айнымалыға берілуі мүмкін, мысалы. num_day = Функция3 (сан).

Жеке Функция Функция4(ByRef ішкі мән сияқты Бүтін)    ішкі мән = ішкі мән + 1Соңы Функция

Бұл функция мәнді қайтармайды, бірақ адресі параметр ретінде берілген айнымалыны өзгертеді; ол «деп аталатын едіФункция4 (айнымалыға_өзгерту)".

PL / I мысалы

Жылы PL / I шақырылған рәсім қабылдануы мүмкін а дескриптор аргумент туралы мәліметтер беру, мысалы, жолдардың ұзындығы және массивтің шекаралары. Бұл процедураны жалпылауға мүмкіндік береді және бағдарламашының мұндай ақпаратты жіберу қажеттілігін болдырмайды. Әдепкіде PL / I аргументтерді сілтеме арқылы өткізеді. Екі өлшемді жиымның әрбір элементінің белгісін өзгертуге арналған (тривиальды) ішкі программа келесідей болуы мүмкін:

  change_sign: процедура (массив); массивті (*, *) өзгермелі деп жариялау; жиым =-массив; соңын өзгерту_ белгісі;

Мұны әртүрлі массивтермен келесідей атауға болады:

  / * бірінші массивтің шекаралары -5-тен +10 дейін және 3-тен 9-ға дейін * / 1 массивін жарияла (-5: 10, 3: 9) өзгермелі; / * екінші массивтің шекаралары 1-ден 16-ға дейін және 1-ден 16-ға дейін * * / array2 (16,16) өзгермелі деп жариялау; change_sign шақыруы (массив1); change_sign шақыруы (массив2);

Жергілікті айнымалылар, рекурсия және рентранс

Ішкі бағдарлама белгілі бір мөлшерді пайдалану үшін пайдалы болуы мүмкін сызат ғарыш; Бұл, жады аралық нәтижелерді ұстап тұру үшін сол ішкі бағдарламаны орындау кезінде қолданылады. Бұл сызылған кеңістікте сақталатын айнымалылар деп аталады жергілікті айнымалылар, ал сызаттар кеңістігі an деп аталады активтендіру жазбасы. Белсендіру жазбасында әдетте a болады қайтару мекен-жайы ішкі бағдарлама аяқталғаннан кейін бақылауды қайда өткізуге болатындығы туралы айтады.

Ішкі бағдарламада қоңырау шалуға арналған сайттардың кез-келген саны мен сипаты болуы мүмкін. Егер рекурсияға қолдау көрсетілсе, кіші бағдарлама тіпті өзін шақыруы мүмкін, ал оның орындалуы басқа уақытша тоқтатылады кірістірілген сол ішкі бағдарламаның орындалуы орын алады. Рекурсия кейбір күрделі алгоритмдерді жеңілдетуге және күрделі есептерді бөлуге арналған пайдалы құрал. Рекурсивті тілдер әдетте әр қоңырауға жергілікті айнымалылардың жаңа көшірмесін ұсынады. Егер бағдарламашы жергілікті айнымалылар мәнінің қоңыраулар арасында өзгеріссіз қалуын қаласа, оларды жариялауға болады статикалық кейбір тілдерде немесе ғаламдық құндылықтарды немесе ортақ аймақтарды қолдануға болады. Мұнда табу үшін C / C ++ тіліндегі рекурсивті ішкі бағдарламаның мысалы келтірілген Фибоначчи сандар:

int Фиб(int n) {  егер (n <= 1) {    қайту n;  }  қайту Фиб(n - 1) + Фиб(n - 2);}

Ерте тілдер ұнайды Фортран бастапқыда рекурсияны қолдамады, өйткені айнымалылар статикалық түрде бөлінген, сонымен қатар қайтарылатын мекен-жайдың орны. Көптеген компьютерлер 1960 жылдардың аяғына дейін, мысалы ПДП-8 аппараттық стек регистрлеріне қолдау болмады.[дәйексөз қажет ]

Кейінгі тілдер АЛГОЛ сияқты PL / I және C әрдайым ішкі бағдарламаның әр орындалуы үшін жаңа активтендіру жазбасын ұсыну үшін қазіргі заманғы компьютерлік нұсқаулар жиынтығындағы стекті қолданады. Осылайша, кірістірілген орындау басқа тоқтатылған орындалуға әсер етуден алаңдамай жергілікті айнымалыларды еркін өзгерте алады. Ұяланған қоңыраулар жинақталған кезде, а шақыру стегі әрбір тоқтатылған ішкі бағдарлама үшін бір активтендіру жазбасынан тұратын құрылым құрылады. Шындығында, бұл стек құрылымы іс жүзінде барлық жерде болады, сондықтан активтендіру жазбалары әдетте қолданылады стек жақтаулары.

Сияқты кейбір тілдер Паскаль, PL / I және Ада сонымен қатар қолдау кірістірілген ішкі бағдарламалар ішіндегі шақыруға болатын ішкі бағдарламалар болып табылады ауқымы сыртқы (ата-аналық) ішкі бағдарламаның. Ішкі ішкі бағдарламалар оларды шақырған сыртқы ішкі бағдарламаның жергілікті айнымалыларына қол жеткізе алады. Бұл а. Деп аталатын белсендіру жазбасында қосымша мәтінмәндік ақпаратты сақтау арқылы жүзеге асырылады дисплей.

Егер кіші бағдарламаны дәл сол ішкі бағдарламаның басқа орындалуы жүріп жатқан кезде де дұрыс орындау мүмкін болса, онда бұл ішкі бағдарлама деп аталады қайта келу. Рекурсивті ішкі бағдарлама қайта ұсынылуы керек. Рентерранттың ішкі бағдарламалары да пайдалы көп бұрандалы жағдай, өйткені бірнеше ағындар бір-біріне кедергі жасаудан қорықпай бір ішкі бағдарламаны шақыра алады. Ішінде IBM CICS транзакцияны өңдеу жүйесі, квази-ревентрант көптеген ағындармен бөлісетін қолданбалы бағдарламаларға аз ғана шектеулі, бірақ ұқсас талап болды.

Ішінде көп бұрандалы орта, әдетте біреуден көп стек бар. Толығымен қолдайтын орта коруотиндер немесе жалқау бағалау активтендіру жазбаларын сақтау үшін стектерден басқа деректер құрылымдарын қолдана алады.

Шамадан тыс жүктеме

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

Жылы объектіге бағытталған бағдарламалау, бірдей аттас функциялар қатары әр түрлі профильдерді немесе әр түрлі типтегі параметрлерді қабылдауы мүмкін болған кезде, функциялардың әрқайсысы шамадан тыс жүктелген.

Ішкі программаны шамадан тыс жүктеу мысалы C ++:

# қосу <iostream>екі есе Аудан(екі есе сағ, екі есе w) { қайту сағ * w; }екі есе Аудан(екі есе р) { қайту р * р * 3.14; }int негізгі() {  екі есе тіктөртбұрыш = Аудан(3, 4);  екі есе шеңбер_арея = Аудан(5);  std::cout << «Төртбұрыштың ауданы» << тіктөртбұрыш << std::соңы;  std::cout << «Шеңбердің ауданы» << шеңбер_арея << std::соңы;}

Бұл кодта екі бірдей функция бар, бірақ олардың параметрлері әр түрлі.

Келесі мысал ретінде, ішкі бағдарлама объект бағыттарды қабылдайтын және экранда осы нүктелерге жететін жолды көрсететін. Конструкторға берілуі мүмкін көптеген параметрлер бар (іздің түсі, х және у координаттарының басталуы, іздеу жылдамдығы). Егер программист конструктордың тек түс параметрін қабылдай алуын қаласа, онда ол тек түсті қабылдайтын басқа конструкторды шақыра алады, ал ол өз кезегінде конструкторды барлық жиынтықта өтетін барлық параметрлермен шақырады әдепкі мәндер барлық басқа параметрлер үшін (X және Y, әдетте, экранда центрленген немесе бастапқы нүктеге орналастырылған және жылдамдық кодер таңдаған басқа мәнге орнатылған болатын).

PL / I-де бар ЖАЛПЫ әр түрлі аргументтермен шақырылған енгізу сілтемелерінің жалпы атауын анықтайтын атрибут. Мысал:

  ГЕН_НОМДЫ ДЕКЛАРАЦИЯЛАҢЫЗ (аты WHEN (ТҮЗЕТІЛГЕН БИНАРИ), жалын WHEN (FLOAT), жол аты басқаша);

Әрбір жазба үшін бірнеше аргумент анықтамалары көрсетілуі мүмкін. «Gen_name» -ге шақыру дәлелді ЕКІНШІЛІКТЕ түзету кезінде «атқа», FLOAT кезінде «жалынға» және т.с.с. әкеледі, егер аргумент таңдаудың ешқайсысына сәйкес келмесе, «жол аты» шақырылмайды.

Жабықтар

A жабу бұл кіші бағдарлама, оның қоршаған ортасынан алынған кейбір айнымалыларының мәндерімен бірге. Жабықтар Lisp бағдарламалау тілінің маңызды ерекшелігі болды Джон Маккарти. Іске асыруға байланысты жабылу жанама әсерлердің механизмі бола алады.

Конвенциялар

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

Кейбір бағдарламашылар подпрограммада тек бір ғана тапсырма орындалуы керек, ал егер подпрограмма бірнеше тапсырмаларды орындайтын болса, оны көп ішкі программаларға бөлу керек деп айтады. Олар ішкі бағдарламалар негізгі компоненттер болып табылады деп дәлелдейді кодқа қызмет көрсету және олардың бағдарламадағы рөлдері айқын болып қалуы керек.

Жақтаушылары модульдік бағдарламалау (модульдеу коды) әрбір ішкі программа кодтың басқа бөліктеріне минималды тәуелділікте болуын қолдайды. Мысалы, жаһандық айнымалылар Адвокаттар бұл перспективаны негізінен ақылсыз деп санайды, өйткені ол ішкі программа мен осы глобальды айнымалылардың арасында тығыз байланыстырады. Егер мұндай байланыстыру қажет болмаса, олардың кеңестері мынада: рефактор қабылданған ішкі бағдарламалар параметрлері орнына. Алайда, ішкі бағдарламаларға берілген параметрлер санын көбейту кодтың оқылуына әсер етуі мүмкін.

Қайтару кодтары

Оның үстіне негізгі немесе қалыпты әсері, қосалқы бағдарлама туралы қоңырау шалушы бағдарламаны хабарлауы қажет болуы мүмкін ерекше оны орындау кезінде орын алуы мүмкін жағдайлар. Кейбір тілдерде және бағдарламалау стандарттарында бұл көбінесе a арқылы жасалады қайтару коды, ішкі бағдарлама қалыпты және ерекше жағдайларды кодтайтын кейбір стандартты жерде орналастырылған бүтін мән.

Ішінде IBM System / 360, егер ішкі кодтан қайтару коды күткен болса, қайтару мәні көбінесе 4 еселі етіп жасалды - ол тікелей ретінде қолданыла алатындай етіп салалық үстел қосымша шартты сынақтардан аулақ болу үшін тиімділікті одан әрі арттыру үшін шақыру нұсқауларынан кейін бірден орналасқан филиалдық кестеге индекс. Ішінде Жүйе / 360 құрастыру тілі, мысалы, жазу керек:

           BAL 14, SUBRTN01 ішкі бағдарламаға ауысады, R14 B кестесінде қайтару мекен-жайын сақтайды (15) тармақ кестесін индекстеу үшін рег 15-де қайтарылған мәнді пайдаланады, * сәйкес тармақ тармағына тармақталады. КЕСТЕ B OK қайтару коды = 00 ЖАҚСЫ} B ЖАМАҚСЫЗ қайтару коды = 04 жарамсыз енгізу} тармақ кестесі B ҚАТЕ қайтару коды = 08 күтпеген жағдай}

Бағдарламалық қоңырауларды оңтайландыру

Маңызды жұмыс уақыты бар үстеме қосымша бағдарламаны шақыру кезінде, оның ішінде аргументтерді беру, ішкі бағдарламаға тармақтау және қоңырау шалушыға қайта тармақтау. Үстеме ақыға көбінесе белгілі бір процессор регистрлерін сақтау және қалпына келтіру, қоңыраулар жадының жадын бөлу және қалпына келтіру және т.б. кіреді. Кейбір тілдерде ішкі бағдарламаның кез-келген қоңырауы ішкі бағдарламаның қайтару кодын автоматты түрде тексеруді немесе ерекшеліктер ол көтеруі мүмкін. Объектіге бағытталған тілдерде үстеме шығындардың маңызды көзі қарқынды қолданылады динамикалық диспетчер әдіс қоңыраулары үшін.

Процедуралық шақырулардың кейбір айқын көрінетін оңтайландырулары бар, оларды қолдану мүмкін емес, егер процедуралар жанама әсер етуі мүмкін болса. Мысалы, өрнекте (f (x) -1) / (f (x) +1), функциясы f екі рет қоңырау шалу керек, өйткені екі қоңырау әртүрлі нәтиже беруі мүмкін. Сонымен қатар, мәні х must be fetched again before the second call, since the first call may have changed it. Determining whether a subprogram may have a side effect is very difficult (indeed, шешілмейтін арқасында Күріш теоремасы ). So, while those optimizations are safe in purely functional programming languages, compilers of typical imperative programming usually have to assume the worst.

Қаптау

A method used to eliminate this overhead is ішкі кеңейту немесе астарлау of the subprogram's body at each сайтты шақыру (versus branching to the subroutine and back). Not only does this avoid the call overhead, but it also allows the құрастырушы дейін оңтайландыру the procedure's дене more effectively by taking into account the context and arguments at that call. The inserted body can be optimized by the compiler. Inlining, however, will usually increase the code size, unless the program contains only one call to the subroutine.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ U.S. Election Assistance Commission (2007). "Definitions of Words with Special Meanings". Voluntary Voting System Guidelines. Архивтелген түпнұсқа 2012-12-08. Алынған 2013-01-14.
  2. ^ Subrata Dasgupta (7 January 2014). It Began with Babbage: The Genesis of Computer Science. Оксфорд университетінің баспасы. 155– бет. ISBN  978-0-19-930943-6.
  3. ^ а б Дж. Mauchly, "Preparation of Problems for EDVAC-type Machines" (1947), in Brian Randell (Ed.), The Origins of Digital Computers, Springer, 1982.
  4. ^ Уилер, Дж. Дж. (1952). «Бағдарламаларда қосалқы бағдарламаларды қолдану» (PDF). 1952 ACM ұлттық жиналысының материалдары (Питтсбург) - ACM '52. б. 235. дои:10.1145/609784.609816.
  5. ^ Уилкс, М.В .; Уилер, Д. Дж .; Гилл, С. (1951). Электрондық сандық компьютерге бағдарламалар дайындау. Аддисон-Уэсли.
  6. ^ Dainith, John (2004). ""open subroutine." A Dictionary of Computing". Encyclopedia.com. Алынған 14 қаңтар, 2013.
  7. ^ Тьюринг, Алан М. (1945), Доктор А.М. баяндамасы Автоматты есептеу қозғалтқышын (ACE) дамыту бойынша ұсыныстар бойынша тьюринг: 1946 жылдың ақпанында NPL Атқару комитетіне ұсынылды. қайта басылған Копленд, Дж., ред. (2005). Алан Тьюрингтің автоматты есептеу машинасы. Оксфорд: Оксфорд университетінің баспасы. б. 383. ISBN  0-19-856593-3.
  8. ^ Дональд Э. Кнут (1997). The Art of Computer Programming, Volume I: Fundamental Algorithms. Аддисон-Уэсли. ISBN  0-201-89683-4.
  9. ^ O.-J. Dahl; E. W. Dijkstra; C. A. R. Hoare (1972). Құрылымдық бағдарламалау. Академиялық баспасөз. ISBN  0-12-200550-3.
  10. ^ Тьюринг, Алан Матисон (1946-03-19) [1945], Автоматты есептеу машинасының (ACE) математика бөлімінде дамыту бойынша ұсыныстар (NB. 1946-03-19 жылдары Ұлттық физикалық зертхананың Атқару комитетінің алдында ұсынылған (Ұлыбритания).)
  11. ^ Ағаш ұстасы, Брайан Эдвард; Доран, Роберт Уильям (1977-01-01) [1975 ж. Қазан]. «Басқа Тьюринг машинасы». Компьютерлік журнал. 20 (3): 269–279. дои:10.1093 / comjnl / 20.3.269. (11 бет)
  12. ^ а б Isaacson, Walter (18 September 2014). "Walter Isaacson on the Women of ENIAC". Сәттілік. Архивтелген түпнұсқа 12 желтоқсан 2018 ж. Алынған 2018-12-14.
  13. ^ Planning and Coding of Problems for an Electronic Computing Instrument, Pt 2, Vol. 3 https://library.ias.edu/files/pdfs/ecp/planningcodingof0103inst.pdf (see pg 163 of the pdf for the relevant page)
  14. ^ Гай Льюис Стил кіші.AI Memo 443.'Debunking the "Expensive Procedure Call" Myth; or, Procedure call implementations considered harmful".Section "C. Why Procedure Calls Have a Bad Reputation".
  15. ^ Frank, Thomas S. (1983). Introduction to the PDP-11 and Its Assembly Language. Prentice-Hall software series. Prentice-Hall. б. 195. ISBN  9780134917047. Алынған 2016-07-06. We could supply our assembling clerk with copies of the source code for all of our useful subroutines and then when presenting him with a mainline program for assembly, tell him which subroutines will be called in the mainline [...]
  16. ^ «ARM ақпарат орталығы». Infocenter.arm.com. Алынған 2013-09-29.
  17. ^ "x64 stack usage". Microsoft Docs. Microsoft. Алынған 5 тамыз 2019.
  18. ^ "Function Types". Msdn.microsoft.com. Алынған 2013-09-29.
  19. ^ "what is meant by a free function".
  20. ^ "Microsoft Small Basic". www.smallbasic.com.