I’m glad to work in compiled languages, where figuring out which types and functions can be removed without affecting the program is a decidable problem.

Except Java/Scala/Kotlin have reflection, so maybe not…still, it’s a lot easier to mark everything accessible from reflection, then mark everything accessible everywhere because a variable lookup itself is a form of reflection, and an arbitrary function call can modify or even un-define any of your in-scope variables.