C+语言理论2.0
新增 检查:同一时刻可以有多个只读引用,或者一个可写引用,不能两者同时存在,引用的生命周期必须不超过其指向值的生命周期,强制执行。 默认可变:变量默认可修改,用const标绑定不可重新赋值 问号:可能失败的操作通过 ? 自动向调用链传播。 内存:gc括号内由编译器先尝试静态处理,无法处理时用自动垃圾回收,gc括号像栈分配、堆分配、指针引用一样,不是一块会传染的代码区域 值即代码:代码可以作为普通值处理。 宏即函数:宏是受限的编译时普通函数。 缩进分块:允许用缩进替代一些花括号和分号。 输出:提供print,没有unsafe标记 模块系统:用模块替代头文件和大部分预处理器。 切片和可选值:用带长度的切片、optional、result 等类型替代裸指针、特殊返回值和 NULL。 class机制:1字段和方法:普通的数据容器和函数集合。2单继承:允许继承一个类;3显式虚派发:需要动态派发时写 virtual,没写是静态派发。没有隐式虚化。4构造/析构:明确的初始化和清理,5访问控制:public/private 原生模式:系统编程、C ABI、硬件访问 使用原生目标平台和系统 ABI;允许不安全代码、裸指针、内联汇编等底层能力 Java 模式:Java 虚拟机生态互操作 编译为 JVM 可用的形式;通过显式声明与Java类、方法和异常互操作 Python 模式:全部由GC接管,禁止硬件操作 默认禁止危险隐式转换; 默认错误显式传播; 默认普通代码不需要进入不安全区域。 保留的 C 能力 指针和连续内存; 结构体布局; 位运算; C ABI; 原子操作; 硬件访问; 内联汇编。 舍弃的C内容: printf家族; 头文件机制; 大部分预处理器; 隐式函数声明; 危险隐式类型转换; 未初始化变量; 默认越界行为; 字符串、数组、指针的混淆; errno 式错误处理; 复杂声明语法; 以上理论暂称为c+,剩余问题应当由编译器的实现考虑,理论结束 示例 module calculato class CalcError public message: String class Parser{ private input: Slice(char) private pos: Int public fn init(input: Slice(char)) self.input = input self.pos = 0 public fn evaluate() -> Result(Int, CalcError) self.skip_spaces() value: Int = self.parse_expr()? self.skip_spaces() if self.pos != self.input.len return Err(CalcError("多余的输入")) return Ok(value); fn main() const expression: Slice(char) = "2 + 3 * (4 - 1)" match Parser(expression).evaluate() Ok(value) => print(value) Err(error) => print(error.message)} gc { x: Int = 42 p: Int* = &x // p 是指向 x 的裸指针 print(p) /*在括号中*/ } print(p*) // 编译错误
评论加载中…