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
:typereal 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
这件事表面上只是"中文错误消息",实际意义更深。
它至少带来四层价值:
-
- 错误码保持稳定 :
KLX101不会因为语言切换而变化;
- 错误码保持稳定 :
-
- 消息本地化:用户读到的是中文或英文;
-
- hint 也本地化:不是只翻译标题,而是连修复建议一起翻译;
-
- 编译器诊断路径结构化:错误码、参数、模板、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 |
基础设施闭环 |
这四个版本连起来,几乎就是一条"语言成熟度曲线":
-
- 先强内核:类型系统要可信;
-
- 再强工程:项目级检查、CI、增量编译要稳定;
-
- 再强体验:IDE、REPL、Debug、WASM 要现代;
-
- 最后收口生态:包管理、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 的重点包括:
-
- LSP 重构动作:rename、codeAction、提取函数、内联变量;
-
kylix doc代码示例提取;
-
kylix bench内存分配报告;
-
iter迭代器模块;
-
- 类方法外部定义修复。
这说明 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 doc和kylix bench是否从"有命令"走向"真正好用"; -
• 发布流程是否补齐 tag、go.sum 与 CI 完整闭环。
Kylix 的故事已经进入第二阶段:
不是证明"我能做出来",而是证明"我能长期做好"。
这,才是一门语言最难、也最值得期待的部分。