8.0 KiB
8.0 KiB
🚀 First Five Apps - Nyashの実力を証明する最初の5本
🎯 概要
Phase 11.5完了を待たずに、今すぐ作れる実用アプリ5本で、Nyashの産業レベルの完成度を世に示します。 すべて「Everything is Box/PluginInvoke」で統一実装し、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-jsonlint(Python連携デモ)- プラグイン統合
目的: 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モードで完全再現可能
- 大規模JSON(10MB)でも安定動作
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-hello(WASM/ネイティブ両対応)- 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ビルドでも動作(制限付き)
🎯 実装優先順位
- ny-echo - 最小実装、CI基盤確立
- ny-array-bench - 性能基準確立
- ny-jsonlint - プラグイン統合実証
- ny-filegrep - 実用性実証
- 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日で作った言語」の実力を世界に示せます!🎉