Kura Documentation

Kuraは、Node.jsの豊富なエコシステムを利用しながら、静的型付け、Generics、Trait、async/await、所有権と借用、Send/Share、LLVM Native Backendを統合することを目指すプログラミング言語です。このDocsでは、Kuraを使ってプログラムを書く人に必要な情報だけを、基本操作から高度な機能、エラー対処まで詳しく説明します。

Kura 0.4拡張子 .krNode / Native利用者向け

必要な環境

用途必要なもの確認
通常のKura実行Node.js 22以上、npmnode --version
npm --version
NativeビルドNode.js、npm、Clang / LLVMclang --version
npmライブラリ利用Nodeターゲットkr check --target node
Node.jsだけで始められます。 ClangはNativeターゲットを使うときだけ必要です。

インストール

配布パッケージをグローバルインストール

npm install -g ./kura-lang-compiler-0.4.0.tgz
kr version
kr doctor

ソースコードから使う

npm install
npm run build
npm link
kr version

インストールできたか確認

kr version
kr doctor
kr help
kr が見つからない場合: ターミナルを開き直し、npmのグローバルbinディレクトリがPATHに入っているか確認してください。

最初のプログラム

main.krを作成します。

fn main() {
  println("Hello, Kura");
}

実行します。

kr run main.kr

短縮形も利用できます。

kr main.kr
出力に Hello, Kura と表示されれば、コンパイラとNode Backendは正常です。

プロジェクトを作る

Nodeプロジェクト

kr new my-app
cd my-app
kr run

Nativeプロジェクト

kr new native-app --target native
cd native-app
kr run

生成される構成

my-app/
├─ kura.toml
├─ package.json
├─ src/
│  └─ main.kr
└─ tests/
   └─ smoke.kr

既存フォルダをKuraプロジェクトにする場合は、そのフォルダ内でkr initを実行します。

CLIコマンド一覧

コマンド用途
kr run [file.kr]型検査、コンパイル、実行をまとめて行う
kr check [file.kr]実行せず型・所有権・Backend対応を検査する
kr build [file.kr]ESMまたはNative実行ファイルを生成する
kr testテストファイルを検出して実行する
kr new NAME新規プロジェクトを作成する
kr init現在のフォルダを初期化する
kr fmtKuraコードを整形する
kr cleanbuildと.kuraキャッシュを削除する
kr doctor実行環境を診断する
kr add PACKAGEnpm依存を追加する
kr remove PACKAGEnpm依存を削除する
kr repl対話モードを開く
kr helpヘルプを表示する

よく使うオプション

kr run --target node
kr run --target native
kr run --watch
kr build --release
kr build --emit-hir --emit-mir
kr build -o output
kr run --env PORT=3000
kr run main.kr -- first second third

kura.toml

[package]
name = "my-app"
version = "0.1.0"
edition = "2026"
entry = "src/main.kr"
source-root = "src"

[target]
default = "node"
out-dir = "build/node"
extension = ".mjs"

[runtime]
node-args = []

[dependencies]

target.defaultは既定ターゲットです。コマンドに--targetを指定すると、その実行だけ上書きできます。

複数ファイルとモジュール

src/math.kr

export fn add(left: i32, right: i32) -> i32 {
  return left + right;
}

src/main.kr

import { add } from "./math";

fn main() {
  println(add(20, 22));
}

Kuraは相対import先を再帰的に解決し、別ファイルで宣言された公開関数の引数型と戻り値型も検査します。

外部から使う宣言にはexportを付けてください。付け忘れるとimportできません。

npmパッケージを使う

kr add express
import express from npm:"express";

Node Backendでは次の標準ESMへ変換されます。

import express from "express";

Node組み込みモジュール

import fs from kura:"fs";
import path from kura:"path";
import process from kura:"process";
import crypto from kura:"crypto";
Nativeターゲットではnpmを利用できません。 npm importが必要なプログラムはNodeターゲットで実行してください。

変数と変更可能性

let language = "Kura";
let port: u16 = 3000;

let mut count = 0;
count = count + 1;
  • letは不変です。
  • let mutは変更可能です。
  • 型を書かなければ初期値から推論します。
  • 未初期化の変数を読み取ることはできません。
let value: i32;
println(value); // 初期化されていないためエラー

関数

fn add(left: i32, right: i32) -> i32 {
  return left + right;
}

値を返さない関数

fn show_message(message: String) {
  println(message);
}

公開関数

export fn calculate(value: i32) -> i32 {
  return value * 2;
}

呼び出し時には、引数の個数と型が一致していなければなりません。

条件分岐とループ

if / else

if score >= 80 {
  println("pass");
} else {
  println("retry");
}

while

let mut index = 0;
while index < 3 {
  println(index);
  index = index + 1;
}

ループ内ではbreakcontinueを利用できます。

基本型

分類用途
符号付き整数i8 i16 i32 i64 i128 isize負数を含む整数
符号なし整数u8 u16 u32 u64 u128 usize0以上の整数
浮動小数f32 f64小数値
論理値booltrue / false
文字char単一文字
文字列StringKura所有文字列
バイト列Bytesバイナリデータ
値なしUnit戻り値を持たない処理

数値変換

危険な縮小変換は暗黙に行われません。

let large: i64 = 1000;
let small = large.try_as<i32>()?;

Null安全・Option・Result

通常のKura型にnullは入りません。値がない可能性はOption<T>で表します。

fn find_name(id: i32) -> Option<String> {
  if id == 1 {
    return Some("Kura");
  }
  return None;
}

Result

回復可能な失敗はResult<T, E>で返します。

fn load_config() -> Result<Config, ConfigError> {
  let text = fs.read_text("config.json")?;
  return json.decode<Config>(text);
}

?は失敗時にエラーを呼び出し元へ返します。

Struct

struct User {
  name: String,
  age: i32,
}

fn main() {
  let user = User {
    name: "Kura",
    age: 1,
  };

  println(user.name);
}

コンパイラは、不明なStruct、必須フィールド不足、不明なフィールド、重複、フィールド型不一致を検出します。

EnumとMatch

enum Status {
  Active,
  Suspended(String),
  Deleted { at: i32 },
}

fn describe(status: Status) -> String {
  return match status {
    Status::Active => "active",
    Status::Suspended(reason) => reason,
    Status::Deleted { at } => "deleted",
  };
}

matchは網羅的でなければなりません。扱っていないVariantがある場合はコンパイルエラーになります。

_は残りすべてに一致するワイルドカードです。

Generics

fn identity<T>(value: T) -> T {
  return value;
}

fn main() {
  let number = identity(42);
  let name = identity<String>("Kura");
}

型引数は明示できます。引数から判断できる場合は自動推論されます。

複数制約

fn show_sorted<T>(values: Vec<T>)
where T: Clone + Ord + Display {
  // ...
}

Trait

trait Display {
  fn display(self: &Self) -> String;
}

impl Display for User {
  fn display(self: &User) -> String {
    return self.name;
  }
}

Traitは、異なる型へ共通の能力を定義します。Generic関数のwhere制約として利用できます。

Node BackendではTraitメソッドの実行時ディスパッチに対応しています。Native 0.4では未対応です。

async / await

async fn load_number() -> i32 {
  return 42;
}

async fn main() {
  let value: i32 = await load_number();
  println(value);
}
  • async fnの呼び出し結果はFuture<T>です。
  • awaitすると中身の型Tを取り出せます。
  • awaitはasync関数内で利用します。
Native 0.4には非同期ランタイムがないため、async/awaitはNodeターゲットを使ってください。

所有権とMove

fn consume(value: String) {}

fn main() {
  let value = "Kura";
  consume(value);
  println(value); // Move後なのでエラー
}

非Copy値を値渡しすると、所有権が呼び出し先へ移動します。移動後の値は再利用できません。

Copy型

整数、浮動小数、bool、char、参照、およびすべての内部フィールドがCopyである型はコピーできます。

部分Move

Structの非Copyフィールドだけを移動すると、そのフィールドは使えなくなりますが、移動していない別フィールドは利用できます。

借用

共有借用

let borrowed = &value;

読み取り専用。複数存在できます。

可変借用

let borrowed = &mut value;

排他的。同時に1つだけです。

同じ期間には、「複数の共有借用」または「1つの可変借用」のどちらかだけを持てます。

fn main() {
  let mut value = "first";

  {
    let borrowed = &value;
    println(borrowed);
  }

  value = "second";
}

Kura 0.4はレキシカルスコープを基準に借用期間を判定します。

SendとShare

Send

値の所有権を別スレッドへ安全に移動できることを表します。

Share

共有参照を複数スレッドから安全に使えることを表します。

StructとEnumは内部型から自動的にSend / Shareを導出します。

JsRef<T>JsDynamicRc<T>などは原則としてSendではありません。

Node Backend

kr check --target node
kr build --target node
kr run --target node

向いている用途

  • WebサーバーとAPI
  • Discord Bot
  • CLIと自動化
  • npm中心のアプリ
  • ネットワーク・非同期I/O

npm、Node API、Generics、Trait、async/await、データ付きEnum、Matchなどを利用できます。

LLVM Native Backend

kr check --target native
kr build --target native
kr build --target native --release
kr run --target native

LLVM IRを生成し、Clangを使ってOS向け実行ファイルへ変換します。

出力例

build/native/
├─ my-app.ll
├─ my-app.exe  # Windows
└─ .kura-build.json

別のClangを指定

KURA_CLANG=/path/to/clang kr build --target native

Node / Native対応機能

機能NodeNative 0.4
基本型・関数対応対応
Struct対応対応
データ付きEnum対応未対応
Match高度なパターン対応基本対応
Generics対応未対応
Traitディスパッチ対応未対応
async / await対応未対応
npm対応非対応
所有権・借用検査対応検査対応
Native実行ファイルなし対応

HIR / MIRを確認する

kr build --emit-hir --emit-mir
kr build --target native --emit-hir --emit-mir

コンパイラ内部の中間表現をJSONとして出力します。型解決、Borrow、Await、Match、TraitDispatch、分岐、Returnなどのlowering結果を確認できます。

テスト

kr test

標準では次のファイルを検出します。

tests/**/*.kr
src/**/*.test.kr

単純なテスト例

fn main() {
  let answer: i32 = 40 + 2;
  if answer != 42 {
    panic("test failed");
  }
  println("test passed");
}

整形・監視・キャッシュ

kr fmt
kr fmt --check
kr run --watch
kr clean
  • fmtはコードを整形します。
  • fmt --checkは変更せず差異だけ検査します。
  • run --watchは変更時に再コンパイル・再実行します。
  • cleanは生成物とキャッシュを削除します。

エラーの読み方

error K4102: use of moved value 'value'
種類確認すること
Lexer / Parser括弧、区切り、セミコロン、宣言構文
型エラー期待型と実際の型、引数個数、戻り値
Generics型引数を推論できるか、Trait制約を満たすか
所有権値がMove済みか、借用中に変更していないか
Backend選択したターゲットで構文が対応しているか
まずkr checkを実行すると、プログラムを起動せず診断だけ確認できます。

利用者向けトラブル対処

kr コマンドが見つからない

npm install -gまたはnpm linkを再実行し、ターミナルを開き直してください。npm prefix -gでグローバルインストール先を確認し、そのbinディレクトリがPATHに含まれているか確認します。

Node.jsのバージョンが古いと言われる

node --versionを確認してください。Kura 0.4はNode.js 22以上を想定しています。古いNode.jsがPATHの前方に残っている場合は、新しいNode.jsのパスを優先してください。

kr doctorでClangだけ失敗する

Nodeターゲットだけを使うならClangは不要です。Nativeビルドを使う場合はLLVM/Clangをインストールし、clang --versionが通るようPATHを設定してください。

Nodeでは動くがNativeではコンパイルできない

Native 0.4は対応部分集合です。async/await、npm、Traitディスパッチ、Genericモノモーフィゼーション、データ付きEnumなどは未対応です。Nodeターゲットへ切り替えるか、Native対応構文へ書き換えてください。

npmパッケージをimportできない

kr add package-nameを実行したか、構文がimport name from npm:"package-name";になっているか確認してください。Nativeターゲットではnpmを使えません。

相対importが解決されない

import元から見た相対パスを確認し、対象関数にexportが付いているか確認してください。拡張子を省略した場合はKuraモジュールとして解決されます。

型推論に失敗する

Generic型引数が引数から一意に決まらない場合があります。function<Type>(value)のように型引数を明示してください。同じ型パラメータへ異なる型が推論されていないかも確認します。

Trait制約を満たさないと言われる

where T: Traitで要求されたTraitが対象型へ実装されているか確認してください。Send/Share/Copyのような自動Traitは、内部フィールドの型によって非対応になることがあります。

await が使えない

現在の関数がasync fnになっているか、await対象がFuture<T>か確認してください。NativeターゲットではなくNodeターゲットを使ってください。

Move後使用エラーが出る

非Copy値を関数へ値渡しすると所有権が移動します。処理をMove前に行う、関数引数を参照にする、またはClone可能な型なら明示的に複製する設計へ変更してください。

借用競合エラーが出る

共有借用中に可変借用したり、可変借用中に別の借用を作ったりしていないか確認します。借用を内側のブロックへ入れて、必要な処理が終わった時点でスコープを閉じてください。

不変変数へ代入できない

変更が必要な変数はlet mutで宣言してください。ただし、不要なmutは避けるとコードが安全になります。

Matchが網羅的でない

Enumの全Variantを処理するか、最後に_ => ...を追加してください。新しいVariant追加後に以前のmatchが不足することもあります。

生成されたESMをNodeが読めない

Node.jsのバージョン、生成拡張子、相対import先の出力を確認してください。一度kr cleanしてから再ビルドすると古い生成物の影響を除けます。

ビルド結果が古い

kr cleanを実行し、再度kr buildしてください。watchプロセスが複数起動している場合は、古いプロセスを停止してください。

Native実行ファイルが起動しない

対象OS・アーキテクチャ向けにビルドされているか確認してください。別ターゲットを指定している場合は--target-tripleを外し、現在の環境向けに再ビルドします。

日本語や特殊文字を含むパスで失敗する

一時的に英数字だけの短いパスへプロジェクトを移動して確認してください。Node、npm、Clangのいずれかがパス処理で問題を起こしている可能性を切り分けられます。

原因が分からない

kr doctorkr cleankr checkの順に実行してください。それでも解決しない場合は、最小の.krファイルへ問題を縮小し、エラー全文、Kuraバージョン、Nodeバージョン、OSを記録してください。

現在の制限

Kura 0.4はブートストラップ段階です。Node Backendは実用範囲が広がっていますが、Native Backendには次の未対応があります。

  • Native async runtime
  • Generic関数のモノモーフィゼーション
  • TraitのNativeディスパッチ
  • データ付きEnumのLLVM表現
  • Vec / Array / Optionの完全なNativeランタイム
  • OSスレッド、Channel
  • C FFI、SIMD
未対応構文は、壊れたコードへ変換したりNodeへ暗黙に切り替えたりせず、Backendエラーとして停止します。

コマンド早見表

# 環境
kr version
kr doctor
kr help

# プロジェクト
kr new my-app
cd my-app
kr run

# 検査・ビルド
kr check
kr build
kr build --release
kr run --watch

# Native
kr check --target native
kr build --target native --release
kr run --target native

# 開発
kr test
kr fmt
kr fmt --check
kr clean

# npm
kr add express
kr remove express

# コンパイラ内部
kr build --emit-hir --emit-mir
迷ったとき: kr doctorkr cleankr checkkr run の順で確認してください。