Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Emela - AI 時代に,なぜプログラミング言語を作るのか

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for Allianaab2m Allianaab2m
November 08, 2026
60

Emela - AI 時代に,なぜプログラミング言語を作るのか

2026/11/09 言語処理系集会[0] での発表資料
https://vrc-langdev.connpass.com/event/410417/

Avatar for Allianaab2m

Allianaab2m

November 08, 2026

Transcript

  1. ⾃⼰紹介 ありあな(Alliana) アイコン • 実務で TypeScript と Effect-TS を書いていた •

    今は Kotlin と Go を書いている • 4ヶ⽉ほど前から Emela を作っている • ⽣みの親は Python, 育ての親は TypeScript • 動的型付け⾔語から開発者を守る党 党⾸(?) • X: @Alliana_VRC GitHub: Allianaab2m 2
  2. Emela という名前 Emerald を⽇本語で発⾳したときの⾳から Ruby のような,キレイそうな宝⽯の名前に 発⾳を寄せた -la の綴り 関数

    Lambda や Scala に思いを馳せている ロゴを作ってもらった 規則的な⼋⾓形はコンピュータ,曲線の⼿形は⼈間. ⼆つを⼀つのエメラルドに重ねている ←Created by @skytomo221 ありがとう!! 3
  3. 可読性と決定論のどちらを取るか 機械・AI ⼈間 決定論的に寄せる Emela:共通語 可読性に寄せる 可読性が落ち,⼈間が仕様を 追えなくなる. 本来読みたい部分が埋もれる ⼈間が書いた仕様を

    AI が 難なくコードに起こせる AI が書いたコードを⼈間が 難なく読める 解釈に幅が出るので 品質の担保が難しい. 正しさを決定論的に 検証できない プログラミングは,⾏いたい処理に対して どういう⼿続きをしたいかを明確に記述すること 6
  4. ⾔語は LLM に対する最⼤のハーネス 投機的な⽣成を投機的に底上げする 決定論的に品質を担保する • プロンプトの⼯夫 • 型検査・コンパイラ・Linter •

    エージェントの⼯夫 • 何度⾛らせても同じ結果を返す • 同じ⼊⼒でも結果が変わりうる • LLM の間違いを指摘できる • その間違いを機械的に修正できる 今最も進化すべきなのは,プログラミング⾔語・コンパイラ・Linter 7
  5. 失敗しうる処理は、コンパイラに保証させよう async function greeting(id: number): Promise<string> 何で失敗する? 何に依存する? どうテストする? NotFound?

    DB エラー? 型にはその情報が出てこない DB? HTTP? ログ? 実装を読まないと分からない モジュールごと モックするしかない 8
  6. エラーも副作⽤も,⼀つの仕組みで扱いたい 手段 エラー 副作用・依存 差し替え つらいところ 例外 △ × ×

    throws の宣言が冗長になる Result / Either ◦ × × 伝播を手で書くことになる DI コンテナ × △ ◦ 依存が型に出ず,実行時に分かる 引数で渡す × ◦ ◦ 引数のバケツリレー モナド変換子 ◦ ◦ ◦ 合成が重い,初学者に厳しい Effect System ◦ ◦ ◦ 言語側の支援が要る エラー・副作⽤・DI を推論つきで⼀つの仕組みで扱えるのがエフェクトシステム 9
  7. 何をするかと,どう実装するかを分けて書ける handler:本番 DB に問い合わせる SQL を使うとか ⼿続き(関数) greeting: ユーザーを探して 挨拶する

    use effect Users 何をするか: find(id) は User を返し ,NotFound で失敗しう る with handler:開発 モックデータを返す handler:テスト 常に NotFound とかの 異常系をすぐに作れる ⼈間が読みたい⼿続きと,DB や HTTP といった環境の差異を分離できる effect = interface + 型に残る依存 + コンパイラによる注⼊の検査 10
  8. ライブラリレベルのエフェクトシステムはつらい TypeScript + Effect-TS class Users extends Context.Tag("Users")< Users, {

    readonly find: (id: number) => Effect.Effect<User, NotFound>; } >() {} const greeting = (id: number) => Effect.gen(function* () { if (id < 0) return yield* Effect.fail( new Invalid({ reason: "negative id" })); const users = yield* Users; const user = yield* users.find(id); return `Hello, ${user.name}!`; }); 実務で使って良かったこと • 型によるコーディング⽀援 • LLM のハーネスとして働く つらかったこと • Effect.gen や yield* など, 処理と関係ない記述が多い 11
  9. Emela: エフェクトシステムを⾔語機能でサポート Emela effect Users { fn find(id: Int) ->

    User fails NotFound } # fails NotFound | Invalid と uses Users を推論 fn greeting(id: Int) { if id < 0 { fail Invalid(reason: "negative id") } user = (use Users).find(id) "Hello, #{user.name}!" } # NotFound だけ処理し、Invalid は伝播する fn greeting_or_guest(id: Int) { greeting(id) escape { NotFound(_) -> "Hello, guest!" } } fails:起こりうるエラー use:使う副作⽤ 関数の型としてエラーと 副作⽤を持っている状態 ←エラーは部分的に 処理ができる 12
  10. テストは handler を差し替える 本番・開発⽤ handler SampleUsers: Users { fn find(id)

    { id match { 1 -> User(id: 1, name: "alice") _ -> fail NotFound(id:) } } } テスト handler NoUsers: Users { fn find(id) { fail NotFound(id:) } } @test fn guest_greeting() { with NoUsers { assert greeting_or_guest(1) == "Hello, guest!" } } with で包んだ範囲だけ実装が変わる 実装するコードは effect を通じて同じインターフェースを共有できる 13
  11. Emela と AI での開発フローイメージ LLM が書く コンパイラが検査する ⼈間がレビューする Emela は学習データに

    ほぼない. 書き⽅は Skills などで渡す エラーが網羅的に ハンドリングされているか ハンドラーが すべて実装されているか 構⽂エラー: 実際,LLM は 他の⾔語と間違えて 書き間違えることが多い シグネチャに失敗と副作⽤ が出ているので読みやすい 14
  12. 現状: Web アプリケーションが書けます!! app はただの関数なのでテスト可能 @entry(Http.serve) pub fn app(request: Request)

    -> Response { with Platform { route(request) } } fn route(request: Request) -> Response { (request.method, Request.segments(request)) match { (Get, ["hello", name]) -> Response.new(200, "hello, #{name}") (Post, ["echo"]) -> Response.new(200, request.body) _ -> Response.new(404, "not found") } } Std HTTP サーバーとクライアント ,FileSystem, Clock, Fiber, Map / Set emela-lang/x JSON, Redacted, Dynamic Cloudflare Workers 対応 ツールチェーン Pome: Package manager emela test / brix, fmt, lsp 15
  13. コンパイラのアーキテクチャ図 フロントエンド syntax 字句・構⽂解析, 無損失構⽂⽊ JS codegen-js Core IR derive

    展開,末尾 呼び出しのループ 化,layer の展開 組み込み C codegen-emb Flow IR resolve モジュールと名前解決 表現型つきの構造 化 ANF WASM Heap IR types 型推論,fails / use の 推論 Perceus による 参照カウント (ARC) codegen-wasm C11 codegen-c 周辺の crate:fmt(整形),driver(パイプライン),lsp,cli / pome 16
  14. Emela が⽬指すものと⽬指さないもの ⽬指すもの ⽬指さないもの • AI と⼈間が読み書きしやすい • • トークン効率のよい構⽂

    低レイヤで⾼速・省メモリ・ メモリ安全に動くこと • 構⽂上の驚きが少ない • • 型によるコーディング⽀援 マルチスレッド処理を快適に書く こと(Web アプリケーションの 遅さの多くは I/O 待ちであること が多い) メモリの都合を押し付けない代わりに,処理を素直に書けるようにするのが⽬標 (ちなみに,なぜか組み込みで Emela が動くらしいです → aoi-netai/emelino) 17