文字大小:

xlang5.4 更新日志

版本发布2025-12-07 01:26:12




xlang 5.4 更新内容

语言

  1. 增加注解(annotate)的反射读取能力和接口(hasAnnotate , getAnnotate).
  2. Windows 下的 Process 类构造第二个参String [] args 规范.
  3. String 类和 Math类规范化.
  4. 性能和健壮性优化.

编译器部分

  1. 修复模板函数嵌套时编译的一个错误.
  2. 增加注解(annotate)的反射读取能力.
  3. 修复特定系统类的反射功能工作异常的问题.
  4. 修复RCP组件对float和double支持异常的问题.
  5. 修复在switch中对跨模块的常量进行case引用的一个错误.
  6. 常量传播优化.
  7. 反射结构整体优化.

类库

  • Math 类增加FLOAT_NAN和DOUBLE_NAN常量, round 方法规则变更为"返回最近的整数", 向 +∞ 舍入(负数向靠近0的位置取舍, 不同于C/C++ ISO/IEC 9899 / ISO/IEC 14882的远离 0), 即 Math.round(-1.5) = -1, 而 C/C++ 中 round(-1.5) = -2.
  • _system_ 类的 setProperty/getProperty 方法增加如下功能:

解释 get / set
sys.cpu.cores 物理 cpu 核心数 ✅/❌
sys.cpu.threads 逻辑 cpu 数量 ✅/❌
sys.cpu.usage cpu 用量 ✅/❌
sys.memory.physical.total 物理内存总数 ✅/❌
sys.memory.physical.free 物理内存可用数量 ✅/❌
sys.memory.used 已用内存数量 ✅/❌
sys.memory.virtual.total 虚拟内存总数 ✅/❌
sys.memory.virtual.used 已用虚拟内存总数 ✅/❌
sys.memory.virtual.free 空闲虚拟内存总数 ✅/❌
proc.exception.handle_all 默认捕获全部异常 ✅/✅
proc.crash.dump_core crash时产生coredump(仅win) ✅/✅
proc.crash.show_dialog crash时的msgbox提示(仅win) ✅/✅
  • String 类的方法(使用边界)规范化.
方法 应用 结果/定义
replace 使用 "" 空字符串作为查找条件时 返回 0
split 使用 "" 空字符串作为分割条件时 返回原串
split 使用未被包含的字符串作为风格条件时 返回原串
startsWith/endsWith 使用空串进行测试 返回true
format 方法 / 修订为在ISO/IEC 9899:2018规范的基础上进行了整数格式化的扩展(%i %d %o %x %X %u 同样适用于int 和 long类型)

  • Process 类在windows下的参数 args 分组相对应底层调用函数 CreateProcess 的C 运行时库(CRT)拼接规范:
参数分隔规则 参数由空白字符分隔。
空白字符包括:
空格(0x20)
制表符(0x09)
双引号规则 被一对双引号(")包围的字符序列被解析为单个参数。
在双引号包围的参数内部,空白字符不作为参数分隔符。
双引号本身默认不作为参数内容的一部分。
反斜杠的一般规则

反斜杠(\)在通常情况下按字面字符处理。

仅当反斜杠紧邻位于其后的双引号时,反斜杠才具有转义含义。

反斜杠与双引号组合规则, 偶数个反斜杠(N 为偶数) 设连续的反斜杠数量为 N,其后紧跟一个双引号, 每一对反斜杠解析为一个反斜杠字符。
紧随其后的双引号被解析为参数定界符。
反斜杠与双引号组合规则, 奇数个反斜杠(N 为奇数) 设连续的反斜杠数量为 N,每一对反斜杠解析为一个反斜杠字符。
剩余的单个反斜杠用于转义其后的双引号。
该双引号被解析为字面量双引号字符,并作为参数内容的一部分。
结束规则 未被双引号包围的参数在遇到空白字符时结束。
被双引号包围的参数在遇到未被转义的匹配双引号时结束。
  • Process 类增加创建的flag:
InheritHandle 句柄是否可继承
TTY 运行在tty (影响子进程或者控制台从 isatty 进行判断)
Suspend 创建后立即冻结进程, 需要使用Process.raise(_system_.SIGCONT)使进程继续运行

运行时和版本

  • linux 版本的产出依赖最低 GLIBC2.28 (等同于Debian 10) , 低于此版本无法运行.
  • windows 版本的产出最低可支持运行在 Windows 7 系统.

界面和语言支持

  • 本次的版本增加了多语言功能, 默认支持简体中文(2052), 英文(1033), 俄文(1049), 巴西葡萄牙语(1046), 韩文(1042), 日文(1041).
  • 编译器通过 -lang <id> 参数来改变输出信息的语言.
  • IDE在第一次启动时\以及在设置中可变更语言.

XStudio

  • XStudio 仅发布集成了 xlang 开发插件的版本和未包含任何插件的XStudio版本, 开发功能需安装其他扩展, CDE插件(C/C++ development extension) 优化对 gcc/clang 的支持内容如下:
新增输出窗口对 gcc/clang 的原生彩色信息输出.
增加对clangd lsp的细节选项控制.
增加 C/C++ 并行编译.
增加对每个源文件设置不同优化和编译选项的功能.
增加 esp32 项目的开发支持(需安装官方esp-idf工具链).

竞态数据安全的策略调整

  • 当对象值发生变化时, 内核会先将值的内容清空为 null , 然后再赋值, 此策略导致当对象值改变时, null 的中间态可被观测, 单线程运行或者具有良好同步措施的情况下, 中间态无法被有效观测到, 也不影响程序运行, 但当多线程之间没有良好同步时, 可被短暂观测到 null .
  • 这不同于 java 的优先系统稳定原则, java 的规范明确当 long 和 double 的值改变时, 才会有可能(取决于平台等)产生不确定态, 而其他类型的对象值改变时时保证是原子的, 要么是新值, 要么是旧值, 而 xlang 中对象值改变会产生一个null的中间态.
  • 此策略的原则是当同步逻辑正确时, 保证稳定性和安全性, 当同步逻辑缺失或者出现不可控时, 需要快速失败(fast-fail), 没有可观测的中间态可能会掩盖同步缺陷, 产生不易觉察和难以复现的bug, 如下示例.
class Myclass{
    public static int main(String [] args){
        Object k = "";
        new Thread(){
            void run(){
                for (int i = 0; ; i++){
                        k = "" + i;
                         // 改变k的值
                }
            }
        }.start();
        
        for(;;){
                // 使用k的值  如: k.length();
                if (k == nilptr)
                    throw new NullPointerException();
        }
        return 0;
    }
};

这段代码在java上运行, 不会有任何问题, 因为java的规范中定义了对象值改变是原子的k的值改变要么是新值, 要么是旧值.

但这段代码在xlang中运行, 会抛出异常, xlang 中被定义为只要是多线程的结构, 必须依靠锁进行同步, 而不是依靠改写数据是否原子来保证数据安全, 在 xlang 中任何对象的值改变都会被先清空为null, 即便是int 或者char 这样的对象, 也就是说多线程操作一个 int 也应该使用锁来同步, 正确的逻辑如下:

class Myclass{
    public static int main(String [] args){
        Object k = "";
        Object lock = new Object();
        new Thread(){
            void run(){
                for (int i = 0; ; i++){
                    synchronized (lock) { //<--- 使用锁进行同步
                        k = "" + i;
                    }
                }
            }
        }.start();
        
        for(;;){
            synchronized (lock) { //<--- 使用锁进行同步
                if (k == nilptr)
                    throw new NullPointerException();
            }
        }
        _system_.sleep(3000);
        return 0;
    }
};

结语

本次版本更新涉及到大量的接口规范化和优化, 提高了健壮性和性能, 核心部分编译使用了 mingw clang 来完成, 经测试 性能提高区间在10% ~ 40%左右.






上一篇:xlang 5.2 更新日志下一篇:使用X-Stuidio进行ESP32项目开发

评论

写评论

点击刷新