5/21/2025 at 5:07:47 PM
Link time optimizations were done in the 1980s if I recall correctly.I never tried to implement them, finding it easier and more effective for the compiler to simply compile all the source files at the same time.
The D compiler is designed to be able to build one object file per source file at a time, or one object file which combines all of the source files. Most people choose the one object file.
by WalterBright
5/21/2025 at 9:47:41 PM
In C++, there is a trick to get this behavior called "unity builds", where you include all of your source files into a single file and then invoke the compiler on that file.Of course, being C++, this subtly changes behavior and must be done carefully. I like this article that explains the ins and outs of using unity builds: https://austinmorlan.com/posts/unity_jumbo_build/
by senkora
5/21/2025 at 10:59:07 PM
> this subtly changes behaviorThe D module design ensures that module imports are independent of each other and are independent of the importer.
by WalterBright
5/21/2025 at 5:20:43 PM
I think MLton does it this way.http://mlton.org/WholeProgramOptimization
Dynamically linked and dynamically loaded libraries are useful though (paid for with its problems of course)
by srean
5/22/2025 at 12:29:06 AM
For Inko (https://inko-lang.org/) I went a step further: it generates an object file for each type, instead of per source file or per project. The idea is that if e.g. a generic type is specialized into a new instance (or has some methods added to it), only the object file for that type needs to be re-generated. This in turn should allow for much more fine-grained incremental compilation.The downside is that you can end up with thousands of object files, but for modern linkers that isn't a problem.
by YorickPeterse
5/21/2025 at 7:08:20 PM
Yea, generating many object files seems like weird thing. Maybe it was good thing decades ago, but now?Because then you need to link them, thus you need some kind of linker.
Just generate one output file and skip the linker
by tester756
5/22/2025 at 9:24:32 AM
Generating many object files is pointless for building an executable or a dynamic library, but it remains the desired behavior for building a static library.Many software projects that must generate multiple executables are better structured as a static library plus one source file with the "main" function for each executable.
by adrian_b
5/22/2025 at 6:44:51 PM
One thing the D compiler does is it can generate a library in one step (no need to use the librarian). Give a bunch of source files and object files on the command line, specify a library as the output, and boom! library created directly (compiling the source files, and adding the object files).I haven't used a librarian program for maybe a decade.
by WalterBright
5/21/2025 at 8:51:34 PM
Not maybe. Sufficient RAM for compilation was a serious issue back in the day.by yencabulator
5/22/2025 at 12:00:21 AM
Sure, and if any file is touched, just process them all.by kazinator
5/22/2025 at 9:33:35 AM
Some compilers had incremental compilation to handle this during development builds.Then only the functions touched inside some file would be recompiled, not the remainder of the file or other files.
Obviously, choosing incremental compilation inhibited some optimizations.
by adrian_b
5/21/2025 at 8:03:47 PM
I've considered many times doing just that.by WalterBright
5/21/2025 at 8:49:16 PM
And what was the result/conclusion of such considerations?by tester756
5/21/2025 at 11:02:06 PM
Not worth the effort.1. linkers have increased enormously in complexity
2. little commonality between linkers for different platforms
3. compatibility with the standalone linkers
4. trying to keep up with constant enhancement of existing linkers
by WalterBright
5/22/2025 at 11:24:12 AM
It sounds like this would prevent the inherit concurrency you would get out of handling files separately?by dooglius
5/22/2025 at 6:41:20 PM
It's complicated and not at all clear. For example, most modules import other modules. With separate compilation, most of the modules need to be compiled multiple times, with all-together, it's only once.On the other hand, the optimizer and code generator can be run concurrently in multiple processes/threads.
by WalterBright