On Thursday, 26 April 2018 at 10:06:57 UTC, JN wrote:
On Wednesday, 25 April 2018 at 19:19:58 UTC, BoQsc wrote:

Alternatively, I don't know about specifics how to implement it in D, but the key phrase you are looking for is "code hotswap" or "hot loading". It's being popularized right now in gamedev circles, to avoid slow complications of the code. The way to do it is push code into DLLs, then reload the DLL if the change is detected. Of course it's not that simple, because there are some tricky parts around DLL boundaries and you have to reload the entire state, but it is possible. In such case, rather than recompile the entire code, you can just recompile a small subset of functionality to a DLL.

----- content below is just my thoughts and may or may not have anything common with reality, don't take it as truth, forget after reading, proceed on your own risk
----

The overall process is like this:

1) make a core app that basically serves as host (whether or not put domain logic here is open question) 2) when run, scan & plug-in[*] shared libs (they must must follow well defined plugin API, ideally providing information about their requirements/dependencies and their services) 3) when library should be hot reloaded, it first serializes 'shared' data, then re-loaded with same mechanism as in 2), and deserializes data back.

[*] - it has implications depending on platform, on Windows for example don't just load the libs(executing one's is locked by OS), but copy to temporary executing location first, that way one can overwrite the original libs while (a copy of) it is still running and app can be notified about file changes to perform hot reload. (AFAIK UnrealEngine does this without temporary location, instead it relies on custom build system that checks whether app is running, which will then append incremental number to the name of the resulting binary, after build is done editor replaces old library with new one. I don't know the exact notification mechanism, it could be the build system itself or just FS event handled by engine which compares known running lib names for such incremental change, both ways makes it harder to manually replace library)



The one of the major points of having such libraries, after all, to be able to swap implementation without full rebuild, and better, in run time. For example in case of game engine, let's say we want to switch rendering API(say DirectX to Vulkan), in this case there is even no need to serialize anything because most(if not any) of the stuff is implementation specific, such swap could be done *almost* in real time, I mean minor freeze for few frames doesn't makes a big difference here, and really I doubt anyone would do that in a middle of a game(not in menu or pause).

There is still lots of question, after all this is just example in theory, in practice however I've never yet come close enough to the practical implementation of such thing in D.

---- WARNING: ONLY WINDOWS-SPECIFIC STUFF BELOW

But now the problem.
Guess what? DLL support on Windows is simply isn't there yet! AHAHAHAH (imagine some epic evil laugh here)

Sure thing, it is possible to make a bunch of loose functions that operates on built-in (value) types, but does this really provides the extensibility? I can hardly imagine usefulness of such approach in any but trivial cases, just imagine Unity or Unreal Engine, or complex software like 3ds Max or Maya... It is also to some extent possible to go shady with hacks and abuses, but this is something that should not be shipped as production ready, and there is even no guarantee it will work in a future. The last option probably is to implement whole mechanism from scratch, like COM objects, D is a system language after all, but I to be honest don't have the desire to fall that low, especially because on Linux it works for years...

(side note: I actually tried few simple (hacky) test cases with passing classes cross-boundary and then unloading library, seems to work on Windows, not sure about memory leaks and consequnces in long runs though)

Reply via email to