玄铁版本(XuanTie SemVer)框架:
版本 SemVer:主版本.次版本.修订号.测试号
主版本(Major):破坏性变更/产品里程碑
次版本(Minor):向后兼容功能/部分新功能/大更新
修订号:向后兼容缺陷修复/Bug 修复/小更新
## v1.0-rc.2 (2026-09-27)
第二个候选正式版。语言层补齐"保留字不得作标识符"等硬规则与一批编译期静态校验,运行时跨三平台(Windows / macOS / Linux,含 arm64)平台化,两条编译器线(XTC 自举编译器与 GSC 种子编译器)同步收敛。本历史只记录 XTC 与 GSC 的变更,官方库、插件、文档站与工程治理不在其内。
#### XTC(自举编译器):语言与编译器
- **保留字不得作标识符**:变量名/常量名/函数名/参数名/迭代变量名/型名/接口名等 **14 个标识符定义入口**全部拦截,报错文案逐字对齐种子编译器(GSC);清单以 GSC 的判定处为准(`结果 任务 道 测试 字符串 整 小数 布尔 数组 字典 字节`,另按名补判 `此`)。
- **成员调用静态校验**:① 内置属性被当方法调用(`列表.长度()`)编译期报错并给出改写建议;② 静态可知的型上"方法不存在"编译期报错(查目标型**及其全部派生型**,避免多态误报;字段中存放的函数可调用)。
- **实参个数校验补全**:方法调用与 `造` 构造调用两条路径此前漏校验,少传实参时被调方读取未初始化的形参槽并按 ARC 释放垃圾对象 → 堆损坏;现编译期拦下。
- **嵌套异步块非法 IR 修复**:异步块内再起纯计算块并等待它时,内层函数体曾继承外层 fiber 状态机上下文 → 生成未定长类型的 `getelementptr` 非法 IR。
- **`等待(t).成员` 取空值修复**:方法调用分派前置段曾把接收者求值两次,`等待` 的一次性句柄被提前消费,结果静默变 `空`(fiber 内更会生成 `label %空` 非法 IR);现接收者只求值一次。
- **`终止码` 支持任意表达式**:`终 <表达式>`(变量/算术/调用皆可)此前只认数字字面量,其余被静默丢弃退成 exit 0;并新增语言级类型守卫——字符串/数组/字典当终止码改为编译期报错。
- **编译期自检硬失败**:IR 完整性自查发现非法标记时不再只告警,而是打印诊断并以非零退出码终止,不产出坏产物。
- **`-jc` 只检查模式崩溃修复**:检查模式的作用域退出例程会读已解约页的对象头(0xC0000005);现对齐正常路径 destroy 并硬退出。
- **浮点运算落地**:运行时算术(`+ - * / %`)浮点分派与混合提升、编译器装箱安全路由(非标量算术走运行时调用)、前缀负号与注解小数参数段错误修复。
- **关键字名变量读取纪律统一**:抽出唯一入口 `读符号槽`,修复关键字名分支各自裸 load 不 retain 导致的引用计数下溢(悬垂读,实测段错误)。
- **遮蔽修复(P0)**:函数内 `设`/`遍历` 变量遇同名全局一律新建遮蔽局部,杜绝模块函数静默污染调用方全局槽位。
- **异常与错误处理**:捕捉机制死代码根治(轮询式异常机制,除零/参数类型错误可捕捉)、`是` 中缀双形态(类型判断/值等价)、除模运算全走运行时(灭字面折叠 undef 与变量除零崩溃)。
- **文件 API 铁律硬化**:`文件.写` 检查写入字节数与 `fflush`/`fclose`(磁盘满/短写不再静默成功);新增 `文件.删`(带重试,失败必报错);解释器路径补 `文件.存在?`。
- **数组/字节方法接收者守卫**:错类型对象误用方法(如 `s.找(...)`)不再越界踩内存,改为明确报错退出(修段错误)。
- **其它修复**:数学常量命名与 GSC 对齐(并修常量裸访问把函数地址当数据读的既有缺陷)、长字符串拼接性能(1e5 次拼接 10.5s → 4.6ms)。
- **工具链**:新增 `xtc pao`/`xtc 跑` 子命令(编译后立即运行,语义对齐 `go run`/`cargo run`:临时产物落缓存目录、跑完清理、参数与退出码透传);项目根模式(裸跑 `xtc 铁` 按 `玄铁.配置.toml` 的 `[项目] 入口` 编译);`--检查` 全文件语义错误收集(供 LSP 一次出全部诊断)。
#### XTC(自举编译器):异步与运行时
- **异步路由**:含阻塞核心原语(`求`/`执`/`输`)的异步块整块路由线程池(这三者是 C 侧全程阻塞实现,跑在调度器线程上会饿死同进程其他 fiber)。
- **等待(线程池任务)属主分派与句柄槽位清零**:修复任务析构连带释放 `task->result` 造成的堆结果悬垂,以及作用域退出二次释放;核心原语实参捕获补扫。
- **HTTP 单参请求补强**:重定向跟随、连接/收发超时、多 A 记录容错;`单参求()` 补 chunked 传输解码(铁铺包索引响应超 2KB 曾致卡死/段错误)。
- **跨平台**:macOS/arm64 与 Windows ARM64 自举打通、Linux ARM64 验证记录;运行时 C 文件平台隔离(`unistd.h`/线程宏/TLS 存根)、渲染桥 Win32 专有代码隔离、FFI「外」与终端 VT 处理平台隔离、GNU/Linux 非渲染编译补 `-lm`;修复 POSIX 主线程标志致调度器 drain 失效(裸 spawn 任务被进程退出杀掉)、darwin `执()` 退出码归一化、darwin 渲染库链接适配。
- **调度器与渲染回路**:`xt_scheduler_step` 非阻塞单步泵(根治主线程进 UI 主循环后 fiber 整体饿死)、按需重绘(帧级脏源轮询,空闲 CPU 实测 0.000s)、轮询事件桥。
#### GSC(Go 种子编译器)
- **平台化**:macOS/arm64 自举打通(种子编译器与运行时平台化、`xt_self_path` 补 `__APPLE__`/`__linux__` 分支、FFI「外」与终端 VT 处理平台隔离);Windows ARM64 自举(平台化与架构探测补全)。
- **浮点算术修复**:算术快速路径写死 i64 运算而 `isScalarType` 已含 double,装箱指针被当整数相乘(`设 x = 3.14 * 2` 实测得堆地址量级垃圾数);现按 double 分流,补 `ensureRawDouble` 与 `mapOperatorDouble`(含比较谓词),前缀负号改走 `fneg double`。20 项浮点矩阵探针与 XTC 对照语义一致。
- **后端与 ABI**:LLVM(tie) 后端补齐数学库符号并与解释器 stdlib 对齐;外函数返回小数此前按注解生成 `declare double` 读 XMM0,而实际返回的是装箱指针(RAX),改为 `declare i64` 直取装箱值。
- **转译路径(zao)**:带 `?` 的函数名会生成非法 Go 标识符(`?`→`_q` 映射现覆盖声明预扫描、变量/赋值/遍历/参数、类型父子、方法参、模块导出、闭包参等全路径);补 `或`/`且`/`<=`/`>=` 运算符映射;模块级外函数预声明补齐。
- **文件 API 与解释器**:双端注册 `文件.删`(带退避重试,失败必报错);解释器路径补 `文件.删`、`文件.存在?` 与 `输()` 表达式分支。
- **退出码纪律**:编译/链接三处失败路径由 `return`(退出码 0)改为 `os.Exit(1)`——对明确的编程错误宁可报错退出也不静默跳过。
## v1.0-rc (2026-08-13)
首个候选正式版。囊括 v0.19.0 全部内容(下方条目),另加网络栈完善、自举定点、fiber 网络 I/O 三大块
#### 自举里程碑
- **XTC 自举定点达成**:GSC→S1→S2→S3→S4 逐代编译,s3 与 s4 产物逐字节一致(确定性构建:中间文件按源内容 FNV 指纹命名 + 链接去时间戳);自举产物全量回归通过
#### 网络与并发(方案三:网络与线程调度整合)
- **fiber 感知网络 I/O**:`异步` 块内 `连`/`流.读()`/`流.写()` 成为真挂起点——socket 懒置非阻塞,未就绪挂起并注册调度器就绪表(WSAPoll),不占线程;就绪精确唤醒。语义与阻塞版完全一致
- **字段直存根治两枚地基 Bug**:①异步块内局部变量跨挂起点丢失(读回 空);②捕获变量跨挂起点修改丢失且堆损坏。捕获/局部全部改为状态结构体字段直存
- **HTTP 客户端双参形态**:`求(url, 选项)` 支持方法/头/体/超时,回 状态码/体/头;TLS 接收 EXTRA 字节丢失修复(持久 inbuf)
- **HTTP 服务端落地**:新铁铺包 `HTTP`(纯玄铁,基于 `听`),`HTTP.服务(端口, 处理函)` 请求/响应字典模型
- **听 闭包通路修复**:回调经 `xt_closure_call1` 按 env 感知约定调用,捕获闭包不再崩
- **阻塞写补全发循环**(部分发送自动续传);回归套件新增 8 个网络/调度单元(110-117)
#### 语言语义修正
- **分割 修正为字面子串切分**(同 Python `split`):保留空段、多字符分隔符按整体匹配;旧 strtok 字符集语义(丢空段)废弃。空分隔符维持逐逻辑字符拆分
#### 手册
- GUIDE/08 全面扩写为保姆级:两种执行上下文判定、TCP 无消息边界坑、fiber 写法纪律、求 与异步块的关系、HTTP 服务端细则,关键点多配可运行示例
## v0.19.0 (2026-08-10)
多线程双层架构落地 + 编译器地基全面加固 + 声明式 UI 库首次跑通
#### 语言新特性
- **若表达式**:`设 x = 若 条件 { 值 } (抑 条件 { 值 })* 否 { 值 }`——条件求值可直接作为表达式,支持字典值、函数返回值、实参等任意表达式位置;否分支缺失时编译期明确报错(无值可求属明确编程错误)
#### 网络与铁铺
- **HTTPS 支持**:运行时新增 `runtime/xt_tls.c`,基于 Windows 原生 Schannel 实现 TLS 客户端——`求("https://...")` 实测通过,零新增第三方依赖,发行包零增重
- **铁铺 CLI 落地**:新增 `tiepm/铁铺.xt` 命令行入口(install/list/search/publish/clean 双语命令),`核心.xt` 连修打包链(tar 双实现兼容/TOML 节名解析/路径尾空格/令牌 BOM)
- **发布闭环**:publish 自动 POST 注册索引;下载地址约定为 Release 附件(GitHub 附件名不支持中文,资产名取仓库末段);实测 install 全链(下载→SHA256 校验→解压→编译运行)通过
- **成员访问类型分派**:`.成功/.值/.错误` 成员读曾无条件按 `结果` 结构体直读,带这些键的普通字典读出垃圾;现按运行时类型分派(结果走结构体,字典走键查询)
- **执 编码修复**:临时批处理写入 UTF-8 而 cmd 按系统代码页解析,含中文命令静默失败;现写入前加 `chcp 65001`
- **编译器自定位运行时**:运行时/网络/TLS 栈文件改按 xtc 自身所在目录解析,任意目录调用不再炸链接
#### 多线程与并发(双层调度架构)
- **双层多线程架构全链路修复**:调度/通道/`选`/路由一整串缺陷集中排爆,并发 67 项全覆盖测试全绿
- **新增无栈状态机**:异步块不再依赖栈帧,支持真正的挂起/恢复
- XTC 编译并行 Segfault 与 SSA 问题修复;被引文件 parser 错误不再沉默
- 调度器丢失唤醒导致的间歇死锁修复
- **异步块捕获循环变量修复**:fiber 符号表重定向 + N=0 改 env 字典传参
- 多线程与无栈状态机测试、官方手册教程补全;并发章节详情迁入 08 指南
#### 闭包与捕获(一串老雷)
- 闭包捕获编译崩溃修复(字段名错/alloca 累积/alloca 未入 IR 三连)
- `收集捕获变量` AST 节点覆盖补全:原来 15 种节点之外的语句根本不会捕获外层变量
- 闭包隔离失败修复;尾随闭包动态调用与堆损坏修复;GSC SSA 闭包冲突修复
- **闭包循环捕获共享终值修复**:循环内声明的变量按创建时刻值快照(逐迭代语义)
- **闭包参数补 retain(GSC 和 XTC 同病同修)**:匿名函数入口存参数没 retain,出作用域却 release,每调一次实参引用计数净 -1,闭包调两次实参就被提前释放——`UI.应用` 第二帧必崩的总根因。为抓这个 heisenbug 给运行时临时加过"隔离+投毒"调试层(已撤)
- **捕获变量遍历器三个字段名写错**:`键值列表→键值对列表`、`等待任务→任务对象`、匹配分支按对象读实际是数组。闭包里写字典字面量必段错误
#### GSC 与编译正确性
- **GSC 循环表征翻转误编译根治**:干跑探测 + 前置规范化;回退装箱改动并源码级规避其缺陷
- 编译内建中缀字符串比较与产物类型传播修复
- 布尔关键字 `判` 全面更名 `布尔`
- `==`/`!=` 运算符重载与入口 alloca 支配性错误修复
- **引入路径规范化约束**:正反斜杠混用给出编译期警告;统一转绝对路径并折叠 `.`/`..`(同一物理文件不再被当成两个文件重复编译)
- `<` 比较被误解析为泛型修复;`.含?()` 缺少数组分支修复;JSON 递归下降解析器新增
#### 模块系统
- **模块内裸名互调修复**:别名引入时预扫描会把模块函数改名成 `别名.名`,导致模块内部函数互调全部失效(UI 库就是这么被憋死的)。现在裸名解析不到时自动回退到当前模块命名空间
- **菱形引入双重改名修复**:应用引 UI+渲染、UI 又引渲染时同一文件被预扫描两次,`R.开窗口` 被改成 `R.R.开窗口`。现在同路径同别名只预扫描一次;同模块多别名直接明确报错
- **模块全局变量预登记**:函数体可以先于全局声明语句引用模块全局变量
#### 解析器与诊断
- **`返` 值解析 first 集对齐**:`返 [1,2]`、`返 {"a":1}` 之前被当成"无返回值",静默返回空——UI 库 `量固有` 就是这样中招的
- **S4 诊断强化**:解析器死循环根修(未闭合文件导致的 16GB 内存爆炸)、参数个数校验、类型注解冲突校验
- **运行时守卫**:方法缺失/成员访问非对象/索引非对象,全部从段错误改成明确报错退出
- `整()`/`小数()` 统一返回 `结果` 容器
- 手册补充编译期错误与运行时诊断章节(报错分级策略现状)
#### 性能
- **P-perf-1 中缀整数内联快路径**:1e7 累加 2000ms → 220ms(9 倍),新增 93 性能校验和防"快而错"回归
#### 测试体系
- 回归测试集扩充至 94 单元(75→94),并发项重复 3 次判定;四层判定(编译成功性/退出码/FAIL 标记/金标比对)
- **混沌测试器**:500 轮随机程序轰炸零坠毁;94 内存搅动猎手;80 内存 ARC 压力测试
#### 渲染库 / UI 库
- 声明式 UI 框架库初建;`@响应` 修饰符与尾随闭包语法糖
- **声明式 UI 库首次端到端跑通**:`应用`/`造状态`/`态取`/`态设`/控件/布局/交互全链路可用,计数器实测点击真实递增
- **UI 中文字体接入**:`应用` 选项 `"字体"`/`"字库字号"` 自动加载卸载,文本与按钮绘制走精确测宽(`量字体文字`,新增 MeasureTextEx 桥接)
- **纹理句柄改池化**:之前直接返回裸 C 指针,玄铁 ARC 把 `Texture2D` 当自家对象做 retain/release,必崩。现与字体同款方案(1-16 池内索引)
- **UI 选项容错**:内边距/外边距传裸数字自动转 `全边`
#### 文档
- 新增 [GUIDE/12_UI库编程指南.md](./guide/12_UI库编程指南.md)(用法、禁区、能力边界)
- 手册新增第 10 章(UI 库);05 模块系统补模块内互调语义与单别名限制;09 补 `量字体文字`
- 手册首页改为标注对标版本,正文不再逐条标注"某版本新增"
#### 已知问题
- UI 应用长时间运行内存持续增长(每帧重建控件树相关),排查修复中
---
## v0.18.6 (2026-06-21)
自举编译器外部函数 ABI 修复 + 渲染库 v1.1 字体扩展
#### 自举编译器修复(编译.xt + 玄铁.xt)
- **外部函数声明去重**:预扫描和代码生成两趟不再重复追加 `declare`
- **返回类型映射**:`空→void`、`判→i1` + `select i1→i64 4/2` 布尔转换,修复 X 按钮无响应
- **调用点类型感知**:提前返回路径和动态分派路径均根据 `函数返回类型表` 生成正确的 LLVM call 指令(`call void`/`call i1`/`call i64`)
- **渲染库链接支持**:玄铁.xt 新增自动检测渲染桥 + 编译 + 链接 libraylib.a + OpenGL
#### 渲染库 v1.1(渲染桥.c + 渲染.xt)
- **bool 返回值修正**:6 个函数返回 `0/1` 替代 `XT_FALSE/XT_TRUE`,匹配 LLVM `i1`
- **XTString 布局修正**:对齐运行时 `char* data` 指针布局,修复字符串乱码
- **Unicode 窗口标题**:直接调用 Win32 `MultiByteToWideChar` + `SetWindowTextW`
- **字体 API 新增**:
- `加载字体(文件, 字号)` — 全 CJK 范围(21K 字形)
- `加载字体精准(文件, 字号, 参考文本)` — UTF-8 精准码点提取,纹理 256×256
- `释字体(句柄)` / `绘字体文字(...)` — 自定义字体渲染
- `绘椭圆(...)` — 实心椭圆
- **字体兼容**:仅支持 `.ttf`/`.otf`,不支持 `.ttc`(raylib 限制)
- **预编译 IR**:`lib/渲染/渲染.ll` 和 `渲染.o` 已更新
#### 修复的已知问题
- 产物 Phase 5 代码生成访问违例(`call void` 修复)
- 渲染桥 XTString 布局导致字符串损坏
- 自举编译器不支持渲染程序链接
---
## v0.18.5 (2026-05-23)
#### 铁铺包管理器初始版本
铁铺(TiePM)——玄铁语言的官方包管理器正式落地,包含 CLI 工具、远程索引服务、文档三件套。
#### 铁铺 CLI(铁铺.xt / tiepm/核心.xt)
- **安装铁器**:`铁铺 安装 <包名>` — 从远程索引获取包信息,构造 GitHub 下载 URL,下载 ZIP 到 `~/.tiepm/缓存/`,SHA256 验证完整性,解压到 `~/.tiepm/已安装/<包名>/`;
- **搜索铁器**:`铁铺 搜索 <关键词>` — 匹配远程索引中的包名和描述,返回最新版本信息;
- **发布铁器**:`铁铺 发布` — 读取 `tiepm.toml` 清单,打包项目(tar -czf),计算 SHA256,输出 API 登记指令;
- **列表已安装**:`铁铺 列表` — 列出 `~/.tiepm/已安装/` 下全部铁器;
- **包详情**:`铁铺 信息 <包名>` — 查看指定铁器的版本、仓库、哈希;
- **清理缓存**:`铁铺 清理` — 删除下载缓存;
- **TOML 解析器**:纯玄铁实现的 TOML 配置解析(节、键值对、注释跳过),用于读取 `tiepm.toml`;
- **包清单格式**:`tiepm.toml`(`[包]`/`[作者]`/`[依赖]`/`[描述]` 四节),名称、版本、仓库为必填;
- **索引格式**:JSON 对象 `{包名: {版本: {版本, 哈希, 仓库, 作者, 描述}}}`,作者字段可选;
- **安全机制**:安装时强制 SHA256 哈希比对,不匹配拒绝安装;
- **英文别名**:所有命令支持中文和英文双名(安装/install、搜索/search、发布/publish、列表/list、信息/info、清理/clean);
#### 铁铺官网(tiepm-site/)
- **Go HTTP 服务端**(main.go):单文件部署,`embed.FS` 将前端编译进二进制,零外部依赖;
- **API 端点**:
- `GET /api/index` — 返回完整包索引 JSON;
- `GET /api/search?q=` — 按关键词搜索(大小写不敏感),返回包名、最新版本、作者、描述;
- `POST /api/publish` — 登记新包/版本(校验必填字段名称、版本、哈希),返回成功/错误;
- `GET /download/:name/:version` — 302 重定向到 `{仓库}/archive/v{版本}.zip`;
- **前端页面**:深色主题(GitHub 风格),搜索框实时过滤,展示包名、版本、作者、描述、仓库链接、安装指令;
- **线程安全**:`sync.RWMutex` 保护索引并发读写;
- **安全措施**:哈希日志安全截断(≤16 字符),输入字段校验,JSON 解析失败返回 400;
#### 自举编译器修复
- **语法分析.xt L539**:`解析遍历循环()` 中 `变量名` 缺少 `设` 声明,Go 种子宽容处理但自举编译器要求严格声明;
- **编译.xt L3584**:删除了 `示("[弱赋值查]...")` debug 打印;
- **入口 alloca 机制**:局部变量的 `alloca` 从内联发出改为延迟到 `entry:` 块统一发出,修复 `遍历` 体和条件分支内 `设` 导致的 LLVM 支配性验证失败;
- **`==`/`!=` 运算符重载跳过**:对非标量类型的 `==`/`!=` 跳过 `_等_` 方法查找,避免内联 alloca 在 3+ `若/抑` 条件中崩溃;
- **字符串索引类型分发**:`编译索引表达式` 新增字符串类型分支(type_id==3 → `xt_string_get_char`),此前只处理数组和字典;
- **`返 [...]` 系统化修复**:74 处 `返 [...]` 改为 `设 _r = [...]; 返 _r`,修复自举编译器对 inline array return 的值空化问题;
- **程序缓存恢复**:`预扫描引入` 从 `源码缓存` 恢复为 `程序缓存`(AST 缓存),解决 `此` 参数经 `解析型成员` 添加后在重新解析时丢失的严重问题;
- **字符串 IR 常量**:`转为十六进制` 缓冲区大小确认为 `s->length * 3 + 1`(格式 `\XX`,每字节 3 字符);
- **`公 型` 支持**:`解析带修饰符语句()` 新增 `"型定义"` case,支持 `公 型 类名 { ... }` 语法;
- **`说明符语句` 过滤**:新增 `_name.长度 > 10` 条件,拦截超长标识符误入说明符路径;
- **`解析中缀` 默认分支**:Pratt 解析 `解析表达式(优先级)` → `解析表达式(优先级 - 1)`,修复中缀运算符默认分支无限递归;
- **`结果` 关键字冲突**:将 `tiepm/核心.xt` 和 `铁铺.xt` 中 `结果` 变量重命名为 `_res` 或 `读结果`,因 `结果` 是 `Result` 类型的保留关键字;
- **裸 `返` 无返回值**:所有 `返` 无值改为 `返 空`(`空`=null);
#### 依赖与工具
- **Go 1.26**:tiepm-site 编译依赖,使用 `embed` 标准库静态文件嵌入;
- **certutil**(Windows 内置):SHA256 哈希计算,后续计划纯玄铁实现;
- **tar**(Windows 内置):ZIP 解压;
---
## v0.18.1 (2026-05-16)
`<` 比较解析修复 + 标准库
- **修复了 `<` 比较运算符被误解析为泛型尖括号的编译器bug**:`语法分析.xt:解析泛型参数列表()` 单标记前瞻无法区分 `i < n`(比较)和 `盒子<节点>`(泛型),导致所有含 `<` 比较的玄铁代码解析失败。修复方案:新增 `窥视标记2`(第二前瞻标记),`进标记()` 级联推进,`解析泛型参数列表()` 在标识符后检查第三者标记——只有 `>` / `,` / `?` 才进入泛型模式。该bug也连带导致 `当` 循环体编译异常(条件标记被错误消费)。回归验证:01-29 全部通过。
- **新增了玄铁标准库 `lib/数组.xt`**:纯玄铁实现的数组高阶方法——`映射`(map)、`过滤`(filter)、`归纳`(reduce)、`查找`(find)、`每个?`(every)、`存在?`(some)、`排序`(bubble sort)、`去重`(dedup)、`反转`(reverse)。使用方式:`引 "../lib/数组.xt" 予 A ; A.映射(列表, 变换)`(路径相对于源文件所在目录)。
- **新增了 Test 26 数组高阶方法测试**:覆盖映射、过滤、归纳、查找、每个?、存在?、排序、去重、反转 9 个方法。
- **修复了模块路径解析bug**:`引` 的相对路径未以源文件所在目录为基准,而以编译器工作目录为基准——`Test/`下文件写 `引 "./lib/数组.xt"` 会错误地从项目根查找。根因:`预扫描引入` 用"是否含目录分隔符"判断路径是否已解析(`./lib/数组.xt` 含 `/` 被误判跳过)。修复:改用 `是绝对路径()` 判断;错误信息扩展为四行清晰提示。Test 26 路径已修正为 `../lib/数组.xt`,新增 Test 30 验证错误路径报错。回归 30/30 全部通过。
## v0.18.0 (2026-05-15) 弱引用支持
自举编译器正式支持 `弱` 关键字,打破 ARC 循环引用的关键基础设施落地。
- 新增了弱引用语法 `弱 设 变量 = 对象`:运行时层——`xt_runtime.h/c` 新增 `XTWeakSlot` 旁路链表结构体、`xt_weak_init` 注册槽位 API、`xt_weak_clear` 清零函数(对象释放时遍历链表将匹配槽位置为 `XT_NULL`),`xt_free_obj` 开头调用 `xt_weak_clear`;编译器层——`抽象语法树.xt` 变量声明节点新增 `弱引用` 字段,`语法分析.xt` 在 `解析语句`/`解析带修饰符语句`/`继续解析型定义` 四处分派 `弱` 关键字,`编译.xt` 变量声明时生成 `xt_weak_init`+`xt_release`(释放表达式 load 的 retain,使对象仅由强引用持有)并从作用域追踪移除,赋值时对弱引用变量直接 store 跳过 ARC;ARC 行为验证——覆盖唯一强引用后弱引用自动归零,确认 xt_weak_clear 在 xt_free_obj 中正确触发;
新建 Test 17 弱引用测试(声明、重赋值、空弱引用、归零验证、类成员弱引用)、Test 18 字符串方法(截取/替换/分割/包含?)、Test 19 模式匹配(值匹配/通配符/类型匹配/函数内匹配)、Test 20 运算符重载(_加_/_等_)、Test 21 泛型可空组合(多参数泛型+?后缀+字典缓存)、Test 22 严格模式升级(W004/W005在三档模式下的升级验证)、Test 23 弱引用归零验证(局部变量归零+类成员弱引用读写+嵌套成员访问)——单元测试扩展至 23 个,23/23 全部通过;
- 更新了 `实现清单和计划.md`:弱引用条目标记为已实现;
- 新增了类成员弱引用支持:`型 子节点 { 弱 设 父: 父节点? }`——运行时新增`xt_dict_set_weak`(字典存值不retain)、`xt_dict_weak_init`(注册字典弱引用槽位)、扩展`XTWeakSlot`支持字典槽位和`xt_weak_clear`字典清零;编译器新增`弱引用字段表`跟踪每型的弱引用字段,`编译实例化`和`编译赋值`成员分支对弱字段调`xt_dict_set_weak`+`xt_dict_weak_init`替代`xt_dict_set`;Test 17 新增类成员循环引用测试——”子节点引用父: 根“验证弱引用正确读取;
- 新增了弱引用强制可空类型检测(W005):`弱 设` 声明时若注解类型不含`?`则输出警告,提示开发者添加可空修饰符;
- 新增了编译期循环引用风险检测(W401):在语义分析后、类型推导前运行`检测循环引用`——遍历所有型定义构建引用图,检测2-节点环(A的非弱引用字段指向B,且B的非弱引用字段指向A),输出结构化警告建议将其中一条边标注为`弱`;`提取引用类型名`支持直接类型名、`数组<型>`元素类型、`字典<K,V>`value类型的解析;新建Test 24验证检测(互相强引用触发W401、一方弱引用不触发);24/24全部通过;
- 新增了 JSON 序列化验证测试(Test 25):`化(dict)`、`化(array)`、`化(string)` 均正确输出 JSON 字符串(反序列化`解`有 ABI bug——声明参数为%XTString*但调用传i64——待修复);
- 已验证`口`(接口)关键字可编译通过,当前无编译期接口契约校验(规划中功能);
- 修复了弱引用重赋值时旧槽位可能导致误清零的问题:`xt_weak_clear` 在清零前校验 `*slot_addr == (XTValue)obj`(仅当槽位仍指向本对象时才清零);编译器弱引用赋值分支新增 `xt_weak_init` 调用(注册新值槽位);JSON 反序列化从仅支持字典/数组降级说明为简化实现(支持字符串/数字/布尔/空基础类型);
- 修复了编译器中缀比较`!=`的严重bug——`编译内建中缀`的`"!="`分支创建假中缀节点时未设置`中缀运算符`字段,递归调用匹配不到`"=="`→`指令`为空→返回`["0", "i64"]`(永假)。任何涉及`!=`的比较均受影响(包括弱字段内联比较`a.x != 空`)。修复:设置`中缀运算符="=="`+对结果`xor i1 ..., 1`取反;25/25全部通过;
- 修复了类成员弱引用失效的根因bug:`编译赋值`成员分支中`左类型.截取(0, 2) == "型:"`因`型`为3字节UTF-8无法匹配,导致`弱引用字段表`查找永远失败→构造函数和赋值均走`xt_dict_set`(强引用)→弱引用语义完全未生效;修复为`截取(0, 4)`,类成员弱引用正确走`xt_dict_set_weak`+`xt_dict_weak_init`路径;
- 已知局限:W401仅检测直接类型引用的2-节点环;JSON 解为简化实现不支持 `{}` `[]`;
## v0.17.9 (2026-05-11)
自举编译器GEP字段访问全面切换到C运行时函数,新增编译严格度分级系统与隐式类型/未使用变量检测,并且正式支持泛型语法和闭包变量捕获支持。完全修复了16个单元测试测出来的的Bug。也是这个从这个版本“逻”正式变更为“判”作为玄铁布尔值的关键字。
- 新增了C运行时`xt_array_length`函数,与`xt_dict_size`模式一致,返回数组原始长度(size_t)供编译器标记化后使用;
- 新增了自举编译器中`@xt_dict_contains`的LLVM IR声明;
- 新增了语法分析器的警告码基础设施:定义了`警告码表`(W001~W201覆盖隐式类型/逻辑语法/未使用变量/注释格式六大类),新增`格式化警告`方法输出结构化信息(含警告码、类别、行号、上下文、修复建议和升级提示),改造`添加警告`为基于警告码的调用接口;
- 新增了编译器的类型警告系统:`添加类型警告`方法,在类型推导阶段检测隐式类型问题(W001变量未标注、W002参数未标注、W003返回值未标注),依据严格度决定静默/警告/错误;
- 新增了编译严格度三档开关CLI参数:`--默认`/`--moren`(保持原始等级)、`--严格`/`--yange`(宽松→警告,警告→错误)、`--禁止`/`--jinzhi`(全部→错误),同时支持中文和拼音格式,严格度通过解析器和编译器共享的`严格度`字段联动;
- 新增了未使用变量检测(W101):编译器在函数编译完成时遍历该函数的局部变量(排除参数和全局变量),对比`已用变量`追踪集,对声明但从未引用的变量按严格度输出警告;
- 新增了`若/抑/否`逻辑中多个`否`分支的警告检测(W004);
- 新增了`@允许`注解抑制语法:在语句前加`@允许(W004)`或`@允许(逻辑语法)`可抑制指定警告码或类别名的输出,词法分析器新增`@`令牌识别(`注解允许`类型),解析器解析括号内参数并设置当前抑制列表,警告方法在抑制列表中匹配警告码或类别名时静默跳过;
- 新增了`玄铁.配置.toml`配置文件解析:编译时自动读取源文件同目录下的配置文件,支持`[编译]`节下`严格度`键设置(如`严格度 = "严格"`),优先级为命令行参数 > 配置文件 > 编译器默认值;
- 修复了自举编译器GEP直接读对象字段返回值错误的bug:将`长度`/`大小`/`字节数`成员访问从GEP改为C运行时函数调用(字符串→`xt_string_byte_length`、数组→`xt_array_length`、字典保持`xt_dict_size`),实测发现GEP方式在特定条件下返回0导致输出"空";
- 修复了遍历循环中GEP读取数组/字符串/字典键集长度全部失败的bug:数组长度→`xt_array_length`、字符串长度→`xt_string_byte_length`、字典键集→`xt_array_length`,修复后Test 03"遍历数组"从无输出恢复为正确遍历4个元素;
- 修复了`截取`方法默认结束参数读取字符串长度时GEP失败的bug:改为`xt_string_byte_length` + `ashr`脱壳;
- 修复了语法分析器`解析尝试捕捉`不支持`捕捉 (标识符)`括号语法的严重bug:遇到`捕捉 (e)`时解析器将`(`误当作`{`吃掉,导致状态混乱→死循环→Arena无限扩容→内存超20GB被系统kill;修复后Test 10全部通过;
- 修复了语法分析器`解析返回语句`的first集中缺少`函数定义`标记导致`返 函(...){}`匿名函数表达式不被解析的bug;
- 修复了遍历循环中`任务`等保留关键字不能用作迭代变量名的过度限制;
- 修复了自举编译器`含?`/`包含?`成员方法只调`xt_dict_contains`对字符串完全无效导致Segfault的bug:新增类型分派逻辑,字符串走`xt_string_contains`(参数转%XTString*),字典走`xt_dict_contains`,用phi节点合并两分支结果;
- 修复了自举编译器索引赋值`x[y] = z`只调`xt_array_set`对字典完全无效的bug:新增类型分派,字典走`xt_dict_set`,数组走`xt_array_set`,修复后`映射["地"]="中国"`正确追加条目,字典大小从2变为3,遍历字典不再崩溃;
- 修正了Test 09中非标准写法`管道`为官方关键字`道`;
- 修复了编译器关键字节点(`任务`、`道`、`字节`、`整`、`字`)在表达式求值时跳过了符号表变量查找的bug:关键字被解析器设为特殊节点类别后,编译器直接返回关键字常量,导致`任务`等关键字作为for-each迭代变量时被当作类型ID而非变量值;修复后在关键字匹配分支中优先检查符号表,是变量则按普通标识符加载;
- 修正了Test 08异步测试中`返100`从异步块内返回外层函数的问题(异步降级同步执行的已知限制),改为不返回值并在注释中说明限制;
- 修正了Test 08中`#{结果}`错误引用关键字`结果`而非变量`x结果`的问题;
- 新增了闭包变量捕获支持:`编译匿名函数`在创建独立作用域时扫描函数体AST收集外层局部变量(`收集捕获变量`),为每个捕获变量创建全局桥接变量存储当前值,闭包内从全局加载到局部alloca;支持只读捕获(`外部变量`)和可变捕获(`计数 += 1`、`x = 新值`),跨调用可变状态持久化在显式`返`后暂不完全;
- 将布尔类型关键字从`逻`重命名为`判`:涉及词法分析器(token类型映射)、语法分析器(保留关键字/类型关键字/成员访问检查)、编译器(类型注解映射/标量类型检查/类型推导返回值)、Go种子编译器(llvm.go/compiler.go/token.go/evaluator.go/ast.go)、文档(GUIDE.md/语言参考手册/泛型指南);回归测试16/16全部通过,无性能退化;
- 新增了泛型语法支持:解析器新增`是类型关键字`辅助函数识别内置类型标记,`解析泛型参数列表`增加前瞻检查(区分`<`比较与泛型括号),`解析中缀`新增`小于`处理(泛型调用/类型引用/比较运算符三路分派),`解析变量声明`允许保留关键字用作变量名(编译器通过符号表优先匹配变量);编译器侧采用类型擦除策略,泛型参数在IR层全部映射为`i64`;
- 回归测试:Test 01~16 全部通过退出码0(16/16),斐波那契(30)≈6.6ms无性能退化;
## v0.17.8 (2026-05-09)
修复字符串字节操作返回非法地址、字典键/值方法缺失导致遍历崩溃
- 修复了Go种子编译器中`字节()`方法错误地对返回值做了`ashr i64 ..., 1`反标签化的问题,`xt_string_get_byte`返回的是XTInt对象指针(已经过标签化),多余的右移导致指针被破坏,`xt_obj_to_string`收到无效地址后输出"非法地址";
- 修复了Go种子编译器中`键()`方法未作为内置方法处理的问题,`映射.键()`走了动态字典查找路径尝试从字典中查找key="键",找不到返回null后for循环对null解引用导致ACCESS_VIOLATION崩溃;新增了`键()`和`值()`两个字典内置方法的IR生成逻辑,与自举编译器行为对齐;
- 新增了`xt_dict_values`函数的LLVM IR声明;
- 回归测试通过:Test 01(基础)、Test 02(字符串,第一个字节=72)、Test 03(集合,字典遍历输出版=0.17/地=中国/名=玄铁)、Test 16(控制流)全部正确;
## v0.17.7 (2026-05-05)
修复自举编译器LLVM结构体布局缺失magic字段的重大缺陷
- 修复了自举编译器中所有LLVM类型结构体定义缺少`magic`字段的重大缺陷:Go种子编译器定义了`{ i32, i32, i32 }`(magic, ref_count, type_id)三个头部字段,但自举编译器只有两个(`{ i32, i32 }`),导致`type_id`的`getelementptr`索引偏移4字节,实际读到了`ref_count`(值=1),所有类型分发(`遍历`循环、运算符重载检查)全部失效;
- 修复范围:6种LLVM类型(XTObject/XTTring/XTTray/XTCDict/XTTFunction/XTResult)定义对齐,28处`getelementptr`字段索引偏移修正,覆盖XTObject type_id(8处 i32 1→2)、XTTring data(i32 2→3)/length(3处 i32 3→4)、XTArray length(3处 i32 3→4)、XTFunction funcPtr(i32 2→3)、XTResult isSuccess(5处 i32 2→3)/value(4处 i32 4→5)/error(3处 i32 5→6);
- 确认并保留了此前`raw_i64`类型映射修复:`编译变量声明语句`(L1389-L1395)和`编译赋值`(L3296-L3301)中将`变量类型表`从`"raw_i64"`改为`"i64"`,因为值已被`确保I64`标签化;
- `遍历`循环修复回归:修复前循环体完全不执行(type_id读到ref_count=1,不等于5/6/3);修复后`遍历 x 于 [1,2,3]`正确输出x=1,2,3;
- 回归测试通过:Test 01(基础)、Test 07(算法,斐波那契30=832040)、Test 16(控制流,偶数和=6/阶段和=72)、Test 16i(局部变量函数,x+y=7/a*b=30)全部正确;
- 确认Test 02(字符串`包含?`崩溃)和Test 03(集合字典遍历崩溃)是已有问题(Go种子编译器编译的版本同位置崩溃),非本版本引入;
## v0.17.6 (2026-05-04)
修复编译赋值标量存储bug,16_控制流测试全通过
- 修复了 `编译赋值` 对标量变量存储原始值而非标记值(tagged pointer)的严重bug:当执行 `x = 1` 时,编译器生成 `store i64 1` 而非 `store i64 3`(tagged(1)),导致后续读取和比较全部失效。此bug的传导链为:赋值存raw值 → 读取时被当作tagged值右移1位 → 数值错误 → 条件判断失败 → `续`语句永远不触发。修复方案:将标量存储分支的 `此.符(翻译右[0])` 改为 `xt_val`,与 `编译变量声明语句` 保持一致;
- 16_控制流测试全部5项通过:续跳过奇数、断跳出循环、嵌套断隔离、嵌套续隔离、当+遍历嵌套断;
- 回归测试 05/06/07 全部通过,fib 性能无退化;
## v0.17.5 (2026-05-04) - fib(30) 6ms 超越 Go
自举编译器类型注解驱动优化,fib(30) 6ms 超越 Go
- 新增了自举编译器的 `映射类型注解` 函数:将 `整`→`raw_i64`、`小数`→`double`、`逻`→`i1`,为参数脱壳和静态优化提供统一映射;
- 新增了自举编译器编译函数定义的参数脱壳:读取解析器存入的 `arg节点.推导类型`(如 `"整"`),对标量参数先 `ashr` 脱壳再存储为 raw_i64,跳过不必要的 `xt_retain` 和 `追踪对象`;
- 新增了 `函数返回类型表`:在编译函数定义时注册返回值类型(如 `函 xxx(): 整`),调用处自动 `ashr` 脱壳为 raw_i64 供后续原生运算使用;
- 新增了编译中缀的标量快速路径:当 `+`/`-`/`*`/`/` 等运算符的左右操作数都为标量类型(`raw_i64`/`i1`/`double`)时,跳过动态分发(`xt_dict_get` + `xt_string_new`),直接走原生 LLVM 指令;
- 修复了编译赋值对标量变量存储标记值的问题:`k = k + 1` 现在对 raw_i64 变量存储原始值而非标记值,与种子编译器修复同源;
- 新增了解析器 `是保留关键字` 检测函数:识别 `结果`、`任务`、`道`、`整`、`字`、`逻` 等 15 个关键字,在变量声明、遍历循环、函数定义等位置拦截撞名用法并输出中文友好报错(与种子编译器行为对齐),修复了 07/08/09/15 等测试的解析失败问题;
- 修复了自引用报错:`预扫描引入` 检测到文件引用自身时调用 `终 1` 输出中文错误并立即终止,取代之前的静默跳过;
- 修复了 `出作用域` 无限循环崩溃的严重 bug:根因是种子编译器的 `compileForStatement` 缺少 `continueLabels` 和 `breakLabels` 的 push/pop,导致 `续`/`断` 在嵌套循环中跳转到错误标签。修复方案:在条件分支后提前生成 `stepLabel`,同步 push `breakLabels(endLabel)` + `continueLabels(stepLabel)` + `loopDepths` 三个栈,循环结束后 pop。修复后 05/06 编译正常,新增 16_控制流测试专项覆盖;
- **[性能突破] 斐波那契基准测试**:带注解 `斐波那契(n: 整): 整` 的 fib(30) 从 365ms 降至 **~6ms**(约 60 倍提升),超越 Go 的 ~15ms 和种子编译器的 ~18ms,标志着自举代码生成质量达到生产级;
## v0.17.3 (2026-05-03)
种子编译器类型注解驱动优化与关键 bug 修复
- 新增了种子编译器的函数类型注解支持:编译器现在能识别 `函 xxx(n: 整): 整` 中的参数和返回类型注解,将整数参数以 raw_i64 形式存储,跳过不必要的装箱和 ARC 操作;
- 新增了调用处返回值自动脱壳:当函数声明了返回类型注解(如 `: 整`),调用的地方会自动把返回值脱壳成 raw_i64,让后续运算全走原生 LLVM 指令;
- 修复了种子编译器赋值语句对标量变量错误存储标记值的 bug:`k = k + 1` 这种整数自增会错误地把装箱后的标记值存回 raw_i64 变量,导致后续 `k < N` 的判断失效——这就是自举编译器类方法参数循环只跑一次的根因;
- 修复了带类型注解函数(如 `斐波那契(n: 整): 整`)的 IR 生成问题:比较(`n <= 1`)走原生 `icmp sle`,加减法(`n - 1`、加法)走原生 `sub`/`add`,不再调用 `xt_compare`/`xt_sub`/`xt_add` 这些运行时函数,fib(30) 降至 ~18 毫秒;
## v0.17.2 (2026-04-28)
- 补全了数学标准库:全面支持 `数学.绝对值`、`数学.正弦`、`数学.余弦`、`数学.平方根`、`数学.幂`、`数学.取整`、`数学.进一`、`数学.四舍五入` 等核心函数;
- 实现了变参数学函数支持:针对 `数学.最大值` 和 `数学.最小值` 实现了编译器级别的自动装箱,支持 `...n` 风格的无限参数调用;
- 注册了数学模块常量:支持通过 `数学.PI` 和 `数学.E` 直接访问高精度数学常量;
- 修复了自举词法分析器的标识符识别漏洞:支持以 `?` 结尾的标识符(如 `存在?`),消除了之前的解析歧义;
- 增强了 `?` 操作符的类型安全:在自举编译器中增加了运行时类型校验,非 `结果` 对象调用将触发安全报错;
- 优化了字符串插值兼容性:移除了非标准的 `${}` 支持,统一并加固了 `#{}` 格式,并在编译器层增加了非法插值符号的语法拦截;
- 修正了 `xt_result_new` 的 ABI 调用约定:将成功标志参数由 `i1` 修正为 `i32`,确保了跨 ABI 调用的稳定性;
- 完善了并发对象的内存释放:补全了 `通道` (Channel)、`任务` (Task) 和 `字节流` (Bytes) 的析构逻辑,彻底解决了并发测试中的内存泄漏;
- 实现了轻量化发行支持:预编译了运行时对象 `xt_runtime.o`,并更新驱动使其支持“开包即用”的极速链接模式。
## v0.17.1 (2026-04-28)
- 新增了位运算操作符支持:现在支持 `位与`、`位或`、`异或`、`左移`、`右移` 和前缀 `取反` 关键字;
- 实现了自举编译器的位运算 IR 生成:针对标记指针(Tagged Pointer)进行了优化,位运算会自动处理脱壳与装壳逻辑,确保类型安全;
- 同步更新了 Go 种子编译器:现在种子编译器也能识别并编译位运算操作符,确保了自举链路的一致性;
- 优化了位运算的执行效率:在 LLVM 后端为位运算生成了高效的原生指令,并支持标量优化(Raw i64)下的零开销计算;
## v0.17.0 (2026-04-27)
#### 自举驱动加固+MinGW深度集成+全面性能突破
> 注:所有更新均仅在Windows平台测试过,Linux和Darwin平台未进行任何测试。
- **全面切换至 MinGW 工具链**:种子编译器和自举编译器现在默认生成 MinGW 格式的对象文件,并使用 `gcc` 进行链接,彻底摆脱了对 MSVC 运行时库的依赖;
- **全面硬化了运行时 C 代码**:将所有潜在风险的 `sprintf` 迁移至 `snprintf`,确保在处理超长 URL、错误消息或文件路径时的缓冲区安全性;
- 自举编译器成功驱动化,支持直接编译玄铁程序;
- 新增了原生 FFI 接口 `xt_get_temp_path()`:直接封装 Win32 `GetTempPathA` 极速获取系统临时目录,移除了驱动层之前低效的 `cmd /c echo %TEMP%` 子进程调用与字符串清洗逻辑;
- 新增了单引号和多行字符串支持,现在用 `'''` 就能直接写带换行的长文本,插值 `#{ }` 也是全通的;
- 新增了范围表达式(比如 `1..5`),配合 `遍历` 循环特别好用,底层会自动帮你造好数组;
- 新增了解构赋值语法,不管是数组提取 `[首, ...余]` 还是字典提取 `{名, 别}` 都能一气呵成;
- 新增了早返回操作符(`?`),碰到 `结果` 报错直接往上甩,省去了大段的逻辑判断;
- 新增了自举编译器的输出控制参数 `-sc` / `--输出`,现在能自由指定生成的二进制文件名了;
- 新增了自举编译器的详细信息输出参数 `-xx` / `--xinxi` / `--信息`,默认情况下保持简洁输出,仅在需要调试时显示底层指令;
- 优化了 Windows 指令执行 (Driver Engine):弃用了直接 `_wpopen` 调用,改为通过唯一性命名(PID + 毫秒时间戳)的临时 `.bat` 文件执行,彻底解决了 Windows 下的引号剥离(Quote Stripping)与并发文件碰撞隐患;
- **优化了 argv 获取方式 并 顺利修复了获取中文 argv参数 乱码的问题**:之前走main的argv,拿到的都是ANSI(GBK)字节,要么乱码要么得做不可靠的GBK转UTF-8。现在LLVM-IR里的main会直接`call xt_init_args(argc, argv)`,`xt_init_args`调用 `GetCommandLineW()` + `CommandLineToArgvW()` 直接拿UTF-16无损转换为UTF-8,中文文件名和路径不会再乱码;
- 优化了字符串核心操作的编译方式,把 `字节数`、`取字节`、`字符` 这些常用方法直接硬编码进后端,避开了自举时容易踩坑的动态查找;
- 优化了符号生成安全性,增加了 `符()` 和 `标()` 包装函数,彻底封锁了“空”值被误当成字符串塞进 IR 的漏洞;
- 优化了跨模块的类型解析,现在支持继承别的模块里的类(`型 A 承 别名.B`),实例化也支持带前缀的写法了;
- 优化了 CLI 参数解析逻辑,支持单横杠短参数(如 `-sj`)与双横杠长参数(如 `--shijian`);
- 优化了成员访问报错,现在跨模块访问不存在的成员时会报出精准的错误信息,并立即终止编译;
- 更新了 LLVM Target Triple 为 `x86_64-w64-windows-gnu`,Data Layout 调整为 MinGW 兼容格式;
- 优化了 FFI 调用稳定性:引入了 `xt_ffi_printf` 安全包装器,解决了 MinGW 环境下跨 ABI 传递字符串对象导致的乱码和崩溃问题;
- 增强了运行时字符编码兼容性:支持现代 Windows 的 `.UTF8` 区域设置,确保中文字符串在 FFI 场景下的精准显示;
- 增强了 `执()` 指令的安全性:为指令路径增加了 1024 字节的长度校验与 `_snwprintf` 安全格式化,若路径超限将通过 `结果` 容器返回明确的错误信息,而非导致程序崩溃;
- 增强了前端错误拦截机制:
- 词法期严判:增强了词法分析器对特殊字符的过滤,现在遇到 `^`、`@`、`$` 等未定义操作符时会立即报错并终止,防止非法字符作为标识符流向后端;
- 编译期语义熔断:在自举编译器的语义分析与 IR 生成阶段,引入了严格的“错误熔断”机制。凡是遇到“未知标识符”、“未定义类型”或“越权成员访问”,编译器将立即调用 `终 1` 强制退出,彻底解决了之前错误 IR 泄露导致 LLVM 报错难懂的问题;
- 优化了链接时的文件锁处理:在自举驱动中增加了输出文件预删除逻辑,解决了 Windows 下因输出二进制文件被占用导致的链接挂起与 5~10 秒超时报错问题;
- **修复了 Arena 销毁时的挂起与堆损坏问题**:
- **结构体安全化**:为 `XTArena` 增加了 `XTObject` 头部,并设为“长生不老”状态,彻底解决了 ARC 引擎误将 Arena 句柄当作普通对象进行 `release` 导致的内存污染;
- **扩容算法重构**:优化了 Arena 的自动扩容逻辑,采用“头部锚定”策略,确保用户持有的原始句柄始终指向链表头,使得 `xt_arena_destroy` 能够百分之百回收所有扩容块;
- **实现了 Windows 全链路 UTF-8 路径支持**:
- 在运行时中增加了 `xt_utf8_to_utf16` 与 `xt_utf16_to_utf8` 转换原语;
- 将 `文件.读`、`文件.写`、`文件.存在?`、`xt_get_temp_path` 以及 `执()` 指令全面迁移至 Windows 原生宽字符 API(如 `_wfopen`, `_wstat64`, `GetTempPathW`);
- 解决了 Windows 环境下因 ANSI 编码强制转换导致的中文字符路径乱码及文件操作失败问题;
- 修复了命令行参数的引用计数泄漏:在 `xt_init_args` 初始化全局参数数组后,增加了缺失的 `xt_release` 调用,确保了进程启动阶段内存管理的严格平衡;
- 优化了自举编译器的相对路径解析:现在子模块的 `引` 路径将基于当前源文件所在目录进行解析,而非基于编译器的工作目录,显著提升了大型多层目录项目的组织灵活性;
- 优化了基准测试文案与反馈质量:
- 更新了性能测试文案,将原本的“循环性能测试”明确标注为“LLVM 闭式优化演示”,以准确传达编译器代数简化的优化效果;
- 补全了运行时所需的 `<sys/stat.h>` 与 `<sys/types.h>` 系统头文件,确保了 MinGW 环境下对 `_stat64` 等结构的编译兼容性;
- 补全了运行时里关于字符串取字节、数组切片和范围生成的底层函数;
- 修复了跨模块调用方法莫名其妙返回 `空` 的 Bug,原因是引入模块时漏掉了类定义的合并,现在已经修好了;
- 修复了生成的 IR 里中文字符串长度不对导致报错的问题,所有字符串常量现在都强行走 `.字节数` 计算,出来的长度百分之百精确;
- 修复了拼接符号(`&`)在自举环境下碰到 `空` 值会产生非法指令的隐蔽 Bug,并在拼接和插值时增加了明确的编译期警告;
- 修复了库引用失败时编译器继续运行产生级联报错的问题,现在会立即终止编译;
- 修复了 `XTResult` 结构体的 ABI 对齐问题:在 C 层增加了显式 `padding` 字段以匹配 x64 对齐要求,并同步修正了 LLVM IR 中的 GEP 索引,彻底解决了寻址错位导致的返回值丢失问题;
- **新增高精度计时原语 `时.微秒()`**:
- 在运行时层实现了基于 `QueryPerformanceCounter` (Windows) 和 `clock_gettime` (Linux) 的亚微秒级计时接口;
- 允许开发者通过微秒级数据更精准地评估代码段的性能,彻底告别“0 毫秒”误差;
- **[性能突破] 引入了局部整数脱壳优化 (Raw i64 Optimization)**:
- 对局部整数变量(如循环计数器)引入了基础类型推断,直接使用原生 `i64` 存储而非标记指针(Tagged Pointer);
- **零成本算术运算**:对于纯整数运算,跳过了繁琐的“脱壳-运算-装壳”流程,直接生成原生 LLVM 加减乘除指令;
- **ARC 消除 (Scalar ARC Elimination)**:
- 对识别为 `raw_i64`、`i1`(布尔)等标量类型的局部变量,彻底移除了读取时的 `xt_retain` 和赋值时的 `xt_release` 调用;
- **运行时加速**:在 `xt_retain/xt_release` C 函数内部增加了针对标记指针的快速返回路径,极大减少了无效的原子操作开销;
- **延迟装壳机制**:仅在整数“逃逸”到通用容器(数组/字典)或跨函数调用时才进行装壳转换,大幅提升了密集型循环的执行效率(预计提升 2-5 倍);
- **LLVM 闭式求解优化突破**:由于 `raw_i64` 与 **Scalar ARC 消除** 彻底净化了算术热点路径的 IR 表现(无装拆箱、无冗余原子操作调用),LLVM 优化器现在能将复杂的 10⁸ 次方级线性递推循环识别并压缩为闭式解。在 1 亿次迭代测试中,执行耗时仅为 **11 微秒**(约 27 次迭代开销),标志着玄铁的整数代码质量已达到能让 LLVM 进行深度代数简化的原生级别;
- **mem2reg 友好型 IR 生成**:通过消除标量类型的 `retain/release` 调用,确保局部变量的 `alloca` 地址不被外部函数引用,从而完美触发 LLVM 的 `mem2reg` 优化 pass,将局部变量全量提升至 SSA 寄存器,实现真正的内存 zero-copy 计算;
- **算术强度削减 (Strength Reduction)**:
- **取负优化**:针对标记指针(Tagged Pointer)的取负操作,由原本的 4 条指令(脱壳 -> 取负 -> 移位 -> 装壳)削减为 2 条原生指令:`sub i64 2, %val` 与 `or i64 %res, 1`。这一改进利用了标记指针的代数特性,大幅降低了单目运算的指令密度;
- **标量短路路径**:前端 AST 现在能识别已脱壳的 `raw_i64` 环境,直接生成最简化的原生算术 IR,不再盲目执行装拆箱操作;
## v0.16.5 (2026-04-24)
- 新增了核心网络和系统原语的支持,现在能直接用 `求`、`听`、`连`、`执`、`输` 这些高级货了;
- 补全了标准库里的一大堆常用方法,字符串的 `分割`、`替换`,数组的 `删`、`插`、`找`,字典的 `键`、`值`、`删` 都有了;
- 更新了语法分析器,现在能认出 `: 类型`、`|` 联合类型和 `?` 可空标记了,为以后的静态检查铺好了路;
- 更新了全局内建对象,`时`、`数学`、`文件` 这种常用的现在不用声明就能直接用了;
- 优化了异常处理,`捕捉` 块现在能拿到带 `.消息` 的错误对象了,不再是光秃秃的一个报错;
## v0.16.4 (2026-04-24)
- 更新了内存管理架构,让 ARC(原子引用计数)和 Arena 内存池能一起干活了,彻底解决了自举编译器编译自己时发生的堆损坏问题;
- 补全了运行时里的 `xt_retain` 和 `xt_release` 核心逻辑,现在程序跑完能自动把内存收回来了;
- 优化了工程稳定性,确认了开启 ARC 后自举编译器依然能稳稳当当地通过全量测试;
## v0.16.3 (2026-04-24)
- 新增了分号 `;` 作为语句分隔符,现在你想在一行里写好几条语句也没问题了;
- 补全了命令行参数支持,现在生成的程序能通过 `xt_get_args()` 拿到外边传进来的参数了;
- 优化了文档,把 `GUIDE.md` 里那些乱七八糟的 HTML 标签都删了,看着清爽多了;
- 修复了 Arena 里的字符串被误释放的 Bug,给 `XTString` 加了个 `data_in_arena` 标志位来防误杀;
- 修复了 64 位整数在不同平台上打印不统一的问题,现在都走标准格式了;
## v0.16.2 (2026-04-24)
- 更新了编译器架构,改成了更牛的三趟编译流程,解决了前向引用的问题,函数和类随便怎么写都能找到了;
- 优化了模块引入逻辑,加了 `程序缓存` 机制,不但编译变快了,还解决了循环引用时的状态同步问题;
- 优化了符号表隔离,现在 `引 ... 予 别名` 这种带命名空间的写法更稳了;
- 修复了 LLVM 后端符号命名的兼容性问题,所有全局符号都加了引号保护;
## v0.16.1 (2026-04-21)
- 新增了异步语法的全套解析,包括 `异步`、`等待` 和 `并行`;
- 优化了代码生成策略,目前采取“语法先行、同步降级”,保证了老代码在新版本上也能正常跑;
- 更新了测试基准,专门给 `等待` 和 `并行` 补了集成测试用例;
## v0.16.0 (2026-04-21)
- 新增了 `道` (Channel) 工厂函数,现在可以造带缓冲的并发通道了,顺便把 `发` 和 `收` 也做好了;
- 补全了显式类型转换,`整`、`小数`、`字` 这几个内建函数现在随叫随到;
- 更新了文件操作,`文件.读` 和 `文件.写` 现在都会返回 `结果` 容器,报错处理更优雅了;
- 优化了编译器后端,现在 `追加` 能根据类型自动选是给数组加还是给字节流加;
## v0.15.9 (2026-04-21)
- 新增了匿名函数支持,现在可以在表达式里随手写 `函(x) { ... }` 了;
- 新增了原生字节流类型 `字节` 和异步任务类型 `任务`,给以后的高性能并发打底;
- 补全了 `尝试 ... 捕捉` 的语法解析逻辑,离真正的异常捕获又近了一步;
- 修复了内置类型关键字不能当表达式前缀的 Bug,现在 `设 x = 字节` 这种写法合法了;
## v0.15.8 (2026-04-21)
- 新增了原生 JSON 支持,用 `化` 序列化,用 `解` 反序列化,速度贼快;
- 补全了模块化递归引入的支持,现在的 `引` 终于能像模像样地处理复杂的项目结构了;
- 优化了主函数返回逻辑,现在支持在顶层直接用 `返` 语句安全退出了;
- 修复了全局变量加载时的双重装箱 Bug,解决了跨模块调用时数值不对的怪事;
## v0.15.7 (2026-04-20)
- 更新了访问控制系统,正式支持 `公`、`私`、`护` 三种可见性,谁能看谁不能看现在编译器说了算;
- 优化了语义检查,现在编译器能自动推导变量的具体类型,还能顺着继承链递归找成员;
- 修复了 LLVM 生成时带类型标记寄存器的处理逻辑,转换指令现在出得更准了;
## v0.15.6 (2026-04-19)
- 新增了外部函数接口 `外`,现在能直接声明并调用 C 语言的函数了,比如 `外 函 printf(...)`;
- 更新了内存管理,集成了 Arena 分配器,把 AST 节点全丢进去管理,再也不怕循环引用导致的崩溃了;
- 补全了泛型语法的解析基础,虽然目前是类型擦除模式,但 `<T>` 这种写法已经全通了;
- 补全了接口定义 `口` 的解析逻辑,为以后的契约校验占好了坑位;
## v0.15.5 (2026-04-19)
- 新增了无限循环 `循` 语法,顺带把 `断` (Break) 和 `续` (Continue) 的多层嵌套逻辑也搞定了;
- 补全了针对数组、字符串和字典的统一 `遍历` 语法,写代码更顺手了;
- 补全了模式匹配 `匹配` 语句,支持字面量匹配和 `_` 通配符;
- 优化了分支结构,`若 ... 抑 ... 否` 的全路径现在都能生成正确的代码了;
- 修复了遍历变量顺序不统一的问题,现在全世界都用 `遍历 元素, 索引 于 容器`;
## v0.15.4 (2026-04-18)
- 更新了插值符号,全平台统一用 `#{ }`,看着漂亮也少歧义;
- 优化了类型编译流程,现在先收方法签名再编方法体,解决了类方法里没法实例化自己的问题;
- 优化了类型判断 `是` 的逻辑,现在走内容相等检查,字符串判断再也不会出错了;
- 修复了返回语句会误吞后面 `造` 表达式的严重 Bug;
- 修复了算术运算重载时的引用计数错误,告别了双重释放导致的崩溃;
## v0.15.3 (2026-04-18)
- 新增了字符串插值支持,`"#{表达式}"` 这种写法现在已经落地了,后台会自动帮你转成拼接逻辑;
- 补全了自举编译器源码里缺失的模块引用,现在模块化程度更高了;
- 修复了长字符串在 UTF-8 索引下可能被截断的问题,加了 `空` 值哨兵来保命;
## v0.15.2 (2026-04-18)
- 优化了算符优先级,把 `是` 操作符排到了正确的位置;
- 优化了动态分发,加了操作数类型预检,杜绝了给整数发字典消息导致的崩溃;
- 优化了返回指令检测算法,从 O(N) 优化到 O(1),编译大项目再也不卡了;
- 补全了代码生成里的自动转义逻辑,换行和引号现在都能正确变成 LLVM 常量了;
## v0.15.1 (2026-04-18)
- 新增了类继承 `承` 和方法重写 `覆` 的支持,玄铁的 OOP 终于像那么回事了;
- 优化了实例化流程,现在造对象时会递归初始化整条继承链上的属性;
- 更新了元数据处理,把成员列表扁平化了,查找效率提升了一大截;
- 修复了循环变量重名导致的 LLVM 符号冲突问题;
## v0.15.0 (2026-04-18)
- 新增了原生集合支持,数组 `[ ]` 和字典 `{ }` 的字面量、索引读写现在全部到位;
- 更新了面向对象基础,`型`、`造`、`此` 这些核心概念正式入驻自举编译器;
- 优化了解析器架构,引进了 Pratt Parsing 算法,嵌套的点号和方括号解析起来更稳了;
- 优化了 ARC 内存管理,在方法调用和字面量生成时加了更精细的引用计数控制;
- 修复了某些非法语法会导致编译器进死循环的问题,加了强制 Token 消费;
## v0.14.5 (2026-04-17)
- 新增了 `raw_i64` 内部类型,专门代表那些没被装箱的原始整数;
- 优化了算术运算性能,现在整数加减乘除直接在 CPU 寄存器里跑,不用再来回拆箱装箱了;
- 优化了循环计数器,遍历数组和字符串的时候快了不少;
- 更新了自动装箱逻辑,只有真正需要对象的地方才动手,平时能省就省;
## v0.14.4 (2026-04-17)
- 更新了技术白皮书,把 ARC 内存管理和底层类型规范都定死在文档里了;
- 修复了方法调用返回类型丢失的问题,现在链式调用更聪明了;
- 修复了作用域堆栈泄漏的严重漏洞,退层的时候彻底干净了,解决了内存重复释放的噩梦;
- 修复了自举源码里的指针转换错误,把 `inttoptr` 改成了正确的 `ptrtoint`;
- 修复了编译器入口逻辑,去掉了多余的词法分析调用,解决了输出为空的尴尬;
## v0.14.3 (2026-04-17)
- 新增了定长对象内存池,给字符串、数组这些小结构体安排了专属空闲链表;
- 优化了内存分配速度,尽量从池子里拿,减少了系统调用的开销;
- 更新了分配安全策略,拿出来的对象先洗干净(`memset`),防止脏数据捣乱;
## v0.14.2 (2026-04-17)
- 修复了 ARC 在处理方法参数时的双重释放问题,内存更安全了;
- 修复了实例字段未初始化导致的段错误,现在统一用 `calloc` 保证全零;
- 修复了自举源码里对字典错误调用 `.键()` 的问题,现在都老老实实用 `遍历` 了;
## v0.14.1 (2026-04-17)
- 更新了 `引` 关键字的语义说明,现在更像 C 语言的 `#include`,直接把符号拉进当前作用域;
## v0.14.0 (2026-04-13)
- 更新了项目结构,正式确立 `xuantie_compiler` 为自举源码库,开启了“玄铁编玄铁”的新纪元;
- 更新了代码架构,为了生成 LLVM IR 对原有的解释器原型进行了模块化大重构;
## v0.13.4 (2026-04-12)
- 新增了原生字典支持,哈希表性能杠杠的,支持字面量和索引访问;
- 补全了原生文件 I/O,`文件.读` 和 `文件.写` 终于能用了;
- 补全了数组的 `.长度` 和字典的 `.大小` 属性;
- 优化了 `成功` 和 `失败` 的语法限制,现在能直接用在模式匹配里了;
## v0.13.3 (2026-04-12)
- 新增了标记指针技术,整数、布尔和空值实现了零分配存储,性能飞起;
- 新增了原子引用计数,引入了 `stdatomic.h`,给以后高并发打好了地基;
- 优化了 ARC 插入时机,编译器会自动在变量退出作用域时补上 `release`;
- 优化了位运算,直接在 Tagged 级别操作,省去了转换时间;
## v0.13.2 (2026-04-12)
- 新增了对运算符重载的支持,`_加_`、`_减_` 这些魔术方法现在能接管原生符号了;
- 补全了面向对象在 LLVM 后端的落地,字段存储和方法调用全通了;
- 更新了 `Result` 类型,原生支持 `成功()` 和 `失败()` 的代码生成;
- 更新了运行时接口,统一了本地对象的字符串转换逻辑;
## v0.13.1 (2026-04-11)
- 补全了字符串和集合的一大堆高级方法,像 `.索引()`、`.重复()`、`.包含?` 之类的全都有了;
- 更新了数学库,加入了最大值、最小值和范围随机数;
- 更新了标准库模块,新增了 `字符串` 模块来处理字节转换;
## v0.13.0 (2026-04-11)
- 新增了 `覆` 关键字,重写方法必须显式声明,防止手抖;
- 新增了原生测试支持,有了 `测试` 关键字和断言系统,写代码更有底气了;
- 补全了文档注释支持,`///` 后面的内容现在能被工具链提取出来了;
- 优化了错误对象,`捕捉` 块现在能拿到带消息和堆栈的完整对象了;
## v0.12.0 (2026-04-11)
- 补全了 `结果` 容器的链式方法,`.映射()`、`.解包()` 用起来非常丝滑;
- 补全了数组排序、去重和字典合并等常用集合功能;
- 更新了文件系统操作,现在能处理路径合并和目录遍历了;
- 优化了基础类型表现,字符串支持大小写转换,数学库也更全了;
## v0.11.6 (2026-04-11)
- 补全了类内存布局在 LLVM 后端的初步实现;
- 更新了匹配语句的指令生成,原生执行更快了;
- 更新了语法对齐,后端现在也支持解构遍历和复杂赋值了;
## v0.11.5 (2026-04-10)
- 新增了字典解构遍历,`遍历 键, 值` 这种写法终于支持了;
- 更新了类型转换规则,`整()` 和 `小数()` 统一返回 `结果` 类型,安全第一;
- 补全了字符串的 `.修剪()` 方法;
## v0.11.4 (2026-04-10)
- 新增了模式匹配语法,值匹配、类型匹配和通配符分支全支持了;
## v0.11.3 (2026-04-10)
- 新增了字符串插值,`"#{表达式}"` 这种写法极大地解放了双手;
- 补全了数学库、字典方法和类型转换等一大波基础功能;
- 更新了对象系统,正式支持 `此` 关键字;
- 更新了 FFI,现在加载外部库能返回更详细的 `结果` 了;
## v0.11.2 (2026-04-06)
- 补全了循环语句、本地函数和递归调用在 LLVM 后端的支持;
- 更新了逻辑运算,`且`、`或`、`非` 都能直接生成高效的机器码了;
## v0.11.1 (2026-04-06)
- 补全了 `若` 分支和基础控制流在后端的支持;
- 更新了类型系统,支持了 `逻` 和 `小数` 的本地存储;
- 优化了运行时,初步搞定了字符串的内存管理;
## v0.11.0 (2026-04-06)
- 新增了 LLVM IR 生成器,玄铁从此有了真正的原生后端;
- 新增了 ARC 自动引用计数,摆脱了对 Go 运行时的内存依赖;
- 更新了编译器,开启了用玄铁重写玄铁的自举征程;
## v0.10.0 (2026-04-06)
- 新增了自动类型推导,声明变量不用再写一大串类型名了;
- 优化了泛型推导,造对象的时候能根据参数自动猜出 `<T>` 是啥;
- 优化了 FFI 接口,为对接原生运行时做好了准备;
## v0.9.x 及更早版本
- 补全了模块化命名空间支持,实现了 `引 ... 予 别名`;
- 补全了泛型定义、泛型约束和契约式接口;
- 补全了联合类型和 `?` 空安全标记;
- 更新了标准库,加入了网络原语(`连`、`听`、`求`)和系统原语(`执`、`道`);
- 优化了语法,开启了单字关键字大变革,把 `打印` 变成了 `示`;
- 修复了循环引用检测、路径解析等一大堆早期原型阶段的 Bug;