NagiScript

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

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

コードサンプル

基本構文

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 / マイコン

ドキュメント構成

入门ガイド

チュートリアル

リファレンス