21-sentyabr kuni libprisma repozitoriyida — Telegram xabarlaridagi kod bloklarini yoritish uchun ishlatiladigan — uch soat ichida o'n ikkita o'zgartirish sodir bo'ldi. Til jadvaliga TON smart kontekstlarining asosiy tilini — Tolk qo'shildi, Tact va FunC ta'riflari yangilandi, va 2023-yil 20-noyabrdan beri birinchi marta dastur o'zini qayta yig'ildi.
Hozircha dasturlarda bu ko'rinmayapti. Har bir mijoz o'ziga xos jadval nusxasini o'zida saqlaydi, va u barchasi 2023-yilgi.

Telegram kodni qanday yoritadi
Xabardagi kod bloki server emas, balki o'zining o'zida tahlil qilinadi. Bu jarayonni libprisma boshqaradi — 2023-yil o'zbek kuni Telegram tomonidan chiqarilgan C++ tilida yozilgan Prism.js brauzer kutubxonasining o'tkazilgan versiyasi. Til qoidalari Prism.js paketidan va repozitoriyda to'g'ridan-to'g'ri yozilgan bir nechta fayllardan yig'ilib, normalizatsiyadan o'tkaziladi va grammars.dat nomli bitta binar faylga birlashtiriladi. Mijoz bu faylni dastur ishga tushganda yuklab oladi va keyin har bir kod bloki uchun tushuntirish so'raydi — qaysi so'z kalit so'z, qaysi qator, qaysi sharh.
Bu fayl barcha qo'llab-quvvatlanadigan tillarning ro'yxatidir. Agar til jadvalda bo'lmasa, blok hali ham so'zlar o'ziga xos shaklda, o'ziga xos rangsiz ko'rinishda qoladi, hatto muallif tolk so'zini uchta qavslar ostida to'g'ri belgilasa ham.
Android uchun boshqa tizim ishlatiladi: Prism dvigateli Java tilida qayta yozilgan, jadval esa o'ziga xos — codelng.gzip, va u 2023-yil oktyabr oyining oxirida 10.2 versiyasida keldi. Bir va xuddi shu jadval uchun C++ da Boost, Java da esa java.util.regex — har xil reguliyar ifodalarning dvigatellari — bu 12 ta o'zgartirishni, 2 ta emas, qilishning asosiy sababi bo'ldi.
Nega TON tillari hali ham so'zlar o'ziga xos shaklda?
Bu tillar so'zlar o'ziga xos shaklda bo'lishi, ular uchun qoidalar yozilmaganligi sabab emas. Tact, FunC, Fift va TL-B — to'rtta tilning ta'riflari 2024-yil mayida libprisma manbasiga qo'shildi. To'rt oydan keyin ularni yangilash qo'shildi: Tact 1.2.0 versiyasidan 1.6.0 ga, FunC esa 0.2.0 dan 0.4.4 ga qayta yozildi.
Bular dasturlarga yetib bormadi, va sabab dasturlarda emas. Til qoidalari repozitoriyda oddiy fayllar sifatida saqlanadi, mijozlar esa ularning yig'ilgan binar jadvalini o'qiydi — va bu jadval oxirgi marta 2023-yil 20-noyabrdan beri yig'ilgan, repozitoriyga birinchi TON tilini kiritishdan yarim yil oldin. Shundan keyin qo'shilgan barcha narsalar manbada qoldi va hech qayerga yetib bormadi.
Yig'ish GitHub Actionsdagi workflow orqali amalga oshiriladi, lekin bu workflow hozirgacha ishlamadi: GitHub actions/upload-artifact@v3 versiyasini ishlatishni to'xtatdi, shuning uchun vazifa birinchi qadamni bajarishdan oldin bekor qilindi. Tact va FunC yangilashlari ikki yil davomida kutilayotgan o'rtada qoldi.
Tolk — alohida hikoya. Bu til FunC ning rivojlanishi sifatida yaratildi va hozir TON dokumentatsiyasida tavsiya etilgan til sifatida ko'rsatiladi, FunC esa qoldiqlar qatoriga o'tkazildi. libprisma da uning taklifi 2026-yil mayida keltirildi va u "barcha mijozlarga tarqatishni boshlashdan oldin tushunish kerak" degan qayd bilan qoldi.
21-sentyabrda nima sodir bo'ldi
Avvalo yig'ish tizimi tuzatildi. Harakat versiyalari oshirildi, Node 18 22 ga almashtirildi, va qoidalar o'zgarganda dastur qayta ishga tushadi — qo'lda ham, avtomatik ravishda ham — keyin yangilangan jadval bilan pull request ochiladi. Shundan keyin Tolk qabul qilindi va Tact va FunC yangilashlari qabul qilindi.
Yangilash jarayonida xato topildi, funksional operatorlar (_+_, _<=>_ va boshqalar, bu yerda pastki chiziq argument joyini belgilaydi) to'liq yoritilmayotganligi sababli. Bu qoida boshqa qoidadan olingan, lekin oxirida "keyingi joyda bo'sh joy" tekshiruvi qo'shilgan. Yig'ilgan hollarda bu tekshiruv, pastki chiziqni qo'yilishi kerak bo'lgan joyda bo'sh joy talab qiladi — shu sababli shart bajarilmaydi va qoida hech qachon ishga tushmaydi.
Boshqa o'zgartirishlar TON bilan bog'liq emas, lekin nima uchun bitta jadval ikkita dvigatel uchun yaroqli ekanligini tushuntiradi. Boost ifodalarni baytlar sifatida o'qiydi va \uXXXX ko'rinishidagi yozuvlarni tushunmaydi: belgilar klassi ichida bunday yozuv ixtiyoriy ASCII belgilari to'plamiga aylanadi. Dhall tilida bu sababli operator klassi har bir tur nomining birinchi harfini "yeydi", ∀ kvantifikator esa hech qaysi tilga yoritilmaydi. Jadval serializatsiyasi qisqartirilgan — 256 dan yuqori belgilarning yuqori bayti olib tashlandi, va BQN tilida yozilgan • belgisi jadvalga ikkita qavslar bilan, ∞ — boshqaruv belgisi sifatida, π — À harfi sifatida keldi.
Uchinchi o'zgartirish dvigatellar farqlarini qamrab oladi. \v ikkala tilda ham kompilyatsiya qilinadi, lekin uning ma'nosi farq qiladi: bitta tilda bu vertikal tabulatsiya belgisi, boshqasida esa vertikal bo'sh joy klassi hamda qatorni o'tkazish belgisi. Shu sababli ini fayllarida qiymatlar o'z qatorlaridan chiqib ketdi. Bu xatolikni tekshirish "kompilyatsiya qilinadi" so'zida aniqlanmaydi, shuning uchun hozir har bir pull request uchun jadval qayta yig'iladi va 4000 dan kam bo'lmagan barcha ifodalarning ikkala dvigatel orqali tekshirilishi amalga oshiriladi.
Qachon dasturlarda ko'rinadi
Hozircha barcha dasturlarda muddat belgilanmagan. Mijozlar jadvalni repozitoriydan onlayn o'ziga o'lmaydi, balki o'ziga xos nusxasini o'zida saqlaydi, va har bir nusxa libprisma da birinchi TON tilidan ham qoldi.
| Mijoz | Jadvalni qayerdan oladi | Nusxaning sana |
|---|---|---|
| Telegram Desktop | libprisma forki, qo'shimcha modul sifatida | aprel 2024, jadval ichida — noyabr 2023 |
| Telegram iOS uchun | mijoz repozitoriyida grammars.dat fayli | 31-oktyabr 2023 |
| Telegram Android uchun | dastur resurslarida codelng.gzip fayli | 28-oktyabr 2023 |
Nusxani yangilash har bir mijoz komandasining o'ziga xos qaroridir, va Tolk draftida bu to'g'ridan-to'g'ri aytilgan: PR yangi jadvalni barcha dasturlarga tarqatish usuli kutilayotganligi sababli kutilayotgan. Hozirgacha javob yo'q, shuning uchun tolk, tact yoki func belgilangan blok xabarlarda bugungi kunda ko'rinayotganidek ko'rinishda qoladi.



