BLOG

handwired:通常のJSコードをニューラルネットワークに変換する。4日間で1730星を獲得。

Kael Zhang
技術解剖ハンドワイヤード可微编程WebGPUTypeScriptオープンソースプロジェクト
广告 · Advertisement

title: “handwired:普通のJSコードをニューラルネットワークに変換する、4日間で1730星” description: “開発者chenglouのhandwiredは、普通のJavaScriptコードを行列乗算とregluを用いたニューラルネットワークに変換します。訓練不要、正確、全て可微分で、4日間で1730星を獲得しました。この記事では、その仕組み、メカニズム、プロジェクトの質、限界について6つのセクションで解説します。” author: Kael Zhang pubDate: ‘2026-10-19’ tags: [“Tech Teardown”, “handwired”, “可微分プログラミング”, “WebGPU”, “TypeScript”, “オープンソースプロジェクト”] column: teardown geoAnswer: >- handwiredは、開発者chenglouが2026年10月15日に作成したオープンソースプロジェクト(TypeScript、MITライセンス)で、普通のJavaScriptコードを行列乗算とregluの2つのプリミティブのみでニューラルネットワークに変換し、JSやWebGPU上で実行できます。特徴は、訓練不要(重み手書き)、正確(近似ではなく)、全て可微分です。原理はReLUを用いて比較と分岐を符号化し(例:a>4?10:12を純粋な算術に変換)、全ての計算を大きな行列乗算に集約します。リポジトリは4日間で約1730星を獲得し、1人が825回のコミットを行いました。


10月15日、開発者chenglouがGitHubにhandwiredのリポジトリを作成しました。READMEの最初の文は「普通のJavaScriptコードをニューラルネットワークに変換する;訓練不要、結果は正確で、完全に微分可能」となっています。10月19日時点で、リポジトリのランキングは1730★、フォーク数143、開いている問題数は9件で、4日間で星を獲得しました。唯一の貢献者chenglouが825回のコミットを行いました。MITライセンス、TypeScript、bunでビルドされ、オンラインデモはchenglou.me/handwiredに掲載されており、bun install && bun startでローカルで実行できます。興味深いのは拡散経路です:同時期のHNでのコミットはそれぞれ5▲と4▲で、ほぼ全ての人気がGitHub側から来ています。この記事は従来の方法で6つのセクションに分けて説明します。

一、作者について

作者はchenglouで、HNのカルマーは1295です。個人のプロフィールにはGitHubとTwitterのリンクのみが記載されています。コミュニティの情報によると、彼はReactエコロジーの著名な開発者(React Motionの作者、ReasonMLの推進者、Metaで勤務経験あり)です。この背景は今回は独立して検証していませんが、本文では「開発者chenglou」として扱います。

プロジェクト自体には時間差があります:リポジトリは10月15日に作成されましたが、labディレクトリ内の実験記録は9月初めに書かれ、6月と7月の設計議論についても言及されています。9月中旬には日々更新される実験ログがあり、開発が公開よりもずっと前から行われていたことがわかります。4日間で825回のコミットは公開リポジトリのコミットのペースであり、プロジェクト全体の期間ではありません。これを「長期的な準備の後、一度に公開し、継続的に整理する」と理解する方が、証拠により近いです。

ローカルクローンでの実測結果(浅いクローン、10月19日):全リポジトリには1542ファイルがあり、そのうちtsファイルは1101件で、合計約27.5万行です。srcコアディレクトリは約1.8万行、lab実験ディレクトリは約23.5万行、testsは約2.2万行、docsの6つのドキュメントは合計1296行です。ファイルの種類の分布はtsが1101件、jsonが151件、mdが141件、txtが49件、htmlが38件、cssが22件です。これはgistレベルのアイデアデモンストレーションではなく、ドキュメント、テスト、チュートリアル、オンラインサイトを含む完全なプロジェクトです。

二、仕組みの分解

handwiredの出発点は、プログラムがif-else、ループ、状態で構成されていることに基づいています。この3つの要素を「行列乗算とreglu」に変換し、浮動小数点数上で実行します。

READMEに示されている例が最も直感的です。a > 4 ? 10 : 12のような分岐は、純粋な算術に変換できます:まずabove4 = max(0, a-4) - max(0, a-5)を計算し、max(0, x)はReLUです。整数aに対して、a>4の場合above4は1になり、そうでない場合は0になります。次にresult = above4*10 + (1-above4)*12を計算します。2つの分岐が計算され、どちらか一方が選ばれます。これらの制御流の構成要素は、加算、乗算、ReLUに変換されてコーディングされています。ループや状態も同様です:状態はFloat32Arrayのソーステーブルに格納され、各ループでテーブルを読み、計算し、書き戻します。

次のステップは収集です:すべての加算、乗算、ReLUを巨大なmatmulにまとめ、JSやWebGPU上で実行します。基本的にこれら2つの構成要素のみ使用されるため,READMEでは3つの性質が示されています:プログラム全体が微分可能であること;重みは手書きであり、訓練不要であること;GPUの成熟した最適化技術(フュージョン、スパリシティ、再整理)がこの極簡的な構成要素に特に有効であること。

docs/execution-model.mdの定義はREADMEよりも厳格です。プログラムは一定の長さの命令列であり、命令には4種類あります:affine(アフィン加重)、reglu(left * max(0, gate)、gateが1の場合はReLUに退化)、boolean(0..1の分数を正確な0または1に硬化)、index(テーブル読取り、つまり下付き添字のfloorで候補テーブルから値を取得)。すべての数値セマンティクスはFP32の切り捨て順序で記述され、アフィン項は保存順に一つずつfroundされます。文書では、どのバックエンドも参照評価器とビット単位で一致することが明確に要求されています。

比較もReLUによるコーディングだけではありません。emitCompareは整数グリッド上の演算数について直接正確なビット数を出力します:1/64グリッド上のa>=bは2つの操作、2層で済みます。グリッドが宣言されていない場合は符号連鎖が行われ、0..16,384の範囲内のa>=bには15の操作、14層が必要です。インデックス読取りには専用のloweringがあり、任意のテーブルサイズで1つの操作で完了し、インデックスの範囲は±2^24以内に制限されます。あなたが書くのは命令リストではなく、「ビルダーコード」です:通常のJavaScriptは構築時に一度実行され、emitMultiply、emitCompareといったマクロが命令に展開され、実行時には分岐やループがありません。

微分可能性も構造的であり、パッチではありません。勾配はこれら4つの命令に沿って戻ります:アフィンの勾配は係数であり、regluの勾配はReLUゲートを含みます。booleanのような硬化操作は文書で「rounding point」とマークされており、バックエンドは他の和を自由に再整理、融合することができますが、これらのポイントだけはセマンティクスを保証する必要があります。インデックスの勾配を求める際には、呼び出し側は明示的にzeroまたはbackward-differenceの2つの戦略のいずれかを選択しなければなりません。そうでなければ直接エラーが発生します:設計上、エラーを報告する方が、定義されていない勾配をこっそり与えるよりも良いです。この規則により、「プログラム全体が微分可能」というスローガンは境界を持つ契約に変わりました。

さらに上層には時間とアニメーションがあります。host-timing.tsは、スプリングアニメーションを4msのステップで分割し、剛性とダンピングを組み合わせて2×2のステップマトリックスを事前計算します。ホストは各フレームでこのマトリックスを4つの入力セルに書き込み、プログラム内でemitApplySpringMatrixを使用して適用します。つまり、ネットワークニューラルネットワークには似ていないUIアニメーションでさえ、同じ数値表にコンパイルされています。

三、エンジニアリングの質

srcは4つの部分に分かれています:runtimeは核心の実行時オブジェクトで、cells、host-timing、numeric-ui-core、prefix-networksの4つのファイルです;handwiredosは完全なデスクトップデモで、ウィンドウマネージャー、Photos、Notes、Filesがすべて数値プログラムとしてコンパイルされており、約5500行です;json-searchは約6200行で、検索デモです;learned-galleryは学習関連のデモです。testsディレクトリには42のテストファイルがあり、比較セマンティック、gather lowering、数値セマンティック、スプリングマトリックスなどをカバーしています。json-searchの1つのモジュールには184のテストがあり、約45秒で実行されます。templateディレクトリにはスイッチボタンの教育例が置かれており,docs/tutorial.mdは一行ずつ説明されており、その隣には通常のJSで書かれた参照実装があり、テストでは両方の出力が一致することが確認されています。docsにはpatterns.md(484行)、behavior-choices.md、execution-model.mdなど6つのドキュメントがあり、エンジニアリングの習慣は非常に整然としています。

HandwiredOSのデモについては、もう少し言及する価値があります。これは全倉庫で最も説得力のある展示です。ウィンドウのドラッグ、最大化、写真のクリック選択、テキストの行改行、仮想スクロールリストなどのインタラクションは、ホストJSには現れず、数値プログラムにコンパイルされています。ウィンドウのヒットテストはemitCompareを使用して1/64ピクセルグリッド上で計算され、ポインタ座標はまずグリッドに丸められてからプログラムに入力されるため、各比較は正確な整数桁です。Filesウィンドウの仮想リストは、プログラム自身の値リストであり、64のDOMスロットはプログラムによって行が割り当てられます。ホストはブラウザーのイベントをソーステーブルに書き込み、一度評価して出力をDOMに戻すだけです。言い換えれば、使用可能なデスクトップシステムの実行時オブジェクトは、浮動小数点数表上の行列演算です。

性能の数値はlab/status.mdに記録されており、ミリ秒単位で詳細に記載されています。HandwiredOS全体のデスクトップは20,381のアクティブな操作、230層、45,436のストレージウェイトでコンパイルされており、一度の評価には約133µs、フリークリックフレームには約141µs、タイピングフレームには約282µsかかります。json-searchのREADMEによると、GPUの一度の往復には0.6ms以上かかると自認されており、単一ドキュメントでは何の利益もありません。利益は10万のドキュメントが同時に並列に実行される場合のみ得られます。各ドキュメントは同じ操作を実行し、他の値を読まずに全てを一度に通過します。

READMEの自述例は3つあります。1つ目は、重みを解凍して直接訓練する方法で、「それでは何が起こるか?実際に試してみてわかる」という著者の言葉です。2つ目は、凍結された特定のプログラムを汎用ニューラルネットワークに接続してトータルフローで訓練する方法で、「nanoGPTはシェイクスピアやユーザーのUIを同時に学ぶことができるのか?」という内容です。3つ目は、従来のシングルスレッド方式のJSがGPUレベルの並列処理を実現し、JSON検索が10万件のドキュメントに対してミリ秒単位で完了する方法です。これら3つの例はすべて疑問符で終わっており、実験の様子が表現されています。

提出の頻度も観察ポイントです:1人で4日間に825回の提出がありました。著者は自身の生成方法について何も述べていませんが、9月3日のレビューノートでは、「6月と7月のClaude対話」や「6月のCodex設計討論」について整理したことが記載されており、レビューには3つの独立した監査チームが参加しました。資料はここに置かれており、判断は読者に委ねられています。

また、9月のレビューノートには「最も懸念される発見は具体的でした:いくつかの正確性チェックが同じエラーを繰り返している」と記載されています。プロジェクトが自らのテストシステムの脆弱性を記録し、他者に発見されるのを待つのではなく、これは有名なリポジトリでは珍しいことです。

4. 類似プロジェクトとの比較

概念的には、handwiredは「可微プログラミング」という古い方向性に属しています。通常のプログラムの制御流れを可微的な数値形式で表現し、ニューラルシンボルシステムのアイデアと関連しています。しかし、そのアプローチには独自の位置があります。つまり、プログラムに近づくためにネットワークを訓練するのではなく、手書きのプログラムを正確にニューラルネットワークの形に変換し、重みは訓練の産物ではなく、プログラムそのものです。可微解釈器のような作業は通常、正確性を犠牲にして可微性を実現する必要がありますが、handwiredは逆に、範囲宣言、整数グリッド、シンボル連鎖などの手段を用いて正確性を確保し、その上で可微性を得ています。「訓練不要、正確、可微」という3つの要素が同時に成立しており、これはこのコンパイルの方向性の選択に依存しています。この比較は概念的なレベルでの位置づけであり、具体的なプロジェクトの優劣についての判断にはなりません。

5. 限界

3つあります。1つ目は、数値の境界です:ReLUを用いて整数をコーディングする場合、操作数が宣言されたグリッドと範囲内にいることが重要です。リポジトリでは範囲宣言と正確なビット数を使用してこれを補完していますが、これはプログラムを書く人が自ら数値契約を維持する必要があることを意味します。浮動小数点の世界では、範囲を超える入力は魔法のようなものではなく、索引で±2^24を超える入力は直接拒否されます。2つ目は、規模の拡大です:分岐の両側を計算し、操作数はプログラムの複雑さに応じて増加します。status.mdには既存の例があります。Notesアプリケーションが移行した後、HandwiredOSの活動操作数は14,019から20,381に増加し、ストレージの重みは31,359から45,436に増加しました。単一の評価は約75µsから約133µsに増加しました。おもちゃのデスクトップではすでに2万の操作がありますので、実際のアプリケーションの規模は想像に難くありません。3つ目は、実用性です:著者自身がプロジェクトを実験として位置づけており、READMEには「それは一体何をするのか?見てみよう!」と書かれています。これは直接的な証拠であり、彼の言葉を高めずに述べています。

6. 誰が使えるかの判断

まず、人気の構造を見てみましょう:HNには2つの投稿があり、合計で9つの星が付いています。GitHubでは4日間で1730★の評価を得ています。トレンドやソーシャルメディアからの流入がありますが、技術フォーラムではほとんど注目されていません。この違い自体が、多くの人が「コードがニューラルネットワークになる」という概念に引き込まれたことを示しています。星を付けるコストは、execution-model.mdを読むコストよりもはるかに低いです。ここでの星数は、話題性を測るものであり、採用度ではありません。

人々の層に応じて判断しましょう。可微近似プログラミングを理解したい人には、これは現在の教科書レベルの入門資料です:6つのドキュメントを読み、templateのスイッチサンプルを実行し、bunコマンド1つでローカルデモを行うだけで、半日で済みます。これは論文を読むよりも直感的です。GPUによる数値計算やコンパイラを作る人には、そのマクロ設計を学ぶことができます。emitCompareやindex readといったマクロが構築時にどのように極簡易な命令に変換されるか、rounding pointを使ってどのように重ね合わせの自由度を保持するかは、直接参考にできる手法です。生産ツールを探している人には、今は来ない方がいいです:open issuesは9件あり、APIは常に変更される可能性があります。作者の位置づけは実験的なものです。

研究用の玩具なのか、あるいはパラダイムのシグナルなのか、4日間では結論を出せません。しかし、「プログラム即ネットワーク」というコンパイル目標が、27万行のTypeScriptで実現され、デスクトップシステムで動作し、10万件のドキュメントをミリ秒単位で検索できるレベルに達していることは確かです。ドキュメントとテストの完全性が星数に値する理由です。この事実自体が、一度分解する価値があります。

情報源

  • リポジトリ本体:github.com/chenglou/handwired(README、docs/execution-model.md、docs/tutorial.md、docs/patterns.md、template/、src/json-search/README.md、lab/status.md、lab/reassessment-2026-09-03.md、10月19日のローカルクローン検証;行数とファイル数はローカルのfind/wcで統計)
  • 星数、フォーク、作成時間、貢献者とコミット数:GitHub API(10月19日のスナップショット、星数は変動中)
  • HNのコミット記録:id=50105849(5▲)、id=50105735(4▲)、10月19日のスナップショット
  • 作者の背景で検証されていない部分は、本文に「コミュニティ資料による」と明記されています。
广告 · Advertisement

よくある質問

handwiredの開発者は誰ですか?

handwiredは開発者chenglouによって作成されました。

handwiredの特徴は何ですか?

handwiredは訓練不要で、正確な結果を得られるだけでなく、全ての計算が可微分です。

handwiredのリポジトリはどのくらいの星を獲得しましたか?

リポジトリは4日間で約1730星を獲得しました。