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 从头开始编写的合约肯定比自动转换的合约更美观。例如,使用逻辑运算符而不是按位运算符可以大大提高代码的可读性。