Обзор Tolk
Tolk — это эволюция FunC, созданная для того, чтобы сделать низкоуровневую разработку на TON доступнее без потери контроля над TVM. Если FunC — это «ассемблер с функциями», то Tolk — это «C с безопасностью». Tolk компилируется в тот же TVM-байткод, но с более привычным синтаксисом и встроенными проверками, что снижает порог входа для разработчиков из мира TypeScript и Swift.
Tolk — это современный язык программирования для TVM, выпущенный в версии 1.0 в июле 2025 года. Он является прямым преемником FunC: использует тот же компилятор, генерирует идентичный байт-код TVM, но предлагает значительно более удобный синтаксис.
Что такое Tolk
Tolk можно описать как “FunC с человеческим лицом”. Ключевая идея:
- Тот же TVM — Tolk компилируется в тот же байт-код, что и FunC
- Знакомый синтаксис — напоминает TypeScript/Kotlin вместо C
- Меньше ловушек — убраны неинтуитивные элементы FunC (
impure, тильда-вызовы, asm-вставки для базовых операций) - Автоматический stdlib — стандартная библиотека подключается автоматически
Tolk генерирует идентичный TVM байт-код, что и FunC — это обновление синтаксиса, а не новая виртуальная машина. Контракты на Tolk и FunC имеют одинаковую производительность и потребление газа.
Философия дизайна
FunC: мощь и ловушки
FunC давал полный контроль над TVM, но требовал экспертных знаний:
;; FunC: обязательный impure, тильда-вызовы, загадочные типы
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) { return (); }
slice sender = cs~load_msg_addr();
}
Tolk: та же мощь, меньше трения
// Tolk: fun-объявления, точечный синтаксис, привычный стиль
fun onInternalMessage(myBalance: int, msgValue: int, msgFull: cell, msgBody: slice) {
val cs = msgFull.beginParse();
val flags = cs.loadUint(4);
if (flags & 1) { return; }
val sender = cs.loadAddress();
}
Ключевые улучшения над FunC
1. Ключевое слово fun
FunC использует возвращаемый тип перед именем функции (как C). Tolk использует fun:
;; FunC
int add(int a, int b) { return a + b; }
// Tolk
fun add(a: int, b: int): int { return a + b; }
2. Переменные: val и var
Вместо C-стиля объявления типов, Tolk использует val (неизменяемая) и var (изменяемая):
val counter = 42; // Неизменяемая, тип выведен как int
var total = 0; // Изменяемая
total += counter; // OK
// counter = 10; // Ошибка: val нельзя переназначить
3. Точечный синтаксис вместо тильды
FunC использует cs~load_uint(32) с тильдой для модифицирующих вызовов. Tolk заменяет это точечным синтаксисом:
;; FunC: тильда-вызовы
slice cs = data.begin_parse();
int value = cs~load_uint(32);
int coins = cs~load_coins();
// Tolk: точечный синтаксис
val cs = data.beginParse();
val value = cs.loadUint(32);
val coins = cs.loadCoins();
4. Нет impure
В FunC забытый impure мог привести к тому, что компилятор удалял важный вызов при оптимизации. В Tolk все функции по умолчанию имеют побочные эффекты:
;; FunC: забытый impure = потерянный вызов send_raw_message
() send_coins(slice to, int amount) { ;; БАГ: нет impure!
send_raw_message(...); ;; Компилятор может удалить
}
// Tolk: побочные эффекты по умолчанию
fun sendCoins(to: slice, amount: int) {
sendRawMessage(...); // Всегда выполнится
}
5. Автоматический stdlib
FunC требовал ручного подключения стандартной библиотеки через #include. В Tolk stdlib подключается автоматически:
;; FunC: нужен явный include
#include "stdlib.fc";
// Tolk: stdlib доступен сразу, без импорта
// Все стандартные функции (beginCell, loadUint и т.д.) доступны
Компилятор Tolk
Tolk доступен в нескольких формах:
CLI-компилятор
Устанавливается через Blueprint или как отдельный инструмент:
# Через Blueprint (рекомендуется)
npx blueprint build
# Компилятор создаёт .boc файл с байт-кодом контракта
Браузерный компилятор
Пакет @ton/tolk-js предоставляет WASM-версию компилятора для работы в браузере:
import { runTolkCompiler } from '@ton/tolk-js';
const result = await runTolkCompiler({
entrypointFileName: 'main.tolk',
fsReadCallback: (path) => {
if (path === 'main.tolk') return sourceCode;
throw new Error(`File not found: ${path}`);
},
});
// result.status === 'ok' -> result.codeBoc64, result.codeHashHex
// result.status === 'error' -> result.message
На нашей платформе вы сможете компилировать Tolk прямо в браузере благодаря встроенному редактору с WASM-компилятором.
Частые ошибки
- Считают Tolk полностью новым языком, хотя на самом деле это обратно-совместимое расширение FunC с улучшенным синтаксисом.
- Пытаются использовать Tolk для продакшен-контрактов без проверки совместимости инструментов, поскольку экосистема Tolk ещё развивается.
- Не проверяют, что сгенерированный байткод совпадает с ожидаемым: разные версии компилятора Tolk могут генерировать различный код.
- Переписывают существующие FunC-контракты на Tolk без необходимости, хотя если контракт работает и проаудирован, переписывание создаёт новые риски.
Проверка знанийTolk removes the `impure` specifier from FunC. How does it prevent the compiler from eliminating function calls with side effects?
Миграция FunC в Tolk
Компилятор Tolk может автоматически конвертировать простые FunC контракты:
- Переименование функций:
load_uint->loadUint,begin_cell->beginCell - Замена
~вызовов на точечный синтаксис - Удаление
impureспецификаторов - Замена объявлений на
fun/val/var
Для сложных контрактов может потребоваться ручная доработка, особенно для:
- Asm-вставок
- Нестандартных конвенций вызовов
- Макросов препроцессора
Итоги
- Tolk — современный преемник FunC, выпущенный в версии 1.0 в июле 2025
- Генерирует идентичный TVM байт-код (та же производительность)
- Ключевые улучшения:
fun/val/var, точечный синтаксис, отсутствиеimpure - Доступен как CLI (через Blueprint) и как WASM-компилятор для браузера
- Компилятор поддерживает автоматическую конвертацию из FunC
В следующем уроке мы детально разберём синтаксис Tolk и напишем полноценный контракт.
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок