xlang5.4 更新日志
版本发布2025-12-07 01:26:12xlang 5.4 更新内容
语言
- 增加注解(annotate)的反射读取能力和接口(hasAnnotate , getAnnotate).
- Windows 下的 Process 类构造第二个参String [] args 规范.
- String 类和 Math类规范化.
- 性能和健壮性优化.
编译器部分
- 修复模板函数嵌套时编译的一个错误.
- 增加注解(annotate)的反射读取能力.
- 修复特定系统类的反射功能工作异常的问题.
- 修复RCP组件对float和double支持异常的问题.
- 修复在switch中对跨模块的常量进行case引用的一个错误.
- 常量传播优化.
- 反射结构整体优化.
类库
- 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项目开发

