-
Notifications
You must be signed in to change notification settings - Fork 0
Types and Strong Typing
export type 自定义形状、内置类型注解、编译器流分析与原生优化路径。
适用于 4.0.0。
Note
AuroraScript 仍是动态脚本语言。类型语法主要服务于编译器优化与边界检查,不会在运行时插入结构扫描或强制静态类型系统。
AuroraScript 在源码层不要求每个变量都写类型。编译器通过 flow 分析 推断稳定值的表示方式;作者可以在关键位置用类型语法帮助编译器:
| 机制 | 作用 |
|---|---|
export type |
声明 compile-time 对象形状,授予字段原生推导 |
Number p、Boolean b 等参数 |
内置类型的精确参数/返回契约 |
value as Type |
运行时精确断言(内置类型)或授予形状(自定义类型) |
func f() Number |
声明返回类型,对动态返回值做精确检查 |
native func |
显式函数 ABI,固定入口/出口 |
三者配合可在不牺牲动态语义的前提下,获得无分配数值循环与更安全的边界。
每个值在运行时仍有 kind(number、string、object、array 等)。typeof 报告类型名字符串;packed array 与部分内置对象报告构造函数名(如 "Int32Array"、"Path"),而非 "object"。
运行时 kind 表与 typeof 示例见 语言指南 · 类型模型(概要)。宿主侧对应 ScriptDatum.TypeOf / ValueKind。
export type 声明 compile-time 形状(shape)。它不改变弱类型对象模型,不插入运行时结构校验。
@module(MODELS);
export type Point {
Number x;
Number y;
}
export type Rect {
Point origin;
Number width;
Number height;
}
- 仅模块作用域;字段类型为内置类型名或其它已声明 shape。
- 仅
export type可通过模块别名在外部引用(如models.Point)。 - 模块内未导出的
type Internal { ... }对外不可见。
当值被授予某 shape 后,编译器将已知字段视为对应原生类型,属性读取可走快速路径:
| 授予方式 | 示例 |
|---|---|
| 参数 | func add(Point p) Number { return p.x + p.y; } |
as 断言 |
var p = value as Point; |
| 声明返回 | func origin() Point { return { x: 1, y: 2 }; } |
| 对象字面量 |
sumPoint({ x: 2, y: 3 }) 在参数为 Point 时自动授予 |
局部变量仅在所有分支赋予同一 shape 时保留形状;混合分支会擦除 compile-time 事实。
// models.as
export type Point { Number x; Number y; }
// main.as
import models from "./models";
func distance(models.Point p) Number {
return p.x * p.x + p.y * p.y;
}
- 嵌套字段(如
rect.origin.x)继续推导,运行时仍是普通对象。 - 环形 shape(自引用或相互引用)同样允许;编译器仍不在运行时校验自定义 shape 的字段完整性。
export type Node {
Number value;
Node next;
}
export func tailValue(Node node) Number {
return node.next.value;
}
export type Left { Number value; Right other; }
export type Right { Number value; Left other; }
-
models.Point是 compile-time 限定符,不能作为值(return models.Point编译失败)。 -
models.add、models.originX等普通导出仍正常访问。
自定义 shape 不做运行时字段完整性或类型匹配检查:
- 缺字段或错误类型字段按普通弱类型 coercion 处理(例如算术可能得
NaN)。 - 仅内置
CheckedType(Number、Boolean、packed array 等)在参数、as与声明返回处做精确运行时检查。
export func add(Number a, Number b) Number {
return a + b;
}
export func increment(value) {
var n = value as Number;
return n + 1;
}
-
Number、Boolean、String、通用Array、packed array 等可用于参数与返回声明。 - 传入不兼容值时,运行时抛出
AuroraRuntimeException(精确检查)。 - 声明返回
Number但返回动态不兼容值时同样失败;裸return;返回null,与Number不兼容。
var bytes = payload as UInt8Array;
var n = value as Number;
var p = value as Point; // 授予 shape,非运行时扫描
- 内置类型:
as Number、as Int32Array等做精确运行时检查。 - 自定义 shape:
as Point授予 compile-time 形状,不验证对象结构。
编译器在能证明语义安全时,将稳定值保持在 原生 CIL 表示(double、bool、int、packed 存储),避免 ScriptDatum 装箱。
保留快速路径:
- 单一种类的数值/boolean 局部变量与循环归纳变量
- 已知 packed array 局部变量及直接索引
- 已授予 shape 的字段读取(如
p.x为Number) - 同模块内证明兼容的
native func调用
回退到动态路径:
- 值存入通用
object、经未知属性读取、传给未知宿主回调 - 以不相关 kind 重新赋值
- packed array 放入 object 后再读回(擦除元素类型)
func sum(values) {
var total = 0;
var count = values.length;
for (var i = 0; i < count; i++) {
total += values[i];
}
return total;
}
编写建议与基准数据见 性能与基准测试。
- 流分析优化函数内部局部变量与运算。
-
export type优化对象字段读取的 compile-time 事实。 -
native func优化函数入口/出口与跨模块调用 ABI。
三者可组合:带 Point 参数的 native func 可在 $native 中对 p.x + p.y 发射原生算术(见引擎测试 PointFieldArithmeticEmitsNativeKernel)。
| 限制 | 说明 |
|---|---|
| 类型非值 | 不能把 models.Point 当作运行时对象或构造函数 |
| 非导出不可导入 | 跨模块须使用 export type
|
| 非静态类型系统 | 错误 shape 的对象不会在运行时因「不是 Point」而拒绝 |
| 与 TDoc 分工 | 持久化精确 64 位等场景用 TDoc;shape 用于 compile-time 优化 |
与 native func 分工 |
需要固定 ABI 或不可热补丁时用 Native 函数 |
Tip
4.0 已移除 @directCall 函数注解。请用 native func 声明显式原生 ABI。
// models.as
@module(MODELS);
export type Point { Number x; Number y; }
export func add(Point p) Number { return p.x + p.y; }
// main.as
@module(APP);
import models from "./models";
export func run(value) Number {
var p = value as models.Point;
return models.add(p);
}
export type Rect {
Point origin;
Number width;
}
export func left(Rect rect) Number {
return rect.origin.x;
}
export type Point { Number x; Number y; }
native func sumPoint(Point p) Number {
return p.x + p.y;
}
export func run() Number {
return sumPoint({ x: 2, y: 3 });
}
export type Node {
Number value;
Node next;
}
export func walk(Number total, Node node) Number {
if (node == null) return total;
return walk(total + node.value, node.next);
}
- 语言指南 — 模块、函数与字面量基础。
- Native 函数 — 显式 ABI 与热补丁限制。
- 性能与基准测试 — 实测热路径与编写建议。
- Typed Document (TDoc) — 序列化层类型保真。
AuroraScript.JIT 4.0.0 · 文档首页 · 仓库 · MIT License