Язык Tolk: общие сведения
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Tolk — это новый язык для написания смарт-контрактов в TON. Представьте себе Tolk как «следующее поколение FunC». Компилятор Tolk — это буквально ответвление компилятора FunC, представляющее знакомый синтаксис, похожий на TypeScript, но оставляющее все низкоуровневые оптимизации нетронутыми.
import "storage.tolk"
fun loadData() {
ctxCounter = getContractData().beginParse().loadUint(32);
}
fun onInternalMessage(msgValue: int, msgFull: cell, msgBody: slice) {
var cs = msgFull.beginParse();
var flags = cs.loadMessageFlags();
if (isMessageBounced(flags)) {
return;
}
...
}
get currentCounter(): int {
loadData(); // fills global variables
return ctxCounter;
}
См. ту же логику, реализованную с помощью FunC
#include "storage.fc";
() load_data() impure {
slice cs = get_data().begin_parse();
ctx_counter = cs~load_uint(32);
}
() recv_internal(int msg_value, cell msg_full, slice msg_body) impure {
slice cs = msg_full.begin_parse();
int flags = cs.load_uint(4);
if (flags & 1) {
return ();
}
...
}
int currentCounter() method_id {
load_data(); ;; fills global variables
return ctx_counter;
}
Попробуйте конвертер FunC → Tolk
Прочитайте "Различия Tolk и FunC"
Мотивация, стоящая за Tolk
FunC потрясающий. Он действительно низкоуровневый и побуждает программиста думать о внутренностях компил ятора. Он дает полный контроль над ассемблером TVM, позволяя программисту сделать свой контракт максимально эффективным. Если вы привыкнете к нему, он вам понравится.
Но есть проблема. FunC — это "функциональный C", и он для ниндзя. Если вы увлекаетесь Lisp и Haskell, вы будете счастливы. Но если вы разработчик JavaScript / Go / Kotlin, его синтаксис для вас необычен, что приводит к случайным ошибкам. Борьба с синтаксисом может снизить вашу мотивацию к изучению TON.
Представьте, что если бы был язык, тоже умный, тоже низкоуровневый, но не функциональный и не похожий на C? Оставив всю красоту и сложность внутри, что если бы он был больше похож на популярные языки на первый взгляд?
Вот что такое Tolk.
Переход с FunC на Tolk
Если вы знаете FunC и хотите попробовать новый синтаксис, вот ваш путь:
- Прочитайте Сравнение Tolk и FunC: коротко.
- С помощью blueprint создайте новый контракт Tolk (например, счетчик) и поэкспериме нтируйте. Помните, что почти все функции stdlib переименованы в
подробныепонятные имена. Вот сопоставление. - Попробуйте конвертер для ваших существующих контрактов или один из контрактов FunC. Помните, что контракты, написанные на Tolk с нуля, определенно будут выглядеть лучше, чем автоматически преобразованные. Например, использование логических операторов вместо побитовых значительно повышает читабельность кода.
Как попробовать Tolk, если вы не знаете FunC
В документации описываются различия "Tolk и FunC". Позже она будет адаптирована для новичков. Более того, FunC в конечном итоге станет устаревшим, и все фрагменты кода во всей документации будут переписаны на Tolk.
Если вы новичок в TON, ваш путь таков:
- Покопайтесь в этой документации, чтобы получить базовые знания о разработке в TON. Независимо от того, какой язык вы будете использовать, вам нужно знать о ячейках, срезах, асинхронной природе TON в конце концов.
- Сталкиваясь с фрагментами FunC, вы все равно можете использовать FunC или попытаться выразить то же самое в Tolk. Если синтаксис FunC для вас необычен, не волнуйтесь: цель Tolk — как раз исправить эту проблему.
- Как только вы поймете, что происходит, попробуйте использовать Tolk с blueprint.
Инструменты вокруг языка Tolk
Исходные данные компилятора Tolk являются частью [репозитория] ton-blockchain
(https://github.com/ton-blockchain/ton).
Помимо компилятора, у нас есть:
- tolk-js — оболочка WASM для компилятора Tolk.
- Плагин JetBrains IDE поддерживает Tolk, помимо FunC, Fift, TL/B и Tact.
- Расширение VS Code, включающее поддержку языка Tolk.
- Конвертер из FunC в Tolk — конвертирует файл
.fc
в файл.tolk
с помощью одной командыnpx
. - Язык Tolk доступен в blueprint.
Готов ли Tolk к работе?
Компилятор Tolk, ответвление компилятора FunC, считается готовым к производству, хотя на данный момент он является несколько экспериментальным.
Могут существовать необнаруженные ошибки, потенциально унаследованные от FunC или связанные с характеристиками TVM. В любом случае, независимо от того, какой язык вы используете, вы должны покрывать свои контракты тестами для достижения высокой надежности.
Дорожная карта
Первая выпущенная версия Tolk — v0.6, подчеркивающая отсутствие FunC v0.5.
Вот некоторые (но не все и никак не упорядоченные) моменты, которые необходимо изучить:
- улучшения системы типов: допустимость значений Null, целые числа фиксированного размера, типы объединений, словари
- структуры и обобщения
- автоматическая упаковка структур в/из ячеек, возможно, интегрированная с обработчиками сообщений
- методы для структур, обобщенные для охвата встроенных типов
- более простая отправка сообщений
- лучший опыт для общих вариантов использования (жетонов, nft и т. д.)
- оптимизация газа и стека, встраивание AST
- расширение и поддержка stdlib
- своего рода ABI (как проводники "видят" байт-код)
- управление газом и сборами в целом
Следующей стратегической целью для Tolk v1.0 являются структуры с автоматической сериализацией в ячейки. Это устранит необходимость ручных манипуляций с конструкторами и срезами, что позволит декларативно описывать данные и сообщения. С этим тесно связан ABI (интерфейс) контрактов. Хорошо спроектированные структуры на самом деле составляют большую часть ABI.
Проблемы и контакты
Если вы столкнулись с проблемой, свяжитесь с сообществом разработчиков в TON Dev Chats или создайте issues на GitHub.