许多语言都具有内省和反思的能力。 但是,有些人显然比其他人好。 有关哪种语言的更好的建议"更好"在这方面,为什么。
答案 0 :(得分:2)
反射本质上是提取源程序属性的能力。为了能够检查关于源代码的任意属性(例如,任何和所有),要求您具有可用于检查的源代码,或者至少一些源代码等效。
允许运行时反射的语言预先确定了可以检查多个属性中的哪一个;数量和结果细节由语言设计者决定。因为它花费了运行时空间和时间来提供反射,所以几乎所有这些语言都有(特定于语言)限制可以反映/检查的内容,因为它们都不愿意完整地保留源代码。因此,它们反映了语言设计者认为可能有用的内容,以及可以相对容易地计算和紧凑存储的内容。这些限制对于编译语言尤为强烈,编译语言的目标是在执行和资源方面有效(而不是口译员)。
因此,您通常无法反映和获取有关注释的信息,或有关特定变量可能包含的值范围的信息。
提供相当多反射能力的语言之一是LISP。这是因为LISP程序源文本在设计上与LISP列表同构,这是LISP存储程序代码的方式,至少在解释时如此。 LISP提供对所有此类列表的直接访问,因此LISP程序可以直接检查自己的代码。 [许多LISP允许编译;在限制可检查的内容方面,这些限制与其他所有编译语言相同。
因此,语言在内省/反思中的能力在实践中总是受到限制。
如果您想完全访问源文本的任意属性,则需要在外部语言中进行操作,以便您可以直接检查完整的源代码。
Program transformation systems (PTS)是最接近此的工具。 PTS通常将源代码解析为abstract syntax trees,这是源代码的直接反映,因此可以作为等效的替代。更好的实际上保留有关空白的注释和信息。然后,可以使用某些 PTS编写自定义,任意的算法来爬过AST并从这些AST中提取任意信息。
使用PTS的一个非常好的副作用是,在检查代码之后,PTS还可以转换代码或生成其他代码以帮助解决驱动需要反映的问题。也就是说,分析问题或机会,并因此加强计划。
也许梦的语言将是一个内置完整PTS的语言。 (我公司的DMS产品,一个PTS,是一小部分具有此属性的合作DSL,我们经常使用DMS来检查/转换和永久增强自身。通常我们在检查/转换其他语言时使用DMS。)