M&M を使ってプログラミング言語を作りました。

2026/03/09 3:18

M&M を使ってプログラミング言語を作りました。

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

要約:

MNM Langは、ソースコードをキャンディカラーのPNG画像に変換し、決定論的な画像処理で完全にラウンドトリップしてテキストへ戻せる風変わりなプログラミング言語です。コンパイラーは

.mnm
ファイルを読み取り、プログラム構造の視覚表現を出力し、デコンパイラーはピクセルパターンを解釈して正確に元のコードを再構築します。実行時データはJSONサイドカー ファイルに別途保存されるため、ビジュアルレイアウトには構造情報のみがエンコードされています。命令は色ファミリー(青・緑・黄・橙・茶・赤)に整理され、オペランドはトークン長で符号化されます。本プロジェクトはコマンドラインインターフェース、オンラインプレイグラウンド、サンプルプログラム、AI生成キャンディスプライト、およびパーシング・実行時挙動・デコード・アセット整合性を網羅したテストで構成されています。作者は美的魅力と工学的厳密さの間にある遊び心を継続的に洗練し、ツール拡張や追加例の提供などを検討しつつラウンドトリップの忠実性を保つことを目指しています。

要約骨格

本文が主に伝えたい内容(メインメッセージ)
MNM Langは、ソースコードをキャンディカラー画像へ変換する遊び心あるプログラミング言語であり、完璧なラウンドトリップのコンパイルとデコンパイルが可能です。

証拠/根拠(このように述べられる理由)
コンパイラーは

.mnm
ファイルからPNGを生成し、デコンパイラーは決定論的画像処理で正確なソースを再構築します。実行時データはサイドカーJSONファイルに格納されるため、ビジュアルレイアウトには構造のみがエンコードされています。

関連事例/背景(文脈・過去の出来事・周囲情報)

  • 命令は色ファミリー(青、緑、黄、橙、茶、赤)でグループ化される。
  • オペランドはトークン長によって符号化される。
  • 本プロジェクトにはCLIとブラウザプレイグラウンド、サンプルプログラム、AI生成キャンディスプライト、およびパーシング・実行時・デコード・アセット健全性を網羅する広範なテストが含まれる。

今後起こり得ること(本文で書かれた将来の展開/予測)
作者は、遊び心あるキャンディコードと堅牢なエンジニアリングのバランスを保ちつつ、ツール拡張や例の追加などを検討しながら完璧なラウンドトリップ忠実性を維持する計画です。

この影響が及ぼす可能性(ユーザー/企業/業界)
利用者は視覚的にプログラミング概念を学べ、開発者は独自の言語設計と決定論的画像ベースデコンパイルを実験できる。プロジェクトは創造的な教育ツールやビジュアルエンコーディングを活用したニッチドメイン特化型言語へのインスピレーションになる可能性があります。

本文

この記事のどれくらいがAIによって生成されたもの(コード・文章・構成)ですか?
残りは人間が書いたものです。


もしテーブルに置いたM&Mのお菓子の山が実際のプログラムだったら?

文字通りです。M&M に似たキャンディを特定のパターンで並べると、そのパターンが実行可能なコードになる――という想像です。

物語時間 – この投稿に直接埋め込まれたインライン対話型インタープリタ付き。

すべては、開けすぎて「GEMS†」―インド版M&Mを床に落としてしまったことから始まりました。落ちると矢印形のパターンになり、ふざけたアイデアが湧きました。「M&Mでプログラムを書けないだろうか?」――このプロジェクトはその一例です。


制約

散らばったキャンディを見て、いくつかの制約が浮上しました:

  • 有効な色は 6 色だけ。
  • 写真では正確なシンボルデータを表すには不向き。
  • キャンディは丸く光沢があり、散らばりやすく扱いにくい。
  • 文字列は画像で扱うのが難しい。
  • 面白さを保ちつつ実際に動作する必要がある。

そこで私は MNM Lang を作りました。小さな言語で、

  • ソースコードは 6 種類の文字列で書く:B G R Y O N(Blue, Green, Red, Yellow, Orange, Brown)。
  • それらをキャンディスプライトからなる PNG にコンパイル。
  • PNG を逆にして正確にソースへ戻すことができる。
  • 軽度の歪みを含む画像からもプログラムを復元できる「制御付き写真デコーダ」を備える(うまくいけば)。

CLI、ブラウザ上のプレイグラウンド、サンプルプログラム、テスト、そしてプロジェクト専用に生成されたスプライトパックがあります。実用的というよりは、「ふざけたアイデアを真面目に実装したもの」です。


コア課題

6 色しかないキャンディで、以下の条件を満たす言語を作るにはどうするか?

  • 手で置きやすい。
  • 写真から読み取りやすい。
  • 実際に使えるほど表現力がある。
  • 全体として「おふざけ」さえ保てるくらい小さい。

私の答えは:色ファミリーをオペコード、個数をオペランドとすることです。

BBB
のようなトークンは「青いものが 3 個ある」という意味ではなく、特定のオペコードを表します。
RRRR
は整数リテラル 3 を意味し、オペランド値は
len(token) - 1
で決まります。

この単一ルールにより、テキストで簡単に書け、画像セルへレンダリングでき、ジオメトリから再構築できるようになり、適切な冗談感を保てます。

「青いクラスターは制御フロー、緑はスタックと変数、黄は算術、橙は I/O、茶はラベルと文字列、赤はスタック操作と論理。数値5を表したいなら 6 個の赤キャンディを使う。」


文字列

最初に直面した分岐点が文字列です。

テキストを直接キャンディレイアウトに埋め込むか、ミクロアルファベットを発明することもできましたが、技術的には可能でも精神的には酷いでしょう。プロジェクトの楽しさは視覚構造にあり、砂糖の殻で OCR 耐性 QR コードを作ることではありません。

そこで文字列と初期変数をサイドカー JSON ファイルへ移動しました。プログラムは 2 部分からなります:

  • .mnm
    にある視覚的キャンディレイアウト。
  • .mnm.json
    にある非可視実行時データ。

例として hello world は次のようになります。

OO Y
OOOOOO
BBBBBB

コンパイラ出力(サニック形式)とそのサイドカーは:

{
  "strings": ["Hello, world!"],
  "variables": [],
  "inputs": { "int": [], "str": [] }
}

この分離により、画像は構造のみを担い、実行時入力はキャンディを動かさずに変更できるようになります。


六色で構成された言語

文字列が画像から外れたことで、言語の設計が整いました:

  • :ジャンプ・呼び出し・停止
  • :push/load/store/dup/pop/inc/dec
  • :算術と比較
  • :出力と入力
  • :ラベルと文字列操作
  • :swap、rotate、ブール論理

各行の最初のトークンがオペコードです。1 行= 1 命令;キャンディクラスター= トークン;個数が多いほど別バリアントになります。

第一章の完全階乗例(最初のセクション)は見た目は滑稽ですが機能します。


コンパイラ & デコンパイラ

「このプログラムはキャンディだ」というギミックに合わせて、コンパイラは AST で止まらず画像を出力する必要があります。固定グリッド上に正規化された

.mnm
ソースを描画します:

  • 1 セル= 1 文字。
  • スペースは空セル。
  • セルには透明背景のキャンディスプライト。
  • 出力は PNG。

逆方向は trivial:行列数を復元し、各セルをサンプリングして色分け、末尾スペースを除去して再パース。これにより完全な round‑trip が得られ、ヒューリスティクスなしでコンパイラ自体が小さな画像フォーマットとなります。


スプライト生成

手描きはしませんでした。AI 画像生成†を使って 6 種類の M&M スタイルトークン(青、緑、赤、黄、橙、茶)を作成しました。初期生成物にはスタジオ背景、不揃いな影、スケール差がありました。最終パイプラインは次の通りです:

  1. 透明背景で孤立したキャンディを生成。
  2. 正規化:最大のキャンディ領域を切り取り、128×128 キャンバスに中央配置。
  3. デコンパイラと写真分類器用にカラーパレットメタデータを抽出。

正規化は重要でした。影が強すぎるとぼかし後にキャンディが合体してしまい、写真デコードが失敗します。


写真デコーダ

v1 デコーダは決定的画像処理で動作:

  • 境界から背景色を推定。
  • キャンディ様の前景ブロブをセグメント化。
  • 各ブロブを標準六色パレットに分類。
  • ブロブを行へクラスタリング。
  • セントロイド間隔から空白を推定。
  • 再構築されたソースを再パース。

以下の条件で驚くほど動作します:

  • オーバーヘッド写真
  • コントラストの高い単純背景
  • キャンディが分離している場合
  • 軽度のぼかし
  • 小さな回転または視点歪み

ただし、カジュアルな台所テーブル撮影や iPhone の劇的アングルには対応できません。


実際のサンプルプログラム

hello world 以外にも、言語の各部分を押す例を追加しました:

  • echo_name
    :文字列キューと連結。
  • factorial
    :ラベル、変数変更、算術、条件分岐、ループ。
  • fizzbuzz
    :剰余、枝分かれ、文字列スロット、繰り返し出力。

FizzBuzz をキャンディグリッドにコンパイルして正しく実行できる様子を見ると、単なる呪われた新奇構文ではなく、見た目はスナックのような実際に機能する小さな VM であることが分かります。


ツールチェーン

CLI は次を提供します:

compile
decompile
run
serve
list examples

ブラウザプレイグラウンドでは、例をロードし、ソース/サイドカー JSON を編集してキャンディシートをプレビュー、即座に実行、または画像をアップロードしてソースへデコードできます。2 つのビューで AST と実行トレースをツリー形式で表示します。

hello world のような小さなプログラムでは AST が読みやすくなります:

Program (3 instruction(s))
|-- labels
|   `-- (none)
`-- instructions
    |-- [0] PRINT_STR @ line 1 (string[0] from Y)
    |   `-- source: OO Y
    |-- [1] NEWLINE @ line 2
    |   |-- source: OOOOOO
    |   `-- operands: (none)
    `-- [2] HALT @ line 3
        |-- source: BBBBBB
        `-- operands: (none)

階乗の実行トレースでは分岐判断が確認できます。


テスト

次の項目をテストしました:

  • パーサ検証
  • 実行時意味論
  • サンプルゴールデン出力
  • 正確な round‑trip(ソース → PNG → ソース)
  • ぼかし・回転・視点歪み付き合成写真デコード
  • API 動作
  • プレイグラウンドのスモークフロー
  • スプライト資産の健全性チェック

バグとしては、完全に不透明な RGB 画像を前景と誤認したケースや、スプライト正規化で過剰なドロップシャドウが残ったケースがあります。テストは「キャンディを一度描画したもの」と「実際のシステム」を分離しています。


トレードオフ & 哲学

ジョークプロジェクトには必ず選択肢があります:冗談を守るか、実装を守るか。MNM Lang は両方を強いられました:

  • 青クラスター幅=分岐命令
  • 赤ラン長=整数リテラル
  • 文字列は OCR が酷いので JSON に移動
  • コンパイル済み PNG は正確;写真は「制御付き」

これらの規則は前提に基づいて正当化されます。


ダウンロード

試したい場合はリポジトリをクローンしてください:

git clone https://github.com/mufeedvh/mnmlang.git
cd mnmlang
uv run mnm serve

fizzbuzz
をロードしてレンダリングし、コンパイルされた PNG を眺めてください。バッグから注ぎ出せるプログラミング言語のように見えます。


これは「ばかげたプロジェクト」シリーズ第 1 作です。次回は自分のキーボードドライババイナリを逆解析し、バックライトでスネークゲームを動かす方法をご紹介します。

𝕏(旧 X)でフォローしてください。

同じ日のほかのニュース

一覧に戻る →

2026/03/09 5:30

エージェント・セーフハウス – macOS ネイティブサンドボックスによるローカルエージェントの保護 --- **ポイント解説** - **Agent Safehouse** は、macOS 上で動作するローカルエージェント(バックグラウンドプロセスやサービス)を安全に隔離し、外部からの不正アクセスや権限昇格を防ぐための仕組みです。 - 「macOS‑native sandboxing」は、Apple が提供するサンドボックス機能(`sandbox-exec`, `com.apple.security.*` など)を利用しており、追加のソフトウェアやカーネル拡張は不要です。 **主な特徴** 1. **最小権限で実行** – 必要最低限のファイル・ネットワークアクセスのみ許可し、それ以外は自動的にブロック。 2. **監査ログ** – アクセス試行や失敗がすべて記録され、後からトラブルシューティングやセキュリティ調査に利用可能。 3. **設定の柔軟性** – プロファイルベースでポリシーを定義でき、企業規模に合わせた細かな制御が可能。 **実装例(サンドボックスプロファイル)** ```xml <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.files.user-selected.read-write</key> <true/> ``` このように、エージェント・セーフハウスは macOS の標準機能だけで安全性を大幅に向上させるソリューションです。

## Japanese Translation: > Safehouse は、ローカル AI エージェントがアクセスできるファイルを厳密に制御する軽量な macOS ネイティブサンドボックスです。デフォルトでは「deny‑first」ポリシーに従い、指定されたワークスペース外への読み書き試行はカーネルエラー(“Operation not permitted”)を引き起こし、SSH キーや `.aws` などの機密項目やその他個人リポジトリを保護します。ツールは `curl` を使って `~/.local/bin` にインストールされる単一の Bash スクリプト(`safehouse.sh`)でセットアップされます。 > > エージェントは `safehouse claude --dangerously-skip-permissions` のようなコマンドで呼び出され、現在の作業ディレクトリ(通常は git リポジトリルート)への読み書きアクセスを自動的に許可し、インストール済みツールチェーンへの読み取りアクセスのみを許可して残りのホームディレクトリは拒否します。 > > 上級ユーザーは `safe() { safehouse --add-dirs-ro=~/mywork "$@"; }` のようなシェル関数を `.zshrc` や `.bashrc` に追加し、すべてのエージェント呼び出しがデフォルトで Safehouse 内で実行されるようにできます。セッションごとにサンドボックスをバイパスするには、コマンドに文字列 `command` を接頭辞として付けます(例:`command claude`)。 > > このゼロコンフィグ方式により、開発者やチームはローカルファイルとの AI 連携を安全に行い、個人プロジェクト、クラウド認証情報、企業リポジトリでの偶発的なデータ漏洩を減らすことができます。

2026/03/09 6:40

**ブラックスカイ・AppView**

## Japanese Translation: Blacksky の AppView は Bluesky Social PBC の AT Protocol 参考実装をフォークしたもので、**外部からの貢献やプルリクエストは受け付けません**。すべての変更は `packages/bsky`、`services/bsky` の3つのディレクトリと1つのマイグレーションファイルに限定され、参考コードの大部分を保持しています。 リポジトリは組み込みの TypeScript フィーホーズコンシューマーを Rust ベースのインデクサ **rsky‑wintermute** に置き換えており、並列キューを通じて約10 k+ レコード/秒を取り込むことができます。Wintermute はブートストラップツール(`queue_backfill`、`direct_index`、`label_sync` など)を提供し、ライブインデクシングとバックフィルを分離します。 主なパフォーマンス最適化は次の通りです: - PostgreSQL の LATERAL JOIN 再書き込み(`getTimeline` / `getListFeed` 用) - Redis キャッシュレイヤー(アクタープロファイル TTL 60 s、レコード TTL 5 m、相互作用カウント TTL 30 s、投稿メタデータ TTL 5 m) - 通知設定のサーバー側強制 実装された修正: - JWT 検証における古い署名鍵の処理 - JSON のサニタイゼーションで null バイト/制御文字を除去 - アクターメモリキャッシュ内の protobuf タイムスタンプバグへの対策 Blacksky は **コミュニティ投稿サポート** をカスタムレキシコン namespace(`community.blacksky.feed.*`)と専用 `community_post` テーブル、データプレーン/API 層でのメンバーシップゲーティングを通じて追加しています。これは混在した投稿スレッド(`getPostThreadV2`)とも統合されます。 全体アーキテクチャフロー: Bluesky Relay → rsky‑wintermute(フィーホーズコンシューマ/バックファラー/ラベルインデクサ) → PostgreSQL 17 → bsky‑dataplane(gRPC) → オプションの Redis キャッシュ → bsky‑appview(HTTP) → リバースプロキシ、Palomar が OpenSearch 検索機能を提供 バックフィル性能: ライブインデクシングは約1 k イベント/秒。42 M ユーザーと 18.5 B レコードのフルバックフィルは10 k レコード/秒で 2–4 週間、部分的なバックフィルは数時間〜数日で完了 ブートストラップ課題への対策: - PostgreSQL COPY による JSON 腐敗 - null バイト処理 - タイムスタンプ精度の強制 - 通知テーブルの肥大化緩和 - 投稿埋め込みテーブルの人口化 - ラベル否定順序 - Fjall キュー毒性解決 - TLS プロバイダ初期化 - アカウント移行後の署名鍵回転 **フルネットワーク AppView のリソース要件:** ≥ 16 CPU コア(推奨 48+)、≥ 64 GB RAM(256 GB 推奨)、10 TB NVMe ストレージ(28 TB RAID 推奨)、同一マシンまたは低遅延での PostgreSQL、継続的ネットワーク 100 Mbps(1 Gbps+)以上の取り込み帯域 リポジトリは MIT/Apache 2.0 のデュアルライセンスです。アップストリーム同期手順は `git remote add upstream https://github.com/bluesky-social/atproto.git` で提供されています。

2026/03/09 4:58

「エージェント時代にリテラトープログラミングを見直すべきです。」

## Japanese Translation: > 本稿は、コードと説明文を組み合わせたリテラトープログラミングが、AI エージェント(例:Claude や Kimi)が Org‑Mode ファイルを単一の真実源として扱う場合に実用化できることを主張しています。 > > Org の構文を解析することで、これらのエージェントはランブックを生成し、埋め込みコードブロックを実行し、Jupyter ノートブックのように結果を保存し、プローズとコードを同期して自動的に更新できるため、ナラティブと実行可能なスクリプトを分離する手作業「タンギング」ステップが排除されます。 > > 著者は、Org Mode を設定管理に個人的に使用した例でこれを示しています:エディタ内で直接コマンドを書き込み、それらを実行し、メモを自動的に取得します。 > > コードとプローズの2つの並列文書を維持することは採用への一般的な障壁ですが、AI 主導のワークフローは `AGENTS.md` ファイルに記載された指示(実行前のタンギング、常にステップを説明するプローズ、両側を同期させる)に従うことでそのオーバーヘッドを排除します。 > > このアプローチはワークフローを合理化し、コードベースを複数の読みやすいフォーマットへエクスポートしやすくし、「コードを書く」から「コードを読む」へのシフトを促進します。また、大規模プロジェクトにおける Org‑Mode の Emacs 統合の限界を浮き彫りにし、リテラトープログラミングの普及を広げるために Markdown などの類似フォーマットを推奨することも示唆しています。