Кіріспе

Көздерді қайта пайдалану үшін дерек құрылымы. Компьютер ғылымында, жол интернизациясы – әр түрлі жол мәнінің тек бір данасын сақтау әдісі, ол өзгертілмейтін болуы керек. Жолдарды интернизациялау кейбір жол өңдеу тапсырмаларын уақыт бойынша тиімдірек немесе жадты тиімдірек етеді, бірақ жол құрылғанда немесе интернизацияланғанда көбірек уақыт қажет етеді. Әр түрлі мәндер жол интернизациясы қоймасына сақталады. Әр жолдың бір данасы оның интернизацияланған түрі деп аталады және әдетте жол класының әдісі арқылы ізделеді, мысалы, Java-да String.intern(). Java-дағы компиляция уақытындағы барлық тұрақты жолдар осы әдіс арқылы автоматты түрде интернизацияланады. Жол интернизациясын Java, Python, PHP (5.4 нұсқасынан бастап), Lua және .NET тілдері сияқты кейбір заманауи объектіге бағытталған бағдарламалау тілдері қолдайды. Lisp, Scheme, Julia, Ruby және Smalltalk тілдерінің барлығында негізінен интернизацияланған жолдар болып табылатын символдар типі бар. New Jersey Standard ML кітапханасында осыған ұқсас функцияны орындайтын атом типі бар. Әдетте әдіс атаулары ретінде қолданылатын Objective-C селекторлары интернизацияланған жолдар болып табылады. Жолдардан басқа нысандар да интернизациялануы мүмкін. Мысалы, Java-да, алғашқы мәндер орауыш нысанына (wrapper object) оралғанда, белгілі бір мәндер (кәз келген boolean, кез келген byte, 0-ден 127-ге дейінгі кез келген char және -128 мен 127 арасындағы кез келген short немесе int) интернизацияланады, және осы мәндердің кез келген орауыш түрлендірілімдері бір нысанды қамтамасыз етеді.

Тарих

Lisp өзінің символдары үшін интернацияланған жолдар ұғымын енгізді. Тарихи тұрғыдан алғанда, жолдарды интернациялау пулы ретінде қолданылатын деректер құрылымы oblist (егер ол тізбектелген тізім ретінде іске асырылған болса) немесе obarray (егер ол массив ретінде іске асырылған болса) деп аталды. Қазіргі заманғы Lisp диалектілері символдарды жолдардан ажыратады; берілген жолды интернациялау қанағаттандырылған символды қайтарады немесе жаңасын жасайды, оның аты сол жол болады. Символдарда көбінесе жолдарда жоқ қосымша қасиеттер болады (мысалы, байланысты мәндерді сақтау немесе атау кеңістігі): осы айырмашылық кездейсоқ түрде интернацияланған жолды интернацияланбаған жолмен салыстырудың алдын алу үшін де пайдалы, бұл қолдану үлгілеріне байланысты уақытша қателерге әкелуі мүмкін.

Мотивация

Жіптерді интернациялау (жадта сақтау) жолдарды салыстыруды жылдамдатады, бұл кейде қолданбаларда (мысалы, компиляторлар және динамикалық бағдарламалау тілдерінің орындалу ортасы) өнімділіктің шектеуші факторы болып табылады, олар объектінің атрибуттары мен әдістерін іздеу үшін жол кілттері бар ассоциативтік массивлерге көп көлеңкелейді. Интернацияланбаған жағдайда екі әртүрлі жолдың салыстырылуы екеуінің де әрбір таңбасын қарауды қажет етеді. Бұл бірнеше себептерге байланысты баяу: жолдардың ұзындығына байланысты күрделігі O(n) болады; әдетте, жадтың бірнеше аймақтарынан оқу қажет, бұл уақытты алады; және оқу процессор кэшін толтырады, яғни басқа қажеттіліктер үшін кэште аз орын қалады. Интернацияланған жолдар үшін бастапқы интернация операциясынан кейін қарапайым объект сәйкестігі тесті жеткілікті; бұл әдетте мекенжай теңдігі тесті ретінде жүзеге асырылады, әдетте, жадқа сілтемесіз бір машиналық нұсқау. Жіптерді интернациялау, егер бірдей жол мәнінің көптеген мысалдары болса, жадты үнемдеуге мүмкіндік береді; мысалы, егер ол желіден немесе сақтағыштан оқылса. Мұндай жолдарға магикалық сандар немесе желілік протокол туралы ақпарат кіруі мүмкін. Мысалы, XML анализаторлары жадты үнемдеу үшін тегтер мен атрибуттардың атауларын интернациялай алады. Java RMI сериализациясының объектілер ағыны арқылы нысандарды желілік тарату интернацияланған жолдарды тиімдірек тасымалдай алады, өйткені сериализация кезінде String объектісінің дескрипторы дубликатталған нысандардың орнына қолданылады.

Көптіріктілік

Егер интернирленген жолдар өзгертілмейтін болмаса, кемшіліктердің бір себебі – жолдарды интернирлеу көп тізбектілікпен қолданылғанда қиындықтар тудыруы мүмкін. Көптеген жүйелерде жолдарды интернирлеу адрес кеңістігіндегі барлық тізбектерде (немесе көрсеткіштерді бөлісетін кез келген контексттерде) жаһандық болуы керек, сондықтан интернирлеу пулы (лары) қауіпсіз параллель қол жеткізу үшін синхрондалуы тиіс жаһандық ресурстар болып табылады. Бұл тек жол құру кезінде әсер етеді (интернирлеу пулы қажет болған жағдайда тексеріліп, өзгертілуі керек), және екі рет тексеру құлпы қауіпсіз оптимизация болып табылатын платформаларда қолданылуы мүмкін, бірақ интернирлеу пулын өзгерту кезінде өзара құлыптау қажеттілігі қымбатқа түсуі мүмкін. Бәсекелестікті азайту үшін жол кеңістігін бірнеше пулға бөлуге болады, олар бір-бірінен тәуелсіз синхрондалуы мүмкін.

Пайдаланылмаған интернатталған сымдарды қайта өңдеу

Интернацияланған жолдардың көптеген іске асырылымдары енді қолданылмайтын жолдарды (қолмен немесе басқа тәсілмен) қайтаруға тырыспайды. Интернацияланған жолдардың саны аз немесе белгілі бір тұрақты болған, немесе қысқа мерзімді қолданбалар үшін жүйе ресурстарын жоғалту қабылданатын болуы мүмкін. Бірақ, ұзақ уақыт бойы жұмыс істейтін және орындалу барысында көптеген жол интерндері жасалатын жүйелерде, пайдаланылмаған интерндерді қайтару қажеттігі тууы мүмкін. Бұл міндетті қоқыс жинаушы орындай алады, бірақ мұның дұрыс жұмыс істеуі үшін жол интерндеріне әлсіз сілтемелер интерндер жинағында сақталуы тиіс.