## 1 Introduction  
### Embedded Systems and Dynamic Configuration Challenges  
The rapid advancement of technology has led to an intensive increase in the presence of embedded systems across various domains, including industrial automation, automotive systems, and consumer electronics. These systems are designed to perform specific tasks efficiently and reliably, often with minimal human intervention [1]. However, the growing complexity and dynamic nature of modern applications have created the need for more flexible and adaptable embedded systems. Traditional embedded systems, typically designed to run a single, fixed set of instructions, are no longer sufficient for contemporary applications requiring frequent updates, real-time adjustments, and dynamic reconfiguration. One of the key challenges in developing embedded systems is the need for efficient and flexible code execution. Embedded systems often operate in resource-constrained environments where memory and processing power are limited. These constraints demand optimized code and efficient resource management. However, the traditional approach of compiling code into machine-specific instructions can be limiting, as it does not allow easy updates or modifications [2]. To address these limitations, researchers and developers have explored the use of virtual machines (VMs) and interpreters in embedded systems. Virtual machines provide an abstraction layer between hardware and software, enabling the execution of code that is not specific to the underlying hardware [3]. This abstraction facilitates the creation and use of a unified and often platform-independent design, simplifying portability and maintenance. Interpreters, on the other hand, execute code line-by-line, allowing dynamic code changes without the need for recompilation. This capability is especially useful where frequent updates or modifications are needed [2]. By using interpreters, developers can make code changes \"on the fly\" without requiring a complete system restart. Integrating virtual machines and interpreters offers several advantages:  
* Dynamic system reconfiguration: This allows changes in system behaviour without physical reconfiguration, which is particularly useful in applications with frequently changing requirements, such as industrial automation or autonomous vehicles. * Platform independence and enhanced portability: Virtual machines and interpreters enable the execution of code that is not tied to specific hardware, which is critical in embedded systems where hardware can change or evolve over time. By using a virtual machine, developers can ensure that their code remains compatible with various hardware platforms, reducing the need for extensive rewriting or recompilation. The interpreter within the virtual machine can further abstract the code, making it easier to adapt to various environments such as sandboxing untrusted applications or running potentially harmful scripts in a controlled environment. * Simplified debugging and testing: The combination of virtual machines and interpreters allows developers to test code changes immediately, as interpreters execute code in real time. This setup is useful for debugging and development, as it enables developers to identify and resolve issues on the fly without needing a full system rebuild. * Resource efficiency: By combining virtual machines with interpreters, it is possible to execute lightweight, isolated processes that do not require the full overhead of recompiling or redeploying applications. This setup is particularly useful in environments where computing resources are limited, such as IoT devices or embedded systems. * Improved cross-language support: Virtual machines can support multiple programming languages within the same environment, and interpreters can enable interoperability between these languages. For instance, a Python interpreter running on a Java virtual machine can allow for cross-language calls, enhancing the flexibility of multi-language applications.