
2026/07/11 4:08
Show HN: E--(イーン)── イングリッシュとピソンの間で切り替えられる言語
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
E--(英字表記:e-minus-minus)は、PyPI で利用可能な新しいプログラミング言語であり、
pip install e-minus-minus コマンドでインストールできます。この言語は、スタンドアロンの Python コードに決定論的にコンパイルすることを目的としています。動作モデルは二段階のパイプラインを採用しており、まず(オプションとして)大規模言語モデル(LLM)がノーマライザーとして機能し、自由な英語入力を処理するとともに、トランスパイル時に値スロットを解決します。次に、決定論的なコンパイラーが正規化された形を純粋な Python コードに変換します。E-- は閉じた文法によって曖昧さを排除し、創造的な作者作業と実行プロセスを分離することで、生成された最終プログラムが自己完結型で再現可能であることを保証し、ランタイム時にネットワークへのライブアクセスや API キーの依存を必要としません。特定のファイルタイプ(.emm 拡張子)に対応しており、キャッシュされたバージョン(.emm_cache.json)が存在すれば不要なノーマライゼーションをスキップするように自動的に検出されます。生成ツール自体は Apache License 2.0 の元ですが、生成された Python 出力はライセンス上の制約から解放されています。現在初期設計段階にある E-- は、柔軟な自然言語入力と堅牢なソフトウェア展開の両方を統合し、詳細な仕様については docs/spec.md に記載されています。本文
E-- (イース・ダッシュ)
Python へ決定論的にコンパイルされる、曖昧性を排除した**「英語そのもの」**プログラミング言語です。
概要
- 記述形式: 通常の英語(平文)。
- 特性: 決定論的な Python コードにコンパイルされ、実行時の挙動は再現性が保証されます。
- 設計思想:
- 読んだり編集したりする際には通常の英語のように振る舞う。
- コンパイルされた先は、再現性の高い一般的な Python コードとなる。
なぜ存在するのか?
LLM(大規模言語モデル)が生成したコードには以下の課題があります:
- 実行時の挙動が曖昧。
- 非再現性。
- 呼び出しコストが高い。
- デバッグが困難。
E-- ではこれを解決します:
- 役割の分離: LLM の創意工夫が必要な局面と、その後の一貫した決定的な挙動を分離・併せ持つ。
- 決定論的なコンパイル: E-- から Python へのコンパイルは、決定論的なパーサーによって処理され、純粋な動作のみが保証されます。
- LLM はトランスパイル時(コンパイルの第一段階)のみ使用されるオプションです。
- 実行時には LLM は一切介入しません。
クイックスタート
インストール
標準的な E-- には LLM は必須ではありません:
pip install e-minus-minus
LLM を使用したい場合(オプショナル依存関係):
pip install "e-minus-minus[llm]"
トランスパイル(変換)
.emm ファイルを Python コードに変換:
emm-transpile examples/describe.emm
開発環境での利用(リポジトリから):
PYTHONPATH=src python -m e_minus_minus.transpiler examples/describe.emm
ご自身のソフトウェアでの利用
E-- は Apache License 2.0 ライセンスで提供されており、許諾的かつ特許無償利用が含まれています。
- E-- のツール群: ライセンス制限の対象(プロジェクトライセンスに従う)。
- 生成される Python コード: プロジェクトのライセンス制限なし(出力物は所有され、自由に再利用可能)。
LLM との接続について:
- LLM は E-- プロジェクトとは独立したサービス(プロバイダー)を利用します。
- LLM の利用規約は別途適用されます。
プログラム向けの API
Python コードをトランスパイルする関数:
from e_minus_minus import transpile python_source = transpile(emm_source)
注意:
transpile() は純粋な関数(ネットワーク通信や副作用なし)です。
- スロット処理には、
を受け取る関数を渡す必要があります。resolve_slot - 詳細は
またはソース実装docs/spec.md
の注入型解決器パターンを参照してください。src/transpiler.py
動作原理
E-- は不安定な部分(LLM)と決定論的な部分を分離した二段階のパイプラインで構成されています。
- 正規化エンジン(LLM:オプション)
- 自由形式の英語を「カノン化された E--」に変換します。
- この段階のみが言語的な曖昧性に立ち向かいます。
- コンパイラ(決定論的)
- カノン化された E-- を通常のパーサーで Python に変換します。
- LLM を使用せず、完全な再現性とデバッグ性を確保します。
生成される Python コードは常に純粋で自己完結しています。
ごく簡単な試作例
入力:カノン化された E--
Set result to [[fibonacci]]( {{the first prime number greater than 5}} ). Do [[print]](result).
変換後の Python コード:
result = fibonacci(7) print(result)
記号の意味:
: 関数呼び出し。[[名前]]- 単語: 変数。
: リテラル。"文字列"/数字
: リスト。<数値>
: トランスパイル時に解決され出力に埋め込まれる英語表現(スロット)。{{ ... }}
E-- の実行方法
E-- ソースファイルは
という拡張子を使用します。.emm
コマンドラインオプション
: 生成された Python コードを指定のファイルに出力。-o ファイル名
: トランスパイルして実際にプログラムを実行。--run
(--show
): 生成された Python コードと実行結果を両方表示(境界記号で区切られたコメント形式)。-s
実行例
標準入力を Python コードとして確認:
python3 src/transpiler.py examples/describe.emm --show --run
出力:
# --- generated Python --- def describe(n): if n > 10: return "big" return "small" for n in [3, 42, 7]: print(describe(n)) # --- output --- small big small
備考:
スロット付きファイルは、一度のセットアップ(キャッシュ)によりオフラインで動作します。{{ ... }}- スロットのないファイル(例:
)には API キー不要。examples/describe.emm
{{ }}
スロットの解決方法(LLM セットアップ)
{{ }}トランスパイル時に LLM を使って Python 表現に変換し、その結果をキャッシュすることで、後続のビルドをオフラインかつ再現可能にします。
セットアップ手順
# 1. バーチャル環境を作成 python3 -m venv .venv && source .venv/bin/activate # 2. 依存関係(Anthropic SDK など)をインストール pip install -r requirements.txt # 3. API キーを設定 export ANTHROPIC_API_KEY="sk-ant-..." # 4. スロット付き例を実行 python3 src/transpiler.py examples/primes.emm --show --run
仕組み:
- 最初の実行: LLM (Anthropic Haiku) にスロットを解決させ、結果を
にキャッシュする。.emm_cache.json - 以後の実行: キャッシュヒットにより、API 呼び出しなしで同一の結果が得られる(オフライン動作)。
- バージョン管理: キャッシュファイルはコミット可能であり、解決された値の変更履歴を追跡・レビュー可能です。
一行コマンドによるスロット例
별도의ファイル設定なしにスロット付きファイルを構築:
printf 'Set year to {{the current year, as an integer literal}}.\nDo [[print]](year).\n' > hello.emm emm-transpile hello.emm --show --run
結果: 2 回目の実行からはキャッシュヒットとなり、オフラインで動作します。
コードスロット(v0.2.0)
{{ ... }} スロットは式位置だけでなく、文節位置でも使用可能です。これにより、LLM に複数の Python 文を委譲できます。
特徴
- 著者が周囲の構造を書き込み、LLM が領域を埋める。
- インポート等の記述: 値スロットでは単一の表現しか出力できないのに対し、コードスロットでは
のような独自の一行でインポートを追加可能。from statistics import ...
実行可能なコードスロット例
Define [[summarize]] taking numbers: {{ compute the mean, median and count of numbers into named variables mean_v median_v and count_v }} Do [[print]](count_v). Do [[print]](mean_v). Give back mean_v. Set data to <2, 3, 5, 7, 11, 13>. Do [[summarize]](data).
トランスパイルされた Python コード:
def summarize(numbers): from statistics import mean, median mean_v = mean(numbers) median_v = median(numbers) count_v = len(numbers) print(count_v) print(mean_v) return mean_v data = [2, 3, 5, 7, 11, 13] summarize(data)
トレードオフ:
- コードスロット内部の
や参照は不透明化します(DAG の可視性を放棄)。[[wikilinks]] - 構造を完全に LLM に委譲する必要がある場合のみ使用してください。
自由な英語での記述
E-- ソースとして通常の英語でも記述可能です。トランスパイラの第 1 ステージが LLM を用いて、自由な英語をカノン化された E-- に正規化します。
カノン検出による安全・安価な設計
- パーサーがカノン検出者: ファイルが「すでにカノン化されているか」は決定論的に判定されます(LLM やヒューリスティクス不使用)。
- 固定点+キャッシュ:
- 正規化された出力を再投入すると、第 1 ステージは何もしなくなります。
- 正規化結果はコミットされた
にキャッシュされ、繰り返し実行でオフライン動作が可能。.emm_norm_cache.json
注意: 正規化処理とスロット解決は独立しており、すべてのスロットがキャッシュされたカノンファイルのみがライブ(実時間)呼び出しを行います。
現状
- 初期設計段階。
- 言語仕様:
(真実の基準)。docs/spec.md - コア機能(Lexer, パーサー, エミッター)は実行可能 CLI とともに実装済み。
- LLM 正規化エンジン: ファイル全体粒度での処理(領域ごとの改良は次期予定)。