في صباح يوم 21 سبتمبر، شهد مستودع libprisma — المُستخدم من قبل تيليجرام لتلوين كتل الشيفرة في الرسائل — اثني عشر تعديلًا خلال ثلاث ساعات فقط. أُضيف لغة Tolk، اللغة الأساسية للعقود الذكية في تون، إلى جدول اللغات، وتم تحديث تعريفات لغتي Tact وFunC في تعديل، وتم إعادة تجميع الملف الأساسي لأول مرة منذ 20 نوفمبر 2023، وهو الملف الذي تقرأه التطبيقات.
لكن هذا التحديث لم يظهر بعد في التطبيقات. كل عميل يحمل نسخة خاصة به من الجدول، وكل النسخ الثلاثة تعود إلى عام 2023.

كيف يُلوّن تيليجرام الشيفرة
لا يقوم الخادم بتحليل كتلة الشيفرة في الرسالة، بل يفعل ذلك العميل نفسه. المسؤولة عن التحليل هي مكتبة libprisma — وهي نسخة مُعاد تطويرها من مكتبة Prism.js للويب إلى C++، أُطلقتها تيليجرام خريف 2023. تُجمع قواعد اللغات من مكانين: من حزمة Prism.js، ومن عدة ملفات مكتوبة مباشرة في المستودع، بما في ذلك لغات تون. ثم تُمرّر هذه القواعد عبر عملية توحيد، وتُدمج في ملف ثنائي واحد يُسمّى grammars.dat. يُحمّل العميل هذا الملف عند بدء التشغيل، ثم يطلب منه تسمية كل عنصر في كتلة الشيفرة: ما هو كلمة محجوزة، وما هو نص، وما هو تعليق.
هذا الملف الثنائي هو بالفعل قائمة كاملة باللغات المدعومة. إذا لم تكن اللغة موجودة في الجدول، تبقى الكتلة نصًا رماديًا متناظرًا، حتى لو علّق المؤلف على الكتلة بـ tolk بعد ثلاث علامات عكسية.
أما على أندرويد، فالوضع مختلف: تم إعادة كتابة محرك Prism بلغة جافا، وتم وضع الجدول الخاص به في ملف منفصل يُسمّى codelng.gzip، والذي وصل إلى التطبيق في نهاية أكتوبر 2023 مع الإصدار 10.2. التحديث. التباين بين محركي التعبيرات المنتظمة — Boost في C++ وjava.util.regex في جافا — أصبح السبب الرئيسي في أن عدد التعديلات كان اثني عشر بدلًا من اثنين.
لماذا تظل لغات تون رمادية حتى الآن
تظل لغات تون رمادية ليس لأن من لم يكتب قواعد لها، بل لأن تعريفات أربع لغات — Tact وFunC وFift وTL-B — تم دمجها في مصادر libprisma في مايو 2024. وبعد أربعة أشهر، أُضيف تحديث جديد: ترقية Tact من الإصدار 1.2.0 إلى 1.6.0، وكتابة FunC من الصفر من الإصدار 0.2.0 إلى 0.4.4.
لكن لا شيء من هذا وصل إلى التطبيقات، والسبب ليس في التطبيقات نفسها. تعيش قواعد اللغات في المستودع كملفات عادية، بينما يقرأ العميل جدولًا ثنائيًا مُجمّع من هذه الملفات — وهذا الجدول لم يُعاد تجميعه منذ 20 نوفمبر 2023، أي قبل ستة أشهر من دخول أول لغة تون إلى المستودع. كل ما أُضيف بعدها بقي في المصادر ولم يُرسل أبدًا.
يتم التجميع عبر مسار في GitHub Actions، لكنه لم يُفعّل منذ ذلك الحين: أوقفت GitHub استخدام الإصدار actions/upload-artifact@v3، مما جعل المهمة تُعتبر فاشلة قبل حتى تنفيذ أول خطوة. وبقي تحديث Tact وFunC عالقًا في الطابور لعامين.
أما Tolk، فهي قصة منفصلة. ظهرت كتطوير لـ FunC، وتم تسميتها الآن في وثائق تون كلغة مُوصى بها، بينما تم نقل FunC إلى فئة اللغات القديمة. تم اقتراح دمج Tolk في libprisma في مايو 2026، وتم الاحتفاظ بها كمسودة مع ملاحظة أن التوزيع على جميع العملاء يجب أن يُدرس أولًا.
ما الذي حدث في 21 سبتمبر
أولاً، تم إصلاح عملية التجميع. رُفعت إصدارات الإجراءات، واستُبدلت Node 18 بـ 22، وعادت المهمة تعمل تلقائيًا عند تغيير قواعد اللغات، وتُفتح طلب دمج (Pull Request) يحتوي على الجدول المُعاد تجميعه. ثم تم قبول Tolk، وتحديث Tact وFunC.
بينما كان التحديث في طريقه، اُكتشفت خطأ في تلوين FunC: لم يكن يتم تلوينه بشكل كامل. كان قاعدة المعاملات-الدوال (_+_, _<=>_ وغيرها، حيث تُشير الشرطات إلى أماكن المُعاملات) مُجمّعة من قاعدة أخرى، وكانت النهاية تتحقق من "وجود مسافة لاحقة". في الشكل المُجمّع، كانت هذه المعاينة تتطلب مسافة بالضبط في الموضع الذي يجب أن يقع فيه شرطة إغلاق، ما جعل الشرط مستحيلًا، وبالتالي لم تُفعّل القاعدة أبدًا.
أما التعديلات الأخرى، فهي لا تتعلق بـ تون، لكنها تفسر سبب قابلية جدول واحد ليعمل على محركين مختلفين. يقرأ Boost التعبيرات بالبايتات، ولا يفهم صيغة \uXXXX، حيث تتحول هذه الصيغة داخل الفئة الرمزية إلى مجموعة من الرموز ASCII عشوائية. بسبب ذلك، في لغة Dhall، كانت فئة المعاملات تُبتلع الحرف الأول من كل اسم نوع، بينما لم يُلوّن الرمز ∀ في أي لغة يُذكر فيها. كما أن تسلسل الجدول قصّ البايت الأعلى للرموز خارج أول 256 رمزًا، مما جعل الرمز • في لغة BQN يصل إلى الجدول كاقتباس مزدوج، و∞ كرمز تحكمي، وπ كحرف À.
التعديل الثالث يتناول اختلاف المحركات: \v يُدمج في كليهما، لكنه يعني شيئًا مختلفًا في كل منهما. في أحدهما، يمثل حرف تبويب عمودي واحد، وفي الآخر، يمثل كل فئة المسافات العمودية مع نقل السطر. هذا السبب جعل القيم في ملفات ini تُفلت من نهاية سطرها. ونظرًا لأن التحقق من "هل يُدمج؟" لا يُكتشف هذا الخطأ، أصبح الآن يتم إعادة تجميع الجدول لكل طلب دمج، ويُمرّر كل من أربع آلاف تعبير تقريبًا عبر كلا المحركين.
متى سيظهر هذا في التطبيقات
لم يُحدّد أي موعد في أي من التطبيقات. لا يأخذ العملاء الجدول من المستودع مباشرة، بل يحملون نسخة مُضمنة، وكل نسخة أقدم من أول لغة تون في libprisma.
| العميل | مصدر الجدول | تاريخ النسخة |
|---|---|---|
| تيليجرام سطح المكتب | نسخة مُكرّرة من libprisma مُثبتة كمودول فرعي | أبريل 2024، الجدول داخليًا: نوفمبر 2023 |
| تيليجرام لأيفون | ملف grammars.dat داخل مستودع العميل | 31 أكتوبر 2023 |
| تيليجرام لأندرويد | ملف codelng.gzip في موارد التطبيق | 28 أكتوبر 2023 |
تحديث النسخة يعتمد على قرار كل فريق تطبيق، وقد وُضِّح ذلك صراحة في مسودة Tolk: كان طلب الدمج ينتظر إجابة حول كيفية توزيع الجدول الجديد على جميع التطبيقات. حتى الآن، لم تُعطَ الإجابة، لذا تظل كتل الرسائل المُعلّمة بـ tolk أو tact أو func تظهر كما كانت بالأمس.



