Кіріспе
Бағдарламалауда, объектісін қоқыс жинаудан қорғамайтын сілтеме. Компьютерлік бағдарламалауда әлсіз сілтеме – бұл сілтеме арқылы көрсетілген объектіні қоқыс жинаушыдан қорғамайтын, мықты сілтемеден өзгеше сілтеме. Егер объектіге тек әлсіз сілтемелер арқылы қол жеткізілсе – яғни "объектіге жететін әрбір сілтеме тізбегінде кем дегенде бір әлсіз сілтеме болады" – онда ол әлсіз қолжетімді деп есептеледі және қолжетімсіз деп қарастырылып, кез келген уақытта жиналынуы мүмкін. Кейбір қоқыс жинау тілдері, мысалы C#, Lua, Java, Lisp, OCaml, Perl, Python және PHP (7.4 нұсқасынан бастап) әлсіз сілтемелердің әртүрлі деңгейлерін ұсынады немесе қолдайды.
In computer programming, a weak reference is a reference that does not protect the referenced object from collection by a garbage collector, unlike a strong reference. An object referenced only by weak references – meaning "every chain of references that reaches the object includes at least one weak reference as a link" – is considered weakly reachable, and can be treated as unreachable and so may be collected at any time. Some garbage collected languages feature or support various levels of weak references, such as C#, Lua, Java, Lisp, OCaml, Perl, Python and PHP since the version 7.4.
Қолданылуы
Әлсіз сілтемелердің бірнеше кең таралған қолданылуы бар. Есептеу арқылы қоқыс жинау қолданғанда, әлсіз сілтемелер циклдегі сілтеме үшін әлсіз сілтемені пайдалану арқылы сілтеме циклдарын үзуге мүмкіндік береді. Егер сізде кілттері (объекттерге сілтемелер) объектілер болатын ассоциативтік массив (карта, хэш-карта) болса, мысалы, объекттер туралы қосымша деректерді сақтау үшін, кілттер үшін әлсіз сілтемелерді қолдану, объектілерді тек кілт ретінде пайдаланғандықтан тірі ұстаудың алдын алады. Егер бір объект басқа объекттерге тіркелген болса, мысалы, бақылаушы үлгісінде (әсіресе оқиғаларды өңдеуде), егер күшті сілтеме сақталса, объектілерді тіркеуден шығару қажет, әйтпесе жад ағып кетуі мүмкін (ескі тыңдаушы мәселесі), ал әлсіз сілтеме тіркеуден шығару қажеттілігін жояды. Қажет болған жағдайда қайта жасалатын кэштелген деректерді сақтағанда, әлсіз сілтемелер кэшті қайтаруға мүмкіндік береді, нәтижесінде тасталатын жад пайда болады. Бұл соңғы жағдай (кэш) басқалардан ерекшеленеді, себебі объектілерді тек қажет болғанда қоқыс жинау арқылы жою дұрыс, сондықтан әлсіз сілтемелердің ішінде нақтырақ айырмашылықтар қажет, яғни әлсіз сілтемелердің күшті түрі. Көп жағдайларда әлсіз сілтемелерді тікелей пайдаланудың қажеті жоқ, оның орнына әлсіз массивті немесе кілттері немесе мәндері әлсіз сілтемелерден тұратын басқа контейнерді пайдалану жеткілікті.
Қоқыс жинау
Қоқыс жинау пайдаланылмаған нысандарды тазалау үшін қолданылады, соның арқасында жадтың ағуы мен деректердің бұзылу мүмкіндігі азаяды. Қоқыс жинаудың екі негізгі түрі бар: із кесу және сілтеме санау. Сілтеме санау схемалары белгілі бір нысанға жасалған сілтемелердің санын тіркейді және сілтеме саны нөлге жеткенде нысанды жинайды. Сілтеме санау циклдық (немесе дөңгелек) сілтемелерді жинауға қабілетсіз, себебі бір уақытта тек бір нысан ғана жинала алады. Басқа нысандармен тікелей байланысы жоқ және қол жеткізе алмайтын өзара сілтемелер жасаған нысандар тобы тұрақты түрде жадта қалуы мүмкін; егер бағдарлама мұндай қол жеткізе алмайтын нысандар тобын үнемі жасаса, бұл жадтың ағуына себеп болады. Айналымдық сілтемелерді болдырмау үшін, топтағы кейбір сілтемелерге әлсіз сілтемелер (сілтеме санауда есепке алынбайтын сілтемелер) қолданылса, айналымдық сілтемелер мәселесін шешуге болады. Мұндай күшті және әлсіз сілтемелердің аражігін ажыратудың кең таралған мысалы – ағаш тәрізді құрылымдар, мысалы, Document Object Model (DOM), онда атадан балаға жасалған сілтемелер күшті, ал баладағы атаға жасалған сілтемелер әлсіз болады. Мысалы, Apple компаниясының Cocoa құрылғысы осы тәсілді ұсынады. Шындығында, нысандар графигі ағаш болмаған жағдайда да, нысанға иелік ету тұжырымдамасы арқылы ағаш құрылымын құруға болады, онда иелік ету қатынастары күшті болып, ағаш құрайды, ал иелік ету емес қатынастар әлсіз болып, ағаш құру үшін қажетті емес. Бұл тәсіл C++ (C++11 нұсқасына дейін) жиі қолданылады, мұнда шикі нұсқауыштар әлсіз сілтемелер ретінде пайдаланылады. Алайда, бұл тәсілдің кемшілігі бар: аталық тармақ алынып тасталғанда және жойылғанда оны анықтау мүмкін болмайды. C++11 стандартынан бастап Boost кітапханасынан мұраланған ортақ көрсеткіштер (shared ptr) және әлсіз көрсеткіштер (weak ptr) пайдалану арқылы бұл мәселе шешілді. Әлсіз сілтемелер сонымен қатар бағдарламаға нысандардың қайсысы аз маңызды екенін көрсетуге мүмкіндік беру арқылы жадтағы қажетсіз нысандардың санын азайту үшін де қолданылады.
Вариациялар
Кейбір тілдерде әлсіз сілтеме күшінің бірнеше деңгейі болады. Мысалы, Java-да, күші азая түсу ретімен, java.lang.ref пакетінде жұмсақ, әлсіз және фантомдық сілтемелер бар. Әрбір сілтеме түрінің қолжетімділік тұжырымы бар. Қоқыс жинағыш (GC) объектіні қашан босату керектігін анықтау үшін объектінің қолжетімділік түрін пайдаланады. GC-ге жұмсақ қолжетімді объектіні босату қауіпсіз, бірақ егер JVM жадты босата алады деп есептесе, GC оны жасамауға шешім қабылдауы мүмкін (мысалы, JVM-де көп пайдаланылмаған үйінді кеңістігі болса). GC әлсіз қолжетімді объектіні байқаған кезде бірден босатады. Басқа сілтеме түрлерінен айырмашылығы, фантомдық сілтемені іздеуге болмайды. Екінші жағынан, фантомдық сілтемелер объекті босатылған кезде бағдарламаны хабардар ету механизмін ұсынады (хабарлама ReferenceQueues арқылы іске асырылады). C#-да әлсіз сілтемелер объектінің қайта жандануын қадағалай ма, жоқ па, соған қарай ажыратылады. Бұл айырмашылық күшті сілтемелерде болмайды, себебі егер объектілерде күшті сілтемелер болса, олар аяқталмайды. Дәстүрлі түрде, C#-да әлсіз сілтемелер қайта жандануды қадағаламайды, яғни объекті қайта жанданса әлсіз сілтеме жаңартылмайды; мұндай сілтемелерді қысқа әлсіз сілтемелер деп атайды, ал қайта жандануды қадағалайтын әлсіз сілтемелер ұзақ әлсіз сілтемелер деп аталады. Кейбір қоқыс жиналатын тілдер, мысалы C++, қоқыс жиналатын кітапханаларды қолдау мақсатында әлсіз/күшті сілтеме функционалдығын ұсынады. Boost C++ кітапханасы күшті және әлсіз сілтемелерді қамтамасыз етеді. Қалыпты C++ көрсеткіштерін ақылды көрсеткіштердің әлсіз аналогтары ретінде пайдалану қате, себебі мұндай қолдану күшті сілтеме саны 0-ге жеткенде және объекті жойылғанда оны анықтау мүмкіндігін жояды. Жағдайды одан да нашарлату үшін, ол белгілі бір қарапайым көрсеткішті басқа күшті сілтеме қадағалап тұрғанын анықтауға мүмкіндік бермейді. Бұл екі (немесе одан да көп) ақылды көрсеткіштердің бір қарапайым көрсеткішті қадағалауына әкелуі мүмкін (бұл осы ақылды көрсеткіштердің бірінің сілтеме саны 0-ге жетіп, объекті жойылған кезде зақымдануға себеп болады).
Мысалдар
Қолданбада қазіргі уақытта сілтеме жасалған айнымалылардың тізімін сақтау үшін әлсіз сілтемелер пайдалы болуы мүмкін. Осы тізімдегі нысандарға әлсіз сілтемелер болуы керек. Әйтпесе, нысандар тізімге қосылғаннан кейін, олар тізіммен байланысты болып қалады және бағдарлама аяқталғанға дейін сақталады.