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

joh*_*ard 3 reflection introspection

许多语言都具有内省和反思的能力。然而,有些显然比其他更好。关于哪些语言在这方面“更好”以及为什么的任何建议。

Ira*_*ter 5

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

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

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

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

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

如果您想完全访问源文本的任意属性,则需要跳出语言,以便实际上可以直接检查完整的源代码。

程序转换系统(PTS)是最接近这一点的工具。PTS 通常将源代码解析为抽象语法树,这些抽象语法树是源代码的直接反映,因此可以充当等效的替代品。更好的实际上保留有关空白的注释和信息。然后,人们可以使用一些PTS编写自定义的任意算法来爬过 AST 并从这些 AST 中提取任意信息。

使用 PTS 的一个非常好的副作用是,在检查代码后,PTS 还可以转换代码或生成附加代码来帮助解决驱动需要反思的问题。也就是说,分析问题或机会,并由此改进计划。

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