哪种编程语言具有最好的内省和反射能力?

3
许多编程语言都具有内省和反射的能力。然而,有些语言显然比其他语言更好。您有哪些建议,哪些语言在这方面更“好”,以及为什么?

1
这不是一个好问题。没有办法构建“更好”的定义,回答这个问题也不能解决任何实际问题,因为你不会根据编程语言在内省和反射方面的优劣来选择用于特定任务的编程语言。(Note: The translation provided assumes simplified Chinese script. If you require traditional Chinese, please let me know.) - Jeroen Mostert
@JeroenMostert:你可以将“更好”定义为“反射实际上能提供的潜在无限属性集合中有多少”。如果你的目标是能够对代码提出任意问题,这个定义是很有用的。请参阅我的回答。 - Ira Baxter
1个回答

5
反射实质上是提取源程序属性或描述源代码的事实的能力。要能够检查有关源代码的任意属性(例如,任何一个或所有属性)需要有源代码可供检查,或至少具有等效的源代码。允许运行时反射的语言已经预先确定了可以检查的众多属性;其数量和细节已由语言设计者决定。因为提供反射需要运行时空间和时间,所以几乎所有这样的语言都有(特定于语言的)限制,限制了可以反映/检查的内容,因为它们都不愿意保留源代码的完整性。因此,它们反映了语言设计者认为可能有用的东西,以及可以相对容易计算和紧凑存储的东西。这些限制在编译语言中特别强,因为它们的目标是执行和资源方面的效率(相对于解释器)。因此,您通常无法反映并获取有关注释或特定变量可能保持的值范围的信息。
LISP是一种提供相当多反射能力的语言之一。这是因为LISP程序源文本与LISP列表同构,这就是LISP存储程序代码的方式,至少在解释时是如此。LISP提供了对所有这些列表的直接访问,因此LISP程序可以直接检查其自身代码。[许多LISP允许编译;在可检查性方面,它们具有与其他编译语言相同的限制]。
因此,语言的内省/反射能力在实践中总是受到限制。
如果您想完全访问源文本的任意属性,您需要走出语言,以便您可以实际上直接检查完整的源代码。 程序转换系统(PTS)是最接近这一目标的工具。PTS通常将源代码解析为抽象语法树,它们是源代码的直接反映,因此可以作为等效替代品。更好的工具实际上保留了注释和有关空格的信息。然后,使用某些PTS可以编写自定义的算法来遍历AST并从中提取任意信息。
使用PTS的一个非常好的副作用是,在检查代码之后,PTS还可以转换代码或生成额外的代码来帮助解决需要反映的问题。也就是说,分析问题或机会,并相应地增强程序。
也许理想的语言是内置完整PTS的语言。 (我们公司的DMS产品是一组协作DSL的小型PTS,具有这种属性,我们经常使用DMS来永久性地检查/转换和增强自身。通常我们使用DMS来检查/转换其他语言。)

我对反射(Reflection)的理解还不够全面,有没有什么资源可以提供给我一些好的信息,或者有没有一本书能够清晰地解释这些基本的计算机科学概念? - Suraj Jain
我打算这个答案尽可能全面。请仔细阅读第一段。也许你不明白什么是“属性”;可以参考这个页面了解一般概述:https://en.wikipedia.org/wiki/Property_(disambiguation)。我试图通过添加一个同义词“事实”来进一步澄清。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接