Kylix v2.3.0 深度解析:开发者体验全面升级 + WebAssembly 后端登场

Kylix 连续观察 · 第二十三篇

项目地址:https://github.com/astra-zhao/kylix\\

版本聚焦:v2.4.0

关键词:i18n、REPL、SetLength、包管理器、lockfile、纯 Kylix 标准库、Roadmap


如果说上一篇,也就是第二十二篇,我们看到的是 Kylix v2.3.0 在开发者体验上的集中爆发 :LSP 增量同步、REPL 补全、测试 fixture、i18n 框架、Delve 调试、WASM 后端,那么这一次的 v2.4.0,就明显不是继续堆功能。

它更像一次"收口"。

v2.3.0 搭好了许多基础设施:有了 i18n 包,但尚未全面接入编译器错误路径;有了 REPL :type 命令,但还停留在偏字面量级别的推断;有了更现代的工具链姿态,但包管理器还缺少嵌套依赖与锁文件;标准库 Kylix 化已经进入 Phase 1、Phase 2,但还需要继续证明:Kylix 不只是能写编译器,也能写自己的常用库。

于是 v2.4.0 的主题非常清晰:

Polish & Ecosystem:完善与生态。

这次更新的价值,不在于"又多了几个命令",而在于把前几版已经搭出来的能力真正接入主干,让 Kylix 从"功能可见"走向"体验可信"。


一、先看结论:v2.4.0 是一次工程闭环

从 README、CHANGELOG、ROADMAP 三份核心文档看,当前 Kylix 已经推进到 v2.4.0

这次更新的主线可以概括为五件事:

模块 v2.4.0 变化 本质意义
i18n 全面接入 typecheck 错误与 hint 从"有翻译包"变成"用户真的能看到中文错误"
REPL :type 接入真实类型推导 从"玩具式提示"变成"编译器级推断"
SetLength 修复 nil / 增长 / 截断 / 置零场景 补齐动态数组语义正确性
包管理器 支持嵌套依赖与 kylix.lock 生态工程化开始成型
标准库 Phase 3:stringbuilder + resulttype 纯 Kylix stdlib 覆盖扩大到 45 个函数/方法

如果用一句话概括:

v2.3.0 让 Kylix 更像一门现代语言;v2.4.0 则让 Kylix 更像一个可以被认真使用的生态系统。

这就是本次版本的核心判断。


二、README 的变化:v2.4.0 被放到项目门面中心

README 是一个项目的门面。

Kylix 当前 README 顶部已经明确写出:

v2.4.0 Release: Polish & ecosystem --- i18n fully integrated, REPL :type real inference, SetLength fixed, package manager nested deps + lockfile, stdlib Phase 3。

这句话很关键。

过去 README 更多是在展示 Kylix 是什么:

  • • 现代 Pascal;

  • • 编译到 Go;

  • • 支持 IDE 工具链;

  • • 支持 Web 框架、ORM、模板、配置、JSON、正则、日期时间等标准库能力。

而现在,README 的开头开始承担"版本叙事"的角色:它告诉新用户,当前 Kylix 已经不是早期语法演示,也不是单纯转译器,而是进入了 v2.x 的完善阶段。

1. 版本徽章更新到 2.4.0

README 中的版本徽章已经更新到 2.4.0

这代表主线文档正式承认 v2.4.0 是当前版本。虽然仓库 tag 当前仍未完整看到 v2.3.0 / v2.4.0 的发布标签,这一点后续发布流程还可以补齐,但文档层面已经完成版本推进。

2. 自举编译器仍是核心叙事

README 的项目结构依然保留 src/ 目录下的自举编译器源码:

  • token.klx

  • ast.klx

  • lexer.klx

  • parser.klx

  • generator.klx

  • error.klx

  • main.klx

这提醒我们:Kylix 的故事不是"写一个编译到 Go 的玩具语言",而是 用 Kylix 写 Kylix 编译器

这条自举主线从早期 Phase 8、Phase 9 一直延伸到现在,已经成为整个项目最有辨识度的技术标签。

3. README 已经从"语言介绍"变成"生态首页"

现在 README 覆盖的范围非常完整:

  • • 基础 Pascal 特性;

  • • 类型推导、泛型、泛型约束、Lambda、Async/Await、Pattern Matching;

  • • class / interface / property;

  • • CLI、LSP、REPL;

  • • Web、DI、Config、Middleware、Validation、ORM、Template;

  • • sysutil、jsonutil、datetime、regex;

  • • Cross-platform compilation。

也就是说,README 的叙事已经从"语言语法说明"扩展成了:

语言 + 工具链 + 标准库 + 应用框架 + 生态路线图。

这也解释了为什么 v2.4.0 要补包管理器、lockfile 和标准库 Phase 3:当 README 展示的是完整生态时,底层工程能力必须跟上。


三、CHANGELOG 的核心变化:不是散装更新,而是五个补强点

CHANGELOG 是本次分析最关键的文件。

v2.4.0 的记录非常清楚:它不是随意加功能,而是完成 v2.3.0 的基础设施后续接入。

下面逐项拆开。


四、i18n 全面接入:从"能翻译"到"真的翻译"

v2.3.0 已经引入 pkg/i18n/,提供了:

  • • 21 个错误码;

  • • 中英双语翻译;

  • • hint 翻译;

  • KYLIX_LANG 环境变量识别。

但当时 CHANGELOG 也写得很坦诚:i18n 包虽然 ready,但完整接入 typecheck 和 printDiagnostics 会在 v2.4 完成。

现在,v2.4.0 把这件事补上了。

新的体验是:

复制代码
KYLIX_LANG=zh kylix check broken.klx

可以输出类似:

复制代码
error[KLX101]: 无法将 String 字面量赋给类型为 'Integer' 的变量
  = help: 使用 StrToInt(s) 或 StrToInt64(s) 把 String 转为 Integer

这件事表面上只是"中文错误消息",实际意义更深。

它至少带来四层价值:

    1. 错误码保持稳定KLX101 不会因为语言切换而变化;
    1. 消息本地化:用户读到的是中文或英文;
    1. hint 也本地化:不是只翻译标题,而是连修复建议一起翻译;
    1. 编译器诊断路径结构化:错误码、参数、模板、fallback 机制开始稳定。

这比简单地写一句 fmt.Sprintf("中文错误") 高级得多。

稳定错误码意味着未来可以被 IDE、CI、文档、搜索、AI 辅助修复共同引用。例如:

  • • LSP 可以根据 KLX101 给 code action;

  • • 文档可以按错误码建立索引;

  • • CI 可以统计某类错误出现频率;

  • • 社区问答可以围绕错误码沉淀知识。

所以,i18n 的真正价值不只是"中文化",而是:

诊断系统产品化。


五、REPL :type 真正类型推导:交互环境终于接上编译器大脑

v2.3.0 已经加入了 REPL 的 :type / :t 命令,但当时的已知限制是:它更偏 literal-only inference。

v2.4.0 改成了真实推导:

复制代码
kylix> :type 1 < 2       → Boolean
kylix> :type 3.0 + 4     → Real
kylix> :type GetAge()    → Integer

背后的关键变化,是新增导出的:

复制代码
compiler.InferType(program, expr)

REPL 的 showType() 会把用户输入包装成探针变量,例如:

复制代码
__probe := 

然后交给完整推导引擎处理。

这比"在 REPL 里手写一套猜类型逻辑"要正确得多,因为它复用了编译器的类型系统。

这件事的意义有三层。

1. 对用户:REPL 不只是执行器,而是学习工具

用户在 REPL 里不只是执行代码,还可以探索类型。

对于一门带有类型推导、泛型、数组、函数返回类型的语言来说,:type 是非常重要的学习工具。

2. 对架构:类型推导能力被封装成公共 API

以后不仅 REPL 能用,LSP hover、completion、code action、doc 示例检查都有机会复用这个能力。

3. 对生态:第三方工具可以共享编译器能力

当 Kylix 以后出现第三方工具,例如:

  • • 格式化检查器;

  • • 静态分析器;

  • • 在线 playground;

  • • 教学网站;

  • • AI 辅助编码插件;

它们也可以围绕统一的类型推导入口构建能力。

这就是 v2.4.0 的典型特征:

不是为了一个小功能临时补逻辑,而是把内部能力抽象成可复用基础设施。


六、SetLength 修复:一个小内建函数,背后是语言正确性的态度

这次修复的 SetLength 看似很小,但对 Pascal 系语言来说,它非常关键。

旧问题是:

复制代码
var arr: array of Integer;
arr := nil;
SetLength(arr, 3);  // 以前可能 panic

v2.4.0 后支持:

复制代码
SetLength(arr, 3);  // nil → 长度 3
SetLength(arr, 1);  // 截断
SetLength(arr, 0);  // 清空

实现方式也很有意思:生成器里新增 needsSetLength 标志和 Go 泛型 helper:

复制代码
__kylixSetLength[T any]

当代码里用到:

复制代码
SetLength(arr, n)

生成器会转成:

复制代码
arr = __kylixSetLength(arr, int(n))

这解决了 Go slice 与 Pascal 动态数组语义之间的差异。

为什么这重要?

因为语言设计里最怕的是:

看起来支持,关键场景崩。

动态数组、nil、增长、截断、置零,都是用户会自然写出来的代码。如果这些基础语义不稳定,用户对语言的信任会快速下降。

所以 SetLength 修复不是一个"边角料 bugfix",而是 Kylix 在补齐 Pascal 语义一致性。

这也回应了 v2.2.0 的 Known Limitations:当时明确写着 SetLength builtin only grows existing slices;现在 v2.4.0 正面把这个限制关掉了。


七、包管理器支持嵌套依赖与 lockfile:生态系统开始有"确定性"

v1.5.0 时,Kylix 已经引入包管理器雏形。

v2.4.0 则让它更像一个真正可用的生态工具。

新能力包括:

  • installGit() 克隆后读取包内 kylix.toml

  • • 解析 nested [dependencies]

  • • 递归安装嵌套依赖;

  • • 已安装依赖自动跳过;

  • • 生成 kylix.lock

  • • lockfile 记录 dependency ref 与 git SHA;

  • Add() / InstallAll() / Remove() 都会更新 lockfile。

示例:

复制代码
kylix add mylib github.com/user/mylib@v1.0.0

生成:

复制代码
[dependency "mylib"]
ref = "github.com/user/mylib@v1.0.0"
sha = "abc123def456..."

这一步非常关键。

因为包管理从来不只是"能下载"。真正的问题是:

  • • 今天能构建,明天还能不能构建?

  • • 我的依赖有没有被悄悄更新?

  • • 团队里每个人拿到的是不是同一份依赖?

  • • CI 环境和本地环境是否一致?

kylix.lock 给出的答案是:尽可能一致。

这让 Kylix 从"语言项目"开始迈向"生态项目"。没有包管理器,标准库之外的扩展能力很难繁荣;没有 lockfile,包管理器很难进入严肃项目。

所以 v2.4.0 这一项,虽然没有 LSP / WASM 那么醒目,但它的长期价值极高。


八、stdlib Phase 3:Kylix 正在用 Kylix 写自己的日常能力

v2.1.0 开始,Kylix 标准库进入 Kylix 化:

  • • Phase 1:strutil + mathutil

  • • Phase 2:arrayutil + collections

  • • Phase 3:stringbuilder + resulttype

v2.4.0 新增两个纯 Kylix 模块。

1. stringbuilder.klx

提供 TStringBuilder

方法 作用
Append(s) 追加字符串
AppendLine(s) 追加字符串并换行
Clear() 清空
Length() 返回总长度
ToString() 输出最终字符串

这是非常典型的基础工具模块。

它看起来不复杂,但适合证明 Kylix 的 class、method、string 操作、状态维护是否顺畅。

2. resulttype.klx

提供类似 Result 的错误处理模式:

成员 作用
TResult.Unwrap() 成功则取值,否则 panic
TResult.UnwrapOr(fallback) 失败时返回 fallback
TResult.ErrorMsg() 获取错误信息
Ok(value) 创建成功结果
Err(msg) 创建失败结果
SafeDiv(a, b) 示例:安全除法

这个模块的意义比 StringBuilder 更进一步:它开始探索更现代的错误处理风格。

Pascal 传统上偏异常机制;现代语言生态里,Result / Option 风格越来越常见。Kylix 引入 resulttype,说明它并不只是复刻 Pascal,而是在 Pascal 清晰语法基础上吸收现代工程实践。

3. 累计覆盖:45 个纯 Kylix 函数/方法

截至 v2.4.0,纯 Kylix 标准库覆盖:

模块 阶段 函数/方法数 测试数
strutil v2.1 8 8
mathutil v2.1 12 10
arrayutil v2.2 8 8
collections v2.2 6 5
stringbuilder v2.4 5 4
resulttype v2.4 6 4
合计 45 39

这个数字很漂亮:45 个纯 Kylix 函数/方法,39 个 Kylix 级测试。

它说明 Kylix 的自举叙事已经从"编译器能自举"扩展为:

标准库也在逐步自举。


九、连续对比:v2.x 主线越来越清晰

把最近几版放在一起看,Kylix 的演进路径非常规整。

版本 主题 代表能力 核心价值
v2.1.0 增强类型系统 + stdlib Phase 1 多参数泛型约束、接口实现验证、类型推导、strutil/mathutil 语言内核增强
v2.2.0 工程质量 + stdlib Phase 2 CI/CD、签名验证、项目级类型检查、增量编译、arrayutil/collections 生产可用性提升
v2.3.0 开发者体验 LSP 增量同步、REPL、测试 fixture、i18n 框架、Debug、WASM 工具链现代化
v2.4.0 完善与生态 i18n 全接入、真实 :type、SetLength、lockfile、stdlib Phase 3 基础设施闭环

这四个版本连起来,几乎就是一条"语言成熟度曲线":

    1. 先强内核:类型系统要可信;
    1. 再强工程:项目级检查、CI、增量编译要稳定;
    1. 再强体验:IDE、REPL、Debug、WASM 要现代;
    1. 最后收口生态:包管理、lockfile、stdlib Kylix 化、i18n 接入要闭环。

这比单纯"想到什么做什么"的开源项目更有规划感。


十、ROADMAP 的最大变化:从分散规划合并为主线地图

这次 ROADMAP 变化非常值得单独说。

ROADMAP_v2.1+.md 被删除,内容合并到了 ROADMAP.md

这不是简单的文档整理,而是项目治理上的一次 单一事实源 整理。

以前如果同时存在多个 Roadmap 文件,就容易出现:

  • • 一个文件说 v2.3 进行中,另一个说已完成;

  • • 一个文件规划 v2.5,另一个忘了更新;

  • • README、CHANGELOG、ROADMAP 三者叙事不一致。

现在主 ROADMAP 统一承载:

  • • 当前版本:v2.4.0;

  • • 下一步:v2.5.0;

  • • v2.1 到 v2.4 的完成情况;

  • • v2.5、v2.6、v3.0 的未来规划;

  • • 剩余已知问题;

  • • 文档缺口;

  • • 社区与生态计划;

  • • 历史阶段存档。

这种整理非常有必要。

一个语言项目越往后走,技术本身只是一部分,路线图的可信度也会成为用户判断"这个项目是否长期可投入"的重要依据。


十一、下一站 v2.5:工具链深化

当前 ROADMAP 标注:

  • • v2.4.0:完善与生态,已完成;

  • • v2.5.0:工具链深化,计划中,目标 2026-07;

  • • v2.6.0:性能与优化,计划中,目标 2026-08;

  • • v3.0.0:LLVM 后端 + 包注册中心,长期目标,2026-Q4。

v2.5.0 的重点包括:

    1. LSP 重构动作:rename、codeAction、提取函数、内联变量;
    1. kylix doc 代码示例提取;
    1. kylix bench 内存分配报告;
    1. iter 迭代器模块;
    1. 类方法外部定义修复。

这说明 v2.5.0 的定位不是"大而全的新特性",而是对 v2.3 / v2.4 工具链基础设施的继续深化。

尤其是 LSP rename / codeAction 与外部类方法定义修复,非常关键:

  • • rename / codeAction 决定 IDE 是否真的好用;

  • • 外部类方法定义修复决定 Pascal 风格语法是否完整;

  • • iter 模块决定标准库是否走向更函数式、更现代的集合处理能力;

  • • doc / bench 增强决定工具链是否更适合真实项目维护。

换句话说,v2.5.0 会继续沿着"好用"这个方向前进。


十二、v2.6 与 v3.0:性能优化与架构突破已经进入视野

ROADMAP 中 v2.6.0 聚焦性能:

  • • 并行编译;

  • • 常量传播;

  • • 死代码消除;

  • • LSP 大文件性能基准。

这说明 Kylix 已经开始准备从"能用"进入"更快、更稳、更可规模化"。

而 v3.0.0 的规划则更具野心:

  • • LLVM 原生后端;

  • • 包注册中心服务端;

  • • stdlib 完全 Kylix 化 Phase 4+;

  • • WASI 支持。

其中 LLVM 后端尤其值得关注。

Kylix 当前的策略是编译到 Go,这带来了很大的工程优势:复用 Go 工具链、跨平台、WASM、调试能力。

但 LLVM 后端意味着未来 Kylix 可能拥有不依赖 Go runtime 的原生二进制输出。

这会带来:

  • • 更小二进制;

  • • 更直接的优化链路;

  • • 更强的语言自主性;

  • • 当然,也会带来更复杂的后端维护成本。

因此,v3.0 不是 v2.x 的自然小升级,而是一次架构跃迁。


十三、也要客观看到:还有几个工程细节需要收口

这次更新整体很扎实,但作为连续观察,也应该指出几个后续可以继续优化的地方。

1. 发布 tag 需要补齐

文档已经到 v2.4.0,但 git tag 当前未完整看到 v2.3.0 / v2.4.0。

对于开源项目来说,tag 是用户下载、审计、回溯版本的重要锚点。

建议后续发布流程保持完整闭环:

  • • CHANGELOG 更新;

  • • README 版本更新;

  • • ROADMAP 更新;

  • • git tag;

  • • GitHub Release;

  • • CI release workflow。

2. go.sum 依赖完整性需要整理

我本地执行:

复制代码
go test ./...

多数核心包通过,包括:

  • generator

  • lexer

  • parser

  • pkg/compiler

  • pkg/docgen

  • pkg/formatter

  • pkg/i18n

  • pkg/lsp

  • pkg/pkgmgr

  • pkg/testrunner

  • token

但整体测试因为缺少部分 go.sum 依赖条目失败,涉及:

  • github.com/peterh/liner

  • github.com/go-sql-driver/mysql

  • github.com/lib/pq

  • github.com/mattn/go-sqlite3

这不是 v2.4.0 功能逻辑本身失败,而是依赖校验文件没有完整覆盖当前 import。

后续建议通过 go mod tidy 补齐,并确保干净 clone 后 go test ./... 可直接通过。

3. 文档任务编号可以更严谨

CHANGELOG 中 v2.4.0 的任务编号是 Task 1、2、3、5、6,中间没有 Task 4。

这可能只是开发过程中的任务调整遗留。对用户来说影响不大,但从文档精致度角度,后续可以考虑补一行说明,或者标注 Task 4 deferred。

这些都不是方向问题,而是成熟项目必经的精修。


十四、这次更新最值得夸的三件事

第一,v2.4.0 没有贪多,而是兑现 v2.3.0 的承诺

v2.3.0 引入 i18n 框架,v2.4.0 接入 typecheck;v2.3.0 加 :type,v2.4.0 改真实推导。

这种"上一版打地基,下一版补闭环"的节奏很健康。

第二,包管理器进入确定性构建阶段

嵌套依赖 + lockfile 是生态系统的基本骨架。

有了它,Kylix 未来才可能走向包注册中心、社区库、企业项目。

第三,stdlib Kylix 化越来越像长期主线

从 strutil / mathutil 到 arrayutil / collections,再到 stringbuilder / resulttype,Kylix 正在用自己的语言写自己的标准库。

这比单纯"编译器自举"更贴近日常开发,也更能暴露语言短板。


十五、总结:Kylix 正在从"语言项目"变成"语言生态"

回看 Kylix 近期演进,很容易发现它已经不再只是一个编译器仓库。

它有语言:Pascal 风格语法 + 现代特性。

它有编译器:Go 后端、自举验证、类型检查、错误码。

它有工具链:CLI、LSP、REPL、test/doc/bench/debug。

它有部署目标:跨平台原生、WASM、TinyGo。

它有标准库:从 Go stdlib 包装到纯 Kylix 模块。

它有生态雏形:包管理器、嵌套依赖、lockfile。

它有路线图:v2.5 工具链深化、v2.6 性能优化、v3.0 LLVM + 包注册中心。

这就是 v2.4.0 最重要的意义:

它把 Kylix 从"功能演示型语言"继续推向"可持续演进的语言生态"。

第二十二篇我们说,v2.3.0 是开发者体验全面升级。

第二十三篇可以接着说:

v2.4.0 是 Kylix 对自己工程承诺的一次兑现。它没有制造噱头,而是把错误诊断、交互推导、动态数组语义、依赖管理和标准库自举这些关键细节一项项补实。

这类更新,短期看不一定最炸裂,但长期看最重要。

因为语言项目真正走向成熟,靠的从来不是某一个惊艳 demo,而是无数个"本来就应该正确"的细节终于正确。

Kylix v2.4.0,正是这样一个版本。


结尾:下一篇该看什么?

如果 v2.5.0 按 ROADMAP 推进,那么下一篇最值得关注的将是:

  • • LSP rename / codeAction 是否真正落地;

  • iter 是否让 Kylix 标准库进入更现代的集合处理模式;

  • • 外部类方法定义修复是否补齐 Pascal 风格开发体验;

  • kylix dockylix bench 是否从"有命令"走向"真正好用";

  • • 发布流程是否补齐 tag、go.sum 与 CI 完整闭环。

Kylix 的故事已经进入第二阶段:

不是证明"我能做出来",而是证明"我能长期做好"。

这,才是一门语言最难、也最值得期待的部分。