c - C中的反射支持

标签 c reflection

我知道它不受支持,但我想知道是否有任何技巧。有什么建议吗?

最佳答案

一般来说,反射是程序分析某些代码结构的一种手段。 此分析用于更改代码的有效行为。

作为分析的反射通常很弱;通常它只能提供对函数名和字段名的访问。这一弱点来自于语言实现者基本上不想在运行时提供完整的源代码,以及适当的分析例程以从源代码中提取想要的内容。

另一种方法是直接进行程序分析,方法是使用强大的程序分析工具,例如,可以完全按照编译器的方式解析源文本的工具。 (通常人们建议滥用编译器本身来做这件事,但这通常是行不通的;编译器机器想成为一个编译器,很难将它用于其他目的)。

我们需要的是一种工具:

  • 解析语言源文本
  • 构建代表程序每个细节的抽象语法树。 (如果 AST 保留源的注释和其他详细信息,这将很有帮助 代码布局,例如列号、文字基数值等)
  • 构建符号表,显示每个标识符的范围和含义
  • 可以从函数中提取控制流
  • 可以从代码中提取数据流
  • 能为系统构建调用图
  • 可以判断每个指针指向什么
  • 能够使用上述事实构建自定义分析器
  • 可以根据此类自定义分析转换代码 (通常通过修改表示已解析代码的 AST)
  • 可以重新生成源文本(包括布局和注释) 修订后的 AST。

使用这种机制,可以在需要的任何详细级别实现分析,然后转换代码以达到运行时反射可以达到的效果。 有几个主要的好处:

  • 分析的详细程度或数量取决于雄心(例如,它不是 受限于运行时反射只能做什么)
  • 没有任何运行时开销来实现反射(reflect)的行为变化
  • 所涉及的机制可以是通用的并且适用于多种语言,而不是 而不是局限于特定语言实现提供的内容。
  • 这符合 C/C++ 的理念,即您无需为不使用的东西付费。 如果你不需要反射(reflection),你就不需要这个机器。还有你的语言 不需要内置弱反射的智力包袱。

查看我们的 DMS Software Reengineering Toolkit对于可以为 C、Java 和 COBOL 执行上述所有操作的系统,以及可以为 C++ 执行大部分操作的系统。

[编辑 2017 年 8 月:现在处理 C11 和 C++2017]

关于c - C中的反射支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353022/

相关文章:

C 多线程控制与信号量

c - C 处理指针时出现段错误

javascript - HTML 不更新?

c - 使用降雪包在 R 中使用 C-within-R 函数进行并行计算。问题 : Mac shows loading wheels and almost freezes

java - 从函数中获取通用类型

c# - 缓存或不缓存 - GetCustomAttributes

C: 'struct Table *const' 和 'const struct Table *' 之间的区别?

java - 使用 Jackson JSON 查找字段类型

java - 通用对象创建方法的返回类型

java - scala -> java getField().get()