I've been designing a compiler framework (targeting .NET) for a while now and I've been thinking more and more about deprecating the command line interface. A lot of my compiler's flexibility comes from the ability to define custom pipeline elements (to handle DSLs, macros (which have their own DSL to define), etc) and the command line ends up very verbose and tedious. This also makes it more difficult to design a NAnt task that will expose all of the functionality in a simple way.
The alternative I've been toying around with is actually making the NAnt task load the compiler module and call it directly, so the command line is a nonissue. This will remove the overhead of invoking the compiler -- a non-negligible amount of time when you're doing a lot of compilation, as it has to initialize for each and every compilation -- and allow you to more easily define custom pipelines.
My question is this: Why hasn't this been done before? It seems a natural progression to more tightly integrate the compiler with the build system. Assuming you keep the command line interface around, there are few downsides and a lot of benefits. For that matter, has anyone done this already?
Edit: To clarify, I'm not proposing the complete abolition of the compiler command line interface, just treating it as the legacy interface.
Further edit: A lot of people have responded in favor of the command line interface, which has led me to think more about what can be done to improve it. Is there a reason why accepting basic info -- output filename, language to compile with, possibly source files (if there aren't custom steps to be put onto their compilation), etc -- over the command line and then taking pipeline info and such over STDIN would be an issue? This seems like a nice middle ground that would be easy to use from most any existing build system.