Кіріспе

Деректер қорының (деректер қатарының) бір бөлігі болып табылатын ақпараттық блок. Компьютер ғылымында жазба (сондай-ақ құрылым, struct немесе күрделі деректер деп аталады) – негізгі дерек құрылымы. Деректер базасындағы немесе электрондық кестедегі жазбалар әдетте "қатарлар" деп аталады. Жазба – әртүрлі дерек түрлерінің өрістерінің жиынтығы, әдетте, белгілі бір санда және реттілікте. Жазбаның өрістері мүшелер деп те аталуы мүмкін, әсіресе объектіге бағытталған бағдарламалауда; өрістерді элементтер деп те атауға болады, бірақ бұл жиынның элементтерімен шатастыруға әкелуі мүмкін. Мысалы, күнді сандық жыл өрісі, айды жол ретінде көрсетілген өріс және айдың күнін сандық өріс қамтитын жазба ретінде сақтауға болады. Адам туралы жазбада аты, жалақысы және лауазымы болуы мүмкін. Шеңбер жазбасында ортасы мен радиусы болуы мүмкін. Бұл жағдайда ортасының өзі x және y координаттарын қамтитын нүктелік жазба ретінде бейнеленуі мүмкін. Жазбалар массивтерден өрістерінің саны жазбаның анықтамасымен белгіленетінімен және жазбалар гетерогенді дерек түрі екендігімен ерекшеленеді; барлық өрістерде бірдей дерек түрі болуы міндетті емес. Жазба түрі – осындай мәндер мен айнымалыларды сипаттайтын дерек түрі. Көптеген қазіргі заманғы компьютер тілдері бағдарламашыға жаңа жазба түрлерін анықтауға мүмкіндік береді. Анықтамаға әр өрістің дерек түрін және оған қол жеткізуге болатын идентификаторды (атау немесе белгі) қосу кіреді. Типтер теориясында өнім түрлері (өріс атаулары жоқ) олардың қарапайымдылығы үшін көбінесе артықшылыққа ие, бірақ тиісті жазба түрлері System F sub сияқты тілдерде зерттеледі. Типтік теориялық жазбаларда деректерге қоса, бірінші сыныпты функциялармен типтелген өрістер болуы мүмкін, сондықтан олар объектіге бағытталған бағдарламалаудың көптеген мүмкіндіктерін бейнелей алады. Жазбалар кез келген сақтау ортасында болуы мүмкін, соның ішінде негізгі жадта және магниттік ленталар немесе қатты дискілер сияқты жаппай сақтау құрылғыларында. Жазбалар – көптеген дерек құрылымдарының, әсіресе байланысты дерек құрылымдарының негізгі құрамдас бөлігі. Көптеген компьютерлік файлдар логикалық жазбалар массиві ретінде ұйымдастырылған, көбінесе тиімділік үшін үлкен физикалық жазбаларға немесе блоктарға топтастырылған. Функцияның немесе процедураның параметрлерін көбінесе жазба айнымалының өрістері ретінде қарастыруға болады; ал осы функцияға берілген аргументтерді шақыру кезінде осы айнымалыға тағайындалған жазба мәні ретінде қарастыруға болады. Сонымен қатар, процедуралық шақыруларды жүзеге асыру үшін көбінесе қолданылатын шақыру стегінде әрбір жазба – процедура параметрлерін және жергілікті айнымалыларды, қайтару мекенжайын және басқа ішкі өрістерді қамтитын белсендіру жазбасы немесе шақыру кадры болып табылады. Объектіге бағытталған тілдегі объект – негізінен осы жазбаны өңдеуге арналған мамандандырылған процедураларды қамтитын жазба; ал объект типтері – жазба түрлерінің кеңейтілген нұсқасы. Шындығында, көптеген объектіге бағытталған тілдерде жазбалар объектілердің ерекше жағдайлары болып табылады және OO мүмкіндіктерін пайдаланатын объектілерден айырмашылығы, қарапайым ескі дерек құрылымдары (PODS) ретінде белгілі. Жазба математикалық туплдің компьютерлік аналогы ретінде қарастырылуы мүмкін, бірақ тупл жазба деп есептелуі немесе есептелмеуі мүмкін, және керісінше, конвенцияларға және нақты бағдарламалау тіліне байланысты. Сол сияқты, жазба түрін екі немесе одан да көп математикалық жиынтықтың декарт көбейтіндісінің компьютерлік тілдегі аналогы ретінде немесе белгілі бір тілде абстрактілі өнім түрінің жүзеге асырылуы ретінде қарастыруға болады.

Кілттер

Жазбада нөл немесе одан көп кілттер болуы мүмкін. Кілт жазбадағы мәнге немесе мәндер жиынтығына өрнекті бейімдейді. Негізгі кілт барлық сақталған жазбаларда бірегей болады; осы кілттің тек біреуі ғана бар. Басқаша айтқанда, ешқандай негізгі кілт үшін қайталама болуы мүмкін емес. Мысалы, қызметкер туралы файлда қызметкер нөмірі, аты-жөні, бөлімі және жалақысы болуы мүмкін. Қызметкер нөмірі ұйымда бірегей болады және негізгі кілт болып табылады. Деректерді сақтау ортасына және файл ұйымдастыруына байланысты қызметкер нөмірі индекстелуі мүмкін – яғни, іздеуді жылдамдату үшін жеке файлда да сақталады. Бөлім коды міндетті түрде бірегей емес; ол да индекстелуі мүмкін, онда ол екіншілік кілт немесе балама кілт деп есептеледі. Егер ол индекстелмеген болса, белгілі бір бөлімдегі барлық қызметкерлердің тізімін алу үшін бүкіл қызметкер туралы файлды қарап шығу керек. Кілттер әдетте бір кілтке бірнеше мәннің сәйкес келу ықтималдығын азайтатындай етіп таңдалады. Мысалы, жалақы саласы әдетте кілт ретінде қолданылмайды, себебі көптеген қызметкерлердің жалақысы бірдей болуы мүмкін. Файл құрастыру кезінде индекстеу қарастырылатын факторлардың бірі болып табылады.

Тарих

Жазбаның түсінігін ежелгі заманнан бері бухгалтерлік есепте пайдаланылатын кестелер мен кітаптардың түрлі-түрлеріне байланыстыруға болады. Компьютер ғылымындағы жазбалар туралы қазіргі заманғы түсінік, анықталған типі мен мөлшері бар өрістерді қамтиды және ол 19 ғасырдың механикалық калькуляторларында, мысалы Бэббидждің Аналитикалық машинасы сияқты көрініс тапқан. Деректер үшін (бақылау үшін емес) пайдаланылған алғашқы машинамен оқылатын орта – 1890 жылғы АҚШ халық санағында жазбалар үшін қолданылған перфокарта болды: әрбір перфокарта бір жазбаны білдірді. 1880 жылғы жазбаны 1895 жылғы перфокартамен салыстырып қараңыз. 20 ғасырдың бірінші жартысында деректерді өңдеудің көп бөлігі перфокарталар арқылы жасалғандықтан, жазбалар кеңінен таралды. Әдетте, деректер файлының әрбір жазбасы бір перфокартада тіркелді, ал нақты өрістерге арнайы бағандар белгіленді. Әдетте, жазба – сыртқы жадтан (мысалы, карта оқығышы, таспа немесе диск) оқуға болатын ең кішкентай бірлік болды. Перфокарта стиліндегі жазбалардың мазмұны бастапқыда «бірлік жазбалар» деп аталды, себебі перфокарталар құжаттың ұзындығын алдын ала анықтаған. Жад сақтау жүйелері қатаң дискілер мен магниттік таспаларды пайдалану арқылы жетілдірілгеннен кейін, өзгермелі ұзындығы бар жазбалар стандартқа айналды. Өзгермелі ұзындығы бар жазба – жазбаның байттардағы мөлшері оның өрістерінің мөлшерінің қосындысына шамамен тең болатын жазба. Бұл озық жад аппараттары ойлап табылғанға дейін мүмкін болмады, өйткені барлық перфокарталар компьютер оқи алатын алдын ала белгіленген құжат ұзындығына сәйкес болуы керек еді, себебі сол кезде карталарды машинаға физикалық түрде салу қажет болды. Көптеген машиналық тілдердің іске асырылымдары мен ерте ассемблер тілдерінің жазбалар үшін арнайы синтаксисі болмады, бірақ бұл түсінік индекстік тізілімдерді, жанама адрестеуді және өзін-өзі өзгерту кодын пайдалану арқылы қолжетімді (және кеңінен қолданылды). Кейбір ерте компьютерлер, мысалы IBM 1620, жазбалар мен өрістерді шектеу үшін аппараттық қолдауға және мұндай жазбаларды көшіруге арналған арнайы нұсқауларға ие болды. Жазбалар мен өрістер түсінігі IBM-нің Есеп беру бағдарлама жасағышы (RPG) сияқты кейбір ерте файлдарды сұрыптау және кестелеу құралдарында орталық рөл атқарды. Бұл жазба түрлерін қолдауға арналған алғашқы кең таралған бағдарламалау тілі болды, ал оның жазбаны анықтау мүмкіндіктері сол кезде өте күрделі болды. Тіл кез келген мөлшер мен дәлдігі бар әліппә-сандық, бүтін сан және бөлшек өрістермен қатар, оларға берілген кез келген мәнді автоматты түрде пішімдеуге мүмкіндік беретін өрістерді (мысалы, валюта белгілерін, ондық нүктелерді және цифрлық топтарды бөлушілерді қосу) анықтауға мүмкіндік берді. Әрбір файл деректерді оқуға немесе жазуға арналған жазба айнымалысымен байланыстырылады. COBOL екі жазбаның сәйкес өрістерін олардың аттарына сәйкес тағайындайтын MOVE CORRESPONDING операторын да ұсынады. Сандық есептеулер үшін жасалған FORTRAN (FORTRAN IV-ке дейін) және Algol 60 сияқты ерте тілдерде жазба түрлерін қолдау болмады; бірақ FORTRAN 77 және Algol 68 сияқты сол тілдердің кейінгі нұсқалары оларды қосты. Бастапқы Lisp бағдарламалау тілінде де жазбалар болмады (cons жасушасынан басқа), бірақ оның S өрнектері жеткілікті орынбасар болды. Паскаль бағдарламалау тілі – логикалық тұрғыдан дәйекті типтік жүйеге басқа негізгі типтермен жазба түрлерін толыққанды біріктірген алғашқы тілдердің бірі болды. PL/I бағдарламалау тілі COBOL стиліндегі жазбаларды қамтамасыз етті. C бағдарламалау тілі бастапқыда жазба тұжырымын деректердің нақты дерек типінен гөрі, жад аймағының үстіне орналастырылатын үлгі (құрылым) ретінде ұсынды. Соңғылары кейіннен (typedef жариялануы арқылы) берілді, бірақ екі түсінік тілде әлі де ерекшеленеді. Паскальдан кейін жасалған көптеген тілдер (Ada, Modula және Java сияқты) да жазбаларды қолдады. Жазбалар енді өздерінің бастапқы контекстінде жиі қолданылмаса да (яғни, деректерді сақтау үшін ғана пайдаланылса), олар жаңа объектіге бағытталған бағдарламалау тілдеріне және реляциялық деректер қорын басқару жүйелеріне әсер етті. Жазбалар деректерді сақтау және өңдеу тәсіліне көбірек модульдік мүмкіндік бергендіктен, олар тілдерде әдеттегідей ұсынылған қарапайым дерек түрлеріне қарағанда күрделі, нақты әлем тұжырымдамаларын көрсетуге жақсы бейімделген. Бұл C++, Python, JavaScript және Objective C сияқты бағдарламалаушылардың модульдік мәселелерін қарастыратын кейінгі тілдерге әсер етті. Бұл тілдердегі нысандар негізінен әдістер мен мұрагерлік қосылған жазбалар болып табылады, бұл бағдарламалаушыларға жазбаның мазмұнына ғана емес, деректердің қалай өзгеретініне де әсер етуге мүмкіндік береді. Көптеген бағдарламалаушылар жазбаларды қазірде ескірген деп санайды, себебі объектіге бағытталған тілдер жазбалардың мүмкіндіктерінен әлдеқайда асып түсетін мүмкіндіктерге ие. Екінші жағынан, көптеген бағдарламалаушылар төменгі абстракция деңгейінде бағдарламалау кезінде жазбалардың төменгі жүктемесі мен ассемблер тілінде пайдалану мүмкіндігі оларды әлі де маңызды етеді деп санайды. Бүгінде TIOBE индексіндегі ең танымал тілдер, бағдарламалау тілдерінің танымалдылығының көрсеткіші, жазбаларға белгілі бір дәрежеде әсер еткен, себебі олар объектіге бағытталған. SQL және Объектілік сұрау тілі сияқты сұрау тілдері де жазбалар тұжырымына әсер етті. Бұл тілдер бағдарламалаушыға деректер жиынтығын сақтауға мүмкіндік береді, бұл негізінен жазбалар, кестелерде. Бұл деректерді бастапқы кілтті пайдаланып алуға болады. Кестелердің өзі де жазбалар болып табылады, олар басқа кестедегі деректерге сілтеме жасайтын сыртқы кілтке ие болуы мүмкін.

Тағайындау және салыстыру

Көптеген тілдер бірдей жазба түріне ие жазбалар арасында (оның ішінде бірдей өріс түрлері мен атаулары, бірдей ретпен) мән беруге мүмкіндік береді. Дегенмен, тілге байланысты, екі жеке анықталған дерек типі, тіпті олардың өрістері толық сәйкес келсе де, ерекше типтер ретінде қарастырылуы мүмкін. Кейбір тілдер әртүрлі атаулары бар өрістерге ие жазбалар арасында мән беруге рұқсат етеді, әр өрістің мәнін тиісті өріс айнымалысымен жазбадағы орны бойынша сәйкестендіреді; мысалы, «нақты» және «көлемді» деп аталатын өрістері бар кешенді санды «X» және «Y» өрістері бар 2D нүктелік жазба айнымалысына беруге болады. Мұндай жағдайда екі аргументтің өріс түрлерінің тізбесі бірдей болуы керек. Кейбір тілдерде сәйкес келетін типтердің бірдей өлшемде және кодталуда болуы талап етіледі, сонда бүкіл жазбаны интерпретацияланбаған биттік тізбек ретінде беруге болады. Басқа тілдер бұл тұрғыда икемдірек болуы мүмкін және тек әрбір мән өрісін тиісті айнымалы өрісіне заңды түрде беруге рұқсат береді; мысалы, қысқа бүтін сан өрісін ұзын бүтін сан өрісіне немесе керісінше беруге болады. Тағы да басқа тілдер (мысалы, COBOL) өрістер мен мәндерді олардың орнына атаулары бойынша сәйкестендіруі мүмкін. Осы мүмкіндіктер екі жазбаның мәнін теңдікке салыстыру кезінде де қолданылады. Кейбір тілдер жеке өрістерді салыстыруға негізделген лексикографиялық тәртіпті пайдалана отырып, ретті салыстыруға («<» және «>») рұқсат етеді. PL/I жоғарыда аталған тапсырманың екі түріне де рұқсат береді, сондай-ақ «a = a+1» сияқты құрылымдық өрнектерге рұқсат береді, мұнда «a» – PL/I терминологиясындағы жазба немесе құрылым.

Алгол 68-дің таралу өрісін таңдау

Алголь 68-де, егер Pts X және Y бүтін сандық өрістері бар жазбалар массиві болса, онда Pts-тің барлық элементтерінің Y өрістерінен тұратын бүтін сандар массивін алу үшін Pts-тің Y-ін жазуға болады. Осының нәтижесінде, Y of Pts[3] := 7 және (Y of Pts)[3] := 7 операторлары бірдей әсер етеді.

Паскальдың "мен" сөзі

Паскаль бағдарламалау тілінде R do S командасы S командалар тізбегін орындайды, R жазбасының барлық өрістері айнымалылар ретінде жарияланғандай. C# сияқты объектіге бағытталған тілде басқа атау кеңістігіне кіруге ұқсас, енді өрістерге қол жеткізу үшін жазба атауын алдынан қоюдың қажеті жоқ. Сондықтан, Pt.X := 5; Pt.Y := Pt.X + 3 деп жазудың орнына, .

Жадыда бейнелеу

Жадтағы жазбалардың бейнеленуі бағдарламалау тілдеріне қарай өзгереді. Әдетте, өрістер жадыда тізбектей орналасып, жазба типінде жарияланған ретпен сақталады. Бұл екі немесе одан көп өрістің бір жад сөзіне сыйып қалуына мүмкіндік береді; шындығында, бұл мүмкіндік жүйелік бағдарламалауда жад сөзінің нақты биттеріне қол жеткізу үшін жиі пайдаланылады. Алайда, көптеген компиляторлар машинаның туралау талаптарына сәйкес келу үшін, бағдарламашыға көрінбейтін, қосымша өрістерді қосады – мысалы, қалқыма нүктелік өріс бір жад сөзін толығымен иеленуі керек. Кейбір тілдер жазуды өрістерге (немесе олардың аттарына және/немесе түрлеріне) сілтеме жасайтын адрес тізімі ретінде іске асыруы мүмкін. Объектіге бағытталған тілдердегі объектілер көбінесе күрделі жолдармен іске асырылады, әсіресе көп мұрагерлікке рұқсат беретін тілдерде.

Өзін-өзі анықтайтын жазбалар

Өзін-өзі анықтайтын жазба – жазбаның түрін анықтау және жазба ішіндегі ақпаратты табуға қажетті ақпаратты қамтитын жазба түрі. Ол элементтердің орналасқан жерін көрсетуі мүмкін, сондықтан элементтер кез келген ретпен сақталуы немесе жойылуы мүмкін. Өзін-өзі анықтайтын жазбада сақталған ақпаратты жазбаның метадеректері деп қарастыруға болады, бұл UNIX жүйесіндегі файл туралы метадеректердегідей, жазбаның жасалған уақыты және байттармен өлшенген жазбаның көлемі сияқты ақпаратты қамтиды. Басқаша айтқанда, әрқайсысы элемент идентификаторын қамтитын жазбаның әртүрлі элементтері кез келген ретпен тікелей бірінен соң бірі орналасуы мүмкін.