Pada pagi hari 21 September, di repositori libprisma — yang digunakan Telegram untuk menyoroti blok kode dalam pesan — terjadi dua belas perubahan dalam waktu tiga jam. Dalam daftar bahasa, ditambahkan Tolk, bahasa utama smart contract TON, serta diperbarui definisi Tact dan FunC melalui pull request, dan untuk pertama kalinya sejak 20 November 2023, file inti yang dibaca aplikasi kembali dikompilasi.

Namun, perubahan ini belum terlihat di aplikasi. Setiap klien menyimpan salinan sendiri dari tabel penyorotan, dan ketiganya masih berasal dari tahun 2023.

Kode kontrak yang sama dalam Tolk, sebelah kiri dalam teks monospace abu-abu, sebelah kanan dengan penyorotan warna
Sebelah kiri: blok dengan label tolk seperti yang ditampilkan klien saat ini. Sebelah kanan: blok yang sama, dianalisis sesuai definisi bahasa yang telah diterima. Contoh kontrak diambil dari panduan Tolk dalam dokumentasi TON.

Bagaimana Telegram Menyoroti Kode

Blok kode dalam pesan tidak diproses oleh server, melainkan oleh klien secara lokal. Proses ini diatur oleh libprisma — porting pustaka Prism.js dari browser ke C++ yang dirilis Telegram pada musim gugur 2023. Aturan bahasa dikumpulkan dari dua sumber: paket Prism.js dan beberapa file yang ditulis langsung di repositori, termasuk bahasa TON. Selanjutnya, aturan ini melalui normalisasi dan digabung menjadi satu file biner bernama grammars.dat. Klien mengunduh file ini saat startup, lalu meminta token untuk setiap blok kode — menentukan mana kata kunci, mana string, mana komentar.

File inilah yang berisi seluruh daftar bahasa yang didukung. Jika suatu bahasa tidak ada dalam tabel, blok akan tetap ditampilkan sebagai teks monospace abu-abu, meskipun penulis sudah jujur menandainya dengan tolk setelah tiga backtick.

Di Android, sistemnya berbeda: engine Prism ditulis ulang dalam Java, dan tabelnya tersimpan terpisah sebagai codelng.gzip, yang masuk pada versi 10.2 pada akhir Oktober 2023 (riwayat commit). Perbedaan engine ekspresi reguler antara Boost (C++) dan java.util.regex (Java) menjadi alasan utama mengapa terjadi dua belas perubahan, bukan hanya dua.

Mengapa Bahasa TON Masih Abu-Abu

Bahasa TON tetap abu-abu bukan karena tidak ada aturan yang ditulis untuknya. Empat bahasa — Tact, FunC, Fift, dan TL-B — sudah dimasukkan ke dalam kode sumber libprisma pada Mei 2024 (pull request #13). Empat bulan kemudian, update dilakukan lagi: Tact ditingkatkan dari versi 1.2.0 ke 1.6.0, dan FunC direvisi total dari 0.2.0 ke 0.4.4.

Namun, kedua pembaruan ini belum sampai ke aplikasi. Bukan karena masalah di aplikasi, melainkan karena aturan bahasa disimpan sebagai file biasa di repositori, sedangkan klien membaca tabel biner yang dikompilasi dari file-file tersebut — dan tabel terakhir kali dikompilasi pada 20 November 2023, enam bulan sebelum bahasa TON pertama kali muncul di repositori. Semua perubahan setelah itu hanya ada di kode sumber dan tidak pernah dikirim ke klien.

Proses kompilasi dijalankan oleh workflow GitHub Actions, namun tidak pernah berjalan sejak itu: GitHub menonaktifkan actions/upload-artifact@v3, sehingga tugas tersebut gagal sebelum langkah pertamanya dieksekusi. Update Tact dan FunC pun terjebak dalam antrian selama dua tahun.

Tolk adalah cerita terpisah. Bahasa ini muncul sebagai pengembangan dari FunC, dan kini disebut sebagai rekomendasi resmi dalam dokumentasi TON, sementara FunC sendiri telah ditandai sebagai usang. Di libprisma, Tolk diajukan pada Mei 2026 (pull request #43) dan tetap dalam status draft dengan catatan bahwa perlu dipahami dulu bagaimana cara merilisnya ke semua klien.

Apa yang Terjadi pada 21 September

Pertama-tama, proses kompilasi diperbaiki. Versi aksi dinaikkan, Node 18 diganti dengan 22, dan tugas kembali berjalan — baik secara manual maupun otomatis saat aturan bahasa berubah — lalu membuat pull request dengan tabel yang telah dikompilasi ulang. Setelah itu, Tolk dan pembaruan Tact serta FunC diterima.

Dalam proses pembaruan, ditemukan kesalahan: FunC tidak disorot secara lengkap. Aturan untuk operator fungsi (_+_, _<=>_, dan lainnya, di mana garis bawah menandai posisi argumen) dibuat dari aturan lain, dan akhirnya memeriksa "spasi setelahnya". Dalam bentuk terkompilasi, pemeriksaan ini mensyaratkan spasi tepat di posisi penutup garis bawah — kondisi yang tak mungkin terpenuhi, sehingga aturan tidak pernah aktif.

Perubahan lainnya tidak berkaitan langsung dengan TON, tapi menjelaskan mengapa satu tabel bisa digunakan untuk dua engine berbeda. Boost membaca ekspresi byte per byte dan tidak memahami format \uXXXX: dalam kelas karakter, notasi ini berubah menjadi rangkaian karakter ASCII acak. Akibatnya, di bahasa Dhall, kelas operator menelan huruf pertama setiap nama tipe, dan kuantor tidak disorot di mana pun ia muncul. Serialisasi tabel memotong byte tertinggi dari karakter di luar 256 pertama, sehingga simbol BQN muncul sebagai tanda kutip ganda, sebagai karakter kontrol, dan π sebagai huruf À.

Perubahan ketiga berkaitan dengan perbedaan perilaku engine. \v dikompilasi berbeda di kedua engine: di satu sisi berarti satu karakter tab vertikal, di sisi lain mencakup seluruh kelas spasi vertikal plus karakter baris baru. Akibatnya, nilai dalam file ini melompat keluar dari batas barisnya. Pemeriksaan "apakah kompilasi berhasil?" tidak menangkap masalah ini, sehingga kini setiap pull request memicu re-kompilasi tabel, dan hampir empat ribu ekspresi dites melalui kedua engine.

Kapan Ini Akan Muncul di Aplikasi

Tidak ada tanggal pasti yang ditentukan untuk rilis. Klien tidak mengambil tabel dari repositori secara real-time, melainkan membawa salinannya sendiri — dan setiap salinan lebih tua dari bahasa TON pertama di libprisma.

KlienSumber TabelTanggal Salinan
Telegram Desktopfork libprisma, dijadikan submoduleApril 2024, tabel dalam — November 2023
Telegram untuk iOSfile grammars.dat di dalam repositori klien31 Oktober 2023
Telegram untuk Androidfile codelng.gzip di sumber daya aplikasi28 Oktober 2023

Memperbarui salinan adalah tanggung jawab masing-masing tim klien. Dalam draft Tolk, hal ini disebutkan secara eksplisit: PR menunggu respons tentang bagaimana merilis tabel baru ke semua aplikasi. Sampai saat ini belum ada respons, maka blok yang ditandai tolk, tact, atau func masih tampak seperti kemarin di percakapan.