Concurrency that reads like your intent.
Actors, channels, and structured scopes are built into the language from the start.
Safe and simple by default. Siyo is a compiled language with actors, channels, and native Java interop. Familiar enough to start today. Different enough to enjoy it.
actor Store { data: map } impl Store {fn new() -> Store {Store { data: map() }} fn set(self, key: string,value: string) -> string {self.data.set(key, value)"OK"}} mut store = spawn Store.new()println(store.set("lang", "siyo"))Siyo is an experimental programming language that compiles directly to Java Virtual Machine bytecode. Its concurrency model combines actors, buffered and unbuffered channels, and structured scope blocks that join spawned work automatically. Siyo programs can also call Java constructors, methods, and libraries through native interoperability.
The compiler shares one frontend from lexing through lowering, then runs code through an ASM bytecode emitter or a tree-walking interpreter. Parity tests compare both execution paths. Siyo 0.7.0 adds generic containers, sum types and functions, checked interfaces, typed errors, explicit module exports, and import aliases. It targets Java 21 virtual threads and ships with project tooling, Maven dependency resolution, and a bundled runtime. The project is source available and experimental.
Designed around the way software is built now: concurrent by default, connected to an enormous ecosystem, and pleasant to read six months later.
Actors, channels, and structured scopes are built into the language from the start.
Siyo emits standard JVM bytecode and runs beside Java and Kotlin with access to the full ecosystem.
Generics, checked interfaces, typed errors, and exhaustive pattern matching in one compact syntax.
From stronger module boundaries to generics and interfaces, each release keeps bytecode and interpreter behavior aligned.
A 3,000-line HTTP library exposed 32 defects. Namespaced modules, located diagnostics, and a safer Java boundary followed.
Exhaustive variant matching, checked function types, collection helpers, indexed maps, and shared mutable captures landed together.
Generic containers and functions, checked interfaces, typed errors, explicit exports, and import aliases expand what programs can express.
Siyo keeps the syntax compact while giving you real tools for real systems. Model data with generic sum types, accept interface implementations, catch typed errors, or coordinate work with actors and channels.
type Maybe<T> = Just(T) | Nothing
fn identity<T>(value: T) -> T { value }
fn describe(value: Maybe<int>) -> string {
match value {
Just(n) => "number: " + toString(n),
Nothing => "no number",
}
}
fn main() {
imut counts: Map<string, int> = {"visits": 7}
println(toString(identity(counts["visits"]) + 1))
println(describe(Just(42)))
}fields, field, setField, toMap, and typeName.#{"red", "green"}; len now handles maps and sets too.break and continue." hello ".trim().toUpper().try expressions; full module paths avoid JVM class-name collisions.Module visibility is opt-in: a module that marks nothing exports everything. Its first pub switches it to explicit exports.
Still experimental: generic structs and interface bounds or default methods are not supported. Empty struct literals and map literals as a function body’s tail value remain limitations.
Read the 0.7.0 release notesThe compiler and interpreter share the same analysis pipeline, so compiled programs and debug runs keep identical semantics.
Install Siyo with its bundled runtime, then create your first project.
curl -fsSL siyolang.org/install | shsiyoc new my-app02cd my-app03siyoc runSiyo already ships with the pieces to explore real applications.
Siyo is young, public, and ready for curious builders.