3 回答
TA贡献1806条经验 获得超5个赞
通常,反射是程序分析某些代码结构的一种方式。此分析用于更改代码的有效行为。
作为分析的反思通常非常薄弱;通常,它只能提供对函数和字段名称的访问。这种弱点来自于语言实现者基本上不希望在运行时提供完整的源代码,以及不希望从源代码中提取所需内容的适当分析例程。
另一种方法是通过使用强大的程序分析工具来直接解决程序分析问题,例如,一种可以完全按照编译器的方式分析源文本的工具。(通常人们建议滥用编译器本身来执行此操作,但这通常不起作用;编译器机制希望成为编译器,很难将其用于其他用途)。
需要一种工具,该工具:
解析语言源文本
构建代表程序每个细节的抽象语法树。(如果AST保留注释和源代码布局的其他详细信息(例如列号,文字基数值等),将很有帮助。)
建立符号表,显示每个标识符的范围和含义
可以从功能中提取控制流
可以从代码中提取数据流
可以为系统构造一个调用图
可以确定每个指针指向的内容
利用上述事实来构建自定义分析器
可以根据这种自定义分析来转换代码(通常通过修改代表已解析代码的AST)
可以从修订的AST重新生成源文本(包括布局和注释)。
使用这样的机制,可以在需要的任何细节级别上进行分析,然后转换代码以实现运行时反射将完成的效果。有几个主要好处:
详细程度或分析量是一个雄心壮志(例如,它不受运行时反射只能做什么的限制)
没有任何运行时开销来实现行为的反映变化
涉及的机制可以是通用的,可以跨多种语言应用,而不仅限于特定语言实现所提供的机制。
这与C / C ++想法兼容,即您无需为不使用的东西付费。如果不需要反射,则不需要这种机器。而且您的语言不需要内置弱反射的智力包。
请参阅我们的DMS软件再造工具包,以了解可以针对C,Java和COBOL进行上述所有操作的系统,以及大多数针对C ++的系统。
- 3 回答
- 0 关注
- 909 浏览
添加回答
举报