Kura Documentation
Kuraは、Node.jsの豊富なエコシステムを利用しながら、静的型付け、Generics、Trait、async/await、所有権と借用、Send/Share、LLVM Native Backendを統合することを目指すプログラミング言語です。このDocsでは、Kuraを使ってプログラムを書く人に必要な情報だけを、基本操作から高度な機能、エラー対処まで詳しく説明します。
必要な環境
| 用途 | 必要なもの | 確認 |
|---|---|---|
| 通常のKura実行 | Node.js 22以上、npm | node --versionnpm --version |
| Nativeビルド | Node.js、npm、Clang / LLVM | clang --version |
| npmライブラリ利用 | Nodeターゲット | kr check --target node |
インストール
配布パッケージをグローバルインストール
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 fmt | Kuraコードを整形する |
kr clean | buildと.kuraキャッシュを削除する |
kr doctor | 実行環境を診断する |
kr add PACKAGE | npm依存を追加する |
kr remove PACKAGE | npm依存を削除する |
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";
変数と変更可能性
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;
}
ループ内ではbreakとcontinueを利用できます。
基本型
| 分類 | 型 | 用途 |
|---|---|---|
| 符号付き整数 | i8 i16 i32 i64 i128 isize | 負数を含む整数 |
| 符号なし整数 | u8 u16 u32 u64 u128 usize | 0以上の整数 |
| 浮動小数 | f32 f64 | 小数値 |
| 論理値 | bool | true / false |
| 文字 | char | 単一文字 |
| 文字列 | String | Kura所有文字列 |
| バイト列 | 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制約として利用できます。
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関数内で利用します。
所有権と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はレキシカルスコープを基準に借用期間を判定します。
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対応機能
| 機能 | Node | Native 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 doctor、kr clean、kr 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
コマンド早見表
# 環境
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 doctor → kr clean → kr check → kr run の順で確認してください。