在字节码中存储值[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在字节码中存储值[关闭]相关的知识,希望对你有一定的参考价值。

我正在为我在C中创建的语言编写解释器。目前它可以将源代码放入令牌中,然后将这些令牌解析为AST。在做了一些阅读之后,我得出的结论是,由于遍历树所需的递归量,使用字节码比仅仅遍历AST更快。

所以给定一个AST,我该如何将其转换为字节码?更具体地说,实际存储的函数,变量和常量在哪里?它们是存储在字节码本身中,还是存在专用于存储这些存储器的单独存储区域?

我的AST实现方式的简化视图:

typedef enum {
    AST_NODE_INT,
    AST_NODE_FLOAT,
    AST_NODE_ADD,
    // many, many more of these
};

typedef struct _ast_node {
    ast_node_type type;

    union {
        int as_int;
        float as_float;

        struct as_add {
            struct _ast_node *left;
            struct _ast_node *right;
        };

        //more structs, representing the different types in the enum
    };
};

我的程序目前需要一些源代码,如

1 + 2

并生成一个AST(这不是C,只是一个表示)

{
    type: AST_NODE_ADD,
    as_add: {
        left: {
            type: AST_NODE_INT,
            as_int: 1
        },
        right: {
            type: AST_NODE_INT,
            as_int: 2
        }
    }
}
答案

函数变量和常量(至少它们的名称以及将其转换为值所需的任何查找信息)通常存储在符号表中。

在函数调用的情况下,您可以将许多args推送到评估堆栈,然后使用调用指令来调用函数的字节代码。

我建议获得编译器:原理,技术和工具(第2版):Alfred V Aho(又名“龙书”),即使它被命名为“编译器”,该材料也可直接应用。

以上是关于在字节码中存储值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )(代

Java字节码中“GOTO”之后的数字是多少?

Android 逆向启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )

如何识别Java字节码中的覆盖方法?

Oracle字段类型及存储

Android 逆向启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )