Кіріспе
Компьютерлік ғылымда таңбаланған сілтеме – бұл сілтеме (нақты айтқанда, жад адресі), оған қосымша деректер қоса байланыстырылған, мысалы, бағытталған бит немесе сілтеме саны. Бұл қосымша деректер көбінесе сілтемеге «қосылады», яғни адресті білдіретін деректердің ішінде тікелей сақталады, жад адрестеудің белгілі бір ерекшеліктерін пайдалана отырып. Атауы «таңбаланған архитектура» жүйелерінен келген, олар әр сөздің маңыздылығын көрсету үшін аппараттық деңгейде биттерді резервтеген; қосымша деректер «таңба» немесе «таңбалар» деп аталады, бірақ қатаң айтқанда «таңба» типті анықтайтын деректерді білдіреді, басқа деректерді емес; алайда «таңбаланған сілтеме» термині кеңінен қолданылады.
Таңбашаларды меңзерге бүктеу
Тагтарды сілтемеге бүктеудің әр түрлі әдістері бар. Сенімсіз дереккөз: reason=Тагталған санды бейнелеуге негізделген мысал – нақты дәлсіздік, өйткені сілтеме мәні дерек мәніне емес, белгіленеді. Архитектуралардың көпшілігі байт адрестік (адрестік ең кіші бірлік байт), бірақ деректердің белгілі бір түрлері көбінесе деректердің көлеміне, көбінесе сөзге немесе оның бірнеше еселігіне сәйкес келеді. Бұл сәйкессіздік меңзердің ең аз маңызды биттерін бос қалдырады, оларды тагтар үшін қолдануға болады – көбінесе бит өрісі ретінде (әр бит жеке таг) – егер меңзерді қолданатын код жадыға кірмес бұрын осы биттерді маскаласа. Мысалы, 32 биттік архитектурада (адрестер мен сөздердің көлемі үшін) сөз 32 бит = 4 байт, сондықтан сөздік сәйкестікпен адрестер әрқашан 4-тің еселігі болып табылады, сондықтан 00-де аяқталады, соңғы 2 битті бос қалдырады; ал 64 биттік архитектурада сөз 64 бит = 8 байт, сондықтан сөздік сәйкестікпен адрестер 000-де аяқталады, соңғы 3 битті бос қалдырады. Деректер сөз өлшеміне бірнеше еселенген жағдайда қосымша биттер қолданылады. Сөзді адрестейтін архитектуралар жағдайында сөздік сәйкестікпен деректер ешқандай битті бос қалдырмайды, өйткені сәйкестік пен адрестеу арасында сәйкессіздік жоқ, бірақ сөз өлшеміне бірнеше еселенген деректер бос биттерді қалдырады. Керісінше, кейбір операциялық жүйелерде виртуалды мекенжайлар жалпы архитектураның енінен тар, бұл тагтар үшін ең маңызды биттерді бос қалдырады; бұл сәйкестендірілген мекенжайлар жағдайында алдыңғы әдіспен біріктірілуі мүмкін. Бұл әсіресе 64 биттік архитектураларда орын алады, өйткені 64 биттік адрестік кеңістік барлық, бірақ ең үлкен қосымшалардың дерек талаптарынан әлдеқайда жоғары, сондықтан көптеген практикалық 64 биттік процессорларда тар адрестер бар. Еске сала кетейік, виртуалды мекенжайдың ені физикалық мекенжайдың енінен тар болуы мүмкін, ол өз кезегінде архитектураның енінен тар болуы мүмкін; пайдаланушы кеңістігіндегі сілтемелерді таңбалау үшін операциялық жүйе (өз кезегінде жадты басқару блогымен қамтамасыз етілген) ұсынатын виртуалды мекенжай кеңістігі тиісті ен болып табылады. Шын мәнінде, кейбір процессорлар мұндай таңбаланған сілтемелерді процессор деңгейінде қолдануды тыйым салады, атап айтқанда x86 64, бұл операциялық жүйеге канондық нысандағы мекенжайларды пайдалануды талап етеді, ең маңызды биттері барлық 0 немесе барлық 1 болады. Соңында, көптеген заманауи операциялық жүйелердегі виртуалды жад жүйесі 0 адресі айналасындағы логикалық жад блогын пайдалануға жарамсыз деп қалдырады. Бұл дегеніміз, мысалы, 0-ге сілтейтін сілтеме ешқашан жарамды сілтеме болып табылмайды және арнайы нөлдік сілтеме мәні ретінде пайдаланылуы мүмкін. Жоғарыда аталған әдістерден айырмашылығы, бұл тек бір ғана арнайы көрсеткіш мәнін, жалпы көрсеткіш үшін қосымша деректерді емес, рұқсат етеді.
Мысалдар
Коммерциялық платформада таңбаланған нұсқауштарға аппараттық қолдау көрсетудің ең алғашқы мысалдарының бірі IBM System/38 болды. Кейін IBM, IBM i операциялық жүйесін қолдау үшін PowerPC архитектурасына таңбаланған нұсқауштарды қосты, бұл IBM System/38 платформасының дамуы болып табылады. Таңбаланған нұсқауштарды қолданудың маңызды мысалы – iOS 7-дегі ARM64 құрылғысындағы Objective-C орындалу ортасы, әсіресе iPhone 5S телефонында қолданылады. iOS 7 жүйесінде виртуалды мекенжайлар тек 33 биттік мекенжай ақпаратын қамтиды, бірақ 64 биттік болып келеді, соның салдарынан 31 бит таңбалар үшін босатылады. Objective-C класының нұсқауштары 8 байтқа дейін туралануы мүмкін, бұл қосымша 3 биттік мекенжай кеңістігін босатады, ал таңбалау өрістері көптеген мақсаттар үшін қолданылады, мысалы, сілтемелер санын сақтау және объектіде деструктор бар-жоқ екенін анықтау. macOS-тың алғашқы нұсқалары деректер объектілеріне сілтемелерді сақтау үшін "Handles" деп аталатын таңбаланған мекенжайларды пайдаланды. Мекенжайдың жоғарғы биттері деректер объектісі құлыпталған, тазартылатын және/немесе ресурстық файлдан алынған екенін көрсетеді. Бұл macOS мекенжайдау жүйесі 7-де 24 биттен 32 битке дейін жеткен кезде үйлесімділік проблемаларын тудырды.
Нөл мен сәйкестендірілген меңзер
Нөлдік көрсеткішті бейнелеу үшін нөлді пайдалану өте кең таралған, көптеген бағдарламалау тілдері (мысалы, Ada) осы мінез-құлыққа тікелей сүйенеді. Теориялық тұрғыдан алғанда, операциялық жүйенің логикалық жад блогындағы басқа да мәндер нөлдік көрсеткіштен өзге жағдайларды белгілеу үшін қолданылуы мүмкін, бірақ мұндай қолданыстар сирек кездеседі, мүмкін олар ең жақсы жағдайда портативті емес. Бағдарламалық жасақтаманы жобалауда қалыпты қабылданған тәжірибе бойынша, егер нөлден өзгеше арнайы көрсеткіш мәні қажет болса (мысалы, кейбір деректер құрылымдарындағы күзетші), бағдарламашы оны нақты түрде қамтамасыз етуі керек. Көрсеткіштердің туралануын пайдалану нөлдік көрсеткіштерге/күзетшілерге қарағанда икемдірек, себебі ол көрсеткіштердің түрі, оларға қол жеткізу шарттары немесе көрсеткіштің қолданылуы туралы басқа да ұқсас ақпаратпен белгілеуге мүмкіндік береді. Бұл ақпаратты әрбір жарамды көрсеткішпен бірге беруге болады. Керісінше, нөлдік көрсеткіштер/күзетшілер жарамды көрсеткіштерден ерекшеленетін шектеулі мөлшерде белгіленген мәндерді ғана ұсынады. Белгіленген архитектурада жадтың әрбір сөзінің бірнеше биті белгі ретінде резервтеледі. Белгіленген архитектуралар, мысалы Lisp машиналары, көбінесе белгіленген көрсеткіштерді түсіндіру және өңдеу үшін аппараттық қолдау көрсетеді. GNU libc malloc 32 биттік платформалар үшін 8 байттық тураланған жад адрестерін, ал 64 биттік платформалар үшін 16 байттық туралауды қамтамасыз етеді. Үлкен туралау мәндерін posix memalign арқылы алуға болады.
Артықшылықтар
Тагталған сілтемелердің басты артықшылығы – олар жеке таңбалау өрісі бар сілтемеге қарағанда аз орын алады. Бұл, әсіресе, сілтеме функциядан қайтарым мәні ретінде берілген кезде маңызды болуы мүмкін. Үлкен сілтемелер тізімінде де маңызды болуы мүмкін. Тағы бір айқын артықшылығы – таңбаны сілтемемен бірге сақтау арқылы, сыртқы синхрондау механизмдерін қолданбай-ақ сілтеме мен оның таңбасын жаңарту операциясының атомарлығын қамтамасыз етуге болады. Бұл, әсіресе операциялық жүйелерде, өнімділіктің айтарлықтай артуына мүмкіндік береді.
Кемшіліктер
Тагталған сілтемелерде XOR-байланысты тізімдер сияқты кейбір қиындықтар бар, бірақ олар аз дәрежеде. Мысалы, кейбір жөндеу құралдары тагталған сілтемелерді дұрыс оқуға шамасы келмейді; алайда, тагталған сілтемелерді ескере отырып жасалған жөндеу құралы үшін бұл мәселе емес. Нөлді бос сілтеме ретінде пайдаланудың бұл кемшіліктері жоқ: ол кеңінен таралған, көптеген бағдарламалау тілдері нөлді ерекше бос мән ретінде қарастырады және оның сенімділігін дәлелдеген. Бірақ C++ тілінде нөлдің жүктеме шешіміне қатысуында ерекшелік бар, онда нөл көрсеткіш емес, бүтін сан ретінде қарастырылады; осы себепті nullptr ерекше мәні, бүтін сан нөлге қарағанда артықшылыққа ие. Дегенмен, тагталған сілтемелерде нөлдер бос сілтемелерді көрсету үшін көбінесе қолданылмайды.