Files
hakorune/docs/phases/phase-11.5/FIRST-FIVE-APPS.md

8.0 KiB
Raw Blame History

🚀 First Five Apps - Nyashの実力を証明する最初の5本

🎯 概要

Phase 11.5完了を待たずに、今すぐ作れる実用アプリ5本で、Nyashの産業レベルの完成度を世に示します。 すべて「Everything is BoxPluginInvoke」で統一実装し、VM/JIT/AOT/WASMの全バックエンドで動作確認します。

📋 アプリケーション一覧

1. ny-echo最小CLI- 基本I/O検証

目的: I/O・StringBoxの道通し確認

// apps/ny-echo/main.nyash
static box Main {
    main(args) {
        local console = new ConsoleBox()
        local options = parseArgs(args)
        
        loop(true) {
            local input = console.readLine()
            if input == null { break }
            
            local output = input
            if options.get("upper") {
                output = input.toUpperCase()
            } else if options.get("lower") {
                output = input.toLowerCase()
            }
            
            console.log(output)
        }
    }
}

受入基準:

  • VM/JIT/AOT/GCオン・オフすべてでtrace_hash一致
  • 100万行処理で性能劣化なし
  • メモリリークなしGCカウンター確認

2. ny-jsonlintPython連携デモ- プラグイン統合

目的: PyRuntimeBox/PyObjectBox経由のPluginInvoke検証

// apps/ny-jsonlint/main.nyash
static box Main {
    init { py, console }
    
    main(args) {
        me.py = new PyRuntimeBox()
        me.console = new ConsoleBox()
        
        local filename = args.get(1)
        if filename == null {
            me.console.error("Usage: ny-jsonlint <file.json>")
            return 1
        }
        
        local file = new FileBox()
        file.open(filename, "r")
        local content = file.read()
        file.close()
        
        local result = me.py.eval("
import json
try:
    json.loads(content)
    'OK'
except Exception as e:
    f'NG: {str(e)}'
", new MapBox().set("content", content))
        
        me.console.log(result)
        return result.startsWith("OK") ? 0 : 1
    }
}

受入基準:

  • OS差なく実行Windows/Linux/macOS
  • --sealedモードで完全再現可能
  • 大規模JSON10MBでも安定動作

3. ny-array-bench性能デモ- ベンチマーク基準

目的: ArrayBox map/reduce、StatsBox導入、性能可視化

// apps/ny-array-bench/main.nyash
static box Main {
    init { stats }
    
    main(args) {
        me.stats = new StatsBox()
        local sizes = [1000, 10000, 100000]
        
        loop(size in sizes) {
            me.benchArrayOps(size)
        }
        
        // 結果をJSON出力CI集計用
        local result = me.stats.toJSON()
        print(result)
    }
    
    benchArrayOps(size) {
        local array = new ArrayBox()
        
        // 1. 配列生成
        me.stats.startTimer("create_" + size)
        loop(i < size) {
            array.push(i)
        }
        me.stats.endTimer("create_" + size)
        
        // 2. map操作
        me.stats.startTimer("map_" + size)
        local doubled = array.map(|x| x * 2)
        me.stats.endTimer("map_" + size)
        
        // 3. reduce操作
        me.stats.startTimer("reduce_" + size)
        local sum = doubled.reduce(|a, b| a + b, 0)
        me.stats.endTimer("reduce_" + size)
        
        // VM基準の相対性能を記録
        me.stats.recordRelative("vm", 1.0)
        if IS_JIT { me.stats.recordRelative("jit", SPEEDUP) }
        if IS_AOT { me.stats.recordRelative("aot", SPEEDUP) }
    }
}

受入基準:

  • VM=1.0x基準でJIT/AOTの倍率表示
  • fallbacks=0完全最適化
  • 結果JSON自動出力CI集計可能

4. ny-filegrep実用ミニ- ファイルI/O実用例

目的: BytesBox/FileBoxプラグインI/O、実用的なツール

// apps/ny-filegrep/main.nyash
static box Main {
    init { pattern, recursive, results }
    
    main(args) {
        me.parseArgs(args)
        me.results = new ArrayBox()
        
        local path = args.getLast() || "."
        me.searchPath(path)
        
        // 結果表示
        loop(result in me.results) {
            print(result)
        }
        
        return me.results.length() > 0 ? 0 : 1
    }
    
    searchPath(path) {
        local file = new FileBox()
        
        if file.isDirectory(path) {
            if me.recursive {
                local entries = file.listDir(path)
                loop(entry in entries) {
                    me.searchPath(path + "/" + entry)
                }
            }
        } else {
            me.searchFile(path)
        }
    }
    
    searchFile(filepath) {
        local file = new FileBox()
        file.open(filepath, "r")
        
        local lineNum = 0
        loop(true) {
            local line = file.readLine()
            if line == null { break }
            
            lineNum = lineNum + 1
            if line.contains(me.pattern) {
                me.results.push(filepath + ":" + lineNum + ":" + line)
            }
        }
        
        file.close()
    }
}

受入基準:

  • Windows/Linux/macOSで同一結果
  • 大規模ディレクトリ1万ファイル対応
  • メモリ効率的(ストリーム処理)

5. ny-http-helloWASM/ネイティブ両対応)- Web実用例

目的: NetBoxプラグインとイベントループ、FutureBox活用

// apps/ny-http-hello/main.nyash
static box Main {
    init { server, running }
    
    main(args) {
        local port = args.get(1) || "8080"
        me.server = new HttpServerBox()
        me.running = true
        
        // シグナルハンドラー設定
        registerSignal("SIGINT", || me.stop())
        
        // サーバー起動
        me.server.start(port.toInteger())
        print("Server listening on http://localhost:" + port)
        
        // リクエストループ
        loop(me.running) {
            nowait request = me.server.accept()
            me.handleRequest(wait request)
        }
        
        me.server.stop()
        return 0
    }
    
    handleRequest(request) {
        local response = new HttpResponseBox()
        
        if request.path() == "/" {
            response.setStatus(200)
            response.setHeader("Content-Type", "text/plain")
            response.write("Hello from Nyash!")
        } else {
            response.setStatus(404)
            response.write("Not Found")
        }
        
        request.respond(response)
    }
    
    stop() {
        print("Shutting down...")
        me.running = false
    }
}

受入基準:

  • 100req/s程度のスモーク通過
  • 停止シグナルでクリーンfini
  • WASMビルドでも動作制限付き

🎯 実装優先順位

  1. ny-echo - 最小実装、CI基盤確立
  2. ny-array-bench - 性能基準確立
  3. ny-jsonlint - プラグイン統合実証
  4. ny-filegrep - 実用性実証
  5. ny-http-hello - Web対応実証

📊 成功指標

全体指標

  • 5アプリすべてがVM/JIT/AOTで動作
  • CIでの自動テスト確立
  • ドキュメント・サンプル完備

性能指標

  • JIT: VMの5倍以上高速
  • AOT: VMの10倍以上高速
  • メモリ使用量: 同等機能のPython比50%以下

品質指標

  • ゼロクラッシュ1000回実行
  • メモリリークなし(長時間実行)
  • プラットフォーム差異なし

🚀 配布戦略

リリース形式

nyash-apps-v1.0/
├── bin/
│   ├── ny-echo[.exe]
│   ├── ny-jsonlint[.exe]
│   ├── ny-array-bench[.exe]
│   ├── ny-filegrep[.exe]
│   └── ny-http-hello[.exe]
├── examples/
│   └── *.nyash (ソースコード)
├── benchmarks/
│   └── results.json
└── README.md

展開先

  • GitHub Releases
  • Homebrew (macOS)
  • Scoop (Windows)
  • Docker Hub (コンテナ版)

これで「30日で作った言語」の実力を世界に示せます🎉