世界を動かす技術を、日本語で。

Show HN: Bolt – Cで書かれた超高速の静的型付けスクリプト言語

概要

  • Bolt はリアルタイムアプリケーション向けの 軽量・高速・型安全 な埋め込み言語
  • 最小限の依存関係小規模な実装 でビルドサイズへの影響が少ない
  • 高速なコンパイル豊富な型システム による安全性確保
  • 組み込みやすさ を重視した設計
  • MITライセンス で公開、貢献やバグ報告も歓迎

Boltとは

  • Bolt はリアルタイムアプリケーションに最適化された 超高速・軽量・型安全 なスクリプト言語
  • 組み込み用途 を最優先に設計、わずかなコードで他言語と連携可能
  • 豊富な型システム で実行前にエラーを検出、ネイティブコードからの拡張も容易
  • 最小限の依存関係 (C標準ライブラリとUnix系ではlibmのみ)で動作
  • 組み込み例やガイド も充実、CLIツールも同梱

主な特徴

  • 圧倒的な実行速度、同クラス他言語を凌駕
  • コンパクトな実装、ビルドサイズへの影響極小
  • 爆速コンパイル、1スレッドで50,000行/秒以上
  • 組み込みやすさ、数行で導入可能
  • 堅牢な型システム、エラーを事前検出
  • Embed-first設計、他言語との連携・パフォーマンス重視

依存関係と構成

  • C標準ライブラリlibm (Unix系)のみ
  • ファイル/システムIO 等の標準ライブラリモジュールは無効化可能
  • メモリ管理 はmalloc/realloc/freeをデフォルト使用(カスタマイズ可能)
  • 正規表現解析 に自作ライブラリ picomatch を内蔵

組み込み・ビルド方法

  • x64アーキテクチャ のみサポート、32bitは非対応、arm/riscvは未検証
  • CMake で静的ライブラリとCLIツールを生成
  • 組み込み例 はbolt-cliや公式ガイド参照
  • 詳細設定 はbt_config.hを参照

コンパイラ対応状況

| コンパイラ | ステータス | 備考 | |:---|:---|:---| | MSVC | ✅ | 問題なし | | GCC | ✅🟨 | 機能全対応、一部警告あり | | Clang | ✅🟨 | 機能全対応、一部警告あり |

  • 安定版ではない ため、バグやクラッシュ報告を歓迎

言語例

import print, error, Error from core
import abs, epsilon from math

fn safe_divide(a: number, b: number) {
  if abs(b) < epsilon {
    return error("Cannot divide by zero!")
  }
  return a / b
}

match let result = safe_divide(10, 5) {
  is Error { print("Failed to divide:", result.what) }
  is number { print("The answer is", result) }
}

コントリビューション方針

  • バグ修正 は合理的範囲で歓迎、動作変更は不可
  • テスト追加リグレッション防止 を推奨
  • 最適化提案 も軽微なら受け入れ、ベンチマーク必須
  • 新機能追加 は慎重審査、事前提案・計画提出が必要
  • パフォーマンス・実装コスト・ユースケース の明確化を要求

ライセンス

  • MITライセンス 採用、詳細はLICENSE参照

リンク一覧

  • Bolt programming guide
  • Bolt standard library reference
  • Bolt embedding and API reference
  • Bolt performance
  • Notable Bolt users

開発者からのメッセージ

  • Bolt は長年インタプリタを開発してきた作者が理想を形にした 初の公開リリース(0.1.0)
  • 安全性・型付け 重視の流れを受け、Boltは言語レベルで型システムを採用
  • 安全性・パフォーマンス向上 を両立
  • 今後、組み込み例やトイアプリを公開予定
  • 興味があればexamplesやプログラミングガイドを参照

Hackerたちの意見

かっこいいけど、「ボルト」って名前はもうやめてほしいな。

うん、これが俺が知ってるBoltって名前のプログラミング言語、3つ目だわ。

参考までに、「埋め込みシーン」は「埋め込みインタプリタ」よりも「埋め込みシステム」と解釈される可能性が高いよ。特に、例に挙げた言語(マイクロパイソン、ルア、さらにはタイプスクリプト)全てがそのターゲットで使われようとしたことを考えるとね。

いい指摘だね、ありがとう。ちょっと修正してわかりやすくしたよ。

そうだね。特に「リアルタイム」って言葉があったから、埋め込み用だと読み間違えちゃった。その後、ARMやRISC-Vのサポートがないのを見て、すごく混乱した。

関数に戻り値の型がない場合、コンパイル時に全てが満たされなきゃいけないってこと?メモリ管理や所有権はどうなるの?これだと、各関数呼び出しのたびに値をコピーしなきゃいけないってことになるよね?参照やポインタはどう使うの?サポートされてるの?Rustに似たマッチャーは好きだけど、エラーハンドリングが暗黙的でも明示的でもないから、大きなコードベースではデバッグが大変そうだな。Kokaについて知ってる?あの構文の選択はあまり好きじゃないけど、効果ベースのエラータイプシステムが君のデザイン選択と上手く統合できるかもと思ってる。特にマッチャーを消費者として使う場合ね。[1] https://koka-lang.github.io/koka/doc/index.html

あ、OPじゃないけど、Koka大好き!また触ってみようかな、思い出させてくれてありがとう!

「関数に戻り値のシグネチャがない場合、コンパイルステップで全てを満たす必要があるってこと?」関数には戻り値のシグネチャがあるよ。著者は短い例のREADMEコードで戻り値の型推論の機能を見せたかったみたいだね、明示的なケースじゃなくて。https://github.com/Beariish/bolt/blob/main/doc/Bolt%20Progra...

コンセプトが大好きだよ!Luaみたいな軽量言語が静的型付けをもっとサポートしてくれたらいいなってずっと思ってた。パフォーマンスの向上も大好きだし。インタプリタにテールコールデザインを使うことを考えたことある?これがコンパイラから良いコードを引き出す最良の方法だと思ってるよ:https://blog.reverberate.org/2021/04/21/musttail-efficient-i... 残念ながらMSVCには移植できないけど。この技術がLuaJITのインタプリタの例で、Mike Pallの手書きアセンブリに匹敵することができたって記事もあるよ。Mikeは後にこの記事をインタプリタの最適化についての新しい見解としてリンクしてくれた:https://github.com/LuaJIT/LuaJIT/issues/716#issuecomment-854... Python 3.14もこのスタイルのインタプリタディスパッチをサポートして、そこから少しパフォーマンスが向上したよ:https://blog.reverberate.org/2025/02/10/tail-call-updates.ht...

テールコールに特化してはいなかったけど、いくつかの異なるディスパッチ方法を試してから、今のBoltの方法に落ち着いたよ。選んだアプローチは、テストの結果、計算されたgotoソリューションと競争できるし、MSVCでもコンパイルできるから選んだんだ。でも、他の方法を試すことには全然オープンだよ。

ルアのことは知ってるけど、テラランは知ってる?

Robloxが管理してるLuaの徐々に型付けされた方言、Luauに興味があるかもね。ゲーム「Alan Wake 2」でもレベルスクリプティングに使われてたよ。

これの99%は好きなんだけど、嫌なところが例の最初の行にあるんだよね:> import abs, epsilon from math インポートしたシンボルを最初に持ってくるのは間違ってると思う。同じシンボルが2つの異なるライブラリから来て、意味が違うこともあるからね。だからライブラリ名は結構重要で、最後に持ってくると(長いインポートシンボルのリストの後に埋もれちゃうし)なんか変な感じがする。自然言語っぽくなるのはわかるけど、パッケージやモジュール名を最初に持ってくる理由があるんだよね。例えば、Javaなら import packageName.member;、Pythonなら from package import symbol;、Perlなら use Module 'symbol'; みたいにね。タイプスクリプトは例外だけど、import { pi as π } from "./maths.js";って感じ。

TypeScriptみたいにBoltでもアプローチするのは、妥当な妥協だと思う?Boltはすでにimport math as not_mathみたいなフルモジュールのリネームをサポートしてるから、import abs as absolute、sqrt as square_root from mathみたいなのも簡単に実現できそうだよね。

Elmのやり方がすごく好きなんだよね。「ワイド」(パッケージ)から「ナロー」(シンボル)に。これ、言語サーバーの実装にも役立つと思う。例はここを見てね:https://guide.elm-lang.org/webapps/modules ("Using Modules"のところまでスクロールして)

あと、オートコンプリートね。最近はほとんど手動でインポートを書くこともないけど。

プログラミングガイドによると、インポートのエイリアスもサポートしてるみたい。「衝突や便利さのために、モジュールにエイリアスを付けることもできるよ。」

コンパイラは逆に処理できないの?

このクラスでの言語が優れているってのは、かなり重い話だね。wasmインタープリタやJava、.NETのインタープリタ、ML、Lispなどとの比較が欠けてるし。レジスタバイトコードにコンパイルするのは戦略としては正当だけど、速いとは言えないって著者も分かってるはずだから、今の段階でその言語を速いってブランド付けするのはどうかと思う。速い言語かもしれないけど、表面的に見ただけじゃ分からないし、型システムやエイリアス解析、並行性モデルがどう絡むかによるよね。今のところ速い実装ではないと思うよ。

「これにより、関数はインポートを動的にキャプチャする必要がなく、クロージャの呼び出しを避け、インポート配列内でそれらを線形にアドレス指定できるようになります。環境ルックアップを行う代わりに。」 それは怪しいね。関数識別子をバイトコードに直接焼き付けて、テーブルでのルックアップを行っていない可能性がある。各命令の最後のスイッチも多分間違ってる。オペレーションごとに関数を見て、強制的なテールコールを使って、機械の関数呼び出しの引数レジスタにインタープリタの状態を持たせるべきだよ。wasmインタープリタからの良いメモがいくつかあるし、luajitからの背景情報も探せば出てくるよ。

このクラスは「埋め込み可能なインタープリタスクリプト言語」ってことなんだけど、単なるインタープリタとはちょっと違うんだ。埋め込みインタープリタは、C/C++プログラム(多くはゲーム)にスクリプト言語として埋め込むために設計されてる。依存関係はできるだけ少なく、軽量で、コンテキスト間の相互運用を簡単にすることに焦点を当ててる。比較はこの用途における主要な言語を多くカバーしてるけど、Monoのインタープリタモードも含めるべきだったね。誰も使ってないかもしれないけど、MonoがAoTを得てから。

説明を見てかなりワクワクしたんだけど、Boltがダブル浮動小数点数に大きく依存してることに気づいた。これだと、浮動小数点数がほとんどサポートされてない組み込みシステムでは使えないから、ちょっとがっかりだよ...「embedded」を誤解してたなって思った。

同じく!すごくクールだけど、理想的な使い方はESP32みたいな制限されたISAアーキテクチャ上でやりたいな。

わお、普通の構文と型チェックがある速いスクリプト言語だね...これが広まって、Luaの代替として有効になってほしいな。

これ、すごく見覚えがあって考えちゃったんだけど、今発明されてる言語を誰がまとめてるんだろう?HNで毎年二十数個は見かけるよ。OPを批判してるわけじゃないけど、こんなにたくさんの言語を見てると、デジャヴなのか、ヴジャデなのか分からなくなっちゃう。

いくつか例を試してみたけど、「高性能でリアルタイム最適化された超高速」な言語は、luajitよりも約10倍遅くて、lua 5.4よりも約3倍遅いみたい。