  Context: Software development tools that interact with running programs such
as debuggers, profilers, and dynamic analysis frameworks are presumed to demand
difficult tradeoffs among implementation complexity (cost), functionality,
usability, and performance. Among the many consequences, tools are often
delivered late (if ever), have limited functionality, require non-standard
configurations, and impose serious performance costs on running programs.
  Inquiry: Can flexible tool support become a practical, first class, intrinsic
requirement for a modern highperformance programming language implementation
framework?
  Approach: We extended the Truffle Language Implementation Framework, which
together with the GraalVM execution environment makes possible very high
performance language implementations. Truffle's new Instrumentation Framework
is language-agnostic and designed to derive high performance from the same
technologies as do language implementations. Truffle Instrumentation includes:
(1) low overhead capture of execution events by dynamically adding "wrapper"
nodes to executing ASTs; (2) extensions to the Language Implementation
Framework that allow per-language specialization, primarily for visual display
of values and names, among others; and (3) versatile APIs and support services
for implementing many kinds of tools without VM modification.
  Knowledge: It is now possible for a client in a production environment to
insert (dynamically, with thread safety) an instrumentation probe that captures
and reports abstractly specified execution events. A probe in fully optimized
code imposes very low overhead until actually used to access (or modify)
execution state. Event capture has enabled construction of numerous GraalVM
services and tools that work for all implemented languages, either singly or in
combination. Instrumentation has also proved valuable for implementing some
traditionally tricky language features, as well as some GraalVM services such
as placing bounds on resources consumed by running programs.
  Grounding: Tools for debugging (via multiple clients), profiling, statement
counting, dynamic analysis, and others are now part of GraalVM or are in active
development. Third parties have also used Truffle Instrumentation for
innovative tool implementations.
  Importance: Experience with Truffle Instrumentation validates the notion that
addressing developer tools support as a forethought can change expectations
about the availability of practical, efficient tools for high-performance
languages. Tool development becomes a natural part of language implementation,
requiring little additional effort and offering the advantage of early and
continuous availability.
