データ処理 補足
↓このような記事が公開されたわけですが。
- C#/Scala/Python/Ruby/F#でデータ処理はどう違うのか?
- 公開後あったtwitterでのやり取り: http://togetter.com/li/164658
何点か補足と釈明を。
選んだ言語について
とりあえず、個人で拾えたのがこの5つの言語というだけであって、その他の言語は読んだ方に移植とかしていただけると幸い。というか、C#以外は最新追い切れてないと思うので、もっといい書き方があればフォローしていただけると助かります。
その際、気を付けて欲しいのは以下の点:
- 全てのデータ処理を1ループに詰め込まない。パイプライン的に、小さい単位に分ける。
- 一時バッファーのようなものを作らず、イテレーター パターンで1要素ずつ処理する。
- x.filter(…).map(…)というように、後置き記法でつなぐ。
- 以上のことを、利用者視点だけじゃなくて、クラス実装者視点でも考える。
言語のサポートなしでやるのは結構大変なはず。特に、実行効率まで考えるとかなり難易度上がるかと。
一般に、利用者の方が圧倒的に多いので、実装者視点の重要度は低いんですが。標準ライブラリで事足りてるうちは不要な視点ですが、実装者視点の機能が足りてないと、社内フレームワークやサードパーティ ライブラリの質を落とすので無視はできないかと。
ちなみに、Java がないのは、別にハブってるわけではなく、Java にはこの手の機能がないからしょうがなく外しています。データ処理自体はできるんですが、上記の要件全部は厳しいはず。でなきゃ利用者数ナンバー1の言語を外すとかありえない。
C++ は、実装者側が超がんばれば行けそうかな… でも、言語サポートがあるわけではないので勘弁を。
1人じゃ無理
上記の通り、C#以外は門外漢なわけですが。1人で5言語はやりすぎたかなぁとかも思います。
特に、Scala は情報がなさ過ぎて。細かいところは「調べて書く」じゃ厳しいですね。普段から使っていないと。一応、数名の方にはチェックしてもらってはいるんですが。
ということで、みんなで穴埋めしようぜ!
これは、猪股さんが作ってくれたリストなんですけども、こういうとき、Google Docs での共同編集は非常に便利ですねぇ。
その他、まとまりなく雑感
- データ処理って、対象は何もコレクションだけじゃないんで、O/Rマッパーとか分散データ処理とかpush型データ処理とか考えるとさらに大変なはず
- 一部の関数型言語で言うQuoteとか、C# でいうラムダ式からの式ツリー生成とかも必要で(さもないと、静的な型チェックとかが犠牲に)
- push型データ処理はC#の場合Rxがあって、あれは利用側は楽でいいけども、実装側はかなり大変そう
- Scala、トレイト(中の具象メソッド)は本当に必要なのかな
- C#の拡張メソッドに対応するものだけあれば実は十分で、それで言うと、拡張メソッドに直接対応するものは implicit conversion で、これだけでよかった気も
- とはいえ、暗黙の型変換+匿名型ってのも力技過ぎる感じが
- イテレーター的なもの作るのに setjmp/longjmp か…
- あれ、スタックの状態とかも全部キャプチャしちゃうし、正しく、効率よく使うの難しそう
- インターフェイスに対する実装を持つというのの意味:
- インターフェイス: こういうメンバーを持つべきという規約
- 例えば、数学だと、群とか環とかユークリッド聖域とか体とか
- インターフェイスの実装(継承): その規約通りの具体的な実装
- 例えば、整数とか多項式環とか
- インターフェイスに対する実装(インターフェイスを引数に取る関数、C#の拡張メソッドの意義): ある規約を満たすなら使えるアルゴリズム
- 例えば、ユークリッド聖域ならユークリッド互除法というアルゴリズムが使えて、商と余りが計算できる(整数は当然として、多項式環にも互除法が使える)
コメントを残す