0. 版本介绍
本版本为Cangjie语言LTS 1.0.0版本的更新版本(LTS版本定义及维护周期详见仓颉社区版本生命周期管理规范,版本号为Cangjie 1.0.4,主要解决部分发现的Bug,以及对某些功能进行优化。版本包含了仓颉应用开发必须的能力,包括编译器,运行时,标准库,和工具链。欢迎各位开发者使用,如有任何问题,欢迎在Cangjie社区提出issue,我们会第一时间处理。以下介绍本版本相比LTS 1.0.3版本的更新。
1. 语言特性
无特性新增。
2. 编译器
本版本仅修复问题,无特性新增。修复问题如下:
- 【issue-105】let变量在lambda中被赋值了两次,未编译报错
- 【issue-2591】当同一个包不同文件中存在同名私有函数时,无法编译
- 【issue-2533】项目cjpm build -g编译失败,cjpm test --coverage编译崩溃,报错Error Code: 13
- 【issue-2565】【缺陷】Option
作为返回值时,当T为Array,ArrayList时,多层API调用时返回值不对
3. 运行时
本版本仅修复问题,无特性新增。修复问题如下:
- 【issue-2395】新项目MacOS26报SG_READ_ONLY缺失,修复MacOS26编译失败问题
- 【issue-2649】在运行GC场景中,长时间压测情况下,偶现cangjie进程卡死现象问题解决
4. 标准库
本版本仅修复问题,无特性新增。修复问题如下:
- 【issue-2242】修复在Timer的定时任务中调用cancel()时后不能以预期的方式取消的问题
- 【issue-2408】修复TreeMap和TreeSet中出现同一key值多次出现的问题
5. 工具链
1 IDE插件
本版本仅修复问题,无特性新增。修复问题如下:
- 【issue-1961】codeArts编译错误信息的中文内容显示为
- 【issue-6】codeArts编译错误信息的中文内容显示为乱码
2 cjpm
新增支持lto-combined功能,详情请参见工具指南。
本版本修复问题如下:
- 【issue-2373】优化cjpm init报错信息
- 【issue-2650】交叉编译场景下,cjpm宏包依赖出现错误
3 cjdb
无变化。
4 cjfmt
本版本仅修复问题,无特性新增:修复问题如下:
- 【issue-2385】cjfmt文档缺少cangjie-format.toml配置的介绍
5 cjlint
本版本仅修复问题,无特性新增:修复问题如下:
- 【issue-2433】cjlint的G.VAR.02规则误报,预期无警告
6 cjcov
无变化。
7 cjprof
无变化。
8 cjtrace-recover
无变化。
6. 遗留问题
windows下编译cjpm test报错
【问题现象】windows下编译cjpm test,提示找不到openssl相关的动态库错误。
【规避措施】手动增加cjpm test时的-L地址。
在lambda body 体内修改lambda 参数,编译崩溃
【问题现象】在lambda body体内误修改lambda 参数,可能会导致 ICE,ErrorCode 为12。
【规避措施】不要错误的在lambda body体内修改lambda 参数
调用被扩展的接口函数的部分场景会导致运行时崩溃的问题
【问题现象】当存在一个泛型类 A 扩展了某个泛型接口 I,且存在另一个非泛型类 B 继承了实例化版本的类 A,将 B 的实例赋值给 I 类型变量且调用接口 I 函数时可能导致运行时崩溃。 样例:
interface I<T> {
func foo() {}
}
open class A<T> {}
extend<T> A<T> <: I<T> {}
class B <: A<Int64> {}
main() {
let i: I<Int64> = B()
i.foo() // 此处调用会发生运行阶段崩溃
return 0
}
【规避措施】 方案一:若类 A 定义在本包,可以不使用扩展,通过 A 直接继承接口 I 以规避该问题。 规避样例:
interface I<T> {
func foo() {}
}
open class A<T> <: I<T> {} // 使 A 继承 I
open class B <: A<Int64> {}
main() {
let i: I<Int64> = B()
i.foo()
return 0
}
方案二:若类 A 是导入自其它包,可以将类B定义为泛型类以规避该问题。 规避样例:
import pkgA.A
interface I<T> {
func foo() {}
}
extend<T> A<T> <: I<T> {}
open class B<T> <: A<T> {} // 将类 B 定义为泛型类
main() {
let i: I<Int64> = B<Int64>()
i.foo()
return 0
}
7. 文档变更说明
开发指南
- 程序结构章节新增说明:函数和lambda中的静态成员变量赋值,编译器无法判断函数或者lambda是否会被执行,因此采用保守策略,即编译报错。
- 普通try表达式中新增说明:当在try块中可能发生内存溢出错误时,应避免在catch或finally块中执行任何内存分配操作,以免再次触发溢出并导致未定义行为。一旦检测到内存溢出,建议在catch块中立即终止程序(例如调用exit函数),以确保系统稳定性并防止进一步错误。
- 新增编译选项--compile-as-exe相关内容。
标准库API
- 无变化。
工具指南
- 格式化工具cjfmt章节新增说明:CANGJIE_HOME环境下的默认格式化工具配置文件路径为CANGJIE_HOME/tools/config。
- cjpm工具中的模块配置文件说明增加支持工程级LTO相关说明。