Tiny: 一种具有内联 Go 扩展的并发动态语言
Tiny 是一种使用 Go 构建的高性能、并发编程语言和运行时系统。它将动态编码的灵活性与多线程运行时引擎相结合,利用基于栈的字节码虚拟机将源文件编译为 .tbc 指令。
多层级执行与 JIT 编译
Tiny 采用多层级执行模型,由用于通用逻辑的高效解释器和用于性能关键路径的即时 (JIT) 编译器组成。JIT 引擎将热点字节码路径转换为原生 WebAssembly,以实现接近原生的速度。
区域轮廓提取 (Region Outlining)
编译器会自动识别函数体和顶层代码中的热点循环,并将其轮廓化为专门的 JIT 区域。这使得脚本和基准测试可以在无需开发者手动将逻辑封装进函数的条件下,以原生速度运行。
打包对象数组 (Packed Object Arrays)
为了减少 VM 与原生环境之间的交互开销,JIT 为包含统一形状对象的数组实现了宿主内存镜像。通过使用字段-列指针表,运行时可以直接在连续内存中访问对象属性。这些打包数组支持动态增长和 Wasm 侧的优化。
JIT 优化最佳实践
开发者可以通过遵循特定的编码模式来最大化 JIT 性能:
- 使用类型提示:提供显式提示(例如
: number)有助于 JIT 生成专门的机器码。 - 避免捕获闭包:捕获可变外部变量的函数将由解释器而非 JIT 处理。
- 保持同步:
async函数目前尚不具备 JIT 编译资格。 - 字符串操作:字符串拼接操作经过了 JIT 加速,不过对于大规模构建,建议使用标准库中的
stringBuilder。
语言规范
Tiny 旨在用于快速原型设计和稳健的应用开发,将动态类型与结构化验证相结合。
动态类型与结构化接口
Tiny 默认是动态类型的,但支持为变量、参数和返回类型提供可选的静态类型提示,包括对泛型和联合类型的支持。它使用结构化类型(基于形状的验证),即在运行时根据接口验证对象。JIT 引擎通过跟踪对象形状并利用连续内存字段偏移量来优化这些检查。
高级语法特性
- 解构赋值:支持带有嵌套模式、属性重命名和默认值的对象与数组解构。
- 类组合:
embed关键字允许类将行为委托给其他类实例,从而倾向于使用组合而非深层继承。 - 模式匹配:
match块支持字面量值、变量、枚举、联合模式和守卫,是用于从枚举变体中提取数据的核心机制。 - 作用域清理:
defer语句确保函数调用在包围的作用域退出之前立即执行,无论是否存在提前返回或错误。
并发与线程
Tiny 利用操作系统级多线程进行并行执行,这与事件循环模型不同。spawn 关键字在隔离的 VM 状态空间中启动一个新的执行例程,允许任务在所有可用的 CPU 核心上并发运行。
共享状态通过互斥锁 (mutexes) 和原生的 lock 块进行管理。编译器确保在执行离开该块时自动释放互斥锁,以防止死锁。
通过 WebAssembly 实现内联 Go 扩展
Tiny 允许开发者使用 native fn 块直接在源文件中编写 Go 代码。这些块通过 TinyGo 编译为 WebAssembly,并在运行时加载,从而允许在 Tiny 脚本中使用特定的 Go 包。
标准库与工具链
Tiny 提供了一个全面的标准库,用于各种用例:
validate:用于对象、数组和联合类型的模式验证的可链式 API。http:具有基于路由的多路复用功能的并发 Web 服务器和客户端。ui:基于 WebView 的桌面容器,使用 HTML/CSS/JS 并通过直接绑定 Tiny 函数来实现。desktop:用于键盘、鼠标和剪贴板交互的操作系统自动化工具。time,url, 和 ****array**:用于计时、URL 编码和原生数组操作的工具函数。
CLI 与生态系统
Tiny CLI 提供了一些关键命令:
tiny run <file>:使用字节码缓存编译并运行脚本,以避免冗余的重编译。tiny pack <file> -o <binary>:将字节码和 VM 运行时打包成单个独立的原生可执行文件(约 13MB)。tiny dist <file> -o <dir>:将应用程序、插件和资源打包。tiny lsp: 启动语言服务器以实现编辑器集成(例如 VS Code),提供类型收窄、语义恢复和重构安全性等功能。
社区观点
虽然该项目展示了显著的技术广度,但一些用户对与直接使用 Go 或 Python 的相比,其具体用例是否值得探讨。一位用户建议,Tiny 可以作为一种高效的高级脚本语言,用于即时配置管理系统。
"i'm wondering if it can beat just installing go though. I think it'd be interesting to build a adhoc config mgmt system w/ this and use it as a high level scripting language."