Bosh sahifa Wiki Call graph

Call graph

Call graph — dasturdagi funksiya, metod yoki protseduralar o‘rtasidagi chaqiruv munosabatini ifodalovchi yo‘naltirilgan grafikdir. Tugun chaqiriladigan birlikni, A dan B ga qirra esa A funksiyasi B ni chaqirishi mumkinligini ko‘rsatadi. Grafik statik tahlil orqali taxmin qilinishi yoki bajarilish vaqtidagi kuzatuvdan qurilishi mumkin.

Statik call graph

Compiler yoki analizator source, AST yoki intermediate representationni ko‘rib, bevosita call maqsadlarini topadi. Oddiy nomlangan funksiya chaqirig‘i aniq qirra beradi. Virtual dispatch, interface, function pointer, reflection va dynamic loadingda maqsad runtime turiga bog‘liq. Conservative analysis mumkin bo‘lgan barcha maqsadlarni qo‘shib, grafikni xavfsiz, lekin ortiqcha katta qiladi.

Class hierarchy analysis override bo‘lishi mumkin metodlarni sinf iyerarxiyasidan topadi. Points-to analysis funksiya pointeri yoki obyekt reference qaysi qiymatlarga ishora qilishi mumkinligini hisoblaydi. Context-sensitive tahlil bir funksiyaning turli chaqiruv joylarini ajratib aniqlikni oshiradi, ammo vaqt va xotira xarajatini ko‘paytiradi.

Dinamik grafik

Instrumentation yoki profiler real workload davomida kuzatilgan calllarni yozadi. Bu grafik faqat bajarilgan yo‘llarni ko‘rsatadi; testda ishga tushmagan, ammo productionda mumkin bo‘lgan qirra yo‘q bo‘ladi. Evaziga virtual callning haqiqiy maqsadi va chaqiruv soni aniq ko‘rinadi. Sampling profiler stack namunalaridan taxminiy vaznli qirralar chiqaradi.

Tracing xizmatlararo call graph yaratishi mumkin. Har tugun servis yoki endpoint, qirra RPC oqimidir. Sampling va trace propagation yetishmasa, bog‘liqlik to‘liq ko‘rinmaydi. Async queue orqali chaqiruv oddiy stackda bo‘lmaydi; message metadata producer va consumer yo‘lini bog‘lashi kerak.

Qo‘llanish

Compiler call graphdan inlining, interprocedural constant propagation va dead code elimination uchun foydalanadi. Recursive sikl strongly connected component sifatida topiladi. Build tizimi o‘zgargan funksiyaning mumkin bo‘lgan ta’sir doirasini aniqlashi mumkin. Xavfsizlik tahlili ishonchsiz input manbasidan xavfli sinkgacha bo‘lgan yo‘llarni qidiradi.

Arxitektura ko‘rigida qatlam qoidasi tekshiriladi: masalan, domen moduli UI modulini chaqirmasligi kerak. Juda yuqori fan-in markaziy dependency’ni, yuqori fan-out esa murakkab orkestratorni ko‘rsatishi mumkin. Biroq qirra soni o‘zi yomon dizayn hukmi emas; semantika va stabil API hisobga olinadi.

Vizualizatsiya cheklovlari

Katta dastur grafigi minglab tugun bilan o‘qilmaydi. Paket bo‘yicha guruhlash, depth filtri, entry point va qirra vazni ishlatiladi. Flame graph call graphning vaqt bilan vaznlangan stack ko‘rinishidir, lekin vertikal joylashuvi chaqiruv chuqurligini beradi. Call tree bir xil funksiyani turli yo‘llarda takrorlaydi, call graph esa yagona tugunda birlashtirishi mumkin.

Grafik compiler bayroqlari, platforma va feature konfiguratsiyasiga bog‘liq. Reflection konfiguratsiyasi yoki plugin ro‘yxati analizatorga berilmasa qirralar yo‘qoladi. Natija “aniq bajariladi” va “bajarilishi mumkin” ma’nolarini alohida belgilashi kerak.

+## Test tanlash va o‘zgarish ta’siri

Change impact analysis o‘zgargan funksiya tugunidan reverse qirralar bo‘ylab yurib, qaysi test va modul potensial ta’sirlanganini topadi. Static grafik ortiqcha qirralar sabab ko‘proq test tanlashi mumkin, bu xavfsiz, lekin sekin. Faqat dynamic coverage’ga tayanish ilgari bajarilmagan yo‘lni o‘tkazadi. Amaliy tizim public API, data schema va konfiguratsiya bog‘liqligini call graphdan tashqari dependency sifatida qo‘shadi. Recursive komponentda bitta tugun o‘zgarishi butun strongly connected guruhga ta’sir deb olinadi. Tanlanmagan testlarning davriy to‘liq suite’da bajarilishi model xatosini aniqlashga yordam beradi.

Bog‘liq tushunchalar

Control-flow graph, Static analysis, Dynamic dispatch, Profiling, Flame graph, Dependency graph, Recursion