# 介绍 BT(BT Programming Language)是一门由 Rust 实现的解释型语言,采用接近 JavaScript 的语法风格,并通过词法分析、语法分析、字节码编译和寄存器式虚拟机执行代码。它面向脚本、Web 服务、桌面应用、网络通信和设备通信等场景,目标是在保持语法直观的同时,让运行时保持轻量、可常驻。 BT 的核心特点是“表达式有值”。函数体、`if` 代码块、`include()` 引入的文件和模板片段都会返回最后一条语句的值;函数中也可以使用 `return` 提前返回。这使 BT 可以用更少的样板代码组织业务逻辑。 ## 设计目标 - 类 JavaScript 的直观语法,降低学习成本。 - 字节码加寄存器式 VM 执行,减少解释器热路径开销。 - 标准库按对象能力拆分,支持链式调用和按需扩展。 - 支持 CLI、Web 服务和桌面 App 三种主要运行环境。 - 适合常驻内存服务,缓存和后台任务必须可控。 ## 执行机制 BT 源码会先编译成字节码,再由 VM 执行: ```text BT 源码 ↓ 词法分析 ↓ 语法分析 ↓ 字节码编译 ↓ 寄存器式虚拟机执行 ``` 普通脚本由 `bt_cli` 运行;桌面项目由 `bt-app` 读取 `app.json` 后进入 `static`、`server` 或 `remote` 模式;Web 服务通过 `net.listen({type:'web'})` 启动,并在请求中注入 `web` 上下文。 ## 基础语法 BT 保持类 JS 写法,同时保留代码块返回值语义: ```bt fn level(score) { if score >= 60 { 'pass' } else { 'fail' } } println(level(72)) ``` 数组、对象和回调可以链式组合: ```bt users = [ {name:'Lisa', age:18} {name:'Tom', age:25} {name:'Jack', age:16} ] names = users .filter(user -> user.age >= 18) .map(user -> user.name) println(names) ``` ## 模块与模板 `include()` 用于读取并执行其他 BT 文件。相对路径基于当前源码文件所在目录解析,`@` 表示项目根目录。 ```bt config = include('@/config/app.bt') util = include('common/util.bt') ``` Web 页面可以使用 `# TPL` 模板文件,在 HTML 中嵌入 BT 表达式和代码片段,适合官网、后台页面和服务端渲染场景。 ## 标准库 当前标准库覆盖常用基础能力: - `fs`:文件读写、复制、移动、删除、目录遍历和路径信息。 - `net`:Web、TCP、UDP、WebSocket、DNS 和本机网络信息。 - `web`:请求上下文读取、响应头、状态码、跳转和 Cookie/Session 回写。 - `reqwest`:HTTP 客户端请求,支持 header、body、json、form、query、multipart、timeout 等链式配置。 - `device`:设备扫描、打开、读写、关闭,当前以串口能力为主。 - `bytes`:二进制字节值,服务串口、网络和工业协议边界。 - `modbus`:Modbus RTU/TCP 请求帧、响应解析和 CRC16 辅助能力。 - `process`:命令参数、环境变量、工作目录和子进程管理。 - `ffi`:原生动态库调用能力,支持完整 C ABI 签名、返回提示和有限免声明调用本机 `.dll`、`.so` 或 `.dylib`。 - `date`、`math`、`md5`、`base64`、`mysql`:日期、数学、摘要、编码和数据库相关能力。 ## Web 服务 BT 的 Web 服务通过 `net.listen({type:'web'})` 配置站点、入口脚本、静态资源和 SSL: ```bt net.listen({ type:'web' bind:'0.0.0.0:8080' sites:[ { domains:['0.0.0.0'] root:'www/' entry:'main.bt' static:{ route:'/static/{**}' path:'www/static/' } } ] }) ``` 请求进入后,入口 BT 文件可以读取 `web.get`、`web.post`、`web.server`、`web.cookie`、`web.session` 等上下文,并通过最后一条语句或 `print` 输出响应内容。 ## 桌面应用 `bt-app` 是 BT 的桌面应用运行器和打包工具。它读取 `app.json` 创建窗口,支持: - `static`:加载项目内 HTML 资源,并通过 `bt://app/...` 访问打包资源。 - `server`:执行本地 BT Web 服务,再加载本地 HTTP 地址。 - `remote`:加载可信远程页面。 桌面页面会注入 `window.bt`,前端可以调用 `window.bt.call()` 执行 `main.bt` 中的函数,也可以使用窗口、托盘、剪贴板、通知、对话框和拖拽等桌面 API。构建时,`bt-app` 会把资源写入 exe 尾部 Bundle,便于单文件分发。 ## 网络与设备 `net` 标准库面向长连接和本地服务,支持 TCP、UDP、WebSocket 服务端/客户端、DNS 解析和本机 IP 查询。事件回调统一使用 `on_connect`、`on_message`、`on_close`、`on_error` 这类 snake_case 命名。二进制回调可通过 `binary: true` 返回 Bytes。 `device` 标准库用于设备通信,当前可以扫描和操作串口: ```bt ports = device.scan('serial') println(ports) ``` ## 应用场景 - CLI 脚本和自动化工具。 - Web 网站、后台管理系统和 API 服务。 - 桌面应用、本地工具和 WebView 壳应用。 - TCP、UDP、WebSocket 长连接服务。 - 串口设备控制、Modbus 工业自动化和物联网原型。 ## 总结 BT 把脚本语法、字节码 VM、Web 服务、网络通信、设备访问和桌面打包放在同一套语言体系中。它适合需要快速开发、长期运行、可扩展标准库和轻量部署的项目。