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