Ovum is a new general-purpose programming language with a design emphasis on safety, purity, and clarity. It is a strongly statically typed, single-threaded language with Kotlin-like syntax and a focus on safety, clarity, and performance.
Ovum's core design principles center around:
- Memory Safety: Automatic memory management through garbage collection eliminates whole classes of bugs like dangling pointers, memory leaks, and buffer overruns.
- Immutability by Default: Variables, object fields, and function parameters are constant by default, reducing unintended side effects and making code easier to reason about.
- Pure Functions: Functions with no side effects whose results can be cached for performance optimization through memoization.
- Interface-Based Polymorphism: No class inheritance; polymorphism achieved through interface implementation and composition, avoiding complex inheritance hierarchies.
- Explicit Unsafe Operations: Low-level or potentially unsafe operations are isolated within explicit
unsafe { ... }blocks. - Less is More: The language is designed to be simple and easy to learn, with a focus on clarity and readability. The less ways there are to do the same thing, the better.
-
Strong static typing with immutability by default (
varrequired for mutation). -
Nullable types and Kotlin-style null-handling:
Type?, safe calls?., Elvis?:. -
Pure functions (no side effects, VM-level result caching).
-
Classes & interfaces
- No class inheritance; classes only implement interfaces.
- Root
Objectis implicit for all classes and interfaces (no need to write: Object). It declares only a virtual destructor. - Interfaces are named with leading
I(C# style): e.g.,IGreeter,IComparable. - Interface methods are public and virtual by default.
- Class methods implementing interface members must be marked
override. - Access modifiers are mandatory for all fields and methods in classes (
public/private). - Fields use
val(immutable) orvar(mutable).
-
Namespaces with
::resolution (e.g.,sys::Print). -
Functional objects (
callmember) for functional programming. -
Type aliases (
typealiaskeyword) for better readability. -
Built-in operators; no user-defined operators.
-
Preprocessor:
#import,#define,#ifdef,#ifndef,#else,#undef. -
Managed runtime: VM with JIT and GC; no manual memory management.
-
Single-threaded runtime: no concurrency primitives.
-
Passing semantics: all user-defined and non-primitive types (including
Stringand all arrays) are passed by reference (const by default). -
File extension:
.ovum.