The build times we see affecting C++ and Rust are because the type systems of languages is misdesigned. The supply-chain issues we have with the language-level packaging manager downloading source instead of pre-compiled binaries from curated repositories are also related to this. I think we need leaner, simpler, and better modularized software. Not whole-program optimization which is only necessary because of the monomorphized gigantic intermediate results created for badly designed languages, which then needs to be reduced again in a costly process.
In a large multi-dll build like Windows or Office, the import/export information across modules is computed without doing codegen, so ltcg codegen can be done in parallel regardless of the module dependency graph.
I never worked deeply in the build systems for Linux based OSes or other unixes, but I gather that some symbol visibility choices make the build situation worse in Unix systems than Windows.
- they're larger
- to fix a security bug you have to recompile them, you can't just update the relevant library
- a program not written in go can't use a go library
We find these tradeoffs useful because distributions don't always stay close enough to the bleeding edge for what we're doing and often we're using machines where we have no permission to install system packages or update them. So we derive great value from effectively having a private packaging system.On the other hand a build system that only does silos, assumes some packaging system and is monolingual has limited applicability.