c# - 具有元语言抽象的语言是否比仅使用反射 API 的语言表现更好?

标签 c# java reflection lisp eval

<分区>

比如说,如果我有一个 Lisp 程序,它使用 (eval 'sym) 并在它的符号表中查找它,它实际上比 aClass.getField( "sym", anInstance) 在“静态”语言中?

最佳答案

一般来说(模数实现问题,如字节码与 native 代码或代码生成质量),具有元语言抽象的语言提供了更多的能力来创建比使用缺乏此类抽象的语言在可比时间框架内创建的程序性能更好的程序。情况是,当您为自己的语言编写实现时,您有更多的信息来进行比基础语言的编译器更强大的优化。这在实践中有很多例子。

此外,您似乎将反射(作为“开放式实现”的特例)和元语言抽象混合在一起。元语言抽象是关于在基础语言之上构建新语言,而反射(或“开放式实现”)是关于将程序的内部结构暴露给程序本身。

在您的特定示例中(当然,模块实现问题,例如字节码与 native 代码或代码生成质量), (eval 'sym) 可能更快。原因是 'sum 是符号对象而不是字符串。评估符号意味着获取其值单元格。所以 eval 只需要做几件事:

  1. 根据对象类型(在本例中为符号)进行调度(例如,通过使用值标记来遍历跳转表)
  2. 提取符号的值(通过取消引用符号结构)

但是 Java 示例还有更多事情要做:

  1. 根据名称找到一个字段。这需要例如计算字符串的哈希值并使用哈希表
  2. 提取字段的值(通过在特定于字段的偏移量处取消引用实例指针)
  3. 将值框起来(如果它不是引用)

特别昂贵的部分是计算哈希和遍历哈希表。

关于c# - 具有元语言抽象的语言是否比仅使用反射 API 的语言表现更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560174/

相关文章:

javascript - 从 url 中的两个相同单词中删除一个单词

c# - 在 Linq 中按 DayOfWeek 分组

java - 运行 junit 测试时出现 ZipException

Json Unmarshal reflect.Type

c# - .NET 4.5 中的序列化中断

java - 我正在尝试使用 JFrame 创建计算器,但遇到一些困难

java - 如果没有欢迎页面或index.html,则列出目录

c# - 创建一个表示两个其他对象之间的值差异的对象

c# - 区分属性 protected 和 setter protected

c# - WPF 文本框渲染前的高度