Implementation of hot reloading in compiled programming languages
Hot reloading is a powerful software developing tool which allows the programmer to make changes to the codebase, and see those changes be applied to the program while it is running. This feature is naturally easy to implement in interpreted programming languages, such as Python, JavaScript and Ruby...
Збережено в:
| Дата: | 2026 |
|---|---|
| Автори: | , |
| Формат: | Стаття |
| Мова: | Англійська |
| Опубліковано: |
PROBLEMS IN PROGRAMMING
2026
|
| Теми: | |
| Онлайн доступ: | https://pp.isofts.kiev.ua/index.php/ojs1/article/view/1028 |
| Теги: |
Додати тег
Немає тегів, Будьте першим, хто поставить тег для цього запису!
|
| Назва журналу: | Problems in programming |
| Завантажити файл: | |
Репозитарії
Problems in programming| _version_ | 1869381590857023488 |
|---|---|
| author | Shcherbak, D.V. Zhereb, K.A. |
| author_facet | Shcherbak, D.V. Zhereb, K.A. |
| author_institution_txt_mv | [
{
"author": "D.V. Shcherbak",
"institution": "Kiev Taras Shevchenko National University"
},
{
"author": "K.A. Zhereb",
"institution": "Kiev Taras Shevchenko National University"
}
] |
| author_sort | Shcherbak, D.V. |
| baseUrl_str | https://pp.isofts.kiev.ua/index.php/ojs1/oai |
| collection | OJS |
| datestamp_date | 2026-06-29T10:43:50Z |
| description | Hot reloading is a powerful software developing tool which allows the programmer to make changes to the codebase, and see those changes be applied to the program while it is running. This feature is naturally easy to implement in interpreted programming languages, such as Python, JavaScript and Ruby. This feature is highly demanded in compiled languages as well, because it allows to write and debug programs much faster and simpler, without the need to recompile the whole project to test out new functionality. It is especially useful when working on user interface or investigating problems that require the program in a specific state, which is hard or time consuming to reproduce. This paper explores existing approaches to solving this problem in compiled languages. We take a look at approaches used in languages with additional runtime, such as Java and C#, and explore languages which are compiled to native binaries, such as C++, Rust and Zig. We also discuss current challenges that arise with this technology, and what solutions are possible in new generations of programming languages.Prombles in programming 2026; 2: 77-86 |
| first_indexed | 2026-06-30T01:00:10Z |
| format | Article |
| fulltext |
77
Інструментальні засоби та середовища програмування
УДК 004.43 https://doi.org/10.15407/pp2026.02.077
D. Shcherbak, K. Zhereb
IMPLEMENTATION OF HOT RELOADING
IN COMPILED PROGRAMMING LANGUAGES
Hot reloading is a powerful software developing tool which allows the programmer to make changes to the
codebase, and see those changes be applied to the program while it is running. This feature is naturally easy to
implement in interpreted programming languages, such as Python, JavaScript and Ruby. This feature is highly
demanded in compiled languages as well, because it allows to write and debug programs much faster and simpler,
without the need to recompile the whole project to test out new functionality. It is especially useful when working
on user interface or investigating problems that require the program in a specific state, which is hard or time-
consuming to reproduce. This paper explores existing approaches to solving this problem in compiled languages.
We take a look at approaches used in languages with additional runtime, such as Java and C#, and explore
languages which are compiled to native binaries, such as C++, Rust and Zig. We also discuss current challenges
that arise with this technology, and what solutions are possible in new generations of programming languages.
Keywords: hot reloading, hot swapping, dynamic software updates, dynamic library reload, runtime code
patching, programming languages
Д.В. Щербак, К.А. Жереб
РЕАЛІЗАЦІЯ ГАРЯЧОЇ ЗАМІНИ КОДУ
В КОМПІЛЬОВАНИХ МОВАХ ПРОГРАМУВАННЯ
Гаряча заміна коду – це потужний інструмент для розробки програмного забезпечення, який дозволяє
програмісту вносити зміни коду і бачити їх вплив на програму під час того, як вона виконується. Цю
функцію легко реалізувати в інтерпретованих мовах програмування, таких як Python, JavaScript та Ruby.
Ця функція також дуже затребувана в компільованих мовах, оскільки вона дозволяє писати та
відлагоджувати програми набагато швидше та простіше, без необхідності перекомпілювати весь проєкт
для тестування змін. Це корисно під час роботи над інтерфейсом користувача або у процесі дослідження
проблем, які вимагають фіксацію програми у певному стані, особливо, якщо відтворення такого стану
займає багато часу. У цій статті досліджуються існуючі підходи до вирішення цієї проблеми в
компільованих мовах. Ми розглядаємо підходи, що використовуються в мовах з додатковим
середовищем виконання, таких як Java та C#, та досліджуємо мови, які компілюються безпосередньо в
бінарні файли, такі як C++, Rust та Zig. Ми також обговорюємо поточні проблеми, що виникають з цією
технологією, та рішення, можливі в нових поколіннях мов програмування.
Ключові слова: гаряча заміна коду, динамічні оновлення програмного забезпечення, динамічне
перезавантаження бібліотек, виправлення коду під час виконання, мови програмування
Introduction
Hot reloading (or hot swapping) refers
to the ability to modify the source code for
existing programs and see the changes appear
in the program without having to restart it [1].
This feature is native to interpreted and
dynamic languages since they often run
straight from the source code. Hence, changes
to the source code will be instantly reflected
in the program behavior. By contrast,
compiled languages, which produce
executables tailored to the target system, face
some difficulties implementing this feature.
This paper researches the history of the hot
reloading feature, from its first
implementations in dynamic languages to
adoptions to current popular compiled
systems languages like C++, Java and C#. We
also discuss limitations that might be imposed
on this feature in compiled languages, for
instance immutable function definitions and
class definitions, and explore how those
limitations can be overcome in the future.
© Д.В. Щербак, К.А. Жереб, 2026
ISSN 1727-4907. Проблеми програмування. 2026. №2
https://pp.isofts.kiev.ua
CC BY 4.0
78
Інструментальні засоби та середовища програмування
Hot reload
in dynamic languages
Hot reloading has its roots in the
earliest dynamic languages and environments.
For example, Smalltalk, which was introduced
in the 1970s, presented programmers with an
environment which allowed them to make
changes to the classes during the debugging
session [2]. The simple approach of Smalltalk,
which relies on objects, their methods and
messages being sent between those objects,
provides a uniform interface for all language
features, and allows making changes in
runtime easily.
Common Lisp also allows for reassigning
symbols at runtime [3]. This functionality
can be implemented thanks to the interpreter
that runs the program and can incorporate the
changes at runtime, pausing the execution if
needed and providing safety checks to ensure
validity of program state. Since code isn’t
converted to binaries, the runtime
environment can manage updated definitions
of methods and functions, calling the new
version after any changes were made.
Following Lisp and Smalltalk, Python also
incorporates a similar approach: as an
interpreted language, it allows for changes in
functions and class definitions in a live
developing environment, and it can also load
changed versions of modules on the fly using
importlib.reload [4]. This flexibility usually
comes at the cost of efficiency and runtime
execution speed, which are typically lower in
interpreted programming languages. This
paper addresses the challenge of bringing hot
reloading capabilities to compiled languages
without the need to sacrifice the efficiency of
compiler optimizations.
Hot reload in compiled languages
By contrast, compiled languages
achieve significantly better performance by
producing machine-readable artefacts, which
are tailored to the target operating platform.
This approach allows to perform great
performance optimizations – for example,
unused variables might not be calculated at
all [5].
The possibility of using hot reloading in
compiled languages was intriguing. Java
introduced HotSwap [6] in 2002, and C# added
EditAndContinue [7] in 2004, introducing
some limited hot swapping features, mainly in
debugging mode, for the convenience of the
developer. These languages run on virtual
machines (JVM for Java) and managed
runtimes (.NET CLR for C#), which allows for
easier implementation of hot swapping, than in
languages with fully native binaries. On the
other hand, systems languages like C++ and
Rust historically lacked built-in hot reloading,
but various attempts of implementing it were
made. In this section we discuss the most
notable implementations of hot swapping in
Java, C#, C/C++ and some other compiled
languages, focusing on their capabilities and
constraints.
Java and the JVM
Some hot reload functionality can be
accessed in Java through the JVM HotSwap
mechanism [6]. It was first introduced in Java
1.4, and gives the ability to change method
bodies while in debug mode on a live program.
This can be useful while fixing minor bugs, but
it imposes major limitations: developers are
not allowed to add or remove methods and
class fields, change their type, name and access
level, or mutate class hierarchy. The original
design of HotSpotVM held an assumption of
immutability of classes during runtime, hence
all changes to class hierarchy still required full
application restart. This limitation prompted
further research, such as the Dynamic Code
Evolution VM (DCEVM), which was a patch
for HotSpotVM developed by Thomas
Würthinger in the Institute for System
Software in Linz [8]. It drastically increased
the abilities of classic HotSwap, allowing for
changing class fields, adding and removing
methods, and changing class hierarchy. This is
achieved using a special $transformer method,
which is applied to every object on the heap of
the JVM, which initializes new fields, and
helps ensure the consistency of class
invariants. This instrument is very powerful,
allowing for many types of changes to the
running program, with no ongoing runtime
cost – benchmarks show [8] that the program
79
Інструментальні засоби та середовища програмування
returns to original performance metrics after
the changes are applied. The drawbacks of this
approach might include the slightly longer
reload times, additional complexity and the
fact that this is JVM-specific: the same virtual
machine that provides all the class information
at runtime, which is not available in system
languages like C++, introduces additional
memory and performance overheads.
However, with so many advantages for a
considerably low price in terms of
performance, the adoption of this instrument is
low: the project repository wasn’t updated for
six years as of time of writing this paper. The
fact that DCEVM is a separate tool could be a
factor that limits the adoption. It needs a
separate installation and users need to learn
how to use it alongside usual Java tools. We
believe that if such powerful hot reloading was
a native language feature, with the main
language features built around it, much more
developers would be using it.
Other notable implementations include
JDrums [9] and JVolve [10]. JDrums
implements a dynamic JavaVM, which can
allow for many runtime changes, but are
limited in changes to class hierarchy. JVolve
uses Jikes ResearchVM to implement dynamic
code updates, but falls short of DCEVM as
well, as it is not able to change running
methods.
.NET and C#
In the ecosystem of .NET framework
and the C# language, the ability to make
changes while the program is running was
represented since the early 2000s by the “Edit
and Continue” feature [7]. This feature was
available in the official .NET IDE, the Visual
Studio, and allowed for minor changes to be
done while the program was in Debug Mode.
Those changes will then be applied to the
program, without the need to restart the
application. However, the number of changes
that were available was quite limited, primarily
changes inside method bodies were allowed,
with no changes to class hierarchy or layout.
This feature was recently extended
substantially by the new .Net Hot Reload
feature, released first for .Net 6 in 2021 [11].
First major improvement was the ability to
make changes without the need for explicit
breakpoints, while the Edit-And-Continue
feature required the program to be completely
stopped before you could make any
modifications to the running executable. The
number of changes that are allowed was also
significantly increased: the new .Net Hot
Reload supports adding methods, fields,
constructors, properties to classes, including
async methods and changing method’s return
type [12]. However, some changes still remain
unavailable, such as changes to the interfaces,
adding a destructor to existing class,
modifying a class parameter.
Akin to Java using its JVM to smooth out hot
reload, .NET is using its Just-In-Time compiler
to seamlessly introduce updated method
bodies to the existing application. However,
some systems are not suited to incorporate the
additional overhead of Just-In-Time
compilation and Garbage Collection, and
instead rely on low-level languages, such as C
and C++. In the next section we review the
state of hot reloading in C++, as an example of
a language that is compiled to a native
executable, and how it handles hot reloading.
C and C++
Implementing hot reloading in
languages that compile directly to machine
code is a much more challenging task. It is
further complicated by major compiler
optimizations, which can drastically change
the layout of instructions in the executable.
There are two main approaches to this
problem. The first approach is Dynamic
Library Reload, described in [13]. This is
achieved by splitting a program into a host
subprogram, which starts the application and
calls the main executing functions, and the rest
of the logic, which is stored in Dynamic Link
Libraries (DLL) or Shared Objects (SO).
When the new version of a function is
compiled, the host loads the new Shared
Object instead of the old one and redirects
function pointers, ensuring that all future calls
will execute the new logic. The state of the app
is stored by the host, so that changing the
Shared Objects will not affect the application
80
Інструментальні засоби та середовища програмування
data. This approach has some drawbacks: it
requires ahead-of-time planning. Since
changes cannot be applied in the host part of
the application, signatures of the functions
being called from Shared Objects cannot
change, and need to be decided in advance.
Changing object layouts in memory is also
problematic with this approach, since state is
most often managed by the immutable host,
and if new SOs try to access objects with a
different schema, they will encounter
unexpected errors [14].
Another approach to hot reloading in C++ is
Runtime Code Patching, described in [15].
This way, the changes are made directly to the
executable code of the process in memory.
This is a much harder task, since compilers are
relying on the fact that the program code is
static, and can use this information, as was
mentioned, to perform optimizations. One of
the tools that can be used to achieve this is
Live++, a proprietary tool developed by
Molecular Matters [16]. It requires the
program to be compiled with special build
flags that add a small patchable entry point at
the beginning of each function. This way
Live++ can easily insert a jump instruction
which provides an indirection for the execution
flow, allowing to delay execution before
changes are made to the target function, and
then return to normal execution, or if the size
of the function is growing more than the
allocated scope allows, the function
instructions can be moved to a different slot in
memory altogether. Another powerful feature
is Hot Restart: if the changes made by the
developer cannot be handled in runtime, they
will be applied through the full program
restart. However, since the app was already
precompiled, the changes can be applied much
quicker, skipping most of the warmup time.
All in all, Live++ provides a great set of tools
to perform hot reloading in C++, allowing for
many types of changes during runtime with
minimal overhead. A few of its drawbacks
include some compile parameters limitations:
the /FUNCTIONADMIN linking parameter is
compulsory and some optimization flags, like
Whole-Program Optimizations and Link-Time
Optimizations are prohibited. It is prohibited to
introduce new global or static variables into
thread-local storages, and some behaviour
changes might occur when debugging a
patched program.
From the academic side, the most notable
solutions for dynamic software updating in C
and C++ included Ginseng, which
implemented hot reloading for C in [17], and
later improved it with an algorithm for a multi-
threaded solution in [18]. However, its
approach required automatically introducing
additional variables to each struct and function
to provide indirection, which could cause
performance issues. A later project Kitsune
[13] proved to outperform it in terms of
runtime update speed, while maintaining the
ability to make almost arbitrary changes to the
program. This, however, was achieved by a
requirement for the developer to explicitly
mark code points, in which hot reload is
possible. While such technique can work as a
safety guarantee (or at least shift the blame for
the inconsistencies on the developer, who
didn’t properly choose the update points), it
makes the adoption process of Kitsune much
harder for many projects, especially for those
with an extensive code base.
Other notable implementations
Zig, as a low-level language that is
compiled to a native executable, can easily
implement the dynamic library reload,
introduced in the C++ section of [19]. An
implementation of runtime code patching was
proposed in 2022 by one of the language
maintainers [20]. The proposal outlined an
incremental compilation mode, which left the
compiler running as a background service.
After receiving a command to update the live
executable, the compiler determines which
changes need to be made and updates the
corresponding memory of the running process.
This is only implemented as an experimental
feature, and no handling of program state was
described, but it shows potential for future
implementations of hot reloading in Zig,
leveraging its low level access to memory.
Erlang is a programming language built
around the idea of scalable, fault-tolerant
systems with long running time [21]. The main
idea of Erlang is implementing multiple
81
Інструментальні засоби та середовища програмування
concurrent processes, that don’t share any
memory or state, and communicate via
asynchronous messages. Those processes are
designed in a way that makes them easy to halt
and start new instances, which provides a
perfect environment for hot reloading. Erlang
supports multiple versions of the same process
running at the same time, with the main
assumption that all old processes will
eventually die out, and only the newest version
processes are created as soon as it is compiled.
Though Erlang is using a virtual machine,
which restricts it from being used in
performance-critical environments, its ability
to change running systems, among other
advantages, made it widely used in
telecommunication systems, bankings and
more.
Rust is another example of a low-level
language, that is known for its long compile
times, and, as such, would benefit greatly from
hot-reloading capabilities. There are solutions
for Dynamic Library Reload like
dynamic_reload [22] or hot_lib_reloader [23],
but no implementations of Runtime Code
Patching were introduced. With Go, another
popular compiled language, the most
successful solutions like Air [24] provide the
capability of Live Reloading, which essentially
fully restarts the application in an automated
way.
Mun [25] is a programming language in the
early stages of development, which aspires to
have a Rust-like syntax and feature set,
combined with native capabilities of hot
reloading. As of writing of this paper, it is too
early to tell how it compares in terms of speed,
and patches runtime overhead to other
solutions in this paper. However, it shows
promise, and has potential to become a great
example of native hot-reload implementation
in a compiled language.
Proposed Approaches for High-
Performance Hot Reload
Since hot-reloading is a powerful and
useful tool, we believe it is very likely to be a
part of new languages that will be developed in
the future. Yet, it is complex and hard to
implement, especially post-factum in a
language that is already in use, because current
memory layouts in existing programs cannot
be changed.
One way to overcome this is to start building
the compiler around the idea of hot-reloading,
extensibility and improvability. Most popular
compiled languages don’t support hot-
reloading out of the box. We believe that
possible growth of hot reload implementations
and usage is limited, partly, by the general
approach, which is common for most compiled
languages – treating the executable as an
immutable artefact.
Of course, such a way of thinking has its
benefits. It provides for encapsulation,
modularity and more strict separation of
responsibilities. And in the early days of
computing it was enough: simple programs
that automated mathematical tasks, such as
simple physics simulations, followed the same
path. The program started at a clean slate,
allocated and initialized some resources,
executed some computations, freed the
resources and died. Today, many programmers
work on long-running servers that might have
uptime of days, weeks and months. Yet, for
compiled systems languages, these servers still
need to be put to a complete stop for every
change that needs to be introduced. Entire
systems, like Kubernetes, were implemented
for ensuring the uptime of big systems, and one
of the features they provide is an ability to
update a running service to a newer version
without disrupting the users' workflow. This is
achieved by starting multiple instances of the
same service, and gradually switching some of
them to a newer version, while redirecting
users to them. While this solution is elegant, it
does introduce a certain level of complexity,
which is only required because the executables
that are running the servers are immutable.
Perhaps, it would be beneficial to write
programs in an environment that allows them
to change while running, providing evolution
of systems, not revolutionary (breaking)
changes.
Performance-critical systems, which cannot
allow for large overhead of an orchestrator,
such as Kubernetes, would still benefit from an
ability to upgrade its software. In 1988, part of
82
Інструментальні засоби та середовища програмування
a space probe software, which was written in
Lisp, malfunctioned, and the mission was
saved, because Lisp allowed to debug and
change its code while live and in the process of
a spaceflight [26]. While this shows how
important it is to be able to debug and improve
the program in runtime, a strict type system
and compile-time checks can prevent many
cases of undesired behavior. Combining both
the safety of a compiler with the flexibility of
hot reloading is a way to achieve the most
stable and adaptable systems.
Compiler built around Hot
Reloading feature
As was mentioned earlier,
implementing the Hot Reload feature in an
existing language is quite difficult, and it
almost always results in some overhead. For
example, in compiled OOP-languages, like
Java and C++, one of the issues that could arise
is related to the object’s layout in memory. If a
new field is added to an object via Hot
Reloading, how to add this field to existing
objects?
Such a problem would be solved, if the
compiler is designed with the idea of hot
reloading in mind. Then all the tooling,
memory layouts and runtime can be
implemented in such a way that allows to
change them easily, even while the program is
running. This also allows the implementation
of different approaches to hot-reloading,
exploring different trade-offs.
One approach is to do memory mapping in a
way that makes the addresses of functions in
memory predictable and easy to calculate. This
allows to make the hot swapping process as
fast and painless as possible, but might result
in the final executable being larger, which
sometimes could be an issue, if the target
machine doesn’t have a lot of spare memory.
Alternatively, it is possible to provide the most
efficient memory layout for the executable,
and calculate which parts need to be changed
at each hot swap event, factoring in additional
factors like compiler optimizations. This will
result in smaller executable sizes and, in some
cases, faster code, for the cost of longer hot-
reload times. Building the compiler with the
concept of hot reload in mind allows to
implement both approaches much easier. And
of course, such a compiler can still be used in
an old-fashioned way: just a simple
executable, no hot-reloading capabilities, for
the sake of security, speed and reliability.
This way of thinking, in terms of evolving,
runtime-developed systems, allows for
potential new approaches to programming in
general. As an example, it might be possible to
write some interface with default
implementations, and combine it with logic
that will invoke new implementations, when
they are implemented, and until then will fall
back to the default implementation. In other
words, it becomes possible to not only reason
about what the code is, but also about what it
will be.
Proposed compiler architecture
In this section we present a concept of
a future approach to compiler architecture, for
a statically compiled language to achieve
maximum native hot reloading capabilities.
We propose to combine the Dynamic Library
Reload (DLR) approach with Runtime Code
Patching (RCP). In principle, DLR allows for
the easiest approach, and the one providing the
least overhead. However, it has its limitations
in terms of program state and function
signatures, which were already discussed
earlier. RCP, in turn, allows for more
flexibility, but can cause more additional
overhead. What is meant here by combination
of those approaches, is that the compiler
separates the code, designating some of it to
dynamic libraries for ease of hot swapping in
runtime. At the same time, the controlling unit,
which in regular DLR approach is left
immutable, is compiled in a way that allows
the use of the RCP approach, allowing for
changes here as well, with the possibility of
state transformations. This way it is possible to
allow for maximum flexibility, while keeping
memory overhead to a minimum. What is also
important, compiler optimizations also take
this layout into account, so the developer won’t
be forced to choose between powerful
optimizations and hot reloading. The proposed
design is presented at Figure 1. This approach
83
Інструментальні засоби та середовища програмування
doesn't require a separate process to handle hot
reloading, as it is done by the compiler itself,
which can be executed as a background
process. When the hot reload is triggered, the
compiler checks for changes since the last
compilation, compiles them, without
recompiling the whole project, but using
previous compilation info to provide type
checks and other validation. Upon successful
compilation, a patch with new shared object
files and changes necessary to the main unit are
applied to the running executable.
Fig. 1. Proposed compiler architecture
Prototype implementation
To test how two approaches can be
used together, we implemented a simple proof
of concept project. The source code is
available on GitHub at [27], and general
representation of the project workflow is
presented at Figure 2. The main loop iterates
through calls to simple mathematical
functions, one of which is loaded from a
dynamic library via DLR module, and
accessed through a function pointer, and
another one is compiled in a static module and
directly called from the main loop. Both
functions can be modified, and after a call to
the compilation system the changes will be
injected into the main loop, either by
swapping the shared object for a newer
version, or by providing a byte sequence to
the RCP module, which is directly injected
into the running program memory. A
compilation system in this context is a
standard C++ compiler, combined with a
number of simple bash scripts, needed to
perform file substitution and pass build
parameters to the compiler. This project also
shows that DLR is capable of loading
completely new functions, while RCP cannot
do that. RCP on the other hand allows much
more flexibility, but requires more
preparation and is harder to implement.
Benchmarking of this project showed that
patching time varies for the DLR approach,
with bigger batches taking more time to load.
With RCP, bytes can be loaded independently
of the main program running, so the time for
which execution is interrupted is limited to
inserting the jump instruction to the code, and
does not grow as patch gets bigger, as can be
observed in Table 1.
84
Інструментальні засоби та середовища програмування
Fig. 2. Implementation of combined DLR and RCP method
Table 1.
Benchmarking results for different hot reload
approaches
Patching mechanism Mean patch
time (ns)
Min patch
time (ns)
RCP, ~40 bytes 2073 1607
RCP, ~300 bytes 1993 1594
DLR, 1 symbol 278 267
DLR, 1000 symbols 29565 27985
Conclusion
In this paper we explored the history of
the hot reloading feature in different
programming languages, starting with the first
examples, which came from interpreted
languages. We then discussed approaches to
hot reloading in the most popular compiled
languages, ranging from academic results,
such as DCEVM for Java, to proprietary
solutions like Live++ for C++. We also
considered implementations and proposals
thereof in less popular languages. In later
sections, we discussed the importance of the
hot reload feature for modern and future
programming languages, and proposed an
approach of incorporating this feature early in
the development of future programming
languages, to ease its implementation and
usage. Lastly, we introduced a proposal for
compiler architecture, which allows for non-
restrictive and fast hot reloading by combining
the Dynamic Library Reload with Runtime
Code Patching. The proof of concept
implementation, provided in the last section,
confirmed the benefits of using both
approaches, and provided a foundation for a
future full-scale compiler, built around the idea
of hot reloading.
References
1. Appavoo, J., et al. (2003) ‘Enabling autonomic
behavior in systems software with hot
swapping’, in IBM Systems Journal, vol. 42,
no. 1. Armonk, NY, USA: International
Business Machines Corporation, pp. 60–76.
85
Інструментальні засоби та середовища програмування
2. Kay, A.C. (1996) ‘The early history of
Smalltalk’, in History of Programming
Languages---II. New York, NY, USA:
Association for Computing Machinery, pp.
511–598.
3. Steele Jr, G. L. (1990). Common Lisp the
Language (2nd ed.). Digital Press.
4. Python Software Foundation (2025), importlib
— The implementation of import. Available at:
https://docs.python.org/3/library/importlib.ht
ml (Accessed: 15 October 2025)
5. Godbolt, M. (2020) ‘Optimizations in C++
compilers’, Commun. ACM, 63(2), pp. 41–49.
6. Oracle Corporation (2025) HotSwap.
Available at:
https://wiki.openjdk.org/spaces/mlvm/pages/7
897093/HotSwap (Accessed: 15 November
2025)
7. Microsoft (2025) Edit and continue for C#.
Available at: https://learn.microsoft.com/en-
us/visualstudio/debugger/edit-and-continue-
visual-cshar (Accessed: 30 October 2025)
8. Würthinger, T., Wimmer, C. and Stadler, L.
(2010) ‘Dynamic code evolution for Java’, in
Proceedings of the 8th International
Conference on the Principles and Practice of
Programming in Java. New York, NY, USA:
Association for Computing Machinery (PPPJ
’10), pp. 10–19.
9. Andersson, J. and Ritzau, T. (05 2000)
‘Dynamic Code Update in JDRUMS’.
10. Subramanian, S., Hicks, M. and McKinley, K.
(06 2009) ‘Dynamic Software Updates: A VM-
centric Approach’, in, pp. 1–12.
11. Lyalin, D. (2021) Introducing the .NET Hot
Reload experience for editing code at runtime.
Available at:
https://devblogs.microsoft.com/dotnet/introdu
cing-net-hot-reload (Accessed: 01 November
2025)
12. Microsoft (2025) Write and debug running
code with Hot Reload in Visual Studio.
Available at: https://learn.microsoft.com/en-
us/visualstudio/debugger/hot-reload
(Accessed: 01 November 2025)
13. Hayden, C.M. et al. (2012) ‘Kitsune: efficient,
general-purpose dynamic software updating
for C’, in Proceedings of the ACM
International Conference on Object Oriented
Programming Systems Languages and
Applications. New York, NY, USA:
Association for Computing Machinery
(OOPSLA ’12), pp. 249–264.
14. Zylinski K. (2023) Hot Reload Gameplay
Code: What, why, limitations and examples.
Available at: https://zylinski.se/posts/hot-
reload-gameplay-code (Accessed: 1 November
2025)
15. Buck, B. and Hollingsworth, J.K. (2000) ‘An
API for Runtime Code Patching’, in The
International Journal of High Performance
Computing Applications, vol. 14, no. 4.
Thousand Oaks, CA, USA: SAGE
Publications, pp. 317–329.
16. Molecular Matters GmbH (2025) Live++ for
Windows - Documentation. Available at:
https://liveplusplus.tech/docs/documentation.h
tml (Accessed: 30 October 2025)
17. Neamtiu, I. et al. (2006) ‘Practical dynamic
software updating for C’, in Proceedings of the
27th ACM SIGPLAN Conference on
Programming Language Design and
Implementation. New York, NY, USA:
Association for Computing Machinery (PLDI
’06), pp. 72–83.
18. Neamtiu, I. and Hicks, M. (2009) ‘Safe and
timely updates to multi-threaded programs’, in
Proceedings of the 30th ACM SIGPLAN
Conference on Programming Language Design
and Implementation. New York, NY, USA:
Association for Computing Machinery (PLDI
’09), pp. 13–24.
19. Perkin, L. (2024) Hot-reloading with Raylib.
Available at: https://zig.news/perky/hot-
reloading-with-raylib-4bf9 (Accessed: 26
October 2025)
20. Konka, J. (2022) Hot-code reloading on
macOS/arm64 with Zig. Available at:
https://www.jakubkonka.com/2022/03/16/hcs-
zig.html (Accessed: 8 November 2025)
21. Armstrong, J. (2007) ‘A history of Erlang’, in
Proceedings of the Third ACM SIGPLAN
Conference on History of Programming
Languages. New York, NY, USA: Association
for Computing Machinery (HOPL III), pp. 6-
1-6–26.
22. The Rust Foundation (2025) Dynamic_reload
crate documentation. Available at:
https://crates.io/crates/dynamic_reload
(Accessed: 26 October 2025)
23. The Rust Foundation (2025) hot_lib_reloader
crate documentation. Available at:
https://crates.io/crates/hot-lib-reloader
(Accessed: 26 October 2025)
24. Nguyen, H. (2024) Guide for Implementing
Live Reload Using Golang Air. Available at:
https://reliasoftware.com/blog/live-reload-
using-golang-air (Accessed: 14 November
2025)
25. Mun language documentation. Available at:
https://docs.mun-lang.org/ (Accessed: 15
November 2025)
86
Інструментальні засоби та середовища програмування
26. Cassel, D. (2022), NASA Programmer
Remembers Debugging Lisp in Deep Space.
Available at: https://thenewstack.io/nasa-
programmer-remembers-debugging-lisp-in-
deep-space (Accessed: 27 October 2025)
27. Implementation of the prototype described in
the paper. Available at:
https://github.com/DShcherbak/hot-reload-
poc (Accessed: 23 March 2026)
Дата першого надходження до видання:
26.03.2026
Внутрішня рецензія отримана: 14.04.2026
Зовнішня рецензія отримана: 20.04.2026
Дата прийняття статті до друку:05.06.2026
Дата публікації: 29.06.2026
Про авторів:
Денис Щербак,
аспірант
Denys Shcherbak
post-graduate student
https://orcid.org/0009-0006-7842-565X
Костянтин Жереб,
кандидат фізико-математичних наук,
асистент кафедри
Kostyantyn Zhereb
Ph.D., (physical and mathematical sciences),
assistant professor
https://orcid.org/0000-0003-0881-2284
Місце роботи авторів:
Київський національний університет імені
Тараса Шевченка,
факультет комп’ютерних наук та
кібернетики
Kyiv Taras Shevchenko National University,
Faculty of computer science and
cybernetics
тел. +38(044) 521-32-74
E-mail: csc@knu.ua
https://csc.knu.ua
|
| id | pp_isofts_kiev_ua-article-1028 |
| institution | Problems in programming |
| keywords_txt_mv | keywords |
| language | English |
| last_indexed | 2026-06-30T01:00:10Z |
| publishDate | 2026 |
| publisher | PROBLEMS IN PROGRAMMING |
| record_format | ojs |
| resource_txt_mv | ppisoftskievua/ac/4e51a6759056bcd7ad17bbc87142c2ac.pdf |
| spelling | pp_isofts_kiev_ua-article-10282026-06-29T10:43:50Z Implementation of hot reloading in compiled programming languages Реалізація гарячої заміни коду в компільованих мовах програмування Shcherbak, D.V. Zhereb, K.A. hot reloading; hot swapping; dynamic software updates; dynamic library reload; runtime code patching; programming languages UDC 004.43 гаряча заміна коду; динамічні оновлення програмного забезпечення; динамічне перезавантаження бібліотек; виправлення коду під час виконання; мови програмування УДК 004.43 Hot reloading is a powerful software developing tool which allows the programmer to make changes to the codebase, and see those changes be applied to the program while it is running. This feature is naturally easy to implement in interpreted programming languages, such as Python, JavaScript and Ruby. This feature is highly demanded in compiled languages as well, because it allows to write and debug programs much faster and simpler, without the need to recompile the whole project to test out new functionality. It is especially useful when working on user interface or investigating problems that require the program in a specific state, which is hard or time consuming to reproduce. This paper explores existing approaches to solving this problem in compiled languages. We take a look at approaches used in languages with additional runtime, such as Java and C#, and explore languages which are compiled to native binaries, such as C++, Rust and Zig. We also discuss current challenges that arise with this technology, and what solutions are possible in new generations of programming languages.Prombles in programming 2026; 2: 77-86 Гаряча заміна коду – це потужний інструмент для розробки програмного забезпечення, який дозволяє програмісту вносити зміни коду і бачити їх вплив на програму під час того, як вона виконується. Цю функцію легко реалізувати в інтерпретованих мовах програмування, таких як Python, JavaScript та Ruby. Ця функція також дуже затребувана в компільованих мовах, оскільки вона дозволяє писати та відлагоджувати програми набагато швидше та простіше, без необхідності перекомпілювати весь проєкт для тестування змін. Це корисно під час роботи над інтерфейсом користувача або у процесі дослідження проблем, які вимагають фіксацію програми у певному стані, особливо, якщо відтворення такого стану займає багато часу. У цій статті досліджуються існуючі підходи до вирішення цієї проблеми в компільованих мовах. Ми розглядаємо підходи, що використовуються в мовах з додатковим середовищем виконання, таких як Java та C#, та досліджуємо мови, які компілюються безпосередньо в бінарні файли, такі як C++, Rust та Zig. Ми також обговорюємо поточні проблеми, що виникають з цією технологією, та рішення, можливі в нових поколіннях мов програмування.Prombles in programming 2026; 2: 77-86 PROBLEMS IN PROGRAMMING ПРОБЛЕМЫ ПРОГРАММИРОВАНИЯ ПРОБЛЕМИ ПРОГРАМУВАННЯ 2026-06-29 Article Article application/pdf https://pp.isofts.kiev.ua/index.php/ojs1/article/view/1028 PROBLEMS IN PROGRAMMING; No 2 (2026); 77-86 ПРОБЛЕМЫ ПРОГРАММИРОВАНИЯ; No 2 (2026); 77-86 ПРОБЛЕМИ ПРОГРАМУВАННЯ; No 2 (2026); 77-86 1727-4907 en https://pp.isofts.kiev.ua/index.php/ojs1/article/view/1028/1096 Copyright (c) 2026 PROBLEMS IN PROGRAMMING |
| spellingShingle | hot reloading hot swapping dynamic software updates dynamic library reload runtime code patching programming languages UDC 004.43 Shcherbak, D.V. Zhereb, K.A. Implementation of hot reloading in compiled programming languages |
| title | Implementation of hot reloading in compiled programming languages |
| title_alt | Реалізація гарячої заміни коду в компільованих мовах програмування |
| title_full | Implementation of hot reloading in compiled programming languages |
| title_fullStr | Implementation of hot reloading in compiled programming languages |
| title_full_unstemmed | Implementation of hot reloading in compiled programming languages |
| title_short | Implementation of hot reloading in compiled programming languages |
| title_sort | implementation of hot reloading in compiled programming languages |
| topic | hot reloading hot swapping dynamic software updates dynamic library reload runtime code patching programming languages UDC 004.43 |
| topic_facet | hot reloading hot swapping dynamic software updates dynamic library reload runtime code patching programming languages UDC 004.43 гаряча заміна коду динамічні оновлення програмного забезпечення динамічне перезавантаження бібліотек виправлення коду під час виконання мови програмування УДК 004.43 |
| url | https://pp.isofts.kiev.ua/index.php/ojs1/article/view/1028 |
| work_keys_str_mv | AT shcherbakdv implementationofhotreloadingincompiledprogramminglanguages AT zherebka implementationofhotreloadingincompiledprogramminglanguages AT shcherbakdv realízacíâgarâčoízamínikoduvkompílʹovanihmovahprogramuvannâ AT zherebka realízacíâgarâčoízamínikoduvkompílʹovanihmovahprogramuvannâ |