⚠️ **CoreVM API is subject to change.**
# How to write a program for CoreVM
## Rust
CoreVM programs have single entry-point called `main` with `index = 0` (the default).
The simplest program looks like the following.
```rust
#![no_std]
#![no_main]
#[polkavm_derive::polkavm_export]
extern "C" fn main() -> u64 {
0
}
```
CoreVM programs produce output into one of the output streams.
Currently _console_ and _video_ streams are available.
The simplest program that outputs "Hello world" to the console output stream is shown below.
```rust
#![no_std]
#![no_main]
use corevm_guest::println;
#[polkavm_derive::polkavm_export]
extern "C" fn main() -> u64 {
println!("Hello world");
0
}
```
Copying out the data is an atomic operation:
the array passed to e.g. `yield_console_data` is either fully copied or not copied at all.
If the array can't be copied, the program execution is suspended, and
the continuation is possible via creating another work package.
## C
Here is the example program written in C.
```c
#include <stdint.h>
#include "corevm_guest.h"
POLKAVM_EXPORT(uint64_t, ext_main);
uint64_t ext_main() {
corevm_printf("Hello world\n");
return 0;
}
```