Reference — dasturlashda qiymat yoki obyektning o‘zini ko‘chirmasdan, unga murojaat qilish imkonini beradigan bog‘lanishdir. U til va runtime’ga qarab xotira manzili, boshqariladigan handle, obyekt identifikatori yoki compiler nazoratidagi alias sifatida amalga oshiriladi. Reference semantikasi pointerga o‘xshash bo‘lishi mumkin, ammo ko‘pincha arifmetika va yaroqsiz manzil yaratish cheklanadi.
Qiymat va reference semantikasi
Qiymat nusxalanganda yangi mustaqil mazmun hosil bo‘lishi mumkin. Reference nusxalanganda esa ikki nom bir xil obyektni ko‘rsatadi. Ulardan biri obyektning mutable maydonini o‘zgartirsa, ikkinchi murojaat ham yangi holatni ko‘radi. Bu aliasing deb ataladi va API xulqini tushunishda muhim.
Ba’zi tillarda primitive qiymatlar value semantics, sinf obyektlari reference semantics bilan uzatiladi. Boshqalarida struct ham reference orqali berilishi yoki copy-on-write ishlatilishi mumkin. “Funksiyaga reference bilan uzatish” parametning o‘zini qayta bog‘lashga ruxsat berish ma’nosida ham qo‘llanadi; bu obyekt reference qiymatini oddiy nusxalashdan farq qiladi.
Hayot sikli
Reference faqat nishon obyekt yashab turganda yaroqli. Manual xotira boshqaruvida obyekt bo‘shatilgach qolgan reference dangling pointerga aylanishi mumkin. Garbage-collected runtime kuchli reference mavjud ekan obyektni tirik saqlaydi. Weak reference esa obyektning yig‘ilishiga to‘sqinlik qilmaydi va undan foydalanishdan oldin nishon hali mavjudligi tekshiriladi.
Reference counting har kuchli bog‘lanishni sanaydi va son nolga tushganda obyektni bo‘shatadi. Ikki obyekt bir-birini kuchli ko‘rsatsa cycle hosil bo‘lib, ular kerak bo‘lmasa ham sanog‘i nolga tushmaydi. Weak reference yoki cycle detector bu muammoni hal qiladi. Ownership va borrow qoidalariga ega tillar ko‘p xatoni compile time’da cheklaydi.
Null va tenglik
Nullable reference hech qanday obyektni ko‘rsatmasligi mumkin. Null dereference runtime xatosi yoki jarayon qulashiga olib keladi. Optional tur yo‘qlik holatini type systemda ochiq ifodalab, tekshiruvni majburiy qiladi. Non-null annotation esa API shartnomasini ko‘rsatadi, lekin tashqi ma’lumot chegarasida baribir validatsiya zarur.
Reference equality ikki murojaat aynan bir obyektni ko‘rsatishini tekshiradi. Value equality esa alohida obyektlarning mazmuni tengligini baholaydi. Hash map kaliti uchun equality va hash shartnomasi uyg‘un bo‘lishi kerak; mutable obyekt kalit bo‘lsa, keyin o‘zgartirish uni topib bo‘lmaydigan holga keltirishi mumkin.
Parallel dasturda bir mutable obyektga umumiy reference data race yaratadi. Immutable obyekt, nusxa, lock yoki ownership transfer orqali kirish boshqariladi. Reference qulay va arzon bo‘lsa-da, uning egalik hamda mutability shartnomasi aniq bo‘lmasa, yashirin bog‘liqlik kuchayadi.
+## API dizaynidagi oqibat
Funksiya mutable kolleksiyaga reference qaytarsa, chaqiruvchi ichki holatni validatsiyasiz o‘zgartira olishi mumkin. Read-only view, immutable copy yoki aniq mutation metodi encapsulationni saqlaydi. Defensive copy katta obyektlarda qimmat, shu sababli ownership transfer yoki borrow muddati hujjatlashtiriladi. Callback closure tashqi scope’dagi reference’larni ushlab, kutilganidan uzoq hayot sikli yaratishi mumkin; event listener o‘z vaqtida uzilmasa xotira sizishi yuz beradi. Serialization reference identity’ni odatda saqlamaydi: bitta obyektga ikki reference deserializatsiyada ikki nusxaga aylanishi mumkin. Graph formatlari cycle va shared identity uchun maxsus ID talab qiladi.
Reference’ni boshqa threadga yuborish tilning Send yoki thread-safety shartlariga bog‘liq bo‘lishi mumkin. UI obyektiga background threaddan murojaat taqiqlansa, qiymat message orqali egasi bo‘lgan event loopga uzatiladi. Bu yashirin race va lifetime xatosini kamaytiradi.
Bog‘liq tushunchalar
Pointer, Aliasing, Ownership, Garbage collection, Weak reference, Null safety, Reference counting