giantneco’s blog

技術メモ

ジェネリクス勉強会

ジェネリクス勉強会(https://connpass.com/event/56773/)に参加してきた。 会のテーマはジェネリクスで、その話を含めればおおよそ何でもよい感じの話。 テーマがテーマなので Java に言及することが多かった。一方で関数型言語の話は控えめ (最後のセッションが Scala だったが、その前に時間切れで途中で帰ってしまった…これはかなり残念)

ジェネリクス ディスパッチ 表裏 by κeen さん

Java と Rust、ときどき Scala で見るジェネリクス実装方法の違いの話。 実装面まで踏み込んで調べたことはないので興味深かった。Rust も楽しいそう。

また存在型についての話もあった。 存在型については一度調べたことがあるはずなのに、全然覚えていなかった。TaPL を読もう。 ただ存在型があった方がいい場面というのがいまいちイメージできず理解できてない。

ジェネリクスの概論とか by なぎせさん

ジェネリックスとはなんぞやという話。 Java8 で型推論が強化されたらしいが、最近も最近の Java を使えてないのでどうも恩恵を受けれてない。 あとこの発表を聞いて、リスコフ置換原則は若干間違えて覚えていたことがわかった。あぶない。

拡張可能レコードの恩恵 by fumieval さん

Haskell.Generic に関連していると思われる話。正直ついていけてなかった。

Generics on Xamarin products by atsushieno さん

https://speakerdeck.com/atsushieno/generics-on-xamarin-products

Xamarin でのジェネリクスの話。Xamarin、というか Mono は C で書かれていて、 その上でジェネリクスを実装するのはかなり大変だったらしい。 プリミティブがジェネリクスの引数に来てしまうとアドレスがずれてしまうとのこと。 解決策としては昔は多めに引数の領域をとるようにしていたが、現在はスタック上に 引数を置いて、後で CPU 側のトランポリンでメモリアドレスを構成しなおしている。

Xamarin についてはくわしくないが、低レイヤの話もあったので、かえって自分にはわかりやすかった。

Fluent Design のすすめ by haochenxie さん

Java で Fluent Design を構築するために、ジェネリクスをうまく使いましょうという話。 特に入れ子構造になる Fluent Design を実現するにはジェネリクスを使う必要があって、 かつその使い方がかなり工夫されていた。

どうせ Java でしょ?と思っていたが思いのほか楽しかった。 とくに Javaジェネリクスの文脈で継続が出てくるとはまったく思っていなかった。

あと、Java の型システムは実はチューリング完全で、また安全でもないという話は結構驚いた

システムプログラミング会

システムプログラミング会に参加してきました

7/2のシステムプログラミング会に参加してきました。

募集期間が非常に短かったのですが、たまたま TL を覗いた時に見つけたのでなんとか参加申込することができてラッキーでした。

時間切れのため途中で帰ってしまったのですが、懇親会を含めると結構長い時間やっていたようです。

以下メモ。

New LLD Linker for ELF by Rui Ueyama (@rui314)

  • windows 上でもリンクできるようにしたい
    • もともとのモチベーション
  • コンパイラとかデバッガとか移植しないといけない
    • 作ってみたら意外とうまくいって、オープンソースなのでUNIXに移植しようということになった
  • 現在 GNU でないといけないのはリンカぐらいしかない
    • BSDGNU LD から移行したい
    • 現時点で BUILD WORLD とかは動く
  • MIPSに対応
  • icf オプション
    • identify content folding
      • ふつうは名前でまとめるが、このオプションをつけるとコンテンツをま とめてフォールディングする
      • 基本的にはグループ分けして内容が違ったら分割、リロケーションがさしている先が同じだったらまとめる
      • 平衡に達したらマージ可能なグループになる
  • LLD の設計としては、余計なことをしないことを主眼においている
  • GNU LD のシンボル解決
    • 引数の順序によってリンクのされ方が異なるという問題があった
    • LLDではかなり変えていて、ファイル渡す順序によらずシンボルを解決している
  • ファイルサイズはかなり小さくできている。
    • C++ で10,000行ぐらい。
  • リンク時の名前解決
    • ハッシュ使用
      • 少なくとも1回はハッシュを使う 名前解決のため ハッシュに名前を入れるのも結構時間がかかる
      • C++だと関数が 50 バイトくらいなっていたり 名前の変更がポインタの変更になっている
    • 別のファイルを読んだときに、すでにハッシュキーがあったらその先を書き換えて内容を変えたことにする
    • wrapの利用
      • ld で wrap オプションを渡すと、malloc__wrap_mallock にリンカされる。
        • もとのmalloc__real_malloc で参照可能になる
  • LLVM
    • Link Time Optimization (LTO)
      • グローバルなビューをリンカはもっている。
      • LLVMバイトコードをもっているので、リンカが名前解決をするときに そのバイトコードを使ってネイティブコードに落とす (よくわからん)
  • 今後の目標。 FreeBSDで普通に使う。カーネルのビルド。
  • ハッシュ関数
    • 早くするために何かしているか?
      • 普通のハッシュ関数を使っている
      • はやくしたらというアイディアはある
      • キーはヌル終端なものなので、strlen で結構時間を食っている
        • 長さを渡してあげれば?あるいは sha1 でできないかなど

          感想

          GNU LD についても知っているようで知らなかった話が結構聞けてよかった。

現状の GNU LD のことを考えると、案外あっさり置き換えられたりするのかも。

Kati @shinh

LLVMC++コンパイラフロントエンドつくった @Lind_pp

感想

LLVM 使うとやっぱりこういう風になりそうな気はする。

質問タイムであったように最適化とかをやりたいというような用途には向いていないっぽい。

なんかトレースする話 @nalsh

Programming TCP for responsiveness by Kazuho Oku (@kazuho)

  • http://www.slideshare.net/kazuho/programming-tcp-for-responsiveness
  • H2O HTTPサーバ
  • レスポンスのために、データが CWND を超えてTCPパケットを送信できるようになったらすぐ送信できるようにしたい
  • データは TCP send buffer と BIO buffer にためられる
  • BIO buffer は TCP send buffer からあふれた分
    • poll して SOCKET_IS_READY になった段階で書、残り 6 bit をき込むことで BIOとしてめずに済む
    • それでもまだ poll が SOCKET_IS_READY になる閾値は CWND より大きい
    • socket オプションの TCP_NOTSENT_LOWAT を 1 に設定
      • 0 だといろいろ問題が起きてしまう
    • これで CWND + 1 になったときにデータを送れるようになった
  • ただし send buffer が小さくなったことでの弊害もあり

感想

実をいうと、最初聞いたときはあんまりよくわからなかった。

あと HTTP2 もよくわかっていない。つらい。

Fron IA-32 to AVX-512

感想

ここら辺はトイレに行っていて半分くらい聞けてなかった。

ASTをXMLで表現する、というのは仕事でやったことがあるが、あんまりやらないほうがいいのかも。

L1キャッシュ @kumagi

  • Radix Sort
  • SoftWare Write Combining
    • CPU の書き込み先メモリアドレスを絞り、L1キャッシュに乗せられるよう にする
    • Intel のマニュアルに書いてある

      感想

      この話は面白かったが、あまりついていけてない。資料が公開されいたら読みたかったがなさそう。 とりあえず Intel のマニュアルと、Radix ソートについては調べておきたい

      StackExchangeでみたシステムプログラミング案件 by @hogegashi

  • https://docs.google.com/presentation/d/1Y62OO574mcnaKItgAFIO49jCkZ4lOnUY0sMyUgAwQMs/edit#slide=id.p
  • StackExchange は面白い
  • 実行中にシステムコールを全く行わないUNIXコマンドはあるか?
  • システムコールなしでシグナルをどれだけ呼び出せるか?

    感想

    ここも案外知っているつもりで知らないことが多かった。 普通のコマンドではかならずexit()が呼ばれる、というのも、言われてみればそうだがあんまり意識したことはなかったし、結構盲点を突かれた感じ。

俺々OS用スケジューラの設計と実装 by @yitabashi

  • オレオレOSスケジューラをつくったという話

REMarks by @mkasahara

  • 実行したコマンドを自動的に記録して、再度コマンドを実行する Makefile? を生成する
  • LD_PRELOAD を使用して open を入れ替えて、開いたファイルを記録
  • LD_PRELOAD でライブラリを読み込んだときに、ライブラリが procfs を open をしていたので、/proc 下を無視する必要があった

    Out-of-thin-air by @yamasa

  • メモリモデル作成の歴史
    • Double-checked loading の記事が発端
    • data race で undefined な挙動になるなら、そもそもそれを考えずに最適化してもいい(C,C++)の場合

1章から5章まで

1 章

scheme についての前知識
Lisp の起源と scheme の記法(S式 と 前置式),それと schemegauche
について.

S式のSは'S'ymbolのS

2 章

Gauche の特徴について,
スクリプト言語でマルチバイト文字の処理に対応.

3 章

Gauche が他の言語から受けた影響

Perl から
- 正規表現リテラル
- 文字列補完
- モジュールシステム

Common Lispから
- キーワード引数
- オブジェクトシステム CLOS
- コンディション(例外処理機構)

C から
- C の関数を呼び出すための機構が用意されている

4 章

gauche の開発環境
REPL + Emacs おすすめらしい.
vimmer はどうするんだろう?

5 章

プログラムの書式について.
モジュールについては後回しになっていて,この章ではスクリプトの書式に
ついてかかれている.
シェルトランポリン
エンコーディング
各種コメント
コメントの慣例

特徴的なコメントが S式コメント.#;に続くS式をコメントアウトしてくれ
る.
他の言語でもあったら便利かもしれないが,返って読みにくくなるかもしれ
ない.