Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 05.03 · 20 мин
Средний
TolkFunCSmart ContractsTVM

Обзор 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 — стандартная библиотека подключается автоматически
NOTE

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
TIP

На нашей платформе вы сможете компилировать Tolk прямо в браузере благодаря встроенному редактору с WASM-компилятором.

Частые ошибки

  1. Считают Tolk полностью новым языком, хотя на самом деле это обратно-совместимое расширение FunC с улучшенным синтаксисом.
  2. Не используют Tolk для новых контрактов из-за устаревшего восприятия «новинки», хотя Tolk 1.0 (июль 2025) — теперь рекомендованный язык для новых контрактов с 30–50% gas savings vs FunC и фичами nullable types, generics, smart casts, enums, unions, methods on types.
  3. Не проверяют, что сгенерированный байткод совпадает с ожидаемым: разные версии компилятора Tolk могут генерировать различный код.
  4. Переписывают существующие FunC-контракты на Tolk без необходимости, хотя если контракт работает и проаудирован, переписывание создаёт новые риски.

Проверка знанийKnowledge check
Tolk removes the `impure` specifier from FunC. How does it prevent the compiler from eliminating function calls with side effects?
ОтветAnswer
In Tolk, all functions are treated as having side effects by default -- the opposite of FunC's approach. This means the compiler never optimizes away function calls unless explicitly marked as pure. This eliminates the entire class of bugs where developers forget `impure` and lose critical operations like message sends.

Миграция FunC в Tolk

Компилятор Tolk может автоматически конвертировать простые FunC контракты:

  1. Переименование функций: load_uint -> loadUint, begin_cell -> beginCell
  2. Замена ~ вызовов на точечный синтаксис
  3. Удаление impure спецификаторов
  4. Замена объявлений на fun / val / var

Для сложных контрактов может потребоваться ручная доработка, особенно для:

  • Asm-вставок
  • Нестандартных конвенций вызовов
  • Макросов препроцессора

Итоги

  • Tolk 1.0 (июль 2025) — теперь рекомендованный язык для новых контрактов; даёт 30–50% gas savings vs FunC и фичи nullable types, generics, smart casts, enums, unions, methods on types
  • Генерирует идентичный TVM байт-код (та же производительность)
  • Ключевые улучшения: fun/val/var, точечный синтаксис, отсутствие impure
  • Доступен как CLI (через Blueprint) и как WASM-компилятор для браузера
  • Компилятор поддерживает автоматическую конвертацию из FunC

В следующем уроке мы детально разберём синтаксис Tolk и напишем полноценный контракт.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6