the history of linq
DESCRIPTION
Tukuba C# StudyTRANSCRIPT
The History of LINQ
2013/06/22 つくばC#勉強会Yoshifumi Kawai - @neuecc
Self Introduction
@仕事
株式会社グラニ取締役CTO
技術的な目標としては、C#で日本を代表する会社にする!
エンジニアひっそり募集してます:)
@個人活動
Microsoft MVP for Visual C#
Web http://neue.cc/
Twitter @neuecc
JavaScriptにLINQ to Objectsを移植したライブラリ作ってます
linq.js - http://linqjs.codeplex.com/
対象
LINQを全く知らない人
向けではない
LINQの解説はほとんどないです、スミマセンスミマセン
あとで思いだしてもらえれば
LINQをちょっと知ってる人
歴史的なのって、知ってたほうがきっと面白い
あ、これLINQで見たことある!みたいな
Who is the creator of LINQ?
Anders Hejlsberg?(Creator of C#, TypeScript. Microsoft Technical Fellow)
No.
Erik Meijer
LINQ作者はこの人。
作者から辿るLINQの源泉
Erik Meijer
Head in the box @Channel9
http://en.wikipedia.org/wiki/Erik_Meijer_(computer_scientist)
http://research.microsoft.com/en-us/um/people/emeijer/ErikMeijer.html
Microsoft Research, Microsoft(Cloud Programmability Team)
つい最近独立
Applied Duality
http://www.applied-duality.com/
Haskellとの関わり(-2000)
Haskell 98策定者の一人
Programming in Haskellの動画解説とかも
http://www.cs.nott.ac.uk/~gmh/book.html
Parsec: A practical parser library
Daan Leijen, Erik Meijer
http://research.microsoft.com/en-us/um/people/emeijer/papers/parsec.pdf
LINQはMonad?このバックグラウンドならそりゃそうだよね
Cω(-2005)
Cω(しーおめが) @Microsoft Research
http://research.microsoft.com/en-us/um/cambridge/projects/comega/
2004年にコンパイラプレビュー公開
続報はない、というのもC# 3.0に吸収されていったから
Cω is an extension of C# in two areas
Polyphonic C#と呼ばれていた非同期処理への言語拡張
Xen, X#と呼ばれていたXMLやテーブルデータへの言語拡張
こっちの側面がLINQへ繋がる
An Overview of Cω
processing information
Relational Data, XML, Objectの間のギャップを埋める
それがCωの型システムのゴール
どこかで聞いたような(LINQ?LINQ?LINQ?)
説明でのXMLフィーチャー度は高い
そもそもX#(まさにXML)だものね
そういう時代でした、全てはXMLに……
という幻想
XML関連の説明は適当に読み飛ばそう:)
streams
IEnumerable<T>へのフィーチャー
T*でIEnumerable<T>になる、素敵!
public string* LoTR(){
yield return "The Fellowship of the Ring";yield return "The Two Towers";yield return "The Return of the King";
}
public void PrintTrilogyTitles(){
LoTR().{Console.WriteLine(it)};}
ラムダ式みたいな何かは、 it が暗黙の引数になってるよう(Groovyみたい)
C#だと x => Console.WriteLine(x)
Anonymous Structs
むむ、これは匿名型(Anonymous Type)では?
// varがないから面倒くさいけど、型定義してnewで生成なのは匿名型そっくり// 定義は型+名前はオプション、名前無しの場合は配列風にアクセスすることが可能
struct{ int; string; string; DateTime date; string; } x = new {47, "Hello World", "Dare Obasanjo", date = DateTime.Now, "This is"};
Console.WriteLine(x[1]); // “Hello World”, 名前なしの場合は配列風にアクセスDateTime pubDate = x.date; // 名前をつけたものは名前つきなプロパティでもアクセスできる
// 複数の同名フィールドに値を持たせるような定義も可能!
struct {string field; string field; string field;} field3 = new {field="one", field="two", field="three"};
// その場合はIEnumerable<string>になる(インラインなyield returnっぽい)
string* fields = field3.field;
SQL-based Operators
クエリ構文みたいな何か
この時はまだ相当SQLそのものな構文だったよう
// 語順は完全にSQLそのまま、ただし当然タイプセーフ
struct { string Title; string Artist;}* results =select Title, Artist from CDs where Style == CDStyle.HipHop;
results.{ Console.WriteLine("Title = {0}, Artist = {1}", it.Title, it.Artist); };
// update, insert, transactionなども用意されていた
int n = update DB.Customersset City = "London"where Country == "UK" && City == "Landon";
XML Literals
C#にはないけど
VB.NETにはこれそのものじゃないけどある// こんな定義で
public class NewsItem{attribute string title;attribute string author;struct { DateTime date; string body; }
}
// こんな風にリテラル直打ちで
NewsItem news = <NewsItem title="Hello World" author="Dare Obasanjo"><date>{DateTime.Now}</date><body>I am the first post of the New Year.</body>
</NewsItem>;
Console.WriteLine(news.title + " by " + news.author + " on " + news.date);
Language INtegrated Query
C# 3.0(2008-)
Language Extensions for LINQ
Type Inference
Anonymous Type
Lambda Expressions
Expression Trees
Query Syntax
Extension Methods キーワード並べただけなのは手抜きなのではないか疑惑
// LINQの説明をなんか書く
C#はIntelliSense指向言語
を体現する何か
C# is LINQ
無限大に手が広がる
LINQの強みは合成可能なこと、しかもIntelliSenseで選択できる
ドローTake!OrderBy!Select!SkipWhile!
事前のデッキ構築から勝負は始まる
デッキ構築のない無限大は辛ぽよ
IObservable<T>
IEnumerable<T>
(LINQ to Objects)
DataSetXML IQueryable
SQL Twitter
The structure of LINQ Providers
IEnumerable<T>
IObservable<T>
(Reactive Extensions)
UI
(ReactiveProperty)
OAuth
(ReactiveOAuth)IQbservable<T>
WMI
Reactive Extensions
Reactive Extensions =
LINQ to Events
LINQ to Asynchronous
よくわかんないけど凄そうだ!
LINQ to Events
イベントは時間軸に乗った無限リスト
time
間隔は不定期でも可
終わりがなくてもいい(無限に続く)
// モーションセンサーから来る回転速度をLINQで
var motion = new Motion();
motion.CurrentValueChangedAsObservable().Select(x => x.SensorReading.DeviceRotationRate).Subscribe(x => Debug.WriteLine(x));
motion.Start();
時間を横軸に捉えることでLINQになる!不思議!
Sync/Async – Single/Multi
死角がない!
Over the Language
to JavaScript/Java/Dart/etc…
linq.jsLINQ to ObjectsのJavaScript移植
TypeScriptのジェネリクス対応で更に強く!
Java - EL Collection Operations
EL 3.0 uses LINQ
https://java.net/projects/el-spec/pages/CollectionOperations
RxJS/RxJava/Rx…
Reactive Extensions for many laguages
Dart Streams APIWe have learned a lot by looking at .Net’s RX
http://news.dartlang.org/2012/11/introducing-new-streams-api.html
LINQはどこでも使える!普遍!
Conclusion
まとめ、じゃない
Cωはよく見るとヤボったい
何をどう変えると使いやすくなるのか見える
LINQはかんすーがたとおぶじぇくとしこーの融合
使いやすいのか使いやすくないのかが問題だ
C#はunsophisticated peopleに媚びた言語だから:)
汎用性と特化のせめぎあい
使いやすいは正義
でも別に無駄にキーワード増やしまくってるわけでもないけどね