> But it's almost a general-purpose language, so why not just use one?
The usefulness of not being a general-purpose language it that it makes static analysis very good; that's what made the BCL-based tooling so useful: being able to easily diff two versions of the same module (a tool called UBdiff), compute the transitive closure of a module's dependencies, trace the execution of BCL code and correlate it with the AST, to point out where an error comes from.
All these features were either unavailable or took years to develop for Piccolo, because Piccolo was based on Python.
> I'm still not seeing why a DSL was necessary or helpful.
BCL has distinct evaluation rules and a notation that encodes many patterns that SREs used for defining services, and that made BCL code much more compact and easy to ready than all the alternatives.
BCL was designed to be unidirectional: a module was evaluated locally, and the result sent to the Borgmaster. Compare that to Terraform, whose execution model consists of an execution tree where some nodes come from RPCs, meaning that it's not generally possible to statically analyse a TF module, because some errors can come from from feeding RPC results into new RPCs, and execution often fails after tens of minutes. All very janky.