
2026/03/18 20:59
**パラレルPerl – JIT付き自動並列化インタプリタ**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本記事は、AI が生成した Perl コードが実際のシステムを駆動できる方法について説明しています。著者は長年にわたって Perl と機械学習に取り組んできた経験を活かし、WHIP(Witty House Infrastructure Processor) と呼ばれる洗練されたホームオートメーションスタックを構築しました。WHIP は BME280、INA219、DALI、LoRa などの 115 を超えるセンサ/アクチュエータモジュールを制御し、CAN バス、Modbus TCP/RTU、DALI、MQTT、SNMP、I²C、1‑Wire Modbus など多くのプロトコルを実装しています。また、Victron VRM、Discord、Nextcloud、Proxmox、UniFi など 30 を超える外部サービスと統合されています。WHIP はオフグリッド住宅 Villa‑A(プラハ)と Villa‑B(ドイツ)で稼働しています。
著者は AI が Perl モジュールをプロトタイプし、最終的に本番ツールへ進化させることができると示しています。具体例として、PVGIS 変種、Modbus/CAN コマンドラインユーティリティ、熱損失シミュレーション、および STM32 ノード用ファームウェアがあります。AI により作成された CPAN プロジェクト SNMP::MIB::Compiler と Grpc::FFI もありますが、メンテナンスは困難でした。
中核となるのは pperl で、完全に AI エージェントによって Rust で書かれた新しい Perl 5 インタープリターです。5.42 とのフル互換性を目指しつつ、XS や C バインディングなしで V8 レベルの性能を実現します。主な機能は次のとおりです:自動並列化(Rayon)、JIT コンパイル(Cranelift)、Auto‑FFI による直接 C 呼び出し、バイトコードキャッシュ(.plc ファイル)、そしてコールドスタートを排除する Emacs スタイルのデーモン/クライアントモデル。ベンチマークでは、JIT+Rayon を使用した場合にネストされたループ(Mandelbrot)で最大約 400 倍の速度向上が確認され、標準 Perl インタープリターと比べて起動時間も大幅に短縮されています。
本プロジェクトは perl.petamem.com で入手可能です。著者の Richard Jelinek(rj@petamem.com)はコミュニティによる協力を歓迎しています。今後の計画として、pperl を完全な 5.42 互換性へ拡張し、さらに AI が生成した CPAN モジュールをリリースし、大規模なオートメーションエコシステムとの統合を図る予定です。
本文
PerlでAI ― 30年の経験からAI駆動型Perlへ
メインストーリー → 詳細掘り下げ
1 | プロローグ
- GPW 2016(ニュルンベルク):「KI: Wie testet man ein Hirn?」–10年前。
- 「忍耐が必要だ、若きパダワン。」
- Perlとは関係ないが、背景として重要。
秘密の事柄
- 口にしない方が良いこともある。
- 起こった出来事の約半分をここで紹介する。
2 | PV・エネルギーシステム
- 設計・構築・自動化
- Victronエコシステム: Perlによる監視と制御
参考資料
| サイト | 規格 |
|---|---|
| ニュルンベルク (S1) | 約24 kWp, 45 kWh, 80 %+ オフグリッド、フィードイン |
| プラハ (J2) | 40 kWp, 120 kWh, 100 % オフグリッド |
Villa‑A
- テクノクラットの家 – 2050年代仕様
- 1400 m³ の暖房体積(700 t コンクリート熱質量)
- ファイバー強化コンクリート、地熱、毛管天井マット
- 完全ホームオートメーション、オフグリッドエネルギー
- 40 kWp ソーラーパネル、120 kWh バッテリー
3 | システム & 自動化
ノードアーキテクチャ
- STM32 MCU + FreeRTOS(1 Mbit/s CAN)– 自律型
- ハブ: Raspberry Pi with CAN/IPゲートウェイ、Mojolicious (Perl)
- サーバ: Perlによるオーケストレーション
センサー/アクチュエータ(115+モジュール)
| 種類 | 例 |
|---|---|
| 温度 | BME280, DS18x20, SHT3x, NTC |
| 電力 | INA219, INA226, ACS712, ADC |
| 照明 | DALI, WS281x, PWMディマー, SSR |
| 制御 | PCF857x, MCP23017, リレー, GPIO |
| 通信 | LoRa, Modbus RTU, 1‑Wire, SPI |
| ディスプレイ | SSD1306, ST7735 |
| 空気質 | SCD4x, SGP4x, PMS5003, SEN5x |
| その他 | AS3935, MLX90614, VL53L0x, HX711 |
- Linux Kconfig に触発された依存解決器
- 1ノードあたり約5モジュール → 153M+組み合わせ
Ganglion(ノード内ロジック)
- IF–THENルール、タイマー、ローカル変数 → MCU用バイトコード
- 例: 動きを検知 → 照明ON;キッチンで煙を検知 → 全館アラーム
4 | ハブ – パントヘオン
| ハブ | 機能 |
|---|---|
| Raijin | エネルギー(Victron, BMS, MPPT, バッテリー) |
| Lucifer | DALI照明(4バス、シーン) |
| Bragi | マルチルームオーディオ、音声、AIアシスト |
| Gaia | グリーンハウス、灌漑、水槽 |
| Tyr | – |
- 単一障害点なし;各ドメインが独立運用
5 | SELV‑DALI – メイン電源無しでの照明
- 安全低電圧(≤ 60 V DC)
- バッテリ駆動チェーン:48 V → 24 V DC/DC → LED
- DALIは16 V、すべてのスイッチ/センサーはSELV
- インバータが故障しても照明は点灯
6 | プロトコル & 統合(WHIP)
| プロトコル | 詳細 |
|---|---|
| CAN bus | 1 Mbit |
| Modbus TCP/RTU | 21機能コード中17、869テスト、91 % 覆蓋率 |
| DALI | MQTT, SNMP, I²C, 1‑WireModbus |
| 外部統合 | Victron VRM, MasterTherm, PVGIS, Discord, Nextcloud, Proxmox, UniFi 等 |
- すべてハンドラはPerl(Mojolicious async I/O)
7 | 本番デプロイメント
Villa‑A (プラハ) – 完全オフグリッド
- 40 kWp ソーラー、120 kWh LiFePO4、3× Multiplus‑II 10 kVA
- MasterThermヒートポンプ、毛管天井暖房/冷却
- 4バスに分散されたCANノードでDALI照明
Villa‑B (ドイツ) – 同一コンセプト、異なる設定
8 | PerlプロジェクトへのAI貢献
| プロジェクト | 成果 |
|---|---|
| PVGISクローン | 屋根カバレッジの改善 |
| Modbus/CAN CLI & introspection | |
| 熱損失 / 急起動シミュレーション | |
| FreeRTOS/libopencm3 ファームウェア(100+モジュール、テスト) | |
| Discord, Reddit, Twitter, Kraken, Ollama, Proxmox, AWS, Azure, Nextcloud などのAPIエンドポイント |
サイドプロジェクト
- MIB Parser –
(最高のMIBパーサー)SNMP::MIB::Compiler - Grpc::FFI – FFI::Platypus を介した Perl 用 gRPC
9 | CPAN 状況
| 日付 | 問題 |
|---|---|
| 2025‑09‑28 | アカウントが nologin に設定、モジュールの問い合わせに応答なし |
| 2025‑10‑01 | フォローアップ、未回答 |
| 2025‑10‑06 | LinkedIn 経由で連絡、返信無し |
10 | SNMP & MIB の入門
- SNMP:ルーター・スイッチ・UPS・プリンタ等のデバイス監視/管理。
- MIB:デバイス指標を定義するスキーマ。
- ASN.1 で書かれた数千ものベンダー MIB が存在し、逸脱が多いためパースが困難。
SNMP::MIB::Compiler
| パーサ | 言語 | 失敗数 | 合格率 |
|---|---|---|---|
| pysmi | Python | 296 | 93.8 % |
| gosmi | Go | 91 | 98.1 % |
| ours | Perl | 39 | 99.2 % |
- 4,740 MIB → 301 修正、Go より52件少ない失敗
11 | Grpc::FFI
- CPAN に機能的 gRPC ライブラリが無いため自作
- FFI::Platypus を使い C API へバインディング
- 326 テスト合格;メモリリーク・クラッシュなし
- クロス言語(Perl ↔ Java/Go)動作確認済み
- ストリーミング:ユニアリ、クライアント、サーバ、双方向
- 約85 % 本番レディ;約43 ファイル
12 | Navigator / Orchestrator
- AI が実行・文書化・反復;人間が戦略を定義。
- Navigator が無いと AI は素晴らしいが孤立した成果物を作る。
- AI が無いと Navigator に時間が取れない。
13 | pperl – ParallelPerl(PetaPerl)
概要
- インタープリター:Perl 5 互換性(≈ 5.42)、V8レベルの性能。
- Rust で実装;多くの AI エージェントが貢献。
- Linux だけ、すべてのアーキテクチャ対応。
- XS は無し;ネイティブ Rust 実装を統合。
スコープ & 状態
- 22,000+ テスト;約61–400 失敗。
- ベンチマーク:list_util 関数 – Perl 5 より最大3.9×高速化。
機能
| 機能 | 説明 |
|---|---|
| Autoparallelization | Rayon データ並列化; が を置き換え。 |
| JIT Compilation | Cranelift IR → ホットループ(内部・ネスト)でネイティブコード生成。 |
| Auto‑FFI | XS や Inline::C なしで任意の C ライブラリを呼び出せる。 |
| Pre‑Compile (.plc) | バイトコードキャッシュでほぼ即時起動。 |
| Daemonize | Emacs スタイルデーモン/クライアント;共有アレーナ付きフォーク子プロセス。 |
ベンチマーク(抜粋)
- Mandelbrot 1000×1000:
- Perl 5 → 12,514 ms
- pperl インタープリテッド → 163 ms
- JIT + Rayon → 29 ms(約 431×高速)
14 | Auto‑FFI の詳細
- レイヤー0 – Raw: 任意の
、.so
/dlopen
+ libffi。dlsym - レイヤー1 – プレベーク:libc, libuuid 等、オーバーヘッドゼロ。
- レイヤー2 – 発見:システムスキャン → 利用可能ライブラリのハッシュ。
use Peta::FFI qw(scan dlopen call); my $libs = scan(); say scalar keys %$libs; # ライブラリ数 if (exists $libs->{"libz.so.1"}) { my $z = dlopen("libz.so.1"); say "zlib: ", call($z, "zlibVersion", "()p"); }
15 | バイトコードキャッシュ (.plc)
- 一度コンパイル →
保存;次回はロード。.plc - SHA‑256 + mtime/version による検証。
- モジュール読み込みコストを約33–37 % 削減。
16 | デーモン化メカニズム
- コマンド:
(ウォームアップ)pperl --daemon script.pl - クライアント接続 → fork → 子が実行 → 応答。
- 起動 + コンパイルオーバーヘッドを排除;バイトコードキャッシュより高速。
17 | 今後の計画
- GPU 統合(OpenCL/HIP/Vulkan/CUDA)。
- 制限付きデバイス向け pperl‑mini。
- STM32 等へターゲットした pperl‑compiler。
18 | pperl を使うタイミング
適切なケース:
- JIT / 自動並列化で恩恵を受けるワークロード。
- ネイティブ Rust モジュールを利用するスクリプト。
- 高速起動(
)。--cache - セキュリティ(別コードベース → CVE 共有が少ない)。
未対応:
- 非常に大きく複雑なコードベースでエッジケースが多いもの。
長いスクリプトほどコーナーケースが増える傾向;コードを触れられない場合は Perl 5 を使用。
19 | 正確性事例研究
(OFS)と$
(ORS)の扱いにバグがあったが修正。実務的影響は小さいものの、互換性へのコミットを示す。$\
20 | 終わりに
数十年にわたり Perl で AI を行ってきました。今こそ AI に Perl を任せる時です。
入手先:
ありがとうございました。
リチャード・ジェレニク · rj@petamem.com
PetaMem s.r.o. · petamem.com
21 | psh – インタラクティブ Perl シェル
ls "-la"; # サブルーチン呼び出し cd "/tmp"; # chdir ラッパー ps "aux"; # システムコマンド # スクリプト力 for my $f (glob("*.log")) { if (-M $f > 7) { rm $f; say "cleaned $f"; } }
オブジェクトパイプ:データ構造を渡す、テキストではない。
ps() | grep { $_->{mem} > 100_000 } | sort { $b->{cpu} <=> $a->{cpu} };
PowerShell の哲学 + Perl のテキスト力 + pperl の JIT スピード。