exers 0.2.0

Library for compiling and running other code in sandboxed environment
Documentation
# Exers :computer:


Exers is a rust library for compiling and running code in different languages and runtimes.

## Usage example


```rust
fn main() {
    // Imports...

    let code = r#"
    fn main() {
        println!("Hello World!");
    }
    "#;

    let compiled_code = RustCompiler.compile(&mut code.as_bytes(), Default::default());
    let result = WasmRuntime.run(&compiled_code, Default::default()).unwrap();
}
```

## Supported languages :books:


| Language | Supported Runtimes | Required Dependencies      |
| -------- | ------------------ | -------------------------- |
| Rust     | Wasm, Native       | Rustc                      |
| C++      | Wasm, Native       | clang++                    |
| Python   | Native             | python3, Cython (optional) |
| Java     | None               | ---                        |
| C#       | None               | ---                        |
| Go       | None               | ---                        |
| Ruby     | None               | ---                        |

## Available runtimes :running_man:


| Runtime       | Status                      |
| ------------- | --------------------------- |
| WASM          | Implemented                 |
| Native        | Implemented                 |
| Jailed        | In development, not working |
| Firecracker   | Not started                 |
| Docker/Podman | Not started                 |

## Contributing :handshake:


If you want to contribute to this project, please keep my code style and formatting. I use `rustfmt` to format my code. Please also make sure that your code compiles and that all tests pass. If you want to add a new language or runtime, remember to write tests and comment your code well.

Commits should follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.

## Requirements :clipboard:


### WASM


If you want to use the WASM runtime, you need to install the `wasm32-wasi` target for rustc. You can do this by running `rustup target add wasm32-wasi`.

For C++ you need to install `wasi-sdk` or other WASI sdk/libc and specify
`WASI_SDK` environment variable to point to the sdk.

### Native


Native runtime just requires dependencies for the language you want to use.

## Additional features :sparkles:


### wasm-llvm


This feature allows you to use the LLVM backend for the WASM runtime.
LLVM offers better performance, but has longer compilation times.

### cython


This feature allows you to use Cython for the Python runtime.
This makes code execution faster, but requires Cython to be installed.

## Examples :page_facing_up:


Examples can be found in the `examples` directory. To run them, you need to install the required dependencies for the languages you want to use. You can then run the examples with `cargo run --example <example_name>`.

## Dockerfile :whale:


This project contains a Dockerfile that can be used to build a docker image with all the required dependencies for all the languages and runtimes. This image can be used to base your own images on :smile:.
I'm currently working on minimizing the size of the image (currently about 2GB) and allowing you to choose which languages and runtimes you want to include.

**Warning:** I've not tested the image yet, so it might not work for some languages and runtimes.