学习一门新的编程语言比较好的方式可能是编写一个 WebAssembly 的 TOTP 库, 因为编写过程中会遇到以下几个难点能够帮助了解编程语言.

  • 需要使用到 HAMC 和 Sha1 算法, 能了解这个编程语言的基础库和当前语言的生态
  • 涉及到大量的位运算, 能了解编程语言的运算和类型系统是否完善
  • WebAssembly 存在手动的内存管理, 能了解编程语言的内存管理机制
  • 需要使用到不是那么常见的 base32 算法, 能了解这个编程语言的基础库和当前语言生态
  • 为了确保结果的正确, 需要编写大量的单元测试, 能了解编程语言是否容易编写可维护性较高的代码
  • 能够熟悉编程语言的编译流程
  • 能够知道基础库的实现是否与编译平台有较强的绑定 (比如 Go 的基础库大部分无法用于 WebAssembly)

下面是几个我学习新的编程语言过程中编写的 TOTP 实现

  • totp-wasm: Rust 语言的实现. 了解到了 Rust 的生态较为成熟, 大部分东西都有现成的, 但类型的转换极为繁琐. 但语言本身有很多莫名其妙的"魔法", 像 WebAssembly 就离不开 wasm-bindgen 项目
  • totp-wasm-zig: Zig 语言的实现. 了解到了 Zig 当前生态并不成熟, 但语言本身功能较为完善, 编译系统也很优秀
  • UdonOTPLib: C# 语言的 VRChat Udon 实现, 但并不是 WebAssembly. 基本只了解到了部分的 C# 语言, 写完似乎也没学到什么东西