Bosh sahifa Wiki Compilation unit

Compilation unit

Compilation unit — kompilyator bir marta kirish sifatida qabul qilib, sintaktik va semantik tahlil qiladigan manba kod birligidir. Tilga qarab u bitta fayl, modul, package qismi yoki oldindan ishlovdan keyin hosil bo‘lgan kod bo‘lishi mumkin. Atama build targetdan farq qiladi: bitta dastur ko‘plab compilation unitlardan yig‘iladi.

Tilga bog‘liq ma’no

C va C++da source fayl preprocessor orqali headerlar kengaytirilgandan so‘ng translation unit hosil qiladi; amaliy nutqda u compilation unit deb ham ataladi. Har .c yoki .cpp fayl odatda alohida object filega kompilyatsiya qilinadi. Java’da compilation unit odatda .java fayli bo‘lib, package va import deklaratsiyalari hamda type e’lonlarini o‘z ichiga oladi.

Rust crate’ni kengroq kompilyatsiya birligi sifatida ko‘radi, modul fayllari uning ichida birgalikda tahlil qilinadi. TypeScript compiler konfiguratsiya orqali ko‘plab fayl graphini bir dastur sifatida ko‘rishi mumkin. Shu sabab aniq terminni til spetsifikatsiyasi kontekstida tushunish kerak.

Alohida kompilyatsiya

Separate compilation katta loyihada faqat o‘zgargan birliklarni qayta kompilyatsiya qilish imkonini beradi. Har birlik tashqi symbol va type deklaratsiyalariga tayanadi, ammo boshqa fayl amalga oshirishini to‘liq bilmasligi mumkin. Natijadagi object file keyin linker orqali birlashtiriladi.

Header yoki public interface o‘zgarsa, unga bog‘liq ko‘plab birlik qayta build qilinadi. Implementatsiya faqat .cpp ichida o‘zgarsa, qamrov kichikroq. Pimpl va modul tizimlari public dependency yuzasini kamaytirib, build vaqtiga yordam beradi.

Scope va nomlar

Compilation unit top-level scope, import va visibility qoidalarining chegarasi bo‘lishi mumkin. static bilan berilgan C funksiyasi internal linkagega ega bo‘lib, shu unit tashqarisidan ko‘rinmaydi. Boshqa unit xuddi shu nomli internal symbolga ega bo‘lishi mumkin.

Java package-private a’zolar bir package doirasida ko‘rinadi, unit bilan aynan teng emas. Import kodni nusxalamaydi, nomni yechish qoidalarini beradi. C preprocessor #include esa header matnini unitga kiritadi; bu farq dependency va xatolarda muhim.

Object file va linking

Kompilyator birlikdan machine code, bytecode yoki intermediate representation hosil qiladi. Tashqi symbol manzili hali noma’lum bo‘lsa relocation yozuvi qoldiriladi. Linker object file va kutubxonalarni birlashtirib, symbol reference’larni yechadi.

Bir xil tashqi symbol bir nechta unitda noto‘g‘ri e’lon qilinsa duplicate definition xatosi paydo bo‘ladi. C++ One Definition Rule type va inline funksiya e’lonlarining birliklar orasida izchil bo‘lishini talab qiladi. Build flag yoki macro farqi bir headerdan turli ta’rif hosil qilib, nozik xatoga sabab bo‘lishi mumkin.

Incremental build

Build system har compilation unitning manba, import, header, compiler flag va toolchain dependencylarini hisoblaydi. Faqat timestampga tayanish generatsiya qilingan fayl yoki flag o‘zgarishini o‘tkazib yuborishi mumkin; content hash aniqroq. Compiler cache bir xil kirishlar uchun oldingi object natijasini qayta ishlatadi.

Unity build ko‘plab source faylni bitta katta unitga birlashtirib, header parse takrorini kamaytiradi. Biroq parallelism, nom konfliktlari va incremental build aniqligi yomonlashishi mumkin. Modul va precompiled header boshqa muvozanat beradi.

Diagnostika

Kompilyatsiya xatosi odatda joriy unit va uning import qilingan deklaratsiyalariga tegishli. Link xatosi esa unitlar orasidagi yechilmagan yoki takroriy symbolni ko‘rsatadi. Muammoni ajratishda compiler buyrug‘i, include path, macro va target arxitekturasi ko‘riladi. Bir unitni mustaqil qayta kompilyatsiya qilish build tizimi yashirgan farqni topishga yordam beradi.

Bog‘liq tushunchalar

Compiler, Translation unit, Object file, Linker, Symbol, Header file, Incremental compilation