Tolk 语言:概述
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 vs FunC 的区别"
Tolk 背后的动机
FunC 太棒了。 它非常底层,鼓励程序员思考编译器内部问题。 它提供了对 TVM 汇编程序的完全控制,允许程序员尽可能有效地执行合约。 如果你习惯了它,你就会爱上它。
但有一个问题。 FunC 是 "函数式 C",是为忍者设计的。 如果你热衷于 Lisp 和 Haskell,你会很高兴。 但如果你是一名 JavaScript / Go / Kotlin 开发者,它的语法对你来说很特别,会导致你偶尔犯错。 语法上的困难可能会降低您钻研 TON 的动力。
想象一下,如果有一种语言,同样智能,同样低级,但不是函数式的,也不像 C 语言,那会怎样? 撇开所有的美感和复杂性不谈,如果它乍一看更像流行语言呢?
这就是 Tolk 的意义所在。
从 FunC 迁移到 Tolk
如果您了解 FunC 并想尝试新的语法,您的方法是
- 阅读 Tolk vs FunC: in short。
- 使用 blueprint ,创建一个新的 Tolk 合约(例如,一个计数器)并进行实验。请记住,几乎所有的 stdlib 函数都被重命名 为
verbose清晰的名称。下面是 映射。 - 请尝试使用转换器或FunC 合约中的转换器。请记住,用 Tolk 从头开始编写的合约肯定比自动转换的合约更美观。例如,使用逻辑运算符而不是按位运算符可以大大提高代码的可读性。
如果不了解 FunC,如何尝试 Tolk
目前,本文档假定您知道 FunC
文档介绍了 "Tolk 与 FunC" 的区别。 稍后,它将进行调整,以适应新用户的需要。此外,FunC 最终将被弃用, ,整个文档中的所有代码片段都将改写为 Tolk。
如果您是 TON 的新用户,您的方法是
- 阅读本文档,掌握TON开发的基本知识。无论使用哪种语言,您都需要了解 cell 、 slice 和 TON 的异步特性。
- 面对 FunC 代码段,您仍然可以使用 FunC,或者尝试用 Tolk 来表达同样的意思。如果您觉得 FunC 语法很奇怪,不用担心:Tolk 的目标正是解决这个问题。
- 一旦您对发生的事情有了一定的了解,请尝试使用 Tolk 和 blueprint 。
围绕 Tolk 的工具
Tolk 编译器的源代码是 ton-blockchain
repo 的一部分。
除了编译器,我们还有
- tolk-js - Tolk 编译器的 WASM 封装。
- JetBrains IDE 插件 除支持 FunC、Fift、TL/B 和 Tact 外,还支持 Tolk。
- VS 代码扩展 启用 Tolk 语言支持。
- 从 FunC 到 Tolk 的转换器 - 使用一条
npx
命令将.fc
文件转换为.tolk
文件。 - Tolk 可在 blueprint 中使用。