Кіріспе

Компьютерлік бағдарламалауда, статикалық түрде бөлінген айнымалыларға арналған код секциясы – объектілік файлдың, атқарылатын файлдың немесе тілдік құрастыру кодынң бөлігі, онда мәні әлі берілмеген, бірақ жарияланған статикалық айнымалылар орналасқан. Ол көбінесе "bss секциясы" немесе "bss сегменті" деп аталады. Әдетте, объектілік файлда bss секциясының ұзындығы ғана, ал деректер сақталмайды. Бағдарлама жүктегіші бағдарламаны жүктеген кезде bss секциясына жадты бөледі. Бастапқы мән деректерін қажет ететін деректер немесе rodata секциясының орнына, мәні жоқ айнымалыларды bss секциясына орналастыру арқылы объектілік файлдың көлемі кішірейтіледі. Кейбір платформаларда bss секциясының бір бөлігі немесе толығымен нөлдермен инициализацияланады. Unix сияқты жүйелер мен Windows bss секциясын нөлге инициализациялайды, сондықтан оны C және C++ статикалық айнымалыларын инициализациялау үшін пайдалануға болады, олардың барлық біттері нөлге тең. Операциялық жүйелер bss сегментін тиімді жүзеге асыру үшін "талап бойынша нөлдік толтыру" деп аталатын әдісті қолдануы мүмкін. Кіріктірілген бағдарламалық жасақтамада bss сегменті main функциясына дейін C орындалу уақыты жүйесімен нөлге инициализацияланатын жадқа бейнеленеді. Кейбір C орындалу уақыты жүйелері bss сегментінің бір бөлігін инициализацияламауға мүмкіндік береді; C айнымалылары осы bss сегментінің бөлігіне нақты орналастырылуы керек. Кейбір компьютерлік архитектураларда қолданбаның екілік интерфейсі "шағын деректерге" арналған sbss сегментін де қолдайды. Әдетте, бұл деректерді қысқа нұсқаулар арқылы алуға болады, олар тек белгілі бір адрестер диапазонына қол жеткізе алады. Жездел сақтауды қолдайтын архитектуралар инициализацияланбаған, жездел деп белгіленген статикалық деректер үшін tbss секциясын пайдалануы мүмкін.

Шығу тегі

Тарихи тұрғыдан алғанда, BSS (Block Started by Symbol) – UA SAP (United Aircraft Symbolic Assembly Program) бағдарламасындағы псевдо-операция, 1950-ші жылдардың ортасында Рой Натт, Уолтер Рамшоу және басқалар United Aircraft Corporation компаниясында IBM 704 үшін әзірлеген құрастырушы. BSS кілт сөзі кейіннен FORTRAN Assembly Program (FAP) және Macro Assembly Program (MAP) бағдарламаларына, IBM-нің 709 және 7090/94 компьютерлері үшін стандартты құрастырушыларына қосылды. Ол белгіні (яғни символды) анықтады және белгілі бір мөлшердегі сөздерге арналған басталмаған бос орын блогын резервтеді. Осы жағдайда BSS жеке-жеке бірнеше кішкентай деректер орнын резервтеудің орнына ықшам тәсіл болды. Кейбір құрастырушылар символмен аяқталатын блок үшін BES (Block Ended by Symbol) деген қосымша немесе баламалы директиваны қолдайды, онда көрсетілген символ резервтелген блоктың соңына сәйкес келеді.

C-тегі BSS

C тілінде ерекше инициализаторы жоқ статикалық түрде бөлінген объектілер нөлге (арифметикалық типтер үшін) немесе null көрсеткішке (көрсеткіш типтері үшін) инициализацияланады. C тілінің іске асырылымдары әдетте нөлдік мәндер мен null көрсеткіш мәндерін тек нөлдік биттерден тұратын биттік үлгі арқылы көрсетеді (C стандартында bss-ті нөлдермен толтыру талап етілмесе де, C ISO стандарты 9899:1999-дың 6.7.8 бөліміне немесе жаңа стандарттардың 6.7.9 бөліміне сәйкес, bss-тегі барлық айнымалылар қандай да бір нөлдік түрде жеке инициализациялануы тиіс). Сондықтан, BSS сегменті әдетте файл ауқымында (яғни, кез келген функцияның сыртында) жарияланған инициализацияланбаған объектілерді (айнымалылар мен тұрақтыларды) және инициализацияланбаған статикалық жергілікті айнымалыларды (static кілт сөзімен жарияланған жергілікті айнымалыларды) қамтиды; статикалық жергілікті тұрақтылар жариялау кезінде инициализациялануы керек, себебі олардың жеке жариялануы жоқ, сондықтан олар әдетте BSS сегментінде болмайды, бірақ олар жасырын немесе ашық түрде нөлге инициализациялануы мүмкін. Іске асырылым, сонымен қатар, тек нөлдік биттерден тұратын мәнмен инициализацияланған статикалық түрде бөлінген айнымалылар мен тұрақтыларды BSS сегментіне тағайындауы мүмкін. C бағдарламашысы және автор Питер ван дер Линден былай дейді: "Кейбіреулер оны "Орынды үнемдеу" деп есте сақтағанды ұнатады. BSS сегменті әлі ешқандай мәні жоқ айнымалыларды ғана сақтағандықтан, осы айнымалылардың бейнесін сақтаудың қажеті жоқ. BSS-тің орындалу кезінде қажетті көлемі объектілік файлда тіркеледі, бірақ BSS (деректер сегментінен айырмашылығы) объектілік файлда нақты орын алмайды".

Фортрандағы BSS

Фортранда ортақ блок айнымалылары осы сегментте орналастырылады. Кейбір компиляторлар 64 биттік нұсқаулар жиынтығын қолданғанда, осы сегментке қатынас жасайтын нұсқаулардағы офсеттерді 32 битпен шектеуі мүмкін, бұл оның көлемін 2 ГБ немесе 4 ГБ-қа дейін азайтады. Сондай-ақ, Fortran статикалық деректердің міндетті түрде нөлге теңестірілуін талап етпейді. Bss сегменті нөлге инициализацияланатын жүйелерде ортақ блок айнымалыларын және басқа статикалық деректерді сол сегментке орналастыру олардың нөлдік мәнге ие болуын қамтамасыз етеді, бірақ кодтың тасымалдалу қабілетін сақтау үшін бағдарламашылар мұға байланып қалмауы керек.