ディスカッション (9件)
BPF(Berkeley Packet Filter)プログラムをC言語で書くのに疲れていませんか?このプロジェクトは、低レイヤーなBPF開発をGo言語で完結させるための画期的なアプローチを提供します。C言語特有の複雑なメモリ管理やビルド設定から解放され、より安全かつ生産性の高い開発体験を実現しましょう。Goの簡潔さを活かして、Linuxカーネルレベルのパワフルなツールをサクサク構築できます。
すみません、なぜネイティブ言語で書かない理由があるんですか?
自分は主にGoの開発者で、Goという言語が大好きだし、大抵のユースケースではGoを推すつもりだけど、正直言ってBPFに関してはRustが輝く場所だと思うな。
BPFって何?
eBPFの世界では、カーネル内のC関数を呼び出すことになるし、基本的には構造体やnull終端文字列のようなCのデータ型を使うことになる。ループは使えないし(コンパイラによって展開される)、可変長引数関数も使えない。それに、Go特有の便利な機能、例えばgoroutineやselect、contextといったものも全く使えないんだ。
そもそも、なぜこれを使いたいのかよく分からないな。eBPFを書くなら、結局Cのカーネルソースの読み方を知っておく必要があるんだから。
なぜ直接BPFを生成せずにトランスパイルするのか
Goコンパイラのgcには、LLVMベースのBPFバックエンドがないんだ。それを追加するのは数年かかるコンパイラプロジェクトになる。rustcはLLVM上で構築されているからAyaは機能する。だからgobeeはCを出力してClangのBPFバックエンドを再利用しているわけで、それによって成熟したコード生成やBTF、CO-REリロケーションの恩恵をタダで受けられるんだよ。
TinyGo (https://tinygo.org/) の方が適しているんじゃないかと思ったんだがどうだろう:
TinyGoは、LLVMベースの新しいコンパイラを作成することで、Goプログラミング言語を組み込みシステムやモダンなWebにもたらす。
TinyGoはあまり触ったことがないから、他の人の経験談を聞いてみたいな。
覚えておいてほしいのは、GoやRust、eBPFのメモリ安全性に関するメリットの多くは、カーネル内のeBPFには適用されないということ!カーネルのeBPFは、ベリファイアを通じて配列やループの境界、メモリへのアクセス、プログラムの正確性を強制的に検証するからね。ほとんどのユースケースでは、依然としてCでeBPFを書くのが一番だと思うよ!
READMEを一目見ただけで、作りが雑なのが丸わかりだな。
クリーンな実装だね。自分がいつも確認するのは、何かがうまくいかなくなった時にどうなるかということ。優れたエラーハンドリングこそが、週末の趣味プロジェクトと実際に人が使うツールを分ける境界線だよ。