336 lines
9.7 KiB
Markdown
336 lines
9.7 KiB
Markdown
|
|
# 「Everything is Box」革命 - 2025年注目の新言語Nyashが変えるプログラミング体験
|
|||
|
|
|
|||
|
|
:::message
|
|||
|
|
本記事で紹介するNyashプログラミング言語は、**GitHub Stars 0個**という隠れた名言語です🌟
|
|||
|
|
読んでいただき、気に入ったら[⭐GitHubスター](https://github.com/moe-charm/nyash)をお願いします!
|
|||
|
|
:::
|
|||
|
|
|
|||
|
|
## 🎯 はじめに - なぜ「もう一つ」の言語が必要なのか?
|
|||
|
|
|
|||
|
|
2025年現在、プログラミング言語は数百種類存在します。「なぜまた新しい言語を?」と思われるかもしれません。
|
|||
|
|
|
|||
|
|
**Nyash**(ニャッシュ)は、そんな疑問に明確な答えを持つ言語です:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// 🎁 この「箱に詰める」感覚、体験してみませんか?
|
|||
|
|
box User {
|
|||
|
|
init { name, email }
|
|||
|
|
|
|||
|
|
pack(userName, userEmail) { // ← 「pack」で直感的!
|
|||
|
|
me.name = userName
|
|||
|
|
me.email = userEmail
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
greet() {
|
|||
|
|
print("Hello, " + me.name + "!")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local user = new User("Alice", "alice@example.com")
|
|||
|
|
user.greet() // "Hello, Alice!"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Everything is Box** - すべてが「箱」という、シンプルで直感的な哲学。これがNyashの核心です。
|
|||
|
|
|
|||
|
|
## 💡 Everything is Box哲学の魅力
|
|||
|
|
|
|||
|
|
### 🧠 認知負荷の劇的削減
|
|||
|
|
|
|||
|
|
従来の言語では「プリミティブ型」「オブジェクト」「関数」など、概念が分散していました:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// JavaScript: 複雑な概念の混在
|
|||
|
|
let number = 42; // プリミティブ
|
|||
|
|
let string = "hello"; // プリミティブ
|
|||
|
|
let object = { x: 1 }; // オブジェクト
|
|||
|
|
let array = [1, 2, 3]; // 配列オブジェクト
|
|||
|
|
let func = () => {}; // 関数
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Nyashでは**すべてがBox**:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// Nyash: 一貫した「Box」概念
|
|||
|
|
local number = new IntegerBox(42) // NumberもBox
|
|||
|
|
local text = new StringBox("hello") // StringもBox
|
|||
|
|
local data = new MapBox() // ObjectもBox
|
|||
|
|
local items = new ArrayBox() // ArrayもBox
|
|||
|
|
local console = new ConsoleBox() // 機能もBox
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔧 統一されたメソッド呼び出し
|
|||
|
|
|
|||
|
|
すべてがBoxなので、操作方法も統一されます:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// どのBoxでも同じパターン
|
|||
|
|
number.add(10) // 数値演算
|
|||
|
|
text.length() // 文字列操作
|
|||
|
|
data.set("key", "value") // マップ操作
|
|||
|
|
items.push(number) // 配列操作
|
|||
|
|
console.log(text) // コンソール出力
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
「オブジェクト」「関数」「プリミティブ」を意識する必要がありません。**すべてBox、すべて同じ**。
|
|||
|
|
|
|||
|
|
## 🌟 Nyashの革新的機能
|
|||
|
|
|
|||
|
|
### 🎁 pack構文 - Box哲学の具現化
|
|||
|
|
|
|||
|
|
Nyashの`pack`は、他言語の`new`や`init`を超越した概念です:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box Product {
|
|||
|
|
init { name, price, category }
|
|||
|
|
|
|||
|
|
// 🎁 「商品を箱に詰める」直感的メタファー
|
|||
|
|
pack(productName, productPrice, productCategory) {
|
|||
|
|
me.name = productName
|
|||
|
|
me.price = productPrice
|
|||
|
|
me.category = productCategory
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
displayInfo() {
|
|||
|
|
print(me.name + ": $" + me.price)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用時も直感的
|
|||
|
|
local laptop = new Product("MacBook", 1999, "Electronics")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
この「箱に詰める」感覚は、コードを書くたびにBox哲学を体験させてくれます。
|
|||
|
|
|
|||
|
|
### 🔄 明示的デリゲーション - 継承の次世代形
|
|||
|
|
|
|||
|
|
従来の継承の問題点を解決する、明示的デリゲーション:
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
// 🔄 明示的で分かりやすいデリゲーション
|
|||
|
|
box AdminUser from User {
|
|||
|
|
init { permissions }
|
|||
|
|
|
|||
|
|
pack(adminName, adminEmail, perms) {
|
|||
|
|
from User.pack(adminName, adminEmail) // 親の処理を明示的に呼び出し
|
|||
|
|
me.permissions = perms
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override greet() {
|
|||
|
|
from User.greet() // 親のgreetを実行
|
|||
|
|
print("(Administrator)") // 追加機能
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- **`from`構文**: どこから何を呼び出しているか明確
|
|||
|
|
- **`override`**: オーバーライドを明示的に宣言
|
|||
|
|
- **隠れた魔法なし**: すべての動作が可視化
|
|||
|
|
|
|||
|
|
### 📝 変数宣言厳密化 - メモリ安全性の保証
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
static box Calculator {
|
|||
|
|
init { result, memory } // 📝 すべての変数を明示宣言
|
|||
|
|
|
|||
|
|
calculate() {
|
|||
|
|
me.result = 42 // ✅ 事前宣言済み
|
|||
|
|
|
|||
|
|
local temp // ✅ local変数も明示宣言
|
|||
|
|
temp = me.result * 2
|
|||
|
|
|
|||
|
|
// undeclared = 100 // ❌ コンパイルエラー!
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**メモリ安全性と非同期安全性**を、コンパイル時に完全保証。
|
|||
|
|
|
|||
|
|
## 🚀 実用性 - 実際のアプリケーション例
|
|||
|
|
|
|||
|
|
### 🎲 サイコロRPGゲーム
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box DiceRPG {
|
|||
|
|
init { player, monster, random }
|
|||
|
|
|
|||
|
|
pack() {
|
|||
|
|
me.player = new MapBox()
|
|||
|
|
me.monster = new MapBox()
|
|||
|
|
me.random = new RandomBox()
|
|||
|
|
|
|||
|
|
me.player.set("hp", 100)
|
|||
|
|
me.player.set("attack", 20)
|
|||
|
|
me.monster.set("hp", 80)
|
|||
|
|
me.monster.set("attack", 15)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
battle() {
|
|||
|
|
loop(me.player.get("hp") > 0 and me.monster.get("hp") > 0) {
|
|||
|
|
// プレイヤーの攻撃
|
|||
|
|
local damage = me.random.range(10, me.player.get("attack"))
|
|||
|
|
local monster_hp = me.monster.get("hp") - damage
|
|||
|
|
me.monster.set("hp", monster_hp)
|
|||
|
|
|
|||
|
|
print("Player deals " + damage + " damage!")
|
|||
|
|
|
|||
|
|
// 勝利判定
|
|||
|
|
if me.monster.get("hp") <= 0 {
|
|||
|
|
print("Victory!")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// モンスターの攻撃
|
|||
|
|
damage = me.random.range(5, me.monster.get("attack"))
|
|||
|
|
local player_hp = me.player.get("hp") - damage
|
|||
|
|
me.player.set("hp", player_hp)
|
|||
|
|
|
|||
|
|
print("Monster deals " + damage + " damage!")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print("Defeat...")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ゲーム実行
|
|||
|
|
local game = new DiceRPG()
|
|||
|
|
game.battle()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📊 統計計算アプリ
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box Statistics {
|
|||
|
|
init { data, math }
|
|||
|
|
|
|||
|
|
pack() {
|
|||
|
|
me.data = new ArrayBox()
|
|||
|
|
me.math = new MathBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
addData(value) {
|
|||
|
|
me.data.push(value)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
calculateMean() {
|
|||
|
|
local sum = 0
|
|||
|
|
local count = me.data.length()
|
|||
|
|
|
|||
|
|
local i = 0
|
|||
|
|
loop(i < count) {
|
|||
|
|
sum = sum + me.data.get(i)
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return me.math.divide(sum, count)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local stats = new Statistics()
|
|||
|
|
stats.addData(10)
|
|||
|
|
stats.addData(20)
|
|||
|
|
stats.addData(30)
|
|||
|
|
print("Average: " + stats.calculateMean()) // 20.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 技術的な魅力 - Rust実装による堅牢性
|
|||
|
|
|
|||
|
|
### 💪 メモリ安全性
|
|||
|
|
|
|||
|
|
NyashはRustで実装されており、以下を保証:
|
|||
|
|
|
|||
|
|
- **メモリリーク防止**: Arc<Mutex>パターンによる自動メモリ管理
|
|||
|
|
- **データ競合回避**: スレッドセーフなBox実装
|
|||
|
|
- **型安全性**: コンパイル時の型チェック
|
|||
|
|
|
|||
|
|
### 🌐 3つの実行バックエンド
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 開発・デバッグ用(詳細ログ)
|
|||
|
|
nyash program.nyash
|
|||
|
|
|
|||
|
|
# 高速実行用(MIR最適化)
|
|||
|
|
nyash --backend vm program.nyash
|
|||
|
|
|
|||
|
|
# Web配布用(WASM生成)
|
|||
|
|
nyash --compile-wasm program.nyash
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
一つの言語で、**開発から本番まで最適な実行方式**を選択可能。
|
|||
|
|
|
|||
|
|
### ⚡ 驚異の性能
|
|||
|
|
|
|||
|
|
最新のベンチマーク結果(100回実行平均):
|
|||
|
|
|
|||
|
|
| Backend | 実行時間 | 高速化倍率 | 用途 |
|
|||
|
|
|---------|----------|------------|------|
|
|||
|
|
| **WASM** | **0.17ms** | **280倍** | Web配布・高速実行 |
|
|||
|
|
| **VM** | **16.97ms** | **2.9倍** | 本番環境 |
|
|||
|
|
| **Interpreter** | **48.59ms** | **1倍** | 開発・デバッグ |
|
|||
|
|
|
|||
|
|
**280倍の高速化**を実現する技術力。
|
|||
|
|
|
|||
|
|
## 🎮 実際に触ってみよう
|
|||
|
|
|
|||
|
|
### インストール
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Rust環境前提
|
|||
|
|
git clone https://github.com/moe-charm/nyash
|
|||
|
|
cd nyash
|
|||
|
|
cargo build --release -j32
|
|||
|
|
|
|||
|
|
# Hello World実行
|
|||
|
|
./target/release/nyash examples/hello.nyash
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### ブラウザでも実行可能
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# WASM生成
|
|||
|
|
./target/release/nyash --compile-wasm hello.nyash -o hello.wat
|
|||
|
|
|
|||
|
|
# ブラウザで実行(WebAssembly)
|
|||
|
|
# wasm_demo/index.htmlで確認可能
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 今後の展望
|
|||
|
|
|
|||
|
|
### Phase 8: Native実行最適化
|
|||
|
|
|
|||
|
|
- **WASM最適化**: ブラウザネイティブ並みの実行速度
|
|||
|
|
- **Box操作**: オブジェクト指向プログラミング完全対応
|
|||
|
|
- **非同期処理**: `nowait`/`await`構文実装
|
|||
|
|
|
|||
|
|
### 実用アプリケーション開発
|
|||
|
|
|
|||
|
|
- **NyaMesh**: P2P通信ライブラリ(Nyashの最終目標)
|
|||
|
|
- **WebGUI**: ブラウザアプリケーション開発
|
|||
|
|
- **ゲーム開発**: 高性能ゲームエンジン統合
|
|||
|
|
|
|||
|
|
## 💭 まとめ - Nyashが描く未来
|
|||
|
|
|
|||
|
|
**Nyash**は単なる「もう一つの言語」ではありません:
|
|||
|
|
|
|||
|
|
1. **🧠 認知負荷削減**: Everything is Box哲学による学習容易性
|
|||
|
|
2. **🛡️ 安全性保証**: Rust実装による完全なメモリ安全性
|
|||
|
|
3. **⚡ 高性能**: 280倍高速化を実現する最適化技術
|
|||
|
|
4. **🌐 実用性**: 開発からWeb配布まで一貫した開発体験
|
|||
|
|
5. **🔄 明示性**: 隠れた動作のない透明なプログラミング
|
|||
|
|
|
|||
|
|
プログラミング言語設計における**新たな可能性**を提示する言語です。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
:::message alert
|
|||
|
|
**お願い**: もしNyashに興味を持たれたら、[GitHubスター⭐](https://github.com/moe-charm/nyash)をクリックしてください!
|
|||
|
|
現在スター数0個の隠れた名言語を、一緒に世界に広めませんか?
|
|||
|
|
:::
|
|||
|
|
|
|||
|
|
**関連リンク:**
|
|||
|
|
- [GitHub Repository](https://github.com/moe-charm/nyash)
|
|||
|
|
- [Language Documentation](https://github.com/moe-charm/nyash/tree/main/docs)
|
|||
|
|
- [Online Playground](https://moe-charm.github.io/nyash/) ※準備中
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*この記事が気に入ったら、フォロー・いいね・コメントで応援お願いします!*
|