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

KONDO Uchio

June 13, 2021
Tweet

More Decks by KONDO Uchio

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. Puruaの今後
    * そもそもLuaと言える状態じゃないので残った機能を頑張って実装。
    luatest? というやつが走るようにしたい。
    * クロージャの実装が辛そうなので怯えている
    * そもそも、VMを作りたい。
    * LuaのVMはレジスタ型だと聞いて、難しそう... ってなっている。
    * crafting interpreterなどを読んでまずはスタック型から...

    View Slide

  11. 作りたいもの
    tl;dr
    C言語以外で書けるeBPFプログラムのコンパイラを作りたい。

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. BPF を「使う」には
    * BCCのような軽量言語向けのSDKを使う場合
    * Python, Lua, Ruby(拙作)などある
    * その場で動的にCコードを生成してコンパイルする感じ
    * libbpf + CO-RE を使う
    * C/C++, Go, Rust など、BPFプログラムをバイナリに組み込む
    * カーネルバージョンに関わらずある程度動かせるように

    View Slide

  16. BPF プログラムを「作る」には
    * C コンパイラの bpf ターゲットを使う。
    * Clang
    $ clang -O1 -g -c -target bpf \
    foo.bpf.c -o foo.bpf.o
    * GCC も対応するようになったらしい

    View Slide

  17. BPFプログラムを
    動かす例
    左のようなCコードを書く。
    あるcgroupに所属するプロセスの、デバ
    イスタイプごとのアクセス可否をフィルタ
    リングするBPF
    -target bpf でコンパイルすると
    dev_cgroup.o ができる

    View Slide

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

    View Slide

  19. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. View Slide