13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

静的型付け言語を作った

13
Last updated at Posted at 2026-06-08

どういう言語を作ったのか

  • 静的型付
  • オブジェクト指向
  • 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
13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?