mcommit's message

大阪でソフトウェア開発の仕事をしている simotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

SP会に参加させて頂きました

7月2日に東京で開催されたシステムプログラミング会(SP会)に参加させて頂きました。

畏れ多くも参加させて頂きました。

■目次

かなりヤバい人たちの集まりだとは理解しておりましたが、参加者の発表内容や質問内容などのレベルが高すぎて、面白いと同時に、正直ついていけない内容の話もあったのでなんだか申し訳ない気持ちにもなりました。

バイナリやアセンブラに関する話はある程度理解できたのですが、LinuxAPIカーネルの挙動に関する話やTCPのパケットの話、GPUに関する話などは前提知識が無さ過ぎてとても理解しきれず、参加者の皆様のレベルの高さに本当に驚かされるばかりでした。レベルの高さと同時にコンピュータに関するいろいろな基礎知識を体に叩き込まれているという印象が強かったです。

参加動機

そもそもなぜ参加したいと思ったかというと、ちょっと前からコンパイラを作る勉強をしていて、@rui314さんが書いた、Cコンパイラを作る話を読み感銘を受けました。

一体どんな方なんだろうと気になっていました。(実際に作られた8ccのコードも読ませて頂いてました)
※なんというか、そういうミーハーな気持ちと押しかけ的に参加してすいません_(m_m)_。

コンパイラを作ると言っても、(少なくとも自分にとっては)そんなに簡単ではなくて、どう実装していいのかイメージがつかめない部分が多く、flexやbisonで遊んでみたり、ネットの記事や書籍を読んでみて、公開されているコンパイラソースコードを読んで見るという作業をやっていました。ソースコードを読む場合、ステップ数の大きなものだと途中で読む気を無くしてしまうため、8ccは自分にとっては(githubで公開されており、ソースの成長の過程も見えるので)学習教材として拝見させて頂いてました。

コンパイラを作ったことがある人、あるいは作ろうとしている人は自分の身近にはいなくて、実装に関して話を聞いてみたくても聞ける相手はなかなかいません。なのでそういう人に実際に合えるというのは自分にとって激レアなことで、twitterでこの集まりを知り、参加してみたいと思いました。

敷居の高さ

そもそも参加の目安として、

  1. Lisp以上に複雑な言語処理系を作ったことがある」
  2. 「オブジェクトファイルを読むプログラムを書いたことがある」
  3. 「select系のものを使ってネットワークサーバを書いたことがある」
  4. SIMD命令を使った最適化をしたことがある」

という参加基準があったのですが、

2つ目と3つ目ならなんとかまぁ満たしているから参加しても許されるだろうと自分に言い聞かせて参加申し込みをしました。(いや、でも怒られるかなと内心びくびくでしたが)

当日の発表や懇親会の場で実際に参加者の方々の話を聞いていると、コンパイラなんか朝飯前に作ったよみたいなノリで皆さんが会話されていて、しまいには、

「自分がアホなだけで、コンパイラを作るのは実はそんなに難易度の高いことじゃないんじゃないか・・・」

と思えてきました。
※うん、自分がアホなだけだなきっと・・・

内容

システムプログラミング会は@rui314さんのLLDについての基調講演に始まりました。
LLDについては、開発の背景や内部の実装に関する話などをされていて面白かったです。

個人的にはクロスコンパイラとして利用されるGCCリンカスクリプトの機能はどうなるんだろうと気になっていたので質問してみましたが、ある程度はサポートするけどリンカスクリプトは多機能で面倒だしあまり対応したくないという感じの回答を頂きました。

確かに対応するとなると、コマンドやら何やらがいろいろ使える「スクリプト」なのでパーサとか書かないといけないし面倒そうです。

他の方の発表も濃い発表ばかりで、私にはアセンブラやL1キャッシュを使う話などは面白かったです。
発表を聞いていると、コンパイラ作られている方も結構いらっしゃいました。

感想

あらかじめ分かっていたこととは言え、参加者の皆さんのレベルが・・・
Rubyのコミッタの方も多かったように思います。(Rubyist Magazineでお目にかかる方々・・・)

(参加要件からして当然ですが)雑談とか含めてGPUを扱う話が多かったです。GPUで遊ぶようなコードは書いたことが無かったので、その辺の話はあまり理解できませんでした。
懇親会の席で教えて頂いたのですがRaspberry piに載っているGPU(VideoCore4)に関するドキュメントが公開されているらしいので、ラズパイは手元にあるし勉強してみようと思います。

皆さんの発表を聞いていて思ったことは、オープンになっている仕様や論文、ドキュメントを臆せずしっかり読まれているという印象を持ちました。
ドキュメント類をきちんと読んで理解するという作業は、自分の場合面倒くさがって手を抜いてしまうので、そういったところは自分も見習わねばと感じました。


あと、よかったなと思ったのは、極めてレベルが高い人達が多いにも関わらず偉そうな感じの人がいなかったのでホッとしました。
こういうコミュニティというかオープンな場にはあまりそういう人はいないのかもしれません。
そういえば、関西の勉強会などでも偉そうだなと感じる人には今まで会ったことがないように思います。

感謝

この会をオープンに開催して頂けたこととや会場をご提供頂いた方々にこころから感謝したいと思います。
参加者の皆様からも、懇親会の場でいろいろと貴重なお話しを伺うことができ、勉強になりました。有難うございます!



家庭や育児もあるのでここ2年~3年ほどはこういう勉強会的な場から離れていたのですが、この会では強烈な刺激を頂けたのでやっぱり東京まで行ってよかったなと思いました。なにより、レベルの高いエンジニアの方々と接することで勉強のモチベーションが高まります。(いや、むしろレベルが高すぎて自分のような3流プログラマがプログラミングをやっていていいんだろうかと返って落ち込んでしまうという面もありますが・・・)

余談

1.printfの挙動について

SP会の中で(というか一番最後に)プロトタイプ宣言が無い時の挙動についてアセンブラのコードを交えて発表させて頂いたのですが、懇親会の場で主催者の@shinhさんからprintfの挙動について面白い話を教えて頂きました。

#include <stdio.h>
int main (int argc, char **argv) {
    // 3 3.14と出力される
    printf("%d %f\n",3, 3.14);                    
    return 0;
}

C言語のprintf関数は、引数のフォーマットを、%d:整数 %f:実数(float) %c:文字 %s:文字列
のように指定できますが、

もしこんな風に書いた場合どうなるか?

#include <stdio.h>
int main (int argc, char **argv) {
    // 順番が逆だ
    printf("%d %f\n",3.14, 3);                                                                                                              
    return 0;
}

という話を教えて頂きました。

結論ですが、この場合3 3.14 と表示されるよということで、私も手元のCentOS(x86_64,)とcygwin(x86_64)で試してみましたが、centOSの方では確かに 3 3.14と表示されました。

printfの内部では、引数の順番をチェックしていなくて、フォーマット指定子で期待する型の引数が見つかれば(引数の順番を無視して)それを採用するためとのことでした。この例の場合、引数の順番はおかしいですが、順番を無視して%dに一致する3と、%fに一致する3.14がそれぞれみつかったので結果として3 3.14と出力されているというお話です。※実際にはコンパイラが使うライブラリによって挙動は異なると思います。

何の疑問持たずに日常的に使っているprintfですが、言われてみれば知らない事の多いものだと感じました。

2.家路につくまで

懇親会の後は、翌日の始発の新幹線まで神田のマンガ喫茶に泊まったのですが、夜中に近くのブースから

「あんっ(はぁと)あんっ、あんっ(はぁと)(ギシギシギシ)

という、

お前らどう考えてもセ○ロスしてるだろ

的な音が聞こえてきたり、朝マンガ喫茶を出て東京駅に向かうときに中国人のおばちゃんが、

「マッサージイカガデスカ?」

と50mくらい歩く間ずっと声かけてきたりして、東京はITに限らずいろんな意味でファンキーで楽しい街だなと思いながら家路につきました。
※今度もし東京に行くときも神田近辺に泊まろうかな・・・


主催者・参加者の皆様のようなかっこいいソフトウェアエンジニアになれるよう、頑張ろうと強く思いました。