# Aq 字节码结构调整

为了适应自定义类型的需求，对于虚拟机应有相应改变以便于发挥动态语言的独有优势和更高效率（相较于未在字节码支持自定义类型）。更改内容：[Add new features about class in vm. · Issue #247 · aq-org/AQ](https://github.com/aq-org/AQ/issues/247)。但是对于相关字节码的结构尚未存在明确的记录，仅在代码中存有部分记录。为完善详细的字节码结构，该文章具体指出了字节码的结构以及其对应变化。

原字节码结构：

1. 魔数：AQBC(0x41 0×51 0×42 0x43) 4字节
    
2. 版本号：32位正整数 4字节
    
3. 常量池
    
    1. 常量池长度：64位正整数 8字节
        
    2. 常量池内容：1字节用于类型，后面根据类型定义结束（Byte：1字节，Long、Double、Uint64t、指针：8字节，String：根据’\\0’出现的位置决定结束）
        
4. 变量类型表
    
    1. 变量类型表长度：64位正整数 8字节
        
    2. 变量类型表内容：正常类型（动态类型（0×00）、Byte、Long、Double、Uint64\_t）1字节，特殊类型（指针，引用，const）1字节后附带类型直到遇到正常类型（包含动态类型（0×00）），Class类型检测后一个数据（Uleb128算法的常量表索引（作为其名称））
        
5. Class
    
    1. Class名称：根据’\\0’出现的位置决定结束
        
    2. Class内变量类型表：
        
        1. 变量类型表长度：64位正整数 8字节
            
        2. 变量类型表内容：正常类型（动态类型（0×00）、Byte、Long、Double、Uint64\_t）1字节，特殊类型（指针，引用，const）1字节后附带类型直到遇到正常类型（包含动态类型（0×00）），Class类型检测后一个数据（Uleb128算法的常量表索引（作为其名称））
            
    3. 函数表
        
        1. 函数数量：64位正整数 8字节
            
        2. 函数名称：根据’\\0’出现的位置决定结束
            
        3. 函数参数
            
            1. 函数参数数量：Uleb128算法的正整数
                
            2. 函数参数内容：正常类型（动态类型（0×00）、Byte、Long、Double、Uint64\_t）1字节，特殊类型（指针，引用，const）1字节后附带类型直到遇到正常类型（包含动态类型（0×00））
                
        4. 函数体
            
            1. 函数体长度：64位正整数 8字节
                
            2. 函数体内容：1字节的操作数（WIDE操作符可能多字节（目前未启用））附带相关操作数（数量根据操作符的参数决定）。
                

仍需对应的函数支持。
