21 Eylül sabahı, libprisma deposunda üç saat içinde on iki değişiklik yapıldı. Dil tablosuna TON’un ana akıllı sözleşmeler dili olan Tolk eklendi, Tact ve FunC tanımları güncellendi ve 20 Kasım 2023'ten bu yana ilk kez, uygulamaların okuduğu dosya yeniden derlendi.

Şu an bu değişiklikler uygulamalarda görünmüyor. Her istemci kendi kopyasını taşıyor ve bu üç kopya da 2023 yılına ait.

Tolk'ta aynı sözleşme, solda gri monospace metin, sağda renkli vurgulama ile
Solda — bugün istemcilerin gösterdiği `tolk` etiketli blok. Sağda — aynı blok, dil tanımına göre ayrıştırılmış hâli. Sözleşme örneği TON belgelerindeki Tolk incelemesinden alınmıştır.

Telegram kodu nasıl renklendiriyor?

Mesajlardaki kod blokları sunucu değil, istemci tarafından ayrıştırılır. Bu iş için Telegram, sonbaharda 2023’te C++’a taşınmış bir tarayıcı kütüphanesi olan Prism.js’in bir versiyonu olan libprisma kullanılır. Dil kuralları Prism.js paketinden ve doğrudan depodaki birkaç dosyadan toplanır — bunlara TON dilleri de dahildir. Bu kurallar normalleştirilir, tek bir ikili dosyaya birleştirilir: grammars.dat. İstemci bu dosyayı başlangıçta yükler ve her kod bloğu için hangi kısmı anahtar kelime, hangisini dize, hangisini yorum olarak ayırt edeceğini sorar.

Bu dosya, desteklenen tüm dillerin tek kaynağıdır. Bir dil tabloda yoksa, blok hâlâ gri monospace metin olarak kalır, hatta yazar tolk etiketiyle üç geri tırnak işaretinden sonra doğru şekilde işaretlenmiş olsa bile.

Android için durum farklıdır: Prism motoru Java’ya yeniden yazılmıştır ve kendi codelng.gzip tablosu vardır. Bu dosya, ekim ayının sonunda 10.2 sürümüyle geldi. Aynı tablonun farklı düzenleyici motorları — C++’daki Boost ve Java’daki java.util.regex — bu yüzden değişikliklerin sadece iki değil, on iki olması nedenidir.

Neden TON dilleri hâlâ gri?

Dillerin gri kalmasının nedeni, TON için kuralların yazılmamış olması değil. Dört dilin tanımı — Tact, FunC, Fift ve TL-B — libprisma kaynak kodlarına Mayıs 2024’te eklendi. Dört ay sonra güncelleme geldi: Tact 1.2.0’dan 1.6.0’a, FunC ise tamamen yeniden yazıldı ve 0.2.0’dan 0.4.4’e yükseltildi.

Ancak bu değişiklikler uygulamalara ulaşmadı ve sorun uygulamalarda değil. Dil kuralları depoda sıradan dosyalar gibi durur, istemciler ise bunlardan derlenmiş ikili tabloyu okur — ve bu tablo son kez 20 Kasım 2023’te derlendi. TON’un ilk dili depoya girdiğinden altı ay önce. Bundan sonra eklenen her şey kaynaklarda kaldı ve hiçbir yere gitmedi.

Derleme işlemi GitHub Actions’da çalışan bir workflow ile yapılır. Ancak bu workflow, actions/upload-artifact@v3’ün kullanım dışı bırakılması sonrası hiç çalışmamıştır. Görev, ilk adımına bile ulaşmadan düşmüş durumda kalmıştır. Tact ve FunC güncellemesi iki yıl boyunca kuyruktaydı.

Tolk ise ayrı bir hikâye. FunC’nin geliştirilmiş hâli olarak ortaya çıktı ve şu an TON belgelerinde önerilen dil olarak geçiyor. FunC ise artık eski bir dille sınıflandırıldı. libprisma’da Tolk Mayıs 2026’da önerildi ve "tüm istemcilere nasıl dağıtılabileceği önce anlaşılmalı" notuyla taslakta tutuldu.

21 Eylül’de ne oldu?

Öncelikle derleme sistemi düzeltildi. İşlem sürümleri yükseltildi, Node 18 yerine 22 kullanıldı ve görev artık elle çalıştırılıyor ya da dil kurallarında değişiklik olduğunda otomatik olarak çalıştırılıyor. Derleme tamamlandığında, güncellenmiş tabloyu içeren bir pull request açılıyor. Ardından Tolk ve Tact/FunC güncellemesi onaylandı.

Güncellemede yol boyunca bir hata bulundu: FunC tam olarak renklendirilmemişti. İşlev operatörleri (_+_, _<=>_ ve benzeri, alt çizgiler argüman yerlerini belirtir) başka bir kuraldan türetilmiş, ancak kontrol olarak "sonraki karakter boşluk" deniyordu. Derlenmiş hâliyle bu kontrol, kapanış alt çizgisinin tam olarak yer aldığı pozisyonda boşluk olması gerektiğini söylüyordu — bu koşul asla sağlanamayacağı için kural hiçbir zaman çalışmıyordu.

Diğer değişiklikler TON’la ilgili değil ama neden tek bir tablonun iki farklı motor için de çalıştığını açıklıyor. Boost, ifadeleri baytlar halinde okur ve \uXXXX gibi ifadeleri anlamaz. Bu tür ifadeler, karakter sınıfı içinde rastgele ASCII karakterlerin bir kümesine dönüşür. Dhall dilinde bu nedenle operatör sınıfı her tür adının ilk harfini yiyordu ve kuantörü, tanımlı olduğu her dilde vurgulanmıyordu. Tablo serileştirme işlemi, ilk 256 karakterin dışındaki karakterlerin yüksek baytını kesiyordu. BQN’da tanımlı olan sembolü tabloya çift tırnakla, kontrol karakteriyle, π ise À harfi olarak geliyordu.

Üçüncü değişiklik, motorlardaki farklılıklara dair. \v her iki motor için de derlenir ama aynı anlamda değildir: birinde dikey sekme karakteri, diğerinde ise dikey boşluk sınıfı ve satır sonu karakteri birlikte. Bu yüzden ini dosyalarındaki değerler satırın sonundan kaçabiliyordu. Bu tür bir kontrol "derlenir mi?" sorusuyla yakalanamaz. Bu yüzden şimdi her pull request için tablo yeniden derleniyor ve neredeyse dört bin ifade her iki motor üzerinden de test ediliyor.

Uygulamalarda ne zaman görünecek?

Henüz hiçbirinde tarih belirlenmedi. İstemciler tabloyu depodan anında almak yerine kendi kopyalarını taşıyorlar ve her biri, libprisma’da TON dillerinin ilkini eklenmesinden daha eski.

İstemciTabloyu nereden alıyorKopya tarihi
Telegram Masaüstülibprisma’nın klonlanmış bir kopyası, alt modül olarak sabitlenmişNisan 2024, tablo içeriği: Kasım 2023
Telegram iOSİstemci deposunda yer alan grammars.dat dosyası31 Ekim 2023
Telegram AndroidUygulamanın kaynaklarında yer alan codelng.gzip dosyası28 Ekim 2023

Kopyanın güncellenmesi, her istemci ekibinin kendi kararına bağlıdır. Tolk taslağında bu doğrudan belirtilmiştir: PR, tüm istemcilere yeni tabloyu nasıl dağıtabilecekleri konusunda yanıt bekliyordu. Henüz yanıt gelmediği için, tolk, tact veya func etiketiyle işaretlenmiş bloklar, dün olduğu gibi gri monospace metin olarak görünecek.