Bosh sahifa Wiki Native code

Native code

Native code — ma’lum processor instruction seti va operatsion tizim ABI’si uchun mashina kodiga compile qilingan dastur kodidir. U processor tomonidan bevosita bajariladi, biroq dinamik linker, system library va operatsion tizim xizmatlariga tayanishi mumkin. Java bytecode yoki WebAssembly kabi oraliq format esa runtime tomonidan interpretatsiya yoki just-in-time compilation orqali target mashina kodiga aylantiriladi.

Compile va linking

Compiler source’ni object file’larga aylantiradi. Ular machine instruction, symbol, relocation va debug metadata saqlaydi. Linker object file va librarylarni bir executable yoki shared libraryga birlashtiradi, tashqi symbol manzilini hal qiladi. Static linking dependency kodini binaryga qo‘shadi; dynamic linking kerakli shared libraryni load vaqtida bog‘laydi.

Native artifact target architecturega bog‘liq. x86-64 binary ARM64’da emulation yoki qayta compilation’siz ishlamaydi. Operatsion tizim executable format, calling convention va system API’ni belgilaydi. Cross-compiler bir hostda boshqa target uchun build qiladi, lekin target sysroot va library versionlari ham mos bo‘lishi kerak.

Performance xususiyatlari

Ahead-of-time compiler butun modulni optimallashtirib, runtime warm-up’siz tez start berishi mumkin. SIMD, cache locality va branch predictiondan foydalanish yuqori performance beradi. Biroq “native doim tez” degan qoida yo‘q: JIT real workload profiliga mos optimallashtirishi, noto‘g‘ri native algoritm esa sekin bo‘lishi mumkin. Benchmark target hardware va productionga yaqin inputda o‘tkaziladi.

Native kod manual xotira va pointer operatsiyalariga yaqin bo‘lgani sabab buffer overflow, use-after-free va integer overflow xavfi katta. Memory-safe til native binary yaratishi mumkin; “native” atamasi xotira xavfsizligi darajasini bildirmaydi. Compiler hardening, stack protector, control-flow protection, ASLR va sanitizers defense-in-depth beradi.

Interoperabilitet

Managed dastur native libraryni FFI orqali chaqiradi. Chegarada type layout, encoding, ownership, calling convention va error modeli aniq moslashtiriladi. Callback runtime threadiga qaytganda garbage collector va thread attachment qoidalari bajariladi. C-compatible opaque handle murakkab C++ class ABI’sini tashqariga ochishdan barqarorroq.

Crash native chegarada butun processni to‘xtatishi mumkin; exception’ni turli runtime orasida nazoratsiz o‘tkazish xavfli. Error code yoki aniq result struct ishlatiladi. Untrusted native plugin alohida process va sandboxda ishlatilsa blast radius kamayadi.

Tarqatish va diagnostika

Release artifact architecture, OS, libc va minimal CPU feature bo‘yicha nomlanadi. Reproducible build, signed package va SBOM supply-chain tekshiruvini qo‘llaydi. Binary strip qilinsa ham debug symbol build ID bilan alohida saqlanadi. Crash dump aynan o‘sha binary va symbol versiyasi bilan tahlil qilinadi; boshqa build symboli noto‘g‘ri stack trace beradi.

Update mosligi

Dynamic library update’da symbol mavjudligi yetarli emas; struct layout va function semantikasi ham mos qolishi kerak. SONAME yoki boshqa ABI version mexanizmi loaderga incompatible kutubxonani ajratishga yordam beradi. Package manager dependency constraintni tekshiradi, lekin qo‘lda ko‘chirilgan library bu nazoratni chetlab o‘tishi mumkin. Native executable self-update qilsa yuklangan kodni joyida almashtirish o‘rniga yangi artifactni atomik joylashtirib, yangi process ishga tushiradi. Rollback uchun eski binary va configuration schema mosligi saqlanadi. CPU feature detection startda bajarilib, unsupported instructionli optimized path tanlanmaydi; universal paket bir nechta implementation orasidan xavfsiz variantni tanlashi mumkin.

Bog‘liq tushunchalar

Machine code, Compiler, Linker, ABI, Shared library, Foreign Function Interface, Just-in-time compilation