jv入門チュートリアル¶
English | 日本語
初心者でも30分でjv [/jawa/] を始められる完全ガイドです。Javaの知識があれば、すぐにjvの魅力を体感できます!
🎯 このチュートリアルで学べること¶
- ✅ jvのインストール(5分)
- ✅ 最初のjvプロジェクト作成(5分)
- ✅ Javaとの違いを体感(10分)
- ✅ jvの特徴的な機能を試す(10分)
📋 必要なもの¶
- Java 21以上 - jvが生成するJavaコードを実行するため(Java 25推奨)
- 基本的なJava知識 - クラス、メソッド、変数の概念
- コマンドライン操作 - 基本的なターミナル操作
⚡ ステップ1: jvをインストール(5分)¶
🔥 最速インストール(推奨)¶
macOS/Linux:
# ワンライナーでインストール完了!
curl -L https://github.com/project-jvlang/jv-lang/releases/latest/download/install.sh | sh
Windows:
# PowerShellで実行
iex ((New-Object System.Net.WebClient).DownloadString('https://github.com/project-jvlang/jv-lang/releases/latest/download/install.ps1'))
🛠️ 他のインストール方法¶
Rust開発者なら:
手動インストール: 1. GitHub ReleasesからOS用のバイナリをダウンロード 2. 実行可能ファイルをPATHに追加
✅ インストール確認¶
cargo install jv-cli --version 0.1.0### ソースからビルド
開発版を使用する場合:
```bash
# リポジトリをクローン
git clone https://github.com/project-jvlang/jv-lang.git
cd jv-lang
# 全ワークスペースをビルド
cargo build --release
# CLIバイナリを確認
./target/release/jv_cli --help
JDK管理¶
jvには自動JDK管理機能があります:
# 利用可能なJDKを表示
jv toolchain list
# Java 25を自動インストール
jv toolchain install 25-temurin
# 特定のJDKを使用
jv use 25-temurin
インストールの確認¶
最初のjvプログラム¶
1. プロジェクトを初期化¶
これにより作成されます:
2. コードを書く¶
src/main.jvを編集:
fun main() {
// 基本的な文字列補間
val name = "jv"
println("Hello, ${name}! 🌟")
// 空白区切り配列
val numbers = [1 2 3 4 5]
val doubled = numbers.map { it * 2 }
println("Original: $numbers")
println("Doubled: $doubled")
// when式(統一された条件分岐)
val result = when {
numbers.size > 3 -> "Large array"
numbers.isEmpty() -> "Empty array"
else -> "Small array"
}
println("Array size: $result")
// 範囲構文とforループ(統一されたループ)
for (i in 0..5) { // 0..5 = 0から4まで(排他的)
print("$i ")
}
println()
for (i in 0..=5) { // 0..=5 = 0から5まで(包括的)
print("$i ")
}
println()
// 単位システム - 通貨
val price = 100.USD
val euroPrice = price.to(EUR) // 自動為替変換
println("Price: $price = $euroPrice")
// 単位システム - 温度
val celsius = 25.°C
val fahrenheit = celsius.to(°F) // 25°C = 77°F
println("Temperature: $celsius = $fahrenheit")
// 単位システム - 物理単位
val distance = 100.m // メートル
val time = 2.s // 秒
val velocity = distance / time // → 50m/s(自動単位推論)
println("Velocity: $velocity")
// 分解代入
val (x, y, z) = [10, 20, 30]
println("x=$x, y=$y, z=$z")
val person = { "name": "Alice", "age": 30 }
val { name, age } = person
println("Name: $name, Age: $age")
// JSONコメント付きとPOJO生成
val config = {
"app": {
"name": "jv-demo", // アプリケーション名
"version": "1.0.0", // バージョン
"features": ["units", "destructuring", "json"] // 機能リスト
}
}
println("Config: $config")
// 拡張数値型
val bigNumber = 123456789123456789n // BigInt
val precise = 3.141592653589793d // BigDecimal
val complex = 3 + 4im // Complex
val rational = 1//3 // Rational
println("Big number: $bigNumber")
println("Precise PI: $precise")
println("Complex: $complex")
println("Rational: $rational (${rational.toDouble()})")
}
3. ビルドと実行¶
出力:
主な機能を理解する¶
統一された条件分岐: when式のみ¶
jvでは、すべての条件分岐にwhen式を使用します。従来のif文は存在しません。
// 値を返すwhen式
val status = when (code) {
200 -> "OK"
404 -> "Not Found"
else -> "Error"
}
// 条件ベースのwhen
val message = when {
score >= 90 -> "Excellent"
score >= 70 -> "Good"
else -> "Keep trying"
}
統一されたループ: for文のみ¶
jvでは、すべてのループにfor文を使用します。whileやdo-whileは存在しません。
// 範囲のイテレーション
for (i in 0..10) { // 0から9まで(10は含まない)
println(i)
}
for (i in 0..=10) { // 0から10まで(10を含む)
println(i)
}
// コレクションのイテレーション
for (item in items) {
println(item)
}
// 無限ループ
for (;;) {
if (condition) break
}
万能単位システム¶
jvは通貨、温度、物理単位など、様々な単位をネイティブサポートします。
// 通貨変換
val dollars = 100.USD
val euros = dollars.to(EUR)
// 温度変換
val celsius = 25.°C
val fahrenheit = celsius.to(°F)
val kelvin = celsius.to(K)
// 物理計算
val distance = 100.m
val time = 5.s
val speed = distance / time // 自動的に m/s
// 日付計算
val today = Date.now()
val tomorrow = today + 1.day
val nextWeek = today + 1.week
分解代入¶
配列やオブジェクトから値を簡単に取り出せます。
// 配列の分解
val (a, b, c) = [1, 2, 3]
// オブジェクトの分解
val user = { "name": "Alice", "age": 30 }
val { name, age } = user
// 関数パラメータでの分解
fun printPerson({ name, age }: Person) {
println("$name is $age years old")
}
JSON with Comments & POJO生成¶
jvはJSONをネイティブサポートし、コメントも使えます。
val config = {
"server": {
"host": "localhost", // サーバーホスト
"port": 8080, // ポート番号
"ssl": true // SSL有効化
},
"features": ["auth", "api", "websocket"]
}
// JSONから型安全なPOJOを自動生成
@GeneratePOJO
val schema = {
"name": "User",
"fields": {
"id": "Long",
"name": "String",
"email": "String"
}
}
// これにより User クラスが生成されます
ビルドプロセスの理解¶
jv buildを実行すると、以下が実行されます:
- 字句解析: jvソースがトークン化されます
- 構文解析: トークンが抽象構文木(AST)に解析されます
- IR変換: ASTが中間表現(IR)に変換されます
- Java生成: IRが読みやすいJava 25(またはJava 21互換)ソースコードに変換されます
- Javaコンパイル: 生成されたJavaが
javacでコンパイルされます
Javaターゲットバージョンは--targetフラグで指定できます:
生成されたJavaコードはout/ディレクトリで確認できます:
生成されるJavaコードの例¶
jvコードは読みやすい、慣用的なJava 25コードを生成します:
public class Main {
public static void main(String[] args) {
// 基本的な文字列補間
final var name = "jv";
System.out.println("Hello, " + name + "! 🌟");
// 空白区切り配列 → List.of()
final var numbers = List.of(1, 2, 3, 4, 5);
final var doubled = numbers.stream()
.map(it -> it * 2)
.toList();
System.out.println("Original: " + numbers);
System.out.println("Doubled: " + doubled);
// when式 → Java 25 switch式
final var result = switch (true) {
case numbers.size() > 3 -> "Large array";
case numbers.isEmpty() -> "Empty array";
default -> "Small array";
};
System.out.println("Array size: " + result);
// 範囲とforループ → 拡張forループ
for (int i = 0; i < 5; i++) {
System.out.print(i + " ");
}
System.out.println();
// 単位システム → Quantity型ライブラリ
final var price = new USD(100);
final var euroPrice = price.convertTo(EUR.class);
System.out.println("Price: " + price + " = " + euroPrice);
final var celsius = new Celsius(25);
final var fahrenheit = celsius.convertTo(Fahrenheit.class);
System.out.println("Temperature: " + celsius + " = " + fahrenheit);
final var distance = new Meters(100);
final var time = new Seconds(2);
final var velocity = distance.divide(time);
System.out.println("Velocity: " + velocity);
// 分解代入 → 個別変数宣言
final var x = 10;
final var y = 20;
final var z = 30;
System.out.println("x=" + x + ", y=" + y + ", z=" + z);
// JSONコメント付き → Map.of()(コメントは削除)
final var config = Map.of(
"app", Map.of(
"name", "jv-demo",
"version", "1.0.0",
"features", List.of("units", "destructuring", "json")
)
);
System.out.println("Config: " + config);
// 拡張数値型
final var bigNumber = new BigInteger("123456789123456789");
final var precise = new BigDecimal("3.141592653589793");
final var complex = new Complex<>(3.0, 4.0);
final var rational = new Rational<>(1, 3);
System.out.println("Big number: " + bigNumber);
System.out.println("Precise PI: " + precise);
System.out.println("Complex: " + complex);
System.out.println("Rational: " + rational + " (" + rational.toDouble() + ")");
}
}
高度な機能の探索¶
データ処理パイプライン¶
jvのパイプライン演算子でデータ処理を簡潔に記述:
val results = data
|> filter { it.isValid() }
|> map { it.transform() }
|> sortBy { it.priority }
|> take(10)
単位を使った物理計算¶
fun calculateKineticEnergy(mass: kg, velocity: m/s): J {
return 0.5 * mass * velocity.pow(2) // E = (1/2)mv²
}
fun calculateForce(mass: kg, acceleration: m/s²): N {
return mass * acceleration // F = ma
}
// 実際の使用例
val carMass = 1500.kg
val carSpeed = 30.m/s
val energy = calculateKineticEnergy(carMass, carSpeed)
println("Kinetic energy: $energy") // 675000.0 J
複素数と高度な数学¶
fun complexMath() {
val z1 = 3 + 4im
val z2 = 1 - 2im
val product = z1 * z2 // 複素数の積
val magnitude = (z1 * z1.conjugate()).sqrt() // 大きさ
val phase = z1.arg() // 位相
println("Product: $product")
println("Magnitude: $magnitude")
println("Phase: ${phase} radians")
// 有理数計算
val rational1 = 1//3
val rational2 = 2//5
val sum = rational1 + rational2 // 11//15(自動約分)
println("1/3 + 2/5 = $sum")
}
DSL埋め込みの例¶
SQLクエリ:
fun getActiveUsers(): List<User> {
return database.query(```sql
SELECT id, name, email FROM users
WHERE active = true
ORDER BY name
```)
}
ビジネスルール:
val discountRules = ```drools
rule "Premium Discount"
when
$customer: Customer(isPremium == true)
$order: Order(amount > 1000)
then
$order.applyDiscount(0.15);
end
次のステップ¶
おめでとうございます!jvの基本を習得しました。さらに学習を進めるために:
探索すべき主な機能¶
- when式 - 統一された条件分岐の全パターン
- forループ - 範囲、コレクション、無限ループの使い方
- 単位システム - 通貨、温度、物理単位の完全ガイド
- 分解代入 - 関数パラメータや複雑なデータ構造での活用
- JSON POJO生成 - 型安全なデータクラスの自動生成
- DSL埋め込み - SQLやビジネスルールの統合方法
ヘルプの取得¶
- ドキュメント: このサイトのドキュメントを参照
- イシュー: GitHub Issuesでバグを報告
- ディスカッション: GitHub Discussionsで質問