Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CayBC 字节码格式

Cavvy 字节码格式(CayBC)是一种专为 Cavvy 语言设计的二进制中间表示格式。它支持 JIT 和 AOT 编译,并提供混淆能力。


概述

CayBC 字节码系统位于 src/bytecode/,由 7 个模块组成:

模块职责
mod.rsBytecodeModule 顶层结构
constant_pool.rsJVM 风格的常量池
instructions.rs100+ 指令操作码
jit.rsJIT/AOT 编译器
linker.rs自动链接
serializer.rs二进制序列化
obfuscator.rs字节码混淆

BytecodeModule(mod.rs

BytecodeModule 是 CayBC 的顶层容器,包含:

  • 常量池ConstantPool) — 所有常量的索引表
  • 类定义 — 类的字段、方法、接口实现
  • 方法体 — 字节码指令序列
  • 元数据 — 版本号、源文件名、调试信息

常量池(constant_pool.rs

JVM 风格的常量池,支持以下常量类型:

常量类型描述
Utf8UTF-8 编码字符串
Integer32 位整数常量
Long64 位整数常量
Float32 位浮点常量
Double64 位浮点常量
String字符串常量(引用 Utf8)
Class类引用
FieldRef字段引用
MethodRef方法引用
InterfaceMethodRef接口方法引用
NameAndType名称和类型描述符对
MethodHandle方法句柄
MethodType方法类型描述符
InvokeDynamic动态调用点

常量池使用整数索引访问(从 1 开始,类似 JVM 规范)。


指令集(instructions.rs

CayBC 定义 100+ 操作码(Opcode 枚举),按功能分类:

加载和存储

指令描述
Load从局部变量加载到栈
Store从栈存储到局部变量
LoadConst加载常量
LoadField加载实例字段
StoreField存储实例字段
LoadStatic加载静态字段
StoreStatic存储静态字段
LoadArray从数组加载
StoreArray存储到数组

算术运算

指令描述
Add, Sub, Mul, Div, Rem基本算术
Neg取负
Shl, Shr, UShr移位
And, Or, Xor位运算
Inc局部变量自增

类型转换

I2L, L2I, F2D, D2F, I2B, I2C, I2S

对象操作

指令描述
New创建新对象
NewArray创建数组
ArrayLength获取数组长度
InstanceOf类型检查
CheckCast类型强制转换

栈操作

指令描述
Pop弹出栈顶
Dup复制栈顶
Swap交换栈顶两个元素

控制流

指令描述
Goto无条件跳转
IfEq, IfNe, IfLt, IfGe, IfGt, IfLe条件跳转
TableSwitch表跳转(switch)
LookupSwitch查找跳转

方法调用

指令描述
InvokeVirtual虚方法调用(vtable)
InvokeStatic静态方法调用
InvokeSpecial特殊方法调用(构造函数、父类)
InvokeInterface接口方法调用
InvokeDynamic动态方法调用

返回

Return, IReturn, LReturn, FReturn, DReturn, AReturn


JIT/AOT 编译(jit.rs

JitOptions 结构体控制编译行为:

#![allow(unused)]
fn main() {
struct JitOptions {
    optimization_level: u8,    // 0-3
    dump_ir: bool,             // 是否输出 IR
    dump_asm: bool,            // 是否输出汇编
    verbose: bool,
}
}

jit_to_exe() 函数将 BytecodeModule 编译为可执行文件。


链接器(linker.rs

LinkerConfig 支持自动链接检测:

  • 自动检测依赖的本地库
  • 根据目标平台选择正确的链接器
  • 支持静态链接和动态链接

序列化格式(serializer.rs

二进制文件结构

[魔数]        CAY\x01        (4 字节)
[版本号]      主版本:u16 + 次版本:u16  (4 字节)
[常量池]      ConstantPool 序列化
[类定义]      类、字段、方法定义
[字节码]      方法指令序列
[元数据]      调试信息等
[校验和]      CRC32          (4 字节)

魔数

所有 CayBC 文件以 0xCA 0x59 0x01(ASCII “CAY” + 版本 1)开头。


混淆器(obfuscator.rs

BytecodeObfuscator 提供四种混淆技术:

技术描述可逆性
名称混淆将标识符重命名为无意义名称
控制流混淆插入冗余跳转和无关代码块
垃圾代码插入插入不执行的无意义指令
字符串加密运行时解密字符串字面量运行时透明

混淆级别

级别描述
0无混淆
1名称混淆
2名称 + 控制流混淆
3全部(名称 + 控制流 + 垃圾代码 + 字符串加密)

使用方法

# 生成字节码
cay-bcgen input.cay -o output.caybc

# 带混淆生成
cay-bcgen input.cay --obfuscate --obfuscation-level 2 -o obfuscated.caybc

# 查看字节码信息
cay-bcgen input.cay --verbose

与 JVM 字节码的对比

特性CayBCJVM
常量池✅ JVM 风格标准
指令集100+ 操作码200+ 操作码
栈机模型✅ 是
类型信息强类型类型描述符
混淆✅ 内置需外部工具
序列化✅ 自定义格式.class 格式
JIT✅ 基础实现成熟