21 सितंबर की सुबह, libprisma रिपॉजिटरी में — जिसका उपयोग Telegram संदेशों में कोड ब्लॉक को रंगने के लिए करता है — तीन घंटे के भीतर एक दर्जन बदलाव किए गए। भाषाओं की तालिका में Tolk, जो TON स्मार्ट-कॉन्ट्रैक्ट्स की मुख्य भाषा है, को जोड़ा गया, Tact और FunC की परिभाषाओं को अपडेट किया गया और 20 नवंबर 2023 के बाद पहली बार उस फ़ाइल को फिर से बनाया गया जिसे एप्लिकेशन पढ़ते हैं।

यह अभी तक एप्लिकेशन में दिखाई नहीं दे रहा है। प्रत्येक क्लाइंट तालिका की अपनी कॉपी रखता है, और तीनों कॉपियां 2023 की हैं।

Tolk में एक ही कॉन्ट्रैक्ट, बाईं ओर ग्रे मोनोस्पेस टेक्स्ट में, दाईं ओर रंगीन हाइलाइटिंग के साथ
बाईं ओर — tolk लेबल वाला ब्लॉक जैसा कि क्लाइंट आज दिखाते हैं। दाईं ओर — वही ब्लॉक, भाषा की स्वीकृत परिभाषा द्वारा पार्स किया गया। कॉन्ट्रैक्ट का उदाहरण TON डॉक्यूमेंटेशन में Tolk के अवलोकन से लिया गया है।

Telegram कोड को कैसे रंगता है

संदेश में कोड ब्लॉक को सर्वर नहीं, बल्कि क्लाइंट खुद पार्स करता है। libprisma पार्सिंग के लिए जिम्मेदार है — यह Prism.js ब्राउज़र लाइब्रेरी का C++ पोर्ट है, जिसे Telegram ने 2023 की शरद ऋतु में जारी किया था। भाषाओं के नियम जनरेटर दो स्थानों से एकत्र करता है — Prism.js पैकेज से और सीधे रिपॉजिटरी में लिखी गई कई फ़ाइलों से, जहाँ से TON भाषाएँ आती हैं — उन्हें सामान्यीकरण के माध्यम से चलाता है और उन्हें एक बाइनरी फ़ाइल grammars.dat में संग्रहीत करता है। क्लाइंट स्टार्टअप पर इस फ़ाइल को लोड करता है और फिर प्रत्येक कोड ब्लॉक के लिए टोकन के बारे में पूछता है — कहाँ कीवर्ड है, कहाँ स्ट्रिंग है, कहाँ टिप्पणी है।

ऐसी फ़ाइल समर्थित भाषाओं की पूरी सूची है। यदि कोई भाषा तालिका में नहीं है, तो ब्लॉक ग्रे मोनोस्पेस टेक्स्ट रहता है, भले ही लेखक ने ईमानदारी से इसे तीन बैकटिक के बाद tolk के रूप में हस्ताक्षरित किया हो।

Android अलग तरीके से संरचित है: वहां Prism इंजन को Java में फिर से लिखा गया है, और इसकी अपनी तालिका, codelng.gzip, है, और यह संस्करण 10.2 के साथ अक्टूबर 2023 के अंत में आई थी। एक ही तालिका के लिए अलग-अलग रेगुलर एक्सप्रेशन इंजन — C++ में Boost और Java में java.util.regex — आगे चलकर मुख्य कारण साबित होंगे कि क्यों बारह बदलाव हुए, न कि दो।

TON भाषाएँ अभी भी ग्रे क्यों हैं

वे ग्रे इसलिए नहीं रहतीं क्योंकि TON के लिए किसी ने नियम नहीं लिखे। चार भाषाओं — Tact, FunC, Fift और TL-B — की परिभाषाएँ मई 2024 में libprisma के स्रोत कोड में शामिल की गई थीं। चार महीने बाद, एक अपडेट लाया गया: Tact संस्करण 1.2.0 से 1.6.0 तक और FunC को पूरी तरह से 0.2.0 से 0.4.4 तक फिर से लिखा गया।

न तो पहला और न ही दूसरा एप्लिकेशन तक पहुंचा, और इसका कारण एप्लिकेशन नहीं हैं। भाषाओं के नियम रिपॉजिटरी में सामान्य फ़ाइलों के रूप में रहते हैं, और क्लाइंट उनसे बनी बाइनरी तालिका पढ़ते हैं — और यह तालिका आखिरी बार 20 नवंबर 2023 को बनाई गई थी, libprisma में पहली TON भाषा आने से छह महीने पहले। उसके बाद जो कुछ भी जोड़ा गया, वह स्रोत कोड में पड़ा रहा और कहीं नहीं गया।

बिल्ड GitHub Actions पर एक वर्कफ़्लो द्वारा किया जाता है, और यह तब से बिल्कुल भी नहीं चला है: GitHub ने actions/upload-artifact@v3 को बंद कर दिया था, जिसके बाद कार्य अपने पहले चरण को पूरा करने से पहले ही विफल के रूप में चिह्नित हो गया। Tact और FunC का अपडेट दो साल तक कतार में लटका रहा।

Tolk एक अलग कहानी है। यह भाषा FunC के विकास के रूप में सामने आई और अब TON डॉक्यूमेंटेशन में इसे अनुशंसित कहा गया है, जबकि FunC को अप्रचलित की श्रेणी में रखा गया है। libprisma में इसे मई 2026 में प्रस्तावित किया गया था और इसे एक ड्राफ्ट के रूप में रखा गया था, जिसमें यह नोट किया गया था कि पहले यह समझना होगा कि इसे सभी क्लाइंट्स में कैसे रोल आउट किया जाए।

21 सितंबर को क्या हुआ

सबसे पहले, बिल्ड को ठीक किया गया। एक्शन के संस्करणों को अपग्रेड किया गया, Node 18 को 22 से बदल दिया गया, और कार्य फिर से शुरू हो गया — मैन्युअल रूप से और अपने आप, जैसे ही भाषाओं के नियम बदलते हैं — जिसके बाद यह फिर से बनाई गई तालिका के साथ एक pull request खोलता है। इसके बाद Tolk और Tact और FunC का अपडेट स्वीकार किया गया।

अपडेट के दौरान एक त्रुटि पाई गई, जिसके कारण FunC पूरी तरह से रंगीन नहीं था। ऑपरेटर-फ़ंक्शन (_+_, _<=>_ और अन्य, जहाँ अंडरस्कोर तर्क स्थानों को दर्शाते हैं) के लिए नियम एक अन्य नियम से बनाया गया था, और वह "आगे एक स्पेस" की जाँच के साथ समाप्त होता था। संकलित रूप में, जाँच के लिए ठीक उसी स्थिति में एक स्पेस की आवश्यकता थी जहाँ समापन अंडरस्कोर होना चाहिए था — एक असंभव शर्त, इसलिए नियम कभी काम नहीं करता था।

अन्य बदलाव TON से संबंधित नहीं हैं, लेकिन वे बताते हैं कि एक तालिका तुरंत दो इंजनों के लिए क्यों उपयुक्त है। Boost एक्सप्रेशन को बाइट्स में पढ़ता है और \uXXXX जैसे रिकॉर्ड को नहीं समझता है: एक कैरेक्टर क्लास के अंदर ऐसा रिकॉर्ड मनमाने ASCII कैरेक्टर के सेट में बदल जाता है। Dhall भाषा में, इस वजह से ऑपरेटर क्लास प्रत्येक प्रकार के नाम का पहला अक्षर खा जाता था, और क्वांटिफायर किसी भी भाषा में हाइलाइट नहीं होता था जहाँ इसे वर्णित किया गया था। तालिका का क्रमबद्धीकरण पहले दो सौ छप्पन के बाहर के कैरेक्टर के उच्च बाइट को काट देता था, और BQN व्याकरण में लिखा गया कैरेक्टर तालिका में एक डबल उद्धरण चिह्न के रूप में आता था, — एक नियंत्रण कैरेक्टर के रूप में, π — अक्षर À के रूप में।

तीसरा बदलाव इंजनों के विचलन के बारे में है। \v दोनों में संकलित होता है और उनमें अलग-अलग अर्थ रखता है: एक में यह एक ऊर्ध्वाधर टैब कैरेक्टर है, दूसरे में — नई लाइन के साथ ऊर्ध्वाधर स्पेस का पूरा वर्ग, जिसके कारण ini में मान अपनी लाइन के अंत से बाहर निकल जाते थे। "क्या यह संकलित होता है" की जाँच इसे नहीं पकड़ती है, इसलिए अब प्रत्येक pull request के लिए तालिका को फिर से बनाया जाता है और लगभग चार हज़ार एक्सप्रेशन में से प्रत्येक को दोनों इंजनों के माध्यम से चलाया जाता है।

एप्लिकेशन में यह कब दिखाई देगा

किसी भी एप्लिकेशन में कोई समय सीमा निर्धारित नहीं की गई है। क्लाइंट तालिका को तुरंत रिपॉजिटरी से नहीं लेते हैं, बल्कि अपनी कॉपी रखते हैं, और प्रत्येक कॉपी libprisma में पहली TON भाषा से भी पुरानी है।

क्लाइंटतालिका कहाँ से लेता हैकॉपी की तारीख
Telegram Desktoplibprisma का फोर्क, सबमॉड्यूल के रूप में पिन किया गयाअप्रैल 2024, अंदर की तालिका — नवंबर 2023
Telegram for iOSक्लाइंट रिपॉजिटरी में grammars.dat फ़ाइल31 अक्टूबर 2023
Telegram for Androidएप्लिकेशन संसाधनों में codelng.gzip फ़ाइल28 अक्टूबर 2023

कॉपी का अपडेट प्रत्येक क्लाइंट टीम का निर्णय है, और Tolk के ड्राफ्ट में इसका स्पष्ट रूप से उल्लेख किया गया है: PR इस बात के जवाब का इंतजार कर रहा था कि नई तालिका को सभी एप्लिकेशन में कैसे रोल आउट किया जाए। जब तक कोई जवाब नहीं आता, tolk, tact या func के रूप में हस्ताक्षरित ब्लॉक चैट में वैसा ही दिखता है जैसा वह कल दिखता था।