Not really. Hard-real-time is already done in Julia without (yes, for a simulation, currently, of a humanoid robot, so not with an RTOS), and this was/is? my favorite case study of Julia, until the Drone delivery one (I just do not know the extent of non-Julia code in that one and other technical details):
https://juliacomputing.com/case-studies/mit-robotics.html
One area in which we see significant advantages using Julia is in developing online controllers (that is, controllers which run in real time on the robot, typically with control rates of 100-1000 Hz
Another language D, also with GC, neither did go that route of improving its GC, they have a subset they call BetterC, without GC. [Yes, it will be annoying, meaning no longer access to most of the standard library (for them, even more for us?), but not really a problem for many embedded projects.]
I’m not sure we need to generate Rust (while would be interesting, if it applies well at all?) or C code, only compiled binaries of such a subset. If we do it and do not include the Julia runtime, we know we have all the code we need, and we can’t be compiling Julia code at runtime.
This is maybe already possible with:
https://julialang.github.io/PackageCompiler.jl/dev/devdocs/binaries_part_2/
From the paper already given in the thread (seems to be same guys and project):
At first glance, the fact that Julia is a garbage-
collected language seems a major roadblock on the path
to its adoption for online control. Julia employs a stop-
the-world garbage collector (GC), meaning that no useful
work is done while garbage is collected. Although garbage
collectors with hard real-time guarantees do exist in
other languages [19], [20], Julia’s GC provides no such
guarantees. […] a full garbage collector sweep without generating
any garbage takes around 46 ms, which would upper-
bound the achievable control rate to a mere 22 Hz.
This implies that, currently, Julia’s garbage collector
should be disabled for online control purposes, which
in turn implies that dynamic memory allocation should
be avoided so as to not run out of memory. Hence,
our current approach is to completely avoid dynamic
allocation in code that is meant to be run in low-level
control loops (after an initial preallocation phase). […]
This is a serious constraint, but it should be noted
that it is nontrivial to provide hard realtime constraints
in the presence of dynamic allocation in any language,
requiring e.g. a specialized memory allocator in C++
[21].