From 86f4a17cecd7f326bd16767e284936c58077b437 Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Tue, 26 Nov 2024 13:38:13 +0800 Subject: [PATCH 1/7] Introducing typed-fsm-zig --- content/post/2024-11-26-typed-fsm-zig.md | 511 +++++++++++++++++++++++ content/post/data/2.1-1.png | Bin 0 -> 49602 bytes content/post/data/2.1-2.png | Bin 0 -> 7473 bytes content/post/data/2.1-3.png | Bin 0 -> 8547 bytes content/post/data/2.1-4.png | Bin 0 -> 40905 bytes content/post/data/2.2-1.png | Bin 0 -> 36981 bytes content/post/data/2.3-1.png | Bin 0 -> 33607 bytes 7 files changed, 511 insertions(+) create mode 100644 content/post/2024-11-26-typed-fsm-zig.md create mode 100644 content/post/data/2.1-1.png create mode 100644 content/post/data/2.1-2.png create mode 100644 content/post/data/2.1-3.png create mode 100644 content/post/data/2.1-4.png create mode 100644 content/post/data/2.2-1.png create mode 100644 content/post/data/2.3-1.png diff --git a/content/post/2024-11-26-typed-fsm-zig.md b/content/post/2024-11-26-typed-fsm-zig.md new file mode 100644 index 0000000..5ba7330 --- /dev/null +++ b/content/post/2024-11-26-typed-fsm-zig.md @@ -0,0 +1,511 @@ +--- +title: "在zig中实现类型安全的有限状态机" +author: sdzx +date: 2024-11-26T13:32:00+08:00 +--- +# 1. 简单介绍类型化有限状态机的优势 +## 1.1 介绍有限状态机 +有限状态机(FSM,以下简称状态机)是程序中很常见的设计模式。 + +它包含两个主要的概念状态和消息。状态机程序整体上的行为就是不断地产生消息,处理消息。 + +而状态主要是在代码层面帮助人们理解消息的产生和处理。 + +## 1.2 介绍typed-fsm-zig的优势 + +利用zig强大的类型系统加上一些编程规范,我们可以在zig中实现类型安全的有限状态机。 + +它具有以下两点优势: +### 1. 类型安全,极大方便代码的编写,修改和重构 +手写状态机在实际代码中有很大的心智负担,而对于它的修改和重构则更加艰难。 + +typed-fsm-zig在类型上跟踪状态机的变化,使消息的定义,产生,处理都和状态相关联,从而让类型系统帮我们检查这个过程中是否存在状态错误。 + +在编写,修改和重构的时候,任何状态的错误都会产生编译错误,而这些编译错误能帮助我们快速找到问题,解决问题。 + +ps: 推荐在zls中打开保存时检查,这样你几乎能得到一个交互式的状态机开发环境。 + +### 2. 简单高效,无任何代码生成,能方便与现有逻辑整合 + +typed-fsm-zig 是一种编程的思想,掌握这种思想就能方便的使用它。 + +在实际的使用中没有任何的代码生成,除了一处隐式的约束要求之外,没有任何其它的控制,开发者完全掌握状态机,因此你可以方便的将它和你现有的代码结合起来。 + +# 2. 例子:修改 ATM 状态机的状态 +这里我将以一个ATM 状态机(以下简称ATM)的例子来展示typed-fsm-zig和zig的类型系统如何帮助我快速修改ATM的状态。 + +为了简单性,这里我不展示构建ATM这个例子的过程,感兴趣的可以在这里看到[代码](https://github.com/sdzx-1/typed-fsm-zig/blob/master/examples/atm-gui.zig)。 + +## 2.1 介绍 ATM 状态机 +ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款机的一些行为:插入银行卡,输入pin,检查pin,取钱,修改pin。 + +它的状态机整体如下: +![ATM](data/2.1-1.png) + +图中椭圆形表示状态,箭头表示消息。 +它包含五种状态:exit, ready, cardInserted, session, changePin。 + +同时它也包含一堆的消息,每个消息都包含了系统状态的转化。 +比如消息 InsertCard 代表将ATM的状态从ready转化到cardInserted,这代表用户插入卡。 + +消息 Incorrect 代表将ATM的状态冲cardInserted 转化到 cardInserted, +这代表了一种循环,表示用户输错了pin,但是可以再次尝试输入pin,当然我们要求最多可以尝试三次。 + +整个程序效果如下: +![ATM](data/2.1-2.png) + +这里注意消息Update, 它代表跟新pin,同时将状态转从changePin换到ready。 +![ATM](data/2.1-4.png) + +实际的表现就是在changePin的界面中我们修改pin,然后点击Change按钮触发Update消息,修改pin,并返回到ready界面。 +![ATM](data/2.1-3.png) + +接下来的文章中我将修改Update的行为,并展示在这个过程中类型系统如何帮助我快速调整代码。 + +## 2.2 修改Update 消息 +实际的消息Update 定义代码如下 +```c + pub fn changePinMsg(end: AtmSt) type { + return union(enum) { + Update: struct { v: [4]u8, wit: WitFn(end, .ready) = .{} }, + ... + } + } + +``` +这里的.ready 就代表了处理完Update消息后就会进入ready状态。 + +我们修改这里,把它变成.cardInserted , 这代表了我们要求跟新完pin之后进入cardInserted界面重新输入新的pin,这看着是个合理的要求。 + +新的状态图如下: +![ATM](data/2.2-1.png) + + +这时如果我重新编译代码,那么类型系统就会产生下面的错误: +```shell + +➜ typed-fsm-zig git:(doc) ✗ zig build atm-gui +atm-gui +└─ run atm-gui + └─ zig build-exe atm-gui Debug native 1 errors +examples/atm-gui.zig:301:60: error: expected type 'typed-fsm.Witness(atm-gui.AtmSt,.exit,.ready)', found 'typed-fsm.Witness(atm-gui.AtmSt,.exit,.cardInserted)' + @call(.always_tail, readyHandler, .{ val.wit, ist }); + ~~~^~~~ +src/typed-fsm.zig:9:20: note: struct declared here (2 times) + return struct { + ^~~~~~ +examples/atm-gui.zig:254:46: note: parameter type declared here +pub fn readyHandler(comptime w: AtmSt.EWitness(.ready), ist: *InternalState) void { + ~~~~~~~~~~~~~~^~~~~~~~ +referenced by: + cardInsertedHander__anon_6916: examples/atm-gui.zig:271:13 + readyHander__anon_3925: examples/atm-gui.zig:261:13 + 5 reference(s) hidden; use '-freference-trace=7' to see all references + +``` +它告诉我们在301行存在类型不匹配。因为之前的状态是ready所以使用readyHandler。 + +当我们把Update的状态修改为cardInserted时,它与readyHandler类型不匹配,应该将它修改为cardInsertedHandler。 + +修改之后的代码如下: +```c + @call(.always_tail, cardInsertedHandler, .{ val.wit, ist }); +``` + +在这里类型系统精确的告诉了我们需要修改的地方,以及原因。修改完成后程序即能正确运行。 + + +## 2.3 移除changePin 状态 + +这一节中我们尝试移除changePin状态,看看类型系统会给我们什么反馈。 +如果移除changePin,新的状态图如下: +![ATM](data/2.3-1.png) + +重新编译项目,将获得类型系统的反馈 + +类型系统的反馈首先是: +```shell +examples/atm-gui.zig:148:36: error: enum 'atm-gui.AtmSt' has no member named 'changePin' + ChangePin: WitFn(end, .changePin), + ~^~~~~~~~~ +``` +因为changePin状态已经被移除,因此消息ChangePin(它代表了从session 进入 changePin 状态)也不应该再存在了,我们移除它再重新编译。 + +新的反馈如下: + +```shell +examples/atm-gui.zig:161:64: error: union 'atm-gui.AtmSt.sessionMsg(.exit)' has no member named 'ChangePin' + if (resource.changePin.toButton()) return .ChangePin; + ~^~~~~~~~~ +``` +我们移除ChangePin消息,因此也将它从消息产生的地方移除,继续重新编译。 + +新的反馈如下: +```shell +examples/atm-gui.zig:296:10: error: no field named 'ChangePin' in enum '@typeInfo(atm-gui.AtmSt.sessionMsg(.exit)).@"union".tag_type.?' + .ChangePin => |wit| { + ~^~~~~~~~~ +``` +因为消息ChangePin已经不在了,也应将它从消息处理的地方移除,继续重新编译。 + +这一次不再有编译错误产生,我们搞定了一个新的程序,它不再包含changePin的逻辑。 + +在这个过程中类型系统帮助我们找到问题和原因。这非常酷!!! + + +## 2.4 总结 +以上是一个简单的例子,展示了typed-fsm-zig对于提升状态机编程体验的巨大效果。 + +展示类型系统如何帮助我们指示错误的地方,把复杂的状态机修改变成一种愉快的编程经历。 + +还有些没有讲到的优势如下: +1. 状态的分离,后端handler处理业务的状态变化,前端渲染和消息生成不改变状态。 +2. 消息生成受到类型的限制和状态相关,这样避免错误消息的产生。 + +这些优势对于复杂业务有很大的帮助。 + +接下来我将介绍typed-fsm-zig的原理和实现。 + +------------------------------------- +# 3. 原理与实现 +最开始的版本是[typed-fsm](https://github.com/sdzx-1/typed-fsm)使用haskell实现,它实现了完整类型安全的有限状态机。 + +typed-fsm基于[Mcbride Indexed Monad](https://hackage.haskell.org/package/typed-fsm-0.3.0.1/docs/Data-IFunctor.html): +```haskell +type a ~> b = forall i. a i -> b i + +class IMonad m where + ireturn :: a ~> m a + ibind :: (a ~> m b) -> (m a ~> m b) +``` +这是一种特殊的monad,能在类型上为不确定状态建模。 + +而在zig实现中移除了对Monad语义的需求,保留了在类型上追踪状态的能力。 + +所以它不具备完整的类型安全的能力,需要依靠编程规范来约束代码的行为。我认为这样的取舍是值得的,它的类型安全性在zig中完全够用。 + +以下是一个原型例子,它包含了typed-fsm-zig的核心想法。不需要担心,接下来我将详细解释这些代码。 +```c +const std = @import("std"); + +pub fn main() !void { + var val: i32 = 0; + const s1Wit = Witness(Exmaple, .exit, .s1){}; + _ = s1Handler(s1Wit, &val); +} + +pub fn Witness(T: type, b: T, a: T) type { + return struct { + pub fn getMsg(self: @This()) @TypeOf(a.STM(b).getMsg) { + if (b == a) @compileError("Can't getMsg!"); + _ = self; + return a.STM(b).getMsg; + } + + pub fn terminal(_: @This()) void { + if (b != a) @compileError("Can't terminal!"); + return {}; + } + }; +} +const Exmaple = enum { + exit, + s1, + s2, + + // State to Message union + pub fn STM(s: Exmaple, b: Exmaple) type { + return switch (s) { + .exit => exitMsg(b), + .s1 => s1Msg(b), + .s2 => s2Msg(b), + }; + } +}; + +pub fn exitMsg(_: Exmaple) void { + return {}; +} + +pub fn s1Msg(end: Exmaple) type { + return union(enum) { + Exit: Witness(Exmaple, end, .exit), + S1ToS2: Witness(Exmaple, end, .s2), + pub fn getMsg(ref: *const i32) @This() { + if (ref.* > 20) return .Exit; + return .S1ToS2; + } + }; +} +pub fn s2Msg(end: Exmaple) type { + return union(enum) { + S2ToS1: Witness(Exmaple, end, .s1), + pub fn getMsg() @This() { + return .S2ToS1; + } + }; +} + +fn s1Handler(val: Witness(Exmaple, .exit, .s1), ref: *i32) void { + std.debug.print("val: {d}\n", .{ref.*}); + switch (val.getMsg()(ref)) { + .Exit => |wit| wit.terminal(), + .S1ToS2 => |wit| { + ref.* += 1; + s2Handler(wit, ref); + }, + } +} +fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { + switch (val.getMsg()()) { + .S2ToS1 => |wit| { + ref.* += 2; + s1Handler(wit, ref); + }, + } +} + +``` +------------------------------------- + +首先是Witness,它是一个类型上的证据,用来跟踪类型上状态的变化。 + +这里有一些介绍Witness思想的[文章1](https://wiki.haskell.org/Type_witness),[文章2](https://serokell.io/blog/haskell-type-level-witness)。 + +感兴趣的可以看一下,看懂这些要求你了解GADT,上面提到的Mcbirde Indexed Monad 本质就是在GADT类型上的monad。 + +在这里的Winess 三个参数T表示状态机的类型,b 表示终止时的状态,a,表示当前的状态。 +它有两个函数,getMsg 表示从外部获取消息的函数,terminal 表示终止状态机的函数。 + +当b==a时表示当前处于终止状态,因此Witness只能使用terminal函数,当b!=a时表示当前不处于终止状态,应该继续从外部获取消息,因此Witness只能使用getMsg函数。 +```c +pub fn Witness(T: type, b: T, a: T) type { + return struct { + pub fn getMsg(self: @This()) @TypeOf(a.STM(b).getMsg) { + if (b == a) @compileError("Can't getMsg!"); + _ = self; + return a.STM(b).getMsg; + } + + pub fn terminal(_: @This()) void { + if (b != a) @compileError("Can't terminal!"); + return {}; + } + }; +} + +``` + +----------------------------- + +我们在这里定义状态。Example包含三个状态:exit,s1,s2。我们将在类型上跟踪这些状态的变化。 + +注意这里的STM函数,它代表如何将状态映射到对应的消息集合。在实际typed-fsm-zig的代码中,这就是我所说的那一处隐式的约束要求。 + +实际代码中会将消息集合整合在enum的内部,使用特殊的命名规范将状态与消息集合对应。目前的隐式规范是在状态后面加上Msg。 +```c +const Exmaple = enum { + exit, + s1, + s2, + + // State to Message union + pub fn STM(s: Exmaple, b: Exmaple) type { + return switch (s) { + .exit => exitMsg(b), + .s1 => s1Msg(b), + .s2 => s2Msg(b), + }; + } +}; + +``` + +------------------------------- +接下来是消息的定义和产生, + +```c +// exit 状态下没有任何消息 +pub fn exitMsg(_: Exmaple) void { + return {}; +} + +// s1 状态下有两个消息Exit 和 S1ToS2, 他们分别将状态转化为exit 和 s2 +pub fn s1Msg(end: Exmaple) type { + return union(enum) { + Exit: Witness(Exmaple, end, .exit), + S1ToS2: Witness(Exmaple, end, .s2), + + // getMsg 函数表明在s1状态下如何产生消息,这里受到类型系统的约束, + // 在s1 的状态下不会产生其它状态的消息 + pub fn getMsg(ref: *const i32) @This() { + if (ref.* > 20) return .Exit; + return .S1ToS2; + } + }; +} + +// s2状态下有一个消息S2ToS1 +pub fn s2Msg(end: Exmaple) type { + return union(enum) { + S2ToS1: Witness(Exmaple, end, .s1), + + pub fn getMsg() @This() { + return .S2ToS1; + } + }; +} + +``` +----------------------------- +最后一部分是消息的处理。 + +整体的逻辑是通过Witness的getMsg函数从外部获取消息,然后通过模式匹配处理消息。 +每个消息又包含接下来状态的Witness,然后使用对应的函数处理这些Witness。 + +通过Witness 让类型系统帮我们检查函数的调用是否正确。 + +通过对消息进行模式匹配,编译器能确定我们是否正确且完整的处理了所有的消息。 + +这些对于代码的编写,修改,重构都有巨大的帮助。 +```c +fn s1Handler(val: Witness(Exmaple, .exit, .s1), ref: *i32) void { + std.debug.print("val: {d}\n", .{ref.*}); + switch (val.getMsg()(ref)) { + .Exit => |wit| wit.terminal(), + .S1Tos2 => |wit| { + ref.* += 1; + s2Handler(wit, ref); + }, + } +} +fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { + switch (val.getMsg()()) { + .S2Tos1 => |wit| { + ref.* += 2; + s1Handler(wit, ref); + }, + } +} + +``` + +以上就是typed-fsm-zig核心想法的完整介绍。接下来我将介绍需要的编程规范。 + + +# 4. typed-fsm-zig 需要哪些编程规范 +## 1. 状态和消息集合之间需要满足的隐式命名规范 +以ATM为例: + +exit -- exitMsg + +ready -- readyMsg + +cardInserted -- cardInsertedMsg + +session -- sessionMsg + + +```c + +const AtmSt = enum { + exit, + ready, + cardInserted, + session, + + pub fn exitMsg(_: AtmSt) type { + return void; + } + + pub fn readyMsg(end: AtmSt) type { + return union(enum) { + ExitAtm: WitFn(end, .exit), + InsertCard: WitFn(end, .cardInserted), + + pub fn genMsg() @This() { + ... + } + }; + } + + pub fn cardInsertedMsg(end: AtmSt) type { + return union(enum) { + Correct: WitFn(end, .session), + Incorrect: WitFn(end, .cardInserted), + EjectCard: WitFn(end, .ready), + + pub fn genMsg(ist: *const InternalState) @This() { + ... + } + }; + } + + pub fn sessionMsg(end: AtmSt) type { + return union(enum) { + Disponse: struct { v: usize, wit: WitFn(end, .session) = .{} }, + EjectCard: WitFn(end, .ready), + + pub fn genMsg(ist: *const InternalState) @This() { + ... + } + }; + } +}; +``` + +## 2. 除了exit状态外,其它消息需要包含genMsg 函数用于产生消息,任何消息都必须带有Witness +## 3. 状态机都需要定义退出状态,尽管你可能永远也不会退出状态机,但退出状态作用于类型上,是不可缺少的 +## 4. 在互相调用其它handler的时候使用尾递归的语法,并且在必须在语句块最后处理消息附带的Witness + +由于zig的实现缺少Mcbride Indexed Monad 语义的支持,因此类型系统不能阻止你进行下面的操作: + +```c + +// 使用上面Example 的处理函数 s1Handler, 将它修改成下面的样子。 +// 这里的s1Handler 不应该被多次调用,在haskell版本的typed-fsm中,类型系统能检查出这里类型错误,但是在zig实现中无法做到, +// 因此我们要求只能在语句块最后有一个处理Witness的语句 +fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { + switch (val.getMsg()()) { + .S2Tos1 => |wit| { + ref.* += 2; + s1Handler(wit, ref); + s1Handler(wit, ref); + s1Handler(wit, ref); + s1Handler(wit, ref); + }, + } +} + +``` + +由于状态机需要长期运行,在互调递归的函数中如果不使用尾递归会导致栈溢出。 + +因此上面的Example demo中,如果我将20改成很大的值,比如二百万,那么一定会发生栈溢出,因为demo中的调用没采用尾递归的方式。 + +在实际的ATM 例子中他们的调用方式是: +```c +pub fn readyHandler(comptime w: AtmSt.EWitness(.ready), ist: *InternalState) void { + switch (w.getMsg()()) { + .ExitAtm => |witness| { + witness.terminal(); + }, + .InsertCard => |witness| { + ist.times = 0; + @call(.always_tail, cardInsertedHandler, .{ witness, ist }); + }, + } +} + +``` + +这里的 `@call(.always_tail, cardInsertedHandler, .{ witness, ist })` 就是zig 中尾递归语法。出于这个语法的需要,处理函数中的Witness 被变成了编译时已知(这里是 `comptime w: AtmSt.EWitness(.ready)`)。 + +遵循这四点要求,就能获得强大的类型安全保证,足以让你愉快的使用状态机! + +# 5. 接下来能够增强的功能 +暂时我能想到的有如下几点: +1. 在状态机中,消息的产生和处理分开,因此可以定义多个消息产生的前端,处理部分可以任意切换消息产生的前端。比如我们可以定义测试状态机前端,用于产生测试数据,当处理部分调用测试前端的代码时就能测试整个状态机的行为。 +2. 支持子状态,这会让类型更加复杂。 +3. 开发基于[typed-fsm-zig的gui系统](https://discourse.haskell.org/t/try-to-combine-typed-fsm-with-gui-to-produce-unexpected-abstract-combinations/10026),状态机在gui有很高的实用性,将他们结合是一个不错的选择。 +4. 开发typed-session-zig,实现类型安全的通信协议。我在haskell已经实现了一个[实用的类型安全的多角色通讯协议框架](https://github.com/sdzx-1/typed-session),应该可以移植到zig中。 diff --git a/content/post/data/2.1-1.png b/content/post/data/2.1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..978044c5f8847b8c3978f5fad94f76d9c68ca3ef GIT binary patch literal 49602 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%0A)*83)JFfvujin71umoQ|_+XMZ$-Jf20o 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 M*C&A9;1!Ye4-U0`V*mgE literal 0 HcmV?d00001 diff --git a/content/post/data/2.2-1.png b/content/post/data/2.2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb280445a08b21c6dc8ec83e060dda7fb7640350 GIT binary patch literal 36981 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 literal 0 HcmV?d00001 From b12fa017b4c41be94f37b50740d9750138923835 Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Tue, 26 Nov 2024 13:50:36 +0800 Subject: [PATCH 2/7] Add link --- content/post/2024-11-26-typed-fsm-zig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/post/2024-11-26-typed-fsm-zig.md b/content/post/2024-11-26-typed-fsm-zig.md index 5ba7330..029bd08 100644 --- a/content/post/2024-11-26-typed-fsm-zig.md +++ b/content/post/2024-11-26-typed-fsm-zig.md @@ -11,7 +11,7 @@ date: 2024-11-26T13:32:00+08:00 而状态主要是在代码层面帮助人们理解消息的产生和处理。 -## 1.2 介绍typed-fsm-zig的优势 +## 1.2 介绍[typed-fsm-zig](https://github.com/sdzx-1/typed-fsm-zig)的优势 利用zig强大的类型系统加上一些编程规范,我们可以在zig中实现类型安全的有限状态机。 From 02ab9a8981b9049821733407d272b42239bef647 Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Tue, 26 Nov 2024 18:40:46 +0800 Subject: [PATCH 3/7] Fix some words --- content/post/2024-11-26-typed-fsm-zig.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/post/2024-11-26-typed-fsm-zig.md b/content/post/2024-11-26-typed-fsm-zig.md index 029bd08..a24233c 100644 --- a/content/post/2024-11-26-typed-fsm-zig.md +++ b/content/post/2024-11-26-typed-fsm-zig.md @@ -48,7 +48,7 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 同时它也包含一堆的消息,每个消息都包含了系统状态的转化。 比如消息 InsertCard 代表将ATM的状态从ready转化到cardInserted,这代表用户插入卡。 -消息 Incorrect 代表将ATM的状态冲cardInserted 转化到 cardInserted, +消息 Incorrect 代表将ATM的状态从cardInserted 转化到 cardInserted, 这代表了一种循环,表示用户输错了pin,但是可以再次尝试输入pin,当然我们要求最多可以尝试三次。 整个程序效果如下: From d9b9c64b9092290ff0d90b2a4fab5c867b3ffdda Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Wed, 27 Nov 2024 15:40:50 +0800 Subject: [PATCH 4/7] Move images to statics/images --- ...-26-typed-fsm-zig.md => 2024-11-26-typed-fsm.md} | 12 ++++++------ .../post/data => static/images/typed-fsm}/2.1-1.png | Bin .../post/data => static/images/typed-fsm}/2.1-2.png | Bin .../post/data => static/images/typed-fsm}/2.1-3.png | Bin .../post/data => static/images/typed-fsm}/2.1-4.png | Bin .../post/data => static/images/typed-fsm}/2.2-1.png | Bin .../post/data => static/images/typed-fsm}/2.3-1.png | Bin 7 files changed, 6 insertions(+), 6 deletions(-) rename content/post/{2024-11-26-typed-fsm-zig.md => 2024-11-26-typed-fsm.md} (98%) rename {content/post/data => static/images/typed-fsm}/2.1-1.png (100%) rename {content/post/data => static/images/typed-fsm}/2.1-2.png (100%) rename {content/post/data => static/images/typed-fsm}/2.1-3.png (100%) rename {content/post/data => static/images/typed-fsm}/2.1-4.png (100%) rename {content/post/data => static/images/typed-fsm}/2.2-1.png (100%) rename {content/post/data => static/images/typed-fsm}/2.3-1.png (100%) diff --git a/content/post/2024-11-26-typed-fsm-zig.md b/content/post/2024-11-26-typed-fsm.md similarity index 98% rename from content/post/2024-11-26-typed-fsm-zig.md rename to content/post/2024-11-26-typed-fsm.md index a24233c..0896b5d 100644 --- a/content/post/2024-11-26-typed-fsm-zig.md +++ b/content/post/2024-11-26-typed-fsm.md @@ -40,7 +40,7 @@ typed-fsm-zig 是一种编程的思想,掌握这种思想就能方便的使用 ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款机的一些行为:插入银行卡,输入pin,检查pin,取钱,修改pin。 它的状态机整体如下: -![ATM](data/2.1-1.png) +![ATM](/images/typed-fsm/2.1-1.png) 图中椭圆形表示状态,箭头表示消息。 它包含五种状态:exit, ready, cardInserted, session, changePin。 @@ -52,13 +52,13 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 这代表了一种循环,表示用户输错了pin,但是可以再次尝试输入pin,当然我们要求最多可以尝试三次。 整个程序效果如下: -![ATM](data/2.1-2.png) +![ATM](/images/typed-fsm/2.1-2.png) 这里注意消息Update, 它代表跟新pin,同时将状态转从changePin换到ready。 -![ATM](data/2.1-4.png) +![ATM](/images/typed-fsm/2.1-4.png) 实际的表现就是在changePin的界面中我们修改pin,然后点击Change按钮触发Update消息,修改pin,并返回到ready界面。 -![ATM](data/2.1-3.png) +![ATM](/images/typed-fsm/2.1-3.png) 接下来的文章中我将修改Update的行为,并展示在这个过程中类型系统如何帮助我快速调整代码。 @@ -78,7 +78,7 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 我们修改这里,把它变成.cardInserted , 这代表了我们要求跟新完pin之后进入cardInserted界面重新输入新的pin,这看着是个合理的要求。 新的状态图如下: -![ATM](data/2.2-1.png) +![ATM](/images/typed-fsm/2.2-1.png) 这时如果我重新编译代码,那么类型系统就会产生下面的错误: @@ -119,7 +119,7 @@ referenced by: 这一节中我们尝试移除changePin状态,看看类型系统会给我们什么反馈。 如果移除changePin,新的状态图如下: -![ATM](data/2.3-1.png) +![ATM](/images/typed-fsm/2.3-1.png) 重新编译项目,将获得类型系统的反馈 diff --git a/content/post/data/2.1-1.png b/static/images/typed-fsm/2.1-1.png similarity index 100% rename from content/post/data/2.1-1.png rename to static/images/typed-fsm/2.1-1.png diff --git a/content/post/data/2.1-2.png b/static/images/typed-fsm/2.1-2.png similarity index 100% rename from content/post/data/2.1-2.png rename to static/images/typed-fsm/2.1-2.png diff --git a/content/post/data/2.1-3.png b/static/images/typed-fsm/2.1-3.png similarity index 100% rename from content/post/data/2.1-3.png rename to static/images/typed-fsm/2.1-3.png diff --git a/content/post/data/2.1-4.png b/static/images/typed-fsm/2.1-4.png similarity index 100% rename from content/post/data/2.1-4.png rename to static/images/typed-fsm/2.1-4.png diff --git a/content/post/data/2.2-1.png b/static/images/typed-fsm/2.2-1.png similarity index 100% rename from content/post/data/2.2-1.png rename to static/images/typed-fsm/2.2-1.png diff --git a/content/post/data/2.3-1.png b/static/images/typed-fsm/2.3-1.png similarity index 100% rename from content/post/data/2.3-1.png rename to static/images/typed-fsm/2.3-1.png From 3dc3f59d0d7525b7fbbf028614af8492491c72f4 Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Wed, 27 Nov 2024 15:57:33 +0800 Subject: [PATCH 5/7] Add some line breaks --- content/post/2024-11-26-typed-fsm.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/post/2024-11-26-typed-fsm.md b/content/post/2024-11-26-typed-fsm.md index 0896b5d..e184f19 100644 --- a/content/post/2024-11-26-typed-fsm.md +++ b/content/post/2024-11-26-typed-fsm.md @@ -40,6 +40,7 @@ typed-fsm-zig 是一种编程的思想,掌握这种思想就能方便的使用 ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款机的一些行为:插入银行卡,输入pin,检查pin,取钱,修改pin。 它的状态机整体如下: + ![ATM](/images/typed-fsm/2.1-1.png) 图中椭圆形表示状态,箭头表示消息。 @@ -52,12 +53,15 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 这代表了一种循环,表示用户输错了pin,但是可以再次尝试输入pin,当然我们要求最多可以尝试三次。 整个程序效果如下: + ![ATM](/images/typed-fsm/2.1-2.png) 这里注意消息Update, 它代表跟新pin,同时将状态转从changePin换到ready。 + ![ATM](/images/typed-fsm/2.1-4.png) 实际的表现就是在changePin的界面中我们修改pin,然后点击Change按钮触发Update消息,修改pin,并返回到ready界面。 + ![ATM](/images/typed-fsm/2.1-3.png) 接下来的文章中我将修改Update的行为,并展示在这个过程中类型系统如何帮助我快速调整代码。 @@ -78,6 +82,7 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 我们修改这里,把它变成.cardInserted , 这代表了我们要求跟新完pin之后进入cardInserted界面重新输入新的pin,这看着是个合理的要求。 新的状态图如下: + ![ATM](/images/typed-fsm/2.2-1.png) @@ -119,6 +124,7 @@ referenced by: 这一节中我们尝试移除changePin状态,看看类型系统会给我们什么反馈。 如果移除changePin,新的状态图如下: + ![ATM](/images/typed-fsm/2.3-1.png) 重新编译项目,将获得类型系统的反馈 From 08138c5d8eb94ba00c309275c58d0fd0e35defdf Mon Sep 17 00:00:00 2001 From: sdzx-1 Date: Wed, 27 Nov 2024 18:30:34 +0800 Subject: [PATCH 6/7] Some modification suggestions --- content/post/2024-11-26-typed-fsm.md | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/content/post/2024-11-26-typed-fsm.md b/content/post/2024-11-26-typed-fsm.md index e184f19..bf7def0 100644 --- a/content/post/2024-11-26-typed-fsm.md +++ b/content/post/2024-11-26-typed-fsm.md @@ -17,7 +17,7 @@ date: 2024-11-26T13:32:00+08:00 它具有以下两点优势: ### 1. 类型安全,极大方便代码的编写,修改和重构 -手写状态机在实际代码中有很大的心智负担,而对于它的修改和重构则更加艰难。 +手写状态机在实际代码中有很大的心智负担,对于它的修改和重构更是如噩梦一样。 typed-fsm-zig在类型上跟踪状态机的变化,使消息的定义,产生,处理都和状态相关联,从而让类型系统帮我们检查这个过程中是否存在状态错误。 @@ -200,16 +200,16 @@ pub fn main() !void { _ = s1Handler(s1Wit, &val); } -pub fn Witness(T: type, b: T, a: T) type { +pub fn Witness(T: type, end: T, start: T) type { return struct { - pub fn getMsg(self: @This()) @TypeOf(a.STM(b).getMsg) { - if (b == a) @compileError("Can't getMsg!"); + pub fn getMsg(self: @This()) @TypeOf(start.STM(end).getMsg) { + if (end == start) @compileError("Can't getMsg!"); _ = self; - return a.STM(b).getMsg; + return start.STM(end).getMsg; } pub fn terminal(_: @This()) void { - if (b != a) @compileError("Can't terminal!"); + if (end != start) @compileError("Can't terminal!"); return {}; } }; @@ -220,11 +220,11 @@ const Exmaple = enum { s2, // State to Message union - pub fn STM(s: Exmaple, b: Exmaple) type { - return switch (s) { - .exit => exitMsg(b), - .s1 => s1Msg(b), - .s2 => s2Msg(b), + pub fn STM(start: Exmaple, end: Exmaple) type { + return switch (start) { + .exit => exitMsg(end), + .s1 => s1Msg(end), + .s2 => s2Msg(end), }; } }; @@ -280,21 +280,21 @@ fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { 感兴趣的可以看一下,看懂这些要求你了解GADT,上面提到的Mcbirde Indexed Monad 本质就是在GADT类型上的monad。 -在这里的Winess 三个参数T表示状态机的类型,b 表示终止时的状态,a,表示当前的状态。 +在这里的Winess 三个参数T表示状态机的类型,end 表示终止时的状态,start,表示当前的状态。 它有两个函数,getMsg 表示从外部获取消息的函数,terminal 表示终止状态机的函数。 -当b==a时表示当前处于终止状态,因此Witness只能使用terminal函数,当b!=a时表示当前不处于终止状态,应该继续从外部获取消息,因此Witness只能使用getMsg函数。 +当end == start时表示当前处于终止状态,因此Witness只能使用terminal函数,当end != start时表示当前不处于终止状态,应该继续从外部获取消息,因此Witness只能使用getMsg函数。 ```c -pub fn Witness(T: type, b: T, a: T) type { +pub fn Witness(T: type, end: T, start: T) type { return struct { - pub fn getMsg(self: @This()) @TypeOf(a.STM(b).getMsg) { - if (b == a) @compileError("Can't getMsg!"); + pub fn getMsg(self: @This()) @TypeOf(start.STM(end).getMsg) { + if (end == start) @compileError("Can't getMsg!"); _ = self; - return a.STM(b).getMsg; + return start.STM(end).getMsg; } pub fn terminal(_: @This()) void { - if (b != a) @compileError("Can't terminal!"); + if (end != start) @compileError("Can't terminal!"); return {}; } }; @@ -316,11 +316,11 @@ const Exmaple = enum { s2, // State to Message union - pub fn STM(s: Exmaple, b: Exmaple) type { - return switch (s) { - .exit => exitMsg(b), - .s1 => s1Msg(b), - .s2 => s2Msg(b), + pub fn STM(start: Exmaple, end: Exmaple) type { + return switch (start) { + .exit => exitMsg(end), + .s1 => s1Msg(end), + .s2 => s2Msg(end), }; } }; From 44937a0dabdcc345ca8f30ea146844aa2c892149 Mon Sep 17 00:00:00 2001 From: jiacai2050 Date: Wed, 27 Nov 2024 21:29:25 +0800 Subject: [PATCH 7/7] refactor --- content/post/2024-11-26-typed-fsm.md | 158 ++++++++++++++------------- 1 file changed, 81 insertions(+), 77 deletions(-) diff --git a/content/post/2024-11-26-typed-fsm.md b/content/post/2024-11-26-typed-fsm.md index bf7def0..a158554 100644 --- a/content/post/2024-11-26-typed-fsm.md +++ b/content/post/2024-11-26-typed-fsm.md @@ -1,5 +1,5 @@ --- -title: "在zig中实现类型安全的有限状态机" +title: "在 zig 中实现类型安全的有限状态机" author: sdzx date: 2024-11-26T13:32:00+08:00 --- @@ -11,33 +11,33 @@ date: 2024-11-26T13:32:00+08:00 而状态主要是在代码层面帮助人们理解消息的产生和处理。 -## 1.2 介绍[typed-fsm-zig](https://github.com/sdzx-1/typed-fsm-zig)的优势 +## 1.2 [typed-fsm-zig](https://github.com/sdzx-1/typed-fsm-zig) -利用zig强大的类型系统加上一些编程规范,我们可以在zig中实现类型安全的有限状态机。 +typed-fsm-zig 是一个利用 zig 类型系统加一些编程规范实现的一个库,用于实现类型安全的有限状态机。 它具有以下两点优势: -### 1. 类型安全,极大方便代码的编写,修改和重构 +1. 类型安全,极大方便代码的编写,修改和重构 手写状态机在实际代码中有很大的心智负担,对于它的修改和重构更是如噩梦一样。 -typed-fsm-zig在类型上跟踪状态机的变化,使消息的定义,产生,处理都和状态相关联,从而让类型系统帮我们检查这个过程中是否存在状态错误。 + typed-fsm-zig 在类型上跟踪状态机的变化,使消息的定义,产生,处理都和状态相关联,从而让类型系统帮我们检查这个过程中是否存在状态错误。 -在编写,修改和重构的时候,任何状态的错误都会产生编译错误,而这些编译错误能帮助我们快速找到问题,解决问题。 + 在编写,修改和重构的时候,任何状态的错误都会产生编译错误,而这些编译错误能帮助我们快速找到问题,解决问题。 -ps: 推荐在zls中打开保存时检查,这样你几乎能得到一个交互式的状态机开发环境。 - -### 2. 简单高效,无任何代码生成,能方便与现有逻辑整合 + > PS:推荐在 zls 中打开保存时检查,这样你几乎能得到一个交互式的状态机开发环境。 -typed-fsm-zig 是一种编程的思想,掌握这种思想就能方便的使用它。 +2. 简单高效,无任何代码生成,能方便与现有逻辑整合 -在实际的使用中没有任何的代码生成,除了一处隐式的约束要求之外,没有任何其它的控制,开发者完全掌握状态机,因此你可以方便的将它和你现有的代码结合起来。 + typed-fsm-zig 是一种编程的思想,掌握这种思想就能方便的使用它。 + + 在实际的使用中没有任何的代码生成,除了一处隐式的约束要求之外,没有任何其它的控制,开发者完全掌握状态机,因此你可以方便的将它和你现有的代码结合起来。 # 2. 例子:修改 ATM 状态机的状态 -这里我将以一个ATM 状态机(以下简称ATM)的例子来展示typed-fsm-zig和zig的类型系统如何帮助我快速修改ATM的状态。 +这里我将以一个 ATM 状态机(以下简称 ATM)的例子来展示 typed-fsm-zig 和 zig 的类型系统如何帮助我快速修改 ATM 的状态。 -为了简单性,这里我不展示构建ATM这个例子的过程,感兴趣的可以在这里看到[代码](https://github.com/sdzx-1/typed-fsm-zig/blob/master/examples/atm-gui.zig)。 +为了简单性,这里我不展示构建 ATM 这个例子的过程,感兴趣的可以在这里看到[代码](https://github.com/sdzx-1/typed-fsm-zig/blob/master/examples/atm-gui.zig)。 ## 2.1 介绍 ATM 状态机 -ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款机的一些行为:插入银行卡,输入pin,检查pin,取钱,修改pin。 +ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款机的一些行为:插入银行卡,输入 pin,检查 pin,取钱,修改 pin。 它的状态机整体如下: @@ -47,27 +47,27 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 它包含五种状态:exit, ready, cardInserted, session, changePin。 同时它也包含一堆的消息,每个消息都包含了系统状态的转化。 -比如消息 InsertCard 代表将ATM的状态从ready转化到cardInserted,这代表用户插入卡。 +比如消息 InsertCard 代表将 ATM 的状态从 ready 转化到 cardInserted,这代表用户插入卡。 -消息 Incorrect 代表将ATM的状态从cardInserted 转化到 cardInserted, -这代表了一种循环,表示用户输错了pin,但是可以再次尝试输入pin,当然我们要求最多可以尝试三次。 +消息 Incorrect 代表将 ATM 的状态从 cardInserted 转化到 cardInserted, +这代表了一种循环,表示用户输错了 pin,但是可以再次尝试输入 pin,当然我们要求最多可以尝试三次。 整个程序效果如下: ![ATM](/images/typed-fsm/2.1-2.png) -这里注意消息Update, 它代表跟新pin,同时将状态转从changePin换到ready。 +这里注意消息 Update,它代表更新 pin,同时将状态转从 changePin 换到 ready。 ![ATM](/images/typed-fsm/2.1-4.png) -实际的表现就是在changePin的界面中我们修改pin,然后点击Change按钮触发Update消息,修改pin,并返回到ready界面。 +实际的表现就是在 changePin 的界面中我们修改 pin,然后点击 Change 按钮触发 Update 消息,修改 pin,并返回到 ready 界面。 ![ATM](/images/typed-fsm/2.1-3.png) -接下来的文章中我将修改Update的行为,并展示在这个过程中类型系统如何帮助我快速调整代码。 +接下来的文章中我将修改 Update 的行为,并展示在这个过程中类型系统如何帮助我快速调整代码。 -## 2.2 修改Update 消息 -实际的消息Update 定义代码如下 +## 2.2 修改 Update 消息 +实际的消息 Update 定义代码如下 ```c pub fn changePinMsg(end: AtmSt) type { return union(enum) { @@ -77,9 +77,9 @@ ATM 代表自动取款机,因此它的代码的逻辑就是模拟自动取款 } ``` -这里的.ready 就代表了处理完Update消息后就会进入ready状态。 +这里的.ready 就代表了处理完 Update 消息后就会进入 ready 状态。 -我们修改这里,把它变成.cardInserted , 这代表了我们要求跟新完pin之后进入cardInserted界面重新输入新的pin,这看着是个合理的要求。 +我们修改这里,把它变成.cardInserted,这代表了我们要求更新完 pin 之后进入 cardInserted 界面重新输入新的 pin,这看着是个合理的要求。 新的状态图如下: @@ -108,9 +108,9 @@ referenced by: 5 reference(s) hidden; use '-freference-trace=7' to see all references ``` -它告诉我们在301行存在类型不匹配。因为之前的状态是ready所以使用readyHandler。 +它告诉我们在 301 行存在类型不匹配。因为之前的状态是 ready 所以使用 readyHandler。 -当我们把Update的状态修改为cardInserted时,它与readyHandler类型不匹配,应该将它修改为cardInsertedHandler。 +当我们把 Update 的状态修改为 cardInserted 时,它与 readyHandler 类型不匹配,应该将它修改为 cardInsertedHandler。 修改之后的代码如下: ```c @@ -120,10 +120,10 @@ referenced by: 在这里类型系统精确的告诉了我们需要修改的地方,以及原因。修改完成后程序即能正确运行。 -## 2.3 移除changePin 状态 +## 2.3 移除 changePin 状态 -这一节中我们尝试移除changePin状态,看看类型系统会给我们什么反馈。 -如果移除changePin,新的状态图如下: +这一节中我们尝试移除 changePin 状态,看看类型系统会给我们什么反馈。 +如果移除 changePin,新的状态图如下: ![ATM](/images/typed-fsm/2.3-1.png) @@ -135,7 +135,7 @@ examples/atm-gui.zig:148:36: error: enum 'atm-gui.AtmSt' has no member named 'ch ChangePin: WitFn(end, .changePin), ~^~~~~~~~~ ``` -因为changePin状态已经被移除,因此消息ChangePin(它代表了从session 进入 changePin 状态)也不应该再存在了,我们移除它再重新编译。 +因为 changePin 状态已经被移除,因此消息 ChangePin(它代表了从 session 进入 changePin 状态)也不应该再存在了,我们移除它再重新编译。 新的反馈如下: @@ -144,7 +144,7 @@ examples/atm-gui.zig:161:64: error: union 'atm-gui.AtmSt.sessionMsg(.exit)' has if (resource.changePin.toButton()) return .ChangePin; ~^~~~~~~~~ ``` -我们移除ChangePin消息,因此也将它从消息产生的地方移除,继续重新编译。 +我们移除 ChangePin 消息,因此也将它从消息产生的地方移除,继续重新编译。 新的反馈如下: ```shell @@ -152,31 +152,31 @@ examples/atm-gui.zig:296:10: error: no field named 'ChangePin' in enum '@typeInf .ChangePin => |wit| { ~^~~~~~~~~ ``` -因为消息ChangePin已经不在了,也应将它从消息处理的地方移除,继续重新编译。 +因为消息 ChangePin 已经不在了,也应将它从消息处理的地方移除,继续重新编译。 -这一次不再有编译错误产生,我们搞定了一个新的程序,它不再包含changePin的逻辑。 +这一次不再有编译错误产生,我们搞定了一个新的程序,它不再包含 changePin 的逻辑。 在这个过程中类型系统帮助我们找到问题和原因。这非常酷!!! ## 2.4 总结 -以上是一个简单的例子,展示了typed-fsm-zig对于提升状态机编程体验的巨大效果。 +以上是一个简单的例子,展示了 typed-fsm-zig 对于提升状态机编程体验的巨大效果。 展示类型系统如何帮助我们指示错误的地方,把复杂的状态机修改变成一种愉快的编程经历。 还有些没有讲到的优势如下: -1. 状态的分离,后端handler处理业务的状态变化,前端渲染和消息生成不改变状态。 +1. 状态的分离,后端 handler 处理业务的状态变化,前端渲染和消息生成不改变状态。 2. 消息生成受到类型的限制和状态相关,这样避免错误消息的产生。 这些优势对于复杂业务有很大的帮助。 -接下来我将介绍typed-fsm-zig的原理和实现。 +接下来我将介绍 typed-fsm-zig 的原理和实现。 ------------------------------------- # 3. 原理与实现 -最开始的版本是[typed-fsm](https://github.com/sdzx-1/typed-fsm)使用haskell实现,它实现了完整类型安全的有限状态机。 +最开始的版本是[typed-fsm](https://github.com/sdzx-1/typed-fsm),由使用 haskell 实现,它实现了完整类型安全的有限状态机。 -typed-fsm基于[Mcbride Indexed Monad](https://hackage.haskell.org/package/typed-fsm-0.3.0.1/docs/Data-IFunctor.html): +typed-fsm 基于[Mcbride Indexed Monad](https://hackage.haskell.org/package/typed-fsm-0.3.0.1/docs/Data-IFunctor.html): ```haskell type a ~> b = forall i. a i -> b i @@ -184,14 +184,14 @@ class IMonad m where ireturn :: a ~> m a ibind :: (a ~> m b) -> (m a ~> m b) ``` -这是一种特殊的monad,能在类型上为不确定状态建模。 +这是一种特殊的 monad,能在类型上为不确定状态建模。 -而在zig实现中移除了对Monad语义的需求,保留了在类型上追踪状态的能力。 +而在 zig 实现中移除了对 Monad 语义的需求,保留了在类型上追踪状态的能力。 -所以它不具备完整的类型安全的能力,需要依靠编程规范来约束代码的行为。我认为这样的取舍是值得的,它的类型安全性在zig中完全够用。 +所以它不具备完整的类型安全的能力,需要依靠编程规范来约束代码的行为。我认为这样的取舍是值得的,它的类型安全性在 zig 中完全够用。 -以下是一个原型例子,它包含了typed-fsm-zig的核心想法。不需要担心,接下来我将详细解释这些代码。 -```c +以下是一个原型例子,它包含了 typed-fsm-zig 的核心想法。看不懂不需要担心,接下来我将详细解释这些代码。 +```zig const std = @import("std"); pub fn main() !void { @@ -203,8 +203,8 @@ pub fn main() !void { pub fn Witness(T: type, end: T, start: T) type { return struct { pub fn getMsg(self: @This()) @TypeOf(start.STM(end).getMsg) { - if (end == start) @compileError("Can't getMsg!"); _ = self; + if (end == start) @compileError("Can't getMsg!"); return start.STM(end).getMsg; } @@ -272,18 +272,23 @@ fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { } ``` -------------------------------------- -首先是Witness,它是一个类型上的证据,用来跟踪类型上状态的变化。 +首先是 Witness,它是一个类型上的证据,用来跟踪类型上状态的变化。 + +这里有一些介绍 Witness 思想的[文章 1](https://wiki.haskell.org/Type_witness),[文章 2](https://serokell.io/blog/haskell-type-level-witness)。 -这里有一些介绍Witness思想的[文章1](https://wiki.haskell.org/Type_witness),[文章2](https://serokell.io/blog/haskell-type-level-witness)。 +感兴趣的可以看一下,看懂这些要求你了解 GADT,上面提到的 Mcbirde Indexed Monad 本质就是在 GADT 类型上的 monad。 -感兴趣的可以看一下,看懂这些要求你了解GADT,上面提到的Mcbirde Indexed Monad 本质就是在GADT类型上的monad。 +在这里的 Winess 三个参数分别表示: +1. T 表示状态机的类型, +2. end 表示终止时的状态, +3. start 表示当前的状态。 -在这里的Winess 三个参数T表示状态机的类型,end 表示终止时的状态,start,表示当前的状态。 -它有两个函数,getMsg 表示从外部获取消息的函数,terminal 表示终止状态机的函数。 +它还有两个函数: +1. getMsg 表示从外部获取消息的函数 +2. terminal 表示终止状态机的函数。 -当end == start时表示当前处于终止状态,因此Witness只能使用terminal函数,当end != start时表示当前不处于终止状态,应该继续从外部获取消息,因此Witness只能使用getMsg函数。 +当 end == start 时表示当前处于终止状态,因此 Witness 只能使用 terminal 函数,当 end != start 时表示当前不处于终止状态,应该继续从外部获取消息,因此 Witness 只能使用 getMsg 函数。 ```c pub fn Witness(T: type, end: T, start: T) type { return struct { @@ -302,13 +307,12 @@ pub fn Witness(T: type, end: T, start: T) type { ``` ------------------------------ -我们在这里定义状态。Example包含三个状态:exit,s1,s2。我们将在类型上跟踪这些状态的变化。 +我们在这里定义状态。Example 包含三个状态:exit,s1,s2。我们将在类型上跟踪这些状态的变化。 -注意这里的STM函数,它代表如何将状态映射到对应的消息集合。在实际typed-fsm-zig的代码中,这就是我所说的那一处隐式的约束要求。 +注意这里的 STM 函数,它代表如何将状态映射到对应的消息集合。在实际 typed-fsm-zig 的代码中,这就是我所说的那一处隐式的约束要求。 -实际代码中会将消息集合整合在enum的内部,使用特殊的命名规范将状态与消息集合对应。目前的隐式规范是在状态后面加上Msg。 +实际代码中会将消息集合整合在 enum 的内部,使用特殊的命名规范将状态与消息集合对应。目前的隐式规范是在状态后面加上 Msg。 ```c const Exmaple = enum { exit, @@ -328,7 +332,7 @@ const Exmaple = enum { ``` ------------------------------- -接下来是消息的定义和产生, +接下来是消息的定义和产生, ```c // exit 状态下没有任何消息 @@ -336,14 +340,14 @@ pub fn exitMsg(_: Exmaple) void { return {}; } -// s1 状态下有两个消息Exit 和 S1ToS2, 他们分别将状态转化为exit 和 s2 +// s1 状态下有两个消息 Exit 和 S1ToS2, 他们分别将状态转化为 exit 和 s2 pub fn s1Msg(end: Exmaple) type { return union(enum) { Exit: Witness(Exmaple, end, .exit), S1ToS2: Witness(Exmaple, end, .s2), - - // getMsg 函数表明在s1状态下如何产生消息,这里受到类型系统的约束, - // 在s1 的状态下不会产生其它状态的消息 + + // getMsg 函数表明在 s1 状态下如何产生消息,这里受到类型系统的约束, + // 在 s1 的状态下不会产生其它状态的消息 pub fn getMsg(ref: *const i32) @This() { if (ref.* > 20) return .Exit; return .S1ToS2; @@ -351,7 +355,7 @@ pub fn s1Msg(end: Exmaple) type { }; } -// s2状态下有一个消息S2ToS1 +// s2 状态下有一个消息 S2ToS1 pub fn s2Msg(end: Exmaple) type { return union(enum) { S2ToS1: Witness(Exmaple, end, .s1), @@ -366,10 +370,10 @@ pub fn s2Msg(end: Exmaple) type { ----------------------------- 最后一部分是消息的处理。 -整体的逻辑是通过Witness的getMsg函数从外部获取消息,然后通过模式匹配处理消息。 -每个消息又包含接下来状态的Witness,然后使用对应的函数处理这些Witness。 +整体的逻辑是通过 Witness 的 getMsg 函数从外部获取消息,然后通过模式匹配处理消息。 +每个消息又包含接下来状态的 Witness,然后使用对应的函数处理这些 Witness。 -通过Witness 让类型系统帮我们检查函数的调用是否正确。 +通过 Witness 让类型系统帮我们检查函数的调用是否正确。 通过对消息进行模式匹配,编译器能确定我们是否正确且完整的处理了所有的消息。 @@ -396,12 +400,12 @@ fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { ``` -以上就是typed-fsm-zig核心想法的完整介绍。接下来我将介绍需要的编程规范。 +以上就是 typed-fsm-zig 核心想法的完整介绍。接下来我将介绍需要的编程规范。 # 4. typed-fsm-zig 需要哪些编程规范 ## 1. 状态和消息集合之间需要满足的隐式命名规范 -以ATM为例: +以 ATM 为例: exit -- exitMsg @@ -460,17 +464,17 @@ const AtmSt = enum { }; ``` -## 2. 除了exit状态外,其它消息需要包含genMsg 函数用于产生消息,任何消息都必须带有Witness +## 2. 除了 exit 状态外,其它消息需要包含 genMsg 函数用于产生消息,任何消息都必须带有 Witness ## 3. 状态机都需要定义退出状态,尽管你可能永远也不会退出状态机,但退出状态作用于类型上,是不可缺少的 -## 4. 在互相调用其它handler的时候使用尾递归的语法,并且在必须在语句块最后处理消息附带的Witness +## 4. 在互相调用其它 handler 的时候使用尾递归的语法,并且在必须在语句块最后处理消息附带的 Witness -由于zig的实现缺少Mcbride Indexed Monad 语义的支持,因此类型系统不能阻止你进行下面的操作: +由于 zig 的实现缺少 Mcbride Indexed Monad 语义的支持,因此类型系统不能阻止你进行下面的操作: ```c -// 使用上面Example 的处理函数 s1Handler, 将它修改成下面的样子。 -// 这里的s1Handler 不应该被多次调用,在haskell版本的typed-fsm中,类型系统能检查出这里类型错误,但是在zig实现中无法做到, -// 因此我们要求只能在语句块最后有一个处理Witness的语句 +// 使用上面 Example 的处理函数 s1Handler, 将它修改成下面的样子。 +// 这里的 s1Handler 不应该被多次调用,在 haskell 版本的 typed-fsm 中,类型系统能检查出这里类型错误,但是在 zig 实现中无法做到, +// 因此我们要求只能在语句块最后有一个处理 Witness 的语句 fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { switch (val.getMsg()()) { .S2Tos1 => |wit| { @@ -487,9 +491,9 @@ fn s2Handler(val: Witness(Exmaple, .exit, .s2), ref: *i32) void { 由于状态机需要长期运行,在互调递归的函数中如果不使用尾递归会导致栈溢出。 -因此上面的Example demo中,如果我将20改成很大的值,比如二百万,那么一定会发生栈溢出,因为demo中的调用没采用尾递归的方式。 +因此上面的 Example demo 中,如果我将 20 改成很大的值,比如二百万,那么一定会发生栈溢出,因为 demo 中的调用没采用尾递归的方式。 -在实际的ATM 例子中他们的调用方式是: +在实际的 ATM 例子中他们的调用方式是: ```c pub fn readyHandler(comptime w: AtmSt.EWitness(.ready), ist: *InternalState) void { switch (w.getMsg()()) { @@ -505,7 +509,7 @@ pub fn readyHandler(comptime w: AtmSt.EWitness(.ready), ist: *InternalState) voi ``` -这里的 `@call(.always_tail, cardInsertedHandler, .{ witness, ist })` 就是zig 中尾递归语法。出于这个语法的需要,处理函数中的Witness 被变成了编译时已知(这里是 `comptime w: AtmSt.EWitness(.ready)`)。 +这里的 `@call(.always_tail, cardInsertedHandler, .{ witness, ist })` 就是 zig 中尾递归语法(参见:[ziglang #694](https://github.com/ziglang/zig/issues/694#issuecomment-563310662))。出于这个语法的需要,处理函数中的 Witness 被变成了编译时已知(这里是 `comptime w: AtmSt.EWitness(.ready)`)。 遵循这四点要求,就能获得强大的类型安全保证,足以让你愉快的使用状态机! @@ -513,5 +517,5 @@ pub fn readyHandler(comptime w: AtmSt.EWitness(.ready), ist: *InternalState) voi 暂时我能想到的有如下几点: 1. 在状态机中,消息的产生和处理分开,因此可以定义多个消息产生的前端,处理部分可以任意切换消息产生的前端。比如我们可以定义测试状态机前端,用于产生测试数据,当处理部分调用测试前端的代码时就能测试整个状态机的行为。 2. 支持子状态,这会让类型更加复杂。 -3. 开发基于[typed-fsm-zig的gui系统](https://discourse.haskell.org/t/try-to-combine-typed-fsm-with-gui-to-produce-unexpected-abstract-combinations/10026),状态机在gui有很高的实用性,将他们结合是一个不错的选择。 -4. 开发typed-session-zig,实现类型安全的通信协议。我在haskell已经实现了一个[实用的类型安全的多角色通讯协议框架](https://github.com/sdzx-1/typed-session),应该可以移植到zig中。 +3. 开发基于[typed-fsm-zig 的 gui 系统](https://discourse.haskell.org/t/try-to-combine-typed-fsm-with-gui-to-produce-unexpected-abstract-combinations/10026),状态机在 gui 有很高的实用性,将他们结合是一个不错的选择。 +4. 开发 typed-session-zig,实现类型安全的通信协议。我在 haskell 已经实现了一个[实用的类型安全的多角色通讯协议框架](https://github.com/sdzx-1/typed-session),应该可以移植到 zig 中。