2026年7月24日(金)掲載 2,900本日 0
HN5127

【脱C言語】Go言語でBPFプログラムを書こう!手軽で爆速なネットワーク開発のすすめ

Show HN: Write your BPF programs in Go, not C

boratanrikulu2か月前

議論

9
0boratanrikuluスレ主512か月前

BPF(Berkeley Packet Filter)プログラムをC言語で書くのに疲れていませんか?このプロジェクトは、低レイヤーなBPF開発をGo言語で完結させるための画期的なアプローチを提供します。C言語特有の複雑なメモリ管理やビルド設定から解放され、より安全かつ生産性の高い開発体験を実現しましょう。Goの簡潔さを活かして、Linuxカーネルレベルのパワフルなツールをサクサク構築できます。

1shirleyquirk約2か月前

すみません、なぜネイティブ言語で書かない理由があるんですか?

2sparrc約2か月前

自分は主にGoの開発者で、Goという言語が大好きだし、大抵のユースケースではGoを推すつもりだけど、正直言ってBPFに関してはRustが輝く場所だと思うな。

3a1o約2か月前

BPFって何?

4badc0ffee約2か月前

eBPFの世界では、カーネル内のC関数を呼び出すことになるし、基本的には構造体やnull終端文字列のようなCのデータ型を使うことになる。ループは使えないし(コンパイラによって展開される)、可変長引数関数も使えない。それに、Go特有の便利な機能、例えばgoroutineやselect、contextといったものも全く使えないんだ。

そもそも、なぜこれを使いたいのかよく分からないな。eBPFを書くなら、結局Cのカーネルソースの読み方を知っておく必要があるんだから。

5hnlmorg約2か月前

なぜ直接BPFを生成せずにトランスパイルするのか

Goコンパイラのgcには、LLVMベースのBPFバックエンドがないんだ。それを追加するのは数年かかるコンパイラプロジェクトになる。rustcはLLVM上で構築されているからAyaは機能する。だからgobeeはCを出力してClangのBPFバックエンドを再利用しているわけで、それによって成熟したコード生成やBTF、CO-REリロケーションの恩恵をタダで受けられるんだよ。

TinyGo (https://tinygo.org/) の方が適しているんじゃないかと思ったんだがどうだろう:

TinyGoは、LLVMベースの新しいコンパイラを作成することで、Goプログラミング言語を組み込みシステムやモダンなWebにもたらす。

TinyGoはあまり触ったことがないから、他の人の経験談を聞いてみたいな。

6razighter777約2か月前

覚えておいてほしいのは、GoやRust、eBPFのメモリ安全性に関するメリットの多くは、カーネル内のeBPFには適用されないということ!カーネルのeBPFは、ベリファイアを通じて配列やループの境界、メモリへのアクセス、プログラムの正確性を強制的に検証するからね。ほとんどのユースケースでは、依然としてCでeBPFを書くのが一番だと思うよ!

7i2km約2か月前

READMEを一目見ただけで、作りが雑なのが丸わかりだな。

8hbwang2076約2か月前

クリーンな実装だね。自分がいつも確認するのは、何かがうまくいかなくなった時にどうなるかということ。優れたエラーハンドリングこそが、週末の趣味プロジェクトと実際に人が使うツールを分ける境界線だよ。