【问题标题】:Which programming language has the best introspection and reflection capabilities? [closed]哪种编程语言具有最好的自省和反射能力? [关闭]
【发布时间】:2017-03-26 12:41:47
【问题描述】:

许多语言都有自省和反思的能力。 但是,有些显然比其他更好。 关于哪些语言在这方面“更好”以及原因的任何建议。

【问题讨论】:

  • This is not a good question。没有办法建设性地定义“更好”,回答这个问题并不能解决任何实际问题,因为您不会根据内省和反思方面的好坏来为任务选择编程语言。
  • @JeroenMostert:您可以更好地定义为“反射实际上可以提供多少可能无限的属性集?”。如果您的目标是能够询问有关代码的任意问题,那么这是一个有用的定义。看我的回答。

标签: reflection introspection


【解决方案1】:

反射本质上是提取源程序属性(或描述事实)的能力。为了能够检查源代码的任意属性(例如,任何和所有),您需要有可供检查的源代码,或者至少有一些等效的源代码。

允许运行时反射的语言已经预先确定了可以检查哪些属性;数量和结果细节由语言设计者决定。因为提供反射需要运行时空间和时间,所以几乎所有此类语言都对可以反射/检查的内容有(特定于语言的)限制,因为它们都不愿意保留完整的源代码。因此它们反映了语言设计者认为可能有用的东西,以及可以相对容易地计算和紧凑存储的东西。这些限制对于编译型语言尤其严重,其目标是在执行和资源方面高效(与解释器相反)。

因此,您通常无法反映和获取有关 cmets 的信息,或有关特定变量可能包含的值范围的信息。

提供大量反射能力的语言之一是 LISP。这是因为 LISP 程序源文本在设计上与 LISP 列表同构,这就是 LISP 存储程序代码的方式,至少在解释时是这样。 LISP 提供对所有此类列表的直接访问,因此 LISP 程序可以直接检查自己的代码。 [许多 LISP 允许编译;就可以检查的内容而言,它们与所有其他编译语言具有相同的限制]。

因此,一种语言的内省/反思能力在实践中总是会受到限制。

如果您想完全访问源文本的任意属性,则需要在语言之外,这样您就可以直接检查完整的源代码。

Program transformation systems (PTS) 是最接近此的工具。 PTS 通常将源代码解析为abstract syntax trees,这是源代码的直接反映,因此可以充当等效的替代品。更好的实际上保留了 cmets 和有关空白的信息。然后,可以使用 一些 PTS 编写自定义的任意算法来爬过 AST 并从这些 AST 中提取任意信息。

使用 PTS 的一个非常好的副作用是,在检查了代码之后,PTS 还可以转换代码或生成额外的代码来帮助解决需要反思的问题。也就是说,分析问题或机会,从而改进计划。

也许梦想中的语言是一种内置完整 PTS 的语言。 (我公司的 DMS 产品 PTS 是一小部分协作的 DSL,具有此属性,我们经常使用 DMS 来检查/转换和永久增强自身。通常我们在检查/转换其他语言时使用 DMS。)。

【讨论】:

  • 我不完全理解反射是什么,有没有什么资料可以为我提供很好的信息,或者有什么书可以清楚地解释这些基本的 CS 概念?
  • 我希望这个答案非常全面。仔细重读第一段。也许你不明白什么是“财产”;有关一般概述,请参阅此页面:en.wikipedia.org/wiki/Property_(disambiguation)。我试图通过添加一个同义词来澄清它:“事实”。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2010-10-07
  • 2010-09-09
  • 2011-03-30
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
相关资源
最近更新 更多