# 介绍

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`：设备扫描、打开、读写、关闭，当前以串口能力为主。
- `process`：命令参数、环境变量、工作目录和子进程管理。
- `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 命名。

`device` 标准库用于设备通信，当前可以扫描和操作串口：

```bt
ports = device.scan('serial')
println(ports)
```

## 应用场景

- CLI 脚本和自动化工具。
- Web 网站、后台管理系统和 API 服务。
- 桌面应用、本地工具和 WebView 壳应用。
- TCP、UDP、WebSocket 长连接服务。
- 串口设备控制、工业自动化和物联网原型。

## 总结

BT 把脚本语法、字节码 VM、Web 服务、网络通信、设备访问和桌面打包放在同一套语言体系中。它适合需要快速开发、长期运行、可扩展标准库和轻量部署的项目。
