Many languages have the ability for introspection and reflection. However, some are clearly better than others. Any suggestions as to which languages are "better" in this respect, and why.
相关问题
- C# how to invoke a field initializer using reflect
- Get all classes of a package
- Java-Reflection - find the Arguments and the annot
- Java - How to get annotations from Proxy class?
- Limiting a String length on a property
相关文章
- Are GetCallingAssembly() and GetExecutingAssembly(
- Why doesn't reflections.getSubTypesOf(Object.c
- Load a .NET assembly from the application's re
- Get list of classes in namespace in C# [duplicate]
- How to get struct field names in Rust? [duplicate]
- Issue creating ImmutableMap with Class<?> as
- TYPE_USE annotations get lost when type is nested,
- How to use reflection to get extension method on g
Reflection is essentially the ability to extract properties of the source program. To be able to inspect arbitrary properties (e.g, any and all) about the source code requires that you have the source code available to inspect, or at least some source code equivalent.
Languages which allow runtime reflection have predetermined which of many properties can be inspected; the number and resulting details have been decided by the language designers. Because it costs runtime space and time to provide reflection, virtually all such languages have (language specific) limits on what can be reflected/inspected, because none of them are willing to retain the source code in its entirety. So they reflect what the language designers think might be useful, and what can be computed relatively easily and stored compactly. These limitations are especially strong for compiled languages, whose goals are to be efficient in execution and resources (as opposed to interpreters).
Thus you cannot typically reflect and get information about comments, or information about the range of values that a particular variable might hold.
One of the languages that provides quite a lot of reflective ability is LISP. This is because LISP program source texts are by design isomorphic to LISP lists, which is how LISP stores the program code, at least when interpreted. LISP provides direct access to all such lists, and thus LISP programs can inspect their own code directly. [Many LISPs allow compilation; these have the same limitations of every other compiled language in terms of limitation on what can be inspected].
So a language's ability to introspect/reflect will always be limited in practice.
If you want to have full access to arbitrary properties of the source text, you need to step outside the language, so that you can in effect directly inspect the full source code.
Program transformation systems (PTS) are the tools that come closest to this. PTSs generally parse the source code into abstract syntax trees which are a direct reflection of the source code, and can thus act as an equivalent stand in. The better ones actually retain comments and information about the whitespace. One can then write custom, arbitrary, algorithms with some PTS to climb over the ASTs and extract arbitrary information from those ASTs.
One of the very nice side effects of using a PTS, is that after having inspected the code, the PTS can also transform the code or generate additional code to help resolve the question driving the need to reflect. That is, analyze for issues or opportunities, and enhance the program as a result.
Perhaps the dream language would be one which has a full PTS built into it. (My company's DMS product, a PTS, is an small set of cooperating DSLs that has this property, and we often use DMS to inspect/transform and enhance itself permanently. Normally we DMS in inspect/transform other languages.).