どういう言語を作ったのか
- 静的型付
- オブジェクト指向
- GCあり
- Rust風のResultによるエラーハンドリングをサポート
- Goみたいな軽量スレッドをサポートしたくて開発中
ただしClaude, Codexの2つのAIはバリバリ使っているのでご容赦ください…。
シンタックス
こんな感じの言語
Hello World
fn main() {
println("Hello World");
}
OOP
class User {
name: String; // private by default
pub age: i64; // public field
// `init` is the constructor — it takes an explicit `self`.
pub init(self, name: String, age: i64) {
self.name = name;
self.age = age;
}
// Methods are private by default; `pub` exposes them.
pub fn greet(self) -> String {
return self.name;
}
}
fn main() {
let u = new User("Alice", 30); // construct with `new`
println(u.greet()); // Alice
println(u.age); // 30
}
Async/Await
async fn work(x: i64) -> i64 {
await sleep(1); // suspend so other tasks can make progress
return x * 2;
}
async fn main() {
let a = work(10); // start a task (runs concurrently)
let b = work(20); // start another
println(await a); // 20
println(b.join()); // 40
}
パフォーマンス
パフォーマンスはそこそこいいです。
以下の記事のやり方に従って
https://qiita.com/hanaata/items/c91788bcac2a40f1bb05
以下のようなコードでパフォーマンス測定をすると、私の環境では0.11秒とRustやC並みの速度が出ます。使用メモリも、(2026年6月9日現在で)3000kb程度と省メモリです。あえて日付をつけて現時点での使用メモリということを強調しているのは今後機能を増やすと使用メモリが増えるかもしれないからです。
fn main() {
let mut i: i64 = 0;
let mut s: f64 = 0.0;
let mut sign: f64 = 1.0;
let mut denom: f64 = 1.0;
while i <= 100000000 {
s = s + sign / denom;
sign = -sign;
denom = denom + 2.0;
i = i + 1;
}
println(4.0 * s);
}
ただし、、Rustのコードと違い符号の決定にべき乗計算をしていないのでちょっとズルをしてはいます。
なんでパフォーマンスがそこそこ出るのか
それは言語のBackendにCraneliftというものを使っているためです。
Rustなどの言語ではC++製のLLVMが使用されておりアグレッシブに最適化をかけています。
私の言語はLLVMではなくRust製のCraneliftを使用しています。
CraneliftはLLVMほどのアグレッシブな最適化はかけませんが、コンパイルの速さや依存としての扱いやすさ等の点に特徴があります。
Cargoで指定するだけですぐに使える手軽さは素晴らしいです。
OOP
最近はRust, Goなどのネイティブなバイナリにコンパイル言語の人気が上昇しております。
でもそういう言語ってオブジェクト指向プログラミング、特にClassの継承をサポートしていないことが多いです。継承よりも合成というトレンドですね。
もちろんそのトレンドは正しいのですが、あえて継承を使ったプログラミングをしたい、できればバイナリにコンパイルしたいっていうケースでなかなか言語の選択肢がないと感じたのでそれができる言語を作ってみました。作ったと言ってもAIの手を借りてですが。
サンプル
ここに色々なサンプルを置いています。
興味があったら見てみてください。
https://github.com/lechatthecat/willow/tree/main/example
導入
git clone https://github.com/lechatthecat/willow/tree/main/example
cd willow
# release build
cargo run --release -- build example/fib.wi -o fib --release
# Run the output binary
./fib