Bosh sahifa Wiki Translation Unit

Translation Unit

Translation Unit — alohida kompilyatsiya qilinadigan manba dastur birligi. C va C++da u odatda bitta source faylga preprocessor orqali kiritilgan headerlar, macro kengaytmalari va conditional compilation natijasi qo‘shilgandan keyingi tokenlar majmuasidir.

Hosil bo‘lish jarayoni

#include matnni translation unit ichiga mantiqan kiritadi, #define esa keyingi preprocessing tokenlarini o‘zgartiradi. Compiler har translation unitni object filega aylantiradi; linker keyin bir nechta object file va kutubxonadagi external symbol reference’larni bog‘laydi. Shu bois compile-time va link-time xatolar farqli bosqichlarda yuz beradi.

Linkage qoidalari

Internal linkagega ega static global nom faqat o‘z translation unitida ko‘rinadi. External linkagega ega funksiya declarationi ko‘p unitda uchrashi, definitioni esa til qoidalariga ko‘ra kerakli miqdorda bo‘lishi kerak. C++dagi One Definition Rule inline, template va class definitionlari uchun yanada nozik shartlar qo‘yadi.

Headerlar ta’siri

Header guard yoki #pragma once ayni headerning bir unitga takroriy kiritilishidan keladigan redefinitionni cheklaydi. Ammo ular turli translation unitlarda alohida preprocessingni to‘xtatmaydi. Macro yoki build flag farqi bir headerni unitlar orasida turlicha talqin qildirib, ABI yoki ODR muammosiga olib kelishi mumkin.

Build tizimidagi o‘rni

Build system dependency fayllaridan qaysi header o‘zgarsa qaysi translation unit qayta kompilyatsiya qilinishini aniqlaydi. Precompiled header va C++ module mexanizmlari takroriy parsing xarajatini kamaytiradi, lekin ular translation unit tushunchasini butunlay yo‘q qilmaydi. Reproducible build uchun compiler flag va macro muhit ham dependency hisoblanadi.

Diagnostika

Tekshiruvda preprocessor chiqishi, object symbol table va linker map alohida ko‘riladi. Undefined reference ko‘pincha declaration bor, lekin kerakli definition linkga kirmaganini bildiradi. Duplicate symbol esa linkage yoki definition qoidasi buzilganidan dalolat beradi; faqat source faylni o‘qish yetarli tashxis bermaydi.

Translation Unit bo‘yicha tahlil natijasi faqat yakuniy xulosa bilan emas, uni hosil qilgan IR versiyasi, target xususiyatlari va qo‘llangan taxminlar bilan birga saqlanadi. Compiler passlari ketma-ket o‘zgarganda oldingi natija avtomatik ravishda haqiqiy deb olinmaydi: tegishli dependencylar invalidatsiya qilinib, zarur qism qayta hisoblanadi. Debug rejimida asosiy invariant buzilgan nuqta va undan oldingi transformatsiya qayd etiladi; release rejimida esa tekshiruvlarning arzon qismi qoldiriladi. Shu yondashuv nazariy jihatdan qonuniy qoida implementatsiya xatosi yoki noto‘g‘ri cost model sabab zararli qarorga aylangan holatni ajratishga yordam beradi.

Kengaytirilgan jihatlar

Translation unit chegarasi diagnostika va optimizatsiya ko‘lamini ham belgilaydi. Oddiy compile jarayonida compiler boshqa unitdagi function bodyni ko‘rmaydi; link-time optimization object faylga boy IR yozib, linker bosqichida unitlararo inlining va dead code eliminationni ochadi. Bu build natijasini compiler versiyasi va LTO formatiga bog‘laydi. Debug ma’lumotda declaration bir nechta unitda takrorlansa, linker COMDAT yoki weak symbol qoidalari asosida nusxalarni birlashtirishi mumkin. Unity build esa ko‘p source faylni bitta unitga birlashtirib tezlik berishi, lekin ilgari alohida internal nomlar yoki macrolar to‘qnashuvini yuzaga chiqarishi mumkin.

Build cache translation unit natijasini source hash bilan birga barcha transitive headerlar, compiler option, target triple va environment-sensitive macro hashiga bog‘laydi. Timestampning o‘zi yetarli emas. Depfile yo‘qolgan headerni ham dependency sifatida qayd etishi mumkin. Parallel build bir unit xatosini boshqa unit loglari bilan aralashtirmasdan, deterministik fayl kontekstida ko‘rsatadi.

Bog‘liq tushunchalar

preprocessor, object file, linker, header file, linkage, one definition rule