NagiScript

LLVMベースで C/Rust/Zig/Odin と深く相互運用でき、
Arduino言語並みに書きやすい汎用プログラミング言語

LLVM バックエンド WebAssembly 対応 型安全 C ABI 互換

LLVM 直マッピング

最適化は LLVM に丸投げ。C/C++ と同等のパフォーマンスを、シンプルな設計で実現します。

C ABI 相互運用

extern "C" / export "C" による Rust/Zig/C/Arduino とのシームレスな連携。

Safe / Unsafe

生ポインタの参照外しは unsafe 内のみ。安全な領域では境界チェック・オーバーフロー検出がデフォルト。

ジェネリクス

Zig/Odin 方式のコンパイル時ダックタイピング。トレイト制約なしのモノモーフィゼーションで高速コンパイル。

RC ベースメモリ管理

借用チェッカーなしの自動解放。参照カウントによる安全で軽量なヒープ管理。

Wasm 対応

WebAssembly へのコンパイルをネイティブサポート。React/TypeScript との連携も可能。

.ngsx UI 構文

JSX 風マークアップ式で UI コンポーネントを記述。React コンポーネントとの統合を目指します。

Val / Var

イミュータブル変数は val、ミュータブル変数は var。明確で読みやすい変数管理。

クイックスタート

bash
# インストール
npm install -g @nagiscript/cli

# プロジェクト作成
nagiscript init hello
cd hello

# 実行
nagiscript run main.ngs
# => Hello from hello!

ネイティブビルド & Wasm ビルド

bash
# ネイティブバイナリ
nagiscript build main.ngs -o app

# WebAssembly
nagiscript wasm main.ngs -o out

# TypeScript 型定義
nagiscript dts main.ngs -o out.d.ts

Inline WASM Playground

N

NagiScript → WebAssembly ライブ実行

読み込み中…

—

= ネイティブWASM 実行結果(exports 呼び出し)

// 実行コードがここに表示されます

コードサンプル

WASM ライブ実行(Run を押してください)

main.ngs
export "C" fn fibonacci(n: i32) -> i32 {
    if n <= 1 {
        return n
    }
    return fibonacci(n - 1) + fibonacci(n - 2)
}

fn main() {
    print(fibonacci(10))   // => 55
    print(is_prime(17))    // => 1 (素数)
    print(gcd(48, 36))     // => 12
}

基本構文

main.ngs
// コメントは C スタイル。セミコロンは行末で省略可能。
fn add(a: i32, b: i32) -> i32 {
    return a + b
}

fn main() {
    val x = 10          // イミュータブル(型推論)
    var y = 20          // ミュータブル
    y = y + 1
    y += add(x, y)      // 複合代入
    print(add(x, y))    // 数値 / bool / string を出力
}

構造体・enum・パターンマッチ

shapes.ngs
struct Point {
    x: f32,
    y: f32,
}

enum Shape {
    Circle(f32),
    Rect(f32, f32),
    Empty,
}

fn area(s: Shape) -> f32 {
    match s {
        Circle(r) => 3.14159 * r * r
        Rect(w, h) => w * h
        _ => 0.0
    }
}

fn main() {
    val p = Point { x: 1.0, y: 2.0 }
    val s = Shape.Circle(3.0)
    print(area(s))
}

Result とエラー伝播

error.ngs
fn wrap(v: i32) -> Result<i32, string> {
    if v > 10 {
        return Err("too big")
    }
    return Ok(v)
}

fn use_res() -> i32 {
    val r: Result<i32, string> = wrap(5)
    return r?                  // Err なら関数から即return
}

対応プラットフォーム

ターゲット 状態 用途
x86_64 Linux 実用 デスクトップ / サーバー
WebAssembly 実用 Web アプリケーション
Embedded (ARM Cortex-M) 準備中 IoT / マイコン

ドキュメント構成

入門ガイド

チュートリアル

リファレンス