Кіріспе
Бағдарламалау тілінің ұғымы
Компьютерлік ғылымда, бокстау (әлде орау) – мәнді сілтеме ретінде пайдалану үшін қарапайым дерек типін объектінің ішіне орналастыру процесі. Бокстан шығару – орама объектісінен қарапайым дерек типін алудың кері процесі. Автобоксстау – қажет болған жағдайда бокстау және/немесе бокстан шығару түрлендірулерін автоматты түрде қолдану термині.
Бокс
Бокстың ең көп қолданылатын жері Java тілі, онда орындалу уақытының тиімділігі, синтаксис және семантикалық мәселелер сияқты себептермен сілтеме және мән типтері арасында ерекшелік бар. Java-да, a тек One типіндегі мәндерді сақтай алады, бірақ бұл тікелей мүмкін емес. Оның орнына Java, әрбір қарапайым типке сәйкес келетін қарапайым орауыш сыныптарын анықтайды: және , және , және , және т.б. Содан кейін a-ны орауыш типін пайдаланып анықтап, мәндерді нысандар ретінде орап, тізімге қосуға болады. (J2SE 5.0-де енгізілген жалпы параметрленген типтерді қолдану арқылы бұл тип былай көрсетіледі .) Ал C# тілінде қарапайым орауыш сыныптары жоқ, бірақ кез келген мән типін орап, жалпы сілтеме қайтаруға мүмкіндік береді. Objective C-де кез келген қарапайым мәнді a префиксімен алдын ала қоюға болады, осылайша одан a жасауға болады (мысалы, g немесе ). Бұл оларды стандартты жинақтардың кез келгеніне, мысалы, қосуға мүмкіндік береді. Haskell тілінде сілтеме типі туралы түсінік шамалы немесе мүлдем жоқ, бірақ орындалу жүйесінің тегтелген біріктірілген көрсеткіштерге жасалған біртекті ұсынысы үшін «орау» термині әлі де қолданылады. Ораулы нысан әрқашан мән нысанының көшірмесі болып табылады және көбінесе өзгертілмейді. Нысанды ораудан шығару сақталған мәннің көшірмесін қайтарады. Нысандарды қайта-қайта орау және ораудан шығару өнімділікке елеулі әсер етуі мүмкін, себебі орау динамикалық түрде жаңа нысандарды бөліп алады, ал ораудан шығару (егер ораулы мән енді қолданылмаса) оларды қоқыс жинауға жарамды етеді. Дегенмен, Java HotSpot қоқыс жинағышы сияқты қазіргі заманғы қоқыс жинағыштар, қысқа өмір сүретін нысандарды тиімдірек жинай алады, сондықтан егер ораулы нысандардың өмір сүру ұзақтығы қысқа болса, өнімділікке тигізетін әсер айтарлықтай болмауы мүмкін. Кейбір тілдерде ораусыз қарапайым тип пен өзгертілмейтін, ораулы нысан типіне сілтеме арасында тікелей эквиваленттілік бар. Шындығында, бағдарламадағы барлық қарапайым типтерді ораулы нысан типтерімен алмастыруға болады. Бір қарапайым типтен екіншісіне жүктеу оның мәнін көшіреді, ал бір ораулы нысанға сілтемеден екіншісіне жүктеу сілтеме мәнін көшіріп, екі сілтеме де бір нысанға сілтеме жасайды. Алайда, бұл ешқандай проблема тудырмайды, себебі нысандар өзгертілмейді, сондықтан бір нысанға немесе әртүрлі нысандарға екі сілтеме арасында семантикалық айырмашылық жоқ (егер сіз физикалық теңдікке назар аудармасаңыз). Тапсырудан басқа барлық операциялар үшін, мысалы, арифметикалық амалдар, салыстыру және логикалық операторлар, ораулы типті ораудан шығарып, операцияны орындап, нәтижені қажет болған жағдайда қайта орауға болады. Осылайша, қарапайым типтерді мүлдем сақтамауға болады.
Haskell has little or no notion of reference type, but still uses the term "boxed" for the runtime system's uniform pointer to tagged union representation. The boxed object is always a copy of the value object, and is usually immutable. Unboxing the object also returns a copy of the stored value. Repeated boxing and unboxing of objects can have a severe performance impact, because boxing dynamically allocates new objects and unboxing (if the boxed value is no longer used) then makes them eligible for garbage collection. However, modern garbage collectors such as the default Java HotSpot garbage collector can more efficiently collect short lived objects, so if the boxed objects are short lived, the performance impact may not be severe. In some languages, there is a direct equivalence between an unboxed primitive type and a reference to an immutable, boxed object type. In fact, it is possible to substitute all the primitive types in a program with boxed object types. Whereas assignment from one primitive to another will copy its value, assignment from one reference to a boxed object to another will copy the reference value to refer to the same object as the first reference. However, this will not cause any problems, because the objects are immutable, so there is semantically no real difference between two references to the same object or to different objects (unless you look at physical equality). For all operations other than assignment, such as arithmetic, comparison, and logical operators, one can unbox the boxed type, perform the operation, and re box the result as needed. Thus, it is possible to not store primitive types at all.