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

Reflection 哪种编程语言具有最好的内省和反思能力?,reflection,introspection,Reflection,Introspection,许多语言都有内省和反思的能力。 然而,有些显然比另一些好。 关于哪种语言在这方面“更好”的任何建议,以及为什么 反射本质上是提取源程序的属性(或描述源程序的事实)的能力。要能够检查源代码的任意属性(例如,任意和全部),需要有可供检查的源代码,或者至少有一些等效的源代码 允许运行时反射的语言已经预先确定了可以检查许多属性中的哪些属性;语言设计者已经决定了数量和结果细节。由于提供反射需要花费运行时空间和时间,因此几乎所有此类语言都对可以反射/检查的内容有(特定于语言的)限制,因为它们都不愿意完整保留

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

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

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

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

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

因此,语言的反思能力在实践中总是有限的

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

是最接近这一点的工具。PTS通常将源代码解析为源代码的直接反映,因此可以充当等效的替身。更好的方法实际上保留了有关空格的注释和信息。然后,可以使用一些PTS编写自定义、任意的算法来爬过AST并从这些AST中提取任意信息

使用PTS的一个非常好的副作用是,在检查了代码之后,PTS还可以转换代码或生成其他代码,以帮助解决引发反思需求的问题。也就是说,分析问题或机会,并因此加强计划

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

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

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

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

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

因此,语言的反思能力在实践中总是有限的

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

是最接近这一点的工具。PTS通常将源代码解析为源代码的直接反映,因此可以充当等效的替身。更好的方法实际上保留了有关空格的注释和信息。然后,可以使用一些PTS编写自定义、任意的算法来爬过AST并从这些AST中提取任意信息

使用PTS的一个非常好的副作用是,在检查了代码之后,PTS还可以转换代码或生成其他代码,以帮助解决引发反思需求的问题。也就是说,分析问题或机会,并因此加强计划

也许梦中的语言是一种内置了完整PTS的语言。 (我公司的DMS产品,一个PT