Yashil yurish aslida nima deydi
Test — mavjudlik haqidagi daʼvo: «shunday yurish borki, unda tizim toʻgʻri ishlaydi». Testlar toʻplami — shunday daʼvolarning koʻpi. Ularning na bittasi, na hammasi birgalikda «tizimni buzadigan xatti-harakat mavjud emas» demaydi — ular «biz unga duch kelmadik» deydi.
Chiziqli kod uchun bu farq deyarli ahamiyatsiz: yoʻllar sanoqli va qamrov ularni yopadi. Farq qadamlar tartibini dasturchi tanlamaydigan joyda hal qiluvchi boʻlib qoladi: bitta hisobga ikki soʻrov, taymautdan keyin takrorlangan toʻlov, navbat va uni oʻqiydigan jarayon, blokirovka va uni kutish. U yerda xatti-harakatlar fazosi kombinatorik, testlar esa undan bir hovuch oladi.
Kamdan-kam jadvalni takrorlanadigan qilish alohida vazifa va u determinlashgan simulyatsiya bilan hal qilinadi: tasodif oʻrniga sid, bayt-baytigacha takror. Ammo bu ham tanlanma. Nihoyatda katta fazodan ikki yuz jadval — juda yaxshi fazzing, teorema emas.
Bu farq qayerda pulga tushadi
Toʻrttasi ham kod hajmi haqida emas, birikmalar soni haqida. Aynan shu — toʻliq saralash amalda qoʻllanadigan soha: protokollar, holat mashinalari, blokirovkalar, xizmatlar oʻrtasidagi kelishuv. Oddiy CRUD bu sohaga kirmaydi va u yerga model tekshiruvini sudrash keraksiz.
Model tekshiruvi nima
Siz tizimni holat mashinasi sifatida tasvirlaysiz: boshlangʻich holatlar, amallar (har birida ishga tushish sharti va natijasi) va doim rost boʻlishi kerak boʻlgan daʼvolar. Keyin vosita barcha erishiladigan holatlarni aylanib chiqadi va yo daʼvo yolgʻon boʻlgan holatga yoʻl topadi, yo bunday yoʻl yoʻqligini isbotlaydi.
const spec = {
name: 'counter',
processes: 2,
init: [{ n: 0 }],
actions: [
{
name: 'p0: oshirish',
process: 0,
reads: ['n'],
writes: ['n'],
step: (s) => (s.n < 3 ? [{ n: s.n + 1 }] : []),
},
],
invariants: [{ name: 'n haddan oshmaydi', reads: ['n'], holds: (s) => s.n <= 3 }],
terminal: (s) => s.n === 3,
};Shaklning bitta tafsiloti muhim: shart va natija bitta funksiyada yashaydi. Amalning oʻzi keyingi holatlarni qaytaradi, boʻsh roʻyxat esa «hozir imkonsiz» degani. Shunda ular bir-biridan ajralib keta olmaydi — qoʻlda yozilgan modellardagi klassik xato manbai.
Ikkinchisi: reads, writes va simmetrik jarayonlar toʻplami taxmin qilinmaydi, eʼlon qilinadi. TLA+ ham xuddi shuni soʻraydi. Toʻlovi halol: notoʻgʻri eʼlon spetsifikatsiyadagi xatoga aylanadi, kerakli holatlarni jimgina uloqtirgan vositaning yashirin nosozligiga emas.
Kontrmisol verdiktdan muhimroq
«Buzilish mumkin» degan javob unga olib boradigan yoʻlsiz foydasiz. Kenglik boʻyicha qidiruv yoʻlni tuzilishiga koʻra eng qisqa qiladi, shuning uchun kontrmisol dampga emas, hodisa bayonnomasiga oʻxshab oʻqiladi.
✗ peterson (check then set) — invariant "at most one process in the critical section"
trace
(initial) pc=00 flag=00
p0: check the other flag pc=10 flag=00
p1: check the other flag pc=11 flag=00
p0: raise flag and enter pc=31 flag=10
p1: raise flag and enter pc=33 flag=11Ikkalasi ham qaradi, ikkalasi ham tushirilgan bayroqni koʻrdi, ikkalasi ham kirdi. Toʻrt qadam — va bayroq nega tekshiruvdan oldin koʻtarilishi kerakligi ravshan. Trassa boʻlsa bunday narsa bir daqiqada, «baʼzan ikkalasi ichkarida qoladi» boʻlsa haftalab tahlil qilinadi.
Nega saralashni toʻgʻridan-toʻgʻri qilib boʻlmaydi
Holatlar soni koʻpaytma kabi oʻsadi: besh fazadagi oltita jarayon — 15 625 birikma, bu esa oʻyinchoq misol. Shuning uchun vositaning asosiy qismi qidiruv emas, qidirmaslikka imkon beradigan narsalar.
Oxirgi qator birinchi ikkitasidan muhimroq. Jarayonlar doimo bir-birining oʻzgaruvchilarini oʻqib-yozadigan joyda qisqartiradigan narsa yoʻq — vosita esa halol hech narsa bermasligi shart. Bu qator testda daʼvo sifatida turibdi: u yerda yutuq eʼlon qilgan vosita yolgʻon aytgan boʻlardi.
Qidirmaslikning ikki usuli
Simmetriya. Jarayonlar almashtiriladigan boʻlsa, faqat ularning oʻrin almashuvi bilan farq qiladigan holatlar — bitta holat. Besh fazadagi oltita ishchi 15 625 taqsimot beradi, ammo atigi 210 multitoʻplam: qaysi biri qayerda emas, nechtasi qayerda ekani muhim.
Oʻrin almashadigan amallar. Ikki amal umumiy hech narsaga tegmasa, ular orasidagi tartib kuzatilmaydi: bir tartibni oʻrganib, ikkinchisidan hech narsa bilmaysiz. Rasman bu ample toʻplamlar va ularning toʻrtta sharti bor, har biri oʻz oʻrnini haqqoniy egallaydi — bittasini olib tashlang, tekshiruv buzilishlarni ishonch bilan oʻtkazib yubora boshlaydi.
Qisqartiruvchining oʻzini qanday tekshirish kerak
Mana bu butun ishning eng yoqimsiz joyi. Kerakli holatlarni uloqtirgan qisqartirish ishlaydigani bilan aynan bir xil natija beradi: «buzilish topilmadi». Qisqartirilgan qidiruv ichidan qaysi birini ushlab turganingizni ajratib boʻlmaydi.
Yagona ishlaydigan javob — qisqartirishga soʻzida ishonmaslik. Toʻliq saralash yonida qoladi: sekin, toʻliq va xato qila olmaydigan. Har bir spetsifikatsiya ikkala qidiruvdan oʻtadi va qisqartirilgan verdikt toʻligʻiga mos kelishi shart. Qisqartirishga muallifi ishonchli boʻlgani uchun emas, xato qila olmaydigan narsa bilan rozi boʻlgani uchun ishoniladi.
Bu kafolatning chegarasi bor va uni ochiq aytish kerak: solishtirish toʻliq saralash hali ishga tushadigan joyda — kichik modellarda mumkin. Aynan qisqartirish kerak boʻlmagan joyda. Bu yondashuvning tugʻma xossasi va u tekshiruvni bekor qilmaydi, ammo uning shiftini belgilaydi.
Xuddi shu usul boshqa joylarda: har bir eksponati algoritmning bitta qoidasini oʻchiradigan va tutilishi shart boʻlgan xatolar muzeyi hamda har bir pogʻonasi keyingisi taqiqlagan narsani ishlab chiqarishi shart boʻlgan izolyatsiya darajalari zinasi.
Jonlilik: tizim qulamaydi, shunchaki yetib bormaydi
Xavfsizlik «yomon holatga erishsa boʻladimi» degan savol va kenglik boʻyicha qidiruv unga javob beradi. Jonlilik «yaxshi narsa qachondir yuz beradimi» degan savol va uni yaxshi narsa hech qachon yuz bermaydigan cheksiz yurish buzadi. Chekli fazoda bunday yurish — arqon: siklgacha yoʻl va keyin abadiy sikl.
Muammo shundaki, bunday sikllarning koʻpi bemaʼni: ular ishga tushishi mumkin boʻlgan jarayon hech qachon ishga tushirilmasligini talab qiladi. Ularni zaif adolat kesib tashlaydi: uzluksiz tayyor jarayon qachondir qadam tashlashi shart. Bu shartsiz har qanday konkurent dastur jonlilikni «yiqitadi» va tekshiruv foydasiz boʻladi.
✗ spinlock — can loop forever without process 0 reaching its critical section
The cycle is fair: process 1 keeps moving; process 0 is blocked
then forever
p1: acquire pc=03 lock=1
p1: release pc=00 lock=-1Spinlok xavfsiz — ikkalasi bir vaqtda ichkarida boʻlmaydi — va ayni paytda ochlikka olib keladi. Peterson algoritmi xuddi shu tekshiruvdan oʻtadi va turn oʻzgaruvchisi aynan shuning uchun mavjud. «Xavfsiz» bilan «xavfsiz va yetib boradi» orasidagi farqni atay bilish kerak: navbatlarda, qulflarda va taqsimlangan blokirovkalarda aynan u monitoringda xato sifatida koʻrinmaydigan osilib qolishlar manbai.
Bu usul nimani uddalay olmaydi
- Kod emas, model tekshiriladi. Bu ham asosiy chegara, ham asosiy xavf: isbotlangan model va undan uzoqlashgan implementatsiya — oddiy holat. Model gʻoya xatolarini, testlar bajarilish xatolarini tutadi; biri ikkinchisini almashtirmaydi.
- Qisqartirishlar siz eʼlon qilgan narsaga nisbatan toʻgʻri. Eʼlon qilinmagan oʻzgaruvchini yozadigan amal uloqtirilgan holatlarga olib kelishi mumkin. Bu tahlil emas, shartnoma.
- Faqat invariantlar va jonlilikning bitta shakli. «Doim rost» va zaif adolat ostida «qachondir yuz beradi». Ichma-ich vaqt operatorlari ham, kuchli adolat ham, toʻliq LTL ham yoʻq.
- Hammasi xotirada. Milliardlar emas, minglab holatlar: diskdagi saqlash ham, ramziy tasvir ham yoʻq.
- Jiddiy ish uchun TLC va SPIN bor. Ular ortida oʻn yilliklar, diskdagi holat ombori, taqsimlangan tekshiruv va shu ish uchun oʻylab topilgan tillar.
Tijorat loyihasida bu qachon oʻzini oqlaydi
- 01
Umumiy holatga tegadiganlarni sanang
Bir xil maʼlumot ustida ikki yoki undan ortiq mustaqil jarayon ishlasa — toʻlov va vebhuk, ishchi va rejalashtiruvchi, foydalanuvchi va fon solishtiruvi — birikmalar siz yozadigan testlardan koʻp.
- 02
Invariantni bitta jumlada ayting
«Toʻlangan buyurtma toʻlov kutilmoqda holatiga qaytmaydi», «ikki oʻtkazma qoldiqdan ortiq yechmaydi». Invariant shakllanmasa, hozircha tekshiradigan narsa yoʻq — avval nima rost boʻlishi kerakligiga kelishing.
- 03
30–60 satrli model yozing, butun tizimni emas
Ilova emas, protokol modellashtiriladi: buyurtma holatlari, provayder qadamlari, nosozliklar va takrorlar. Qolgani modelga kirmaydi — bu soddalashtirish emas, saralash umuman tugashining sharti.
- 04
Olingan kontrmisolni testga aylantiring
Trassa — tayyor regressiya stsenariysi. Model repozitoriyda qoladi, test implementatsiyani qoʻriqlaydi va ikkalasi ham oʻz ishini qiladi.
Pul jihatidan bu maʼlumotdagi xato ishlamay qolishdan qimmatga tushadigan joyda oʻzini oqlaydi: moliyaviy tizimlar, qoldiqlar hisobi, tashqi provayderlar bilan integratsiyalar. Yondosh tahlillar — toʻlovlar idempotentligi va master qulaganda maʼlumotlar bilan nima boʻlishi.
Ko‘p so‘raladigan savollar
Bu TLA+ ning oʻzimi?
Gʻoya ham, algoritmlar ham bir xil: tizimni holat mashinasi sifatida tasvirlab, erishiladigan holatlarni aylanib chiqish. TLC bilan TLA+ — oʻz tili, diskda holat saqlash va taqsimlangan tekshiruvga ega sanoat vositasi; protokolni haqiqiy verifikatsiya qilish uchun oʻshani oling. Farq kirish chegarasida: TypeScriptdagi model kod bilan bitta repozitoriyda yashaydi va uni bitta ishqiboz emas, butun jamoa oʻqiydi.
Endi tizimni ikki marta — model va kod bilan tasvirlashimiz kerakmi?
Model tizimni emas, protokolni tasvirlaydi: holatlar, oʻtishlar, nosozliklar. Bu minglab emas, oʻnlab satr. Takrorlanish yoʻq, chunki model ataylab implementatsiyadan kambagʻalroq — unda baza ham, tarmoq ham, interfeys ham yoʻq, ammo qadamlarning barcha birikmasi bor.
Holatlar juda koʻp boʻlsa nima qilish kerak?
Mashina quvvatini emas, modelni kichraytirish: oʻn oʻrniga uch jarayon, oʻttiz oʻrniga ikki valyuta. Protokol xatolari deyarli har doim kichik nusxalarda chiqadi — bu maʼlum amaliy kuzatuv va model bilan ishlashning butun amaliyoti shunga tayanadi. Bu ham yordam bermasa, vazifa TLC va SPIN ga oʻtadi.
Tayyorlari bor ekan, nega oʻz model checker ingizni yozdingiz?
Nimaga ishonayotganimni bilish uchun. Saralash qisqartirishlari — kerakli holatlarni jimgina uloqtirib, oʻsha yashil javobni beradigan kod; ularni yozib chiqqach, birovning vositasidan foydalanganda aynan nima bilan tavakkal qilayotganingizni tushunasiz. Kod ochiq: pnueli, MIT, havola manbalarda.
Manbalar
Maqoladagi da’volarni tekshirish mumkin: quyida qayta hikoya emas, birlamchi manbalar.
- 01Clarke, Grumberg, Peled. Model Checking — Qisman tartiblangan qisqartirish va ample toʻplam shartlari
- 02TLA+ va TLC — Xuddi shu vazifa uchun sanoat vositasi
- 03SPIN — Protokollar modelini tekshirish, oʻn yilliklar amaliyoti
- 04Amir Pnueli — Turing mukofoti — Dasturlarni verifikatsiya qilishda vaqt mantigʻi: «doim» va «qachondir»
- 05pnueli — Maqoladagi vosita: MIT, qisqartirishlar yonida toʻliq saralash

Bu maqola, boshqalaridan farqli oʻlaroq, ism bilan imzolangan: uning ortida mijoz yoʻq. Gap ketayotgan kod toʻliq ochiq va oʻsha ismda chop etilgan — uni oʻqish, ishga tushirish va maqoladagi daʼvolarni soʻzga ishonmasdan tekshirish mumkin.