20240749仓颉更新说明-Cangjie 0.53.4

0. 版本介绍

该版本点分式版本号为Cangjie 0.53.4 。该版本条件编译语法进行了变更,对包管理重新设计,支持Unicode标识符,字符、字符串语法有变更,Char关键字改成Rune,删除自动微分语法;上下文感知宏API命名风格变更,udp支持ipv6地址,DateTime类型支持序列化和反序列化,提供了统一日志接口类,支持运行时注入logger实例;包管理工具适配了新包管理编译构建,调试器表达式计算支持场景更多;移除仓颉Tensor Boost,修复了若干bug,感谢各位开发者反馈。

1. 语言特性

Feature

  • 条件编译语法变更
  1. @When[...] 作为一种编译标记只能用于声明节点​和导入节点。


  2. @When[...] 作为一种编译标记,在导入前处理,由宏展开生成的代码中含有 @When[...] 会编译报错。


  3. 内置debug变量含义明确为启用调试模式即启用-g.


  4. 新增内置条件变量test即编译时启用测试模式即启用--test


  5. os字面量取值由目前的”windows”,”linux”按照官方风格命名变更为”Windows”,”Linux”


  6. 原有的 when block语法已不允许使用


  7. 自定义条件编译选项 –conditional-compilation-config=”(feature=lion, tar=dsp)” 变更使用为



    • --cfg="feature=lion, tar=dsp" 键值对格式设置.

    • 在默认路径下搜索或通过 --cfg="" 设定的目录路径下搜索配置文件 cfg.toml, 读取 cfg.toml中的自定义编译条件配置键值对(k=”v”)


    详情可参考用户手册


  • Unicode标识符支持
    Cangjie 允许使用 Unicode 字符作为标识符,具体语法描述如下:



    • 由 XID_Start 字符开头,后接任意长度的 XID_Continue 字符

    • 由一个_开头,后接至少一个 XID_Continue 字符


    其中 XID_Start, XID_Continue是 Unicode 标准 规定的字符属性。Cangjie 使用的 Unicode 标准为15.0.0。


  • 关键字 Char 改为 Rune
    Cangjie字符类型名关键字从 Char 变更为 Rune, Rune不再是类型别名


  • 泛型扩展语法变更并支持扩展特化类型
    泛型扩展定义从 extend Array {} 变更为 extend Array

    • extend 关键字后跟随的尖括号内可定义当前扩展引入的泛型变元,且这些变元必须被使用。例如: extend Array
    • 支持对特化类型进行扩展,例如 extend Array {}
  • 字符、字符串语法变更

    • 字节数组字面量(b"xyz" 替换为 [120u8, 121u8, 122u8])。
    • 字符串既可以用双引号又可以用单引号表示("abc" == 'abc'
    • Rune 字面量由单引号改为 r 后接单字符的单行字符串('x' 替换为 r'x'r"x"
  • 包管理语法变更


项目实现前实现后
代码组织方式模块/包 二级结构包/子包 树形结构没有父包的包称为 root 包,root 包及其子包(包括子包的子包)构成的整棵树称为 module
编译单元包(每个子包单独编译)
访问修饰符public:可修饰顶层和非顶层成员,包内外可见default(不写):仅本包内可见protected:只能修饰 class 的成员,本包内可见、本 class 及其子类可见private:不能修饰 top-level 成员、仅当前作用域可见以下所有访问修饰符均可修饰顶层和非顶层成员public:本 module 内外可见protected:本 module 和子类型内可见internal:本包及其子树可见private:修饰顶层声明时仅本文件内可见,修饰非顶层声明时仅当前类型或扩展定义内可见
package 访问修饰符package a.b(= public package a.b)protected package a.binternal package a.b
import 访问修饰符public importimportpublic importprotected importinternal importimport(= private import)
从 module 导入的语法from std import time.*不再有 from 语法,只有 import std.time.* 的语法
多导入的语法from std import time., math.import a., b.import std.{time., math.}import {a., b.}
导入的语义from std import time.Duration可以同时看到 time 和 Duration 这两个符号import std.time.Duration只看能看到 Duration 这一个符号
单导入可以导入顶层声明,不可以导入包名from std import time // errorfrom std import time.Duration // OK可以导入顶层声明、也可以导入包名import std.time // okimport std.time.Duration // OK
别名导入from std import time.* as stdTime.* // OKfrom std import time.Duration as stdDuration // OKimport std.time.* as stdTime.* // errorimport std.time.Duration as stdDuration // OK
别名导入的作用域和当前包顶层声明处于同一作用域from std import time.Duration as stdDurationlet stdDuration = 1 // error: redefinition和当前包顶层声明处于不同作用域,且优先级更低,若 shadow 则告警import std.time.Duration as stdDuration // warning: shadowlet stdDuration = 1 // OK
重复导入并取别名使用 import as 对导入的声明重命名后,当前包内只能使用别名,无法使用原名from std import time.Duration // error: time.Duration is renamedfrom std import time.Duration as stdDuration允许使用多条导入语句分别导入原名和重命名import std.time.Durationimport std.time.Duration as Duration1import std.time.Duration as Duration2let _ = Duration.second // OKlet _ = Duration1.second // OKlet _ = Duration2.second // OK

Bugfix

  • NA

Remove

  • 自动微分语法移除
    从本版本起,仓颉语言暂时移除了自动微分语法,未来将会以其他形式与开发者相遇。

3. 后端运行时

Feature

  • 调整GC算法,支持in-place compaction,改善部分场景下的峰值内存表现
  • O2编译优化增强,提升执行性能

Bugfix

  • NA

Remove

  • NA

5. 工具链

1 IDE插件

Feature

  • LSP支持Unicode字符集作为标识符
  • LSP适配包管理变更
  • Char修改为Rune关键字变更适配

Bugfix

描述
存在git依赖时,LSP识别git依赖路径不正确
Option类型场景,使用问号操作符,在非声明语句、直接尝试?.联想,无联想结果

Remove

  • NA

2 cjdb

Feature

  • cjdb 支持 Mac OS 上远程调试OHOS仓颉应用
  • cjdb表达式计算支持数值类型转换表达式
  • cjdb表达式计算支持括号表达式
  • cjdb表达式计算支持算术表达式
  • cjdb表达式计算支持关系表达式
  • cjdb表达式计算支持赋值表达式
  • cjdb表达式计算支持逻辑表达式
  • cjdb表达式计算支持位运算表达式
  • cjdb表达式计算支持函数调用表达式
  • cjdb表达式计算支持成员访问表达式
  • cjdb表达式计算支持this和super表达式
  • cjdb表达式计算支持索引访问表达式
  • cjdb表达式计算支持自定义类型变量名
  • cjdb表达式计算支持基础Collection类型变量名
  • cjdb表达式计算支持区间表达式

Bugfix

描述
linux arm环境下使用expression 命令查看类型变量报错
查看class成员变量值(p detaile)为空

Remove

  • NA

3 cjpm

Feature

  • cjpm支持对仓颉产物的安装功能
  • cjpm支持对仓颉产物的卸载功能
  • cjpm支持构建脚本依赖
  • cjpm适配包管理变更
    对于新的包管理规则,有父包的情况下才能有子包。cjpm在扫描源码时,发现父包不合法时会报如下警告:Warning: there is no '.cj' file in directory 'xxx', and its subdirectories will not be scanned as source code。此时,如果想要子包维持之前的行为,则需要在报警告的父包目录下新建一个空的仓颉文件,并声明正确的包名。

Bugfix

描述
cjpm增量编译规格调整,改成默认仅开启cjpm侧包级别的增量。开发者可以在配置文件的 compile-option 字段自行透传 --incremental-compile 编译选项,自行开启 cjc 编译器提供的函数粒度增量功能。
报错信息重叠优化
使用250个字符的包名,在ide界面执行cjpm build终端窗口有抛异常报错
静态库场景下编译报错
toml中配置特定编译选项会造成命令注入
cjpm交叉编译宏包时,宏包依赖当前平台动态库会报错
wrokspace检查父子文件夹方式不合理
cjpm clean 设置target-dir为当前路径后,会发生异常
win平台下cjpm 支持添加运行时环境变量配置不生效

Remove

  • NA

4 cjlint

Feature

  • 字符字面值语法语义变更适配
  • 扩展语法变更适配
  • Char修改为Rune关键字变更适配
  • 移除自动微分相关描述

Bugfix

描述
cjlint扫描不符合仓颉spec代码发生segment fault

Remove

  • NA

5 cjfmt

Feature

  • 字符字面值语法语义变更适配
  • 扩展语法变更适配
  • Char修改为Rune关键字变更适配

Bugfix

描述
cjfmt usage信息里缺少对选项-f的介绍

Remove

  • NA

6 cjcov

Feature

  • NA

Bugfix

  • NA

Remove

  • NA

7 cjprof

  • NA

Feature

  • NA

Bugfix

描述
cjHeapDumpOnOOM生成的.dat文件用cjprof heap -i 解析卡死
cjHeapDumpOnOOM开启,用cjprof同时获取oom日志,程序偶现卡死

Remove

  • NA

8 cjdoc

Feature

  • NA

Bugfix

  • NA

Remove

  • NA

6. 已知问题

  • 单元测试的覆盖率引导的随机化时,数值为0的场景无法被构造,用户需自行测试参数值为0的场景。
4/5 - (1 vote)
发表回复 0