Upgrade to Pro — share decks privately, control downloads, hide ads and more …

@udzura at prog-lang-sys-ja

@udzura at prog-lang-sys-ja

自己紹介@プログラミング言語処理系が好きな人の集まり
Google slide: https://docs.google.com/presentation/d/1Dw2ULrcGf2ajrBM6u8VzoAXJLYJh3GDFj3gzSkwD_YA/edit?usp=sharing

2cf373725ded741824c50fd571eda6e1?s=128

KONDO Uchio

June 13, 2021
Tweet

Transcript

  1. @udzura 作ったり作ろうとしているものの話 @プログラミング言語処理系が好きな人の集まり 定例ミートアップ #2

  2. Uchio Kondo @udzura Rubyist。Rustに爆ハマり中。 低レイヤプログラミングワナビです。 好きなLinuxシステムコール: unshare(2), open_by_handle_at(2)

  3. 作ってるもの Purua Pure Rust で実装した Lua https://github.com/udzura/purua

  4. Purua について PUre-RUst-luA gopher-lua という実装を大きく参考して いる。ただ、今のところVMを実装しておら ず(tree-walkで実行)Opcodeもない そもそも何も分からないので全て手探り

  5. 動くもの フィボナッチ数の計算 (関数定義、呼び出し、if文だけでこんな に苦しいだなんて)

  6. めちゃくちゃ遅い。まあ最適化とかは遠い将来で... Purua (185c5e6e72101342fba08c98307f888f97432269) Ruby (ruby 2.7.1p83 [x86_64-darwin19])

  7. 動くもの #2 イテレータが動くようになった (えらい) Luaのイテレータの仕様を何も知らな かったので大変だった。

  8. 動くもの #3 RustからLuaの関数も定義可能になって いる(と言うより先にそっちを書いた)。 Result 使えます! 嬉しくないですか。

  9. 細かい話はブログに書いていた https://udzura.hatenablog.jp/entry/2021/05/08/150858

  10. Puruaの今後 * そもそもLuaと言える状態じゃないので残った機能を頑張って実装。 luatest? というやつが走るようにしたい。 * クロージャの実装が辛そうなので怯えている * そもそも、VMを作りたい。 *

    LuaのVMはレジスタ型だと聞いて、難しそう... ってなっている。 * crafting interpreterなどを読んでまずはスタック型から...
  11. 作りたいもの tl;dr C言語以外で書けるeBPFプログラムのコンパイラを作りたい。

  12. (e)BPF...って? カーネルで高速にフィルタリングするやつ (雑)。cとeがある。 元々パケットフィルタ用途だが、カーネル の情報なんでもフィルタ集計できるよう に。 カーネル内で動くのでカーネルの機能が 使える。

  13. 言語・環境としての eBPF * 64bit固定長の命令 * 10個のレジスタがある * R10はフレームポインタ * 512バイトのスタック

  14. eBPF の仕様の話は 僕の説明よりmmisonoさんの記事の方がいいと思う 「BPFのアーキテクチャ、命令セット、cBPFとeBPFの違い」 https://www.atmarkit.co.jp/ait/articles/1812/10/news016.html

  15. BPF を「使う」には * BCCのような軽量言語向けのSDKを使う場合 * Python, Lua, Ruby(拙作)などある * その場で動的にCコードを生成してコンパイルする感じ

    * libbpf + CO-RE を使う * C/C++, Go, Rust など、BPFプログラムをバイナリに組み込む * カーネルバージョンに関わらずある程度動かせるように
  16. BPF プログラムを「作る」には * C コンパイラの bpf ターゲットを使う。 * Clang $

    clang -O1 -g -c -target bpf \ foo.bpf.c -o foo.bpf.o * GCC も対応するようになったらしい
  17. BPFプログラムを 動かす例 左のようなCコードを書く。 あるcgroupに所属するプロセスの、デバ イスタイプごとのアクセス可否をフィルタ リングするBPF -target bpf でコンパイルすると dev_cgroup.o

    ができる
  18. コンパイルされた BPFプログラム objdump などで 命令を確認できる 対応する命令を bpf-docsや linux/bpf_common.h, linux/bpf.h などを眺めて確認する

  19. None
  20. ロードした結果 cgroupに所属しているときは urandomにアクセスできない cgroupから外れるとできる

  21. BPFの現況 カーネル側のBPFプログラムは、実質的 にC言語で書く以外選択肢がない(*) (そのプログラムをロードして情報を取得 する外側については言語を問わない。 libbpfのようなライブラリもある) (*) 選択肢の詳細 https://www.atmarkit.co.jp/ait/articles/1812/26/news010.htm l

  22. C以外で書けるようにしたい

  23. コンパイラを書く...ってコト❓

  24. None