## 3 Materials and Methods
### Development Tools and Platforms  
The simplified design of the developed framework is shown in Figure 7 below. Using the integrated development environment (IDE), users send configuration data or source code through one of the implemented methods. Primarily, the HTTP protocol and web server are used, which are pre-implemented on ESP32 and ESP8266 boards due to their intuitiveness and ease of application on both ends. Binary instructions are processed on the microcontroller for code integrity verification, restarting the virtual machine instance, and loading new data. Execution is handled within the main loop, which retrieves and processes instructions with each cycle while simultaneously managing potential modification requests. The IDE's user interface is implemented using the JavaFX platform in combination with Unirest for handling HTTP requests and the Jackson library for data serialization in JSON format. JavaFX provides a powerful and flexible GUI environment for building modern, responsive IDEs with rich visual components, as well as easy modification and expansion through the MVC approach and design tools like Gluon Scene Builder. Unirest's lightweight HTTP client facilitates the integration of the IDE with external systems and APIs, enabling dynamic reconfiguration, while Jackson's efficient JSON processing allows the IDE to manage complex data structures and configurations that need to be serialized before being sent to the target microcontroller. This combination enables the rapid development of a high-quality IDE that meets the specified design, development, and implementation requirements proposed for this framework [25]. Using available components for data entry and click detection, users also have access to a module for defining the input values for the simulator. In this case, a simple interface for a joystick with directional and action buttons is implemented, which updates the system's state in real time using data binding mechanisms, making them accessible for application in the program code. During simulation runtime, input mapping in the interface to other keyboard buttons is possible for convenience. After the program code is tested in the simulated environment, the modified compiler, implemented in C, can directly execute the code. This is particularly useful for low-level testing without the additional abstraction that the JVM provides, or to create a new bytecode file. Users can then browse available clients, select one, and send that bytecode to the microcontroller for temporary single execution or permanent storage on the file system. Figure 7: Simplified framework workflow overview with pre-installed web server on microcontroller boards (authors’ contribution). When a code execution request is made, the active virtual machine instance is reset and loaded with the new program code. Two operation modes are available:  
* Immediate mode--Upon receiving a request, the new configuration is loaded, and the virtual machine remains active until the end of the program code, after which it finalizes execution (garbage collection and closing of open resources);
* Poll mode--All requests are placed in a separate queue and processed sequentially as the instance is released, keeping the virtual machine active even when the program code has finished executing, waiting for new requests. The default behaviour is poll mode, assuming that external influences or requests may asynchronously alter the system state, while also keeping the web server active after completing the program sent for configuration. The microcontroller project is implemented using a combination of C and C++ programming languages, achieving broad compatibility regardless of library language. Through the native interface, the virtual environment can connect with available libraries for GPIO, communication protocols, peripheral devices, and other needs, and call them within the bytecode [26].