the history of linq

29
The History of LINQ 2013/06/22 つくばC#勉強会 Yoshifumi Kawai - @neuecc

Upload: yoshifumi-kawai

Post on 15-Jan-2015

18.791 views

Category:

Documents


2 download

DESCRIPTION

Tukuba C# Study

TRANSCRIPT

Page 1: The History of LINQ

The History of LINQ

2013/06/22 つくばC#勉強会Yoshifumi Kawai - @neuecc

Page 2: The History of LINQ

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/

Page 3: The History of LINQ

対象

LINQを全く知らない人

向けではない

LINQの解説はほとんどないです、スミマセンスミマセン

あとで思いだしてもらえれば

LINQをちょっと知ってる人

歴史的なのって、知ってたほうがきっと面白い

あ、これLINQで見たことある!みたいな

Page 4: The History of LINQ

Who is the creator of LINQ?

Page 5: The History of LINQ

Anders Hejlsberg?(Creator of C#, TypeScript. Microsoft Technical Fellow)

Page 6: The History of LINQ

No.

Page 7: The History of LINQ

Erik Meijer

LINQ作者はこの人。

Page 8: The History of 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/

Page 9: The History of LINQ

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?このバックグラウンドならそりゃそうだよね

Page 10: The History of LINQ

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へ繋がる

Page 11: The History of LINQ

An Overview of Cω

Page 12: The History of LINQ

processing information

Relational Data, XML, Objectの間のギャップを埋める

それがCωの型システムのゴール

どこかで聞いたような(LINQ?LINQ?LINQ?)

説明でのXMLフィーチャー度は高い

そもそもX#(まさにXML)だものね

そういう時代でした、全てはXMLに……

という幻想

XML関連の説明は適当に読み飛ばそう:)

Page 13: The History of LINQ

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)

Page 14: The History of LINQ

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;

Page 15: The History of LINQ

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";

Page 16: The History of LINQ

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);

Page 17: The History of LINQ

Language INtegrated Query

Page 18: The History of LINQ

C# 3.0(2008-)

Language Extensions for LINQ

Type Inference

Anonymous Type

Lambda Expressions

Expression Trees

Query Syntax

Extension Methods キーワード並べただけなのは手抜きなのではないか疑惑

Page 19: The History of LINQ

// LINQの説明をなんか書く

C#はIntelliSense指向言語

を体現する何か

C# is LINQ

無限大に手が広がる

LINQの強みは合成可能なこと、しかもIntelliSenseで選択できる

ドローTake!OrderBy!Select!SkipWhile!

事前のデッキ構築から勝負は始まる

デッキ構築のない無限大は辛ぽよ

Page 20: The History of LINQ

IObservable<T>

IEnumerable<T>

(LINQ to Objects)

DataSetXML IQueryable

SQL Twitter

The structure of LINQ Providers

Page 21: The History of LINQ

IEnumerable<T>

IObservable<T>

(Reactive Extensions)

UI

(ReactiveProperty)

OAuth

(ReactiveOAuth)IQbservable<T>

WMI

Page 22: The History of LINQ

Reactive Extensions

Page 23: The History of LINQ

Reactive Extensions =

LINQ to Events

LINQ to Asynchronous

よくわかんないけど凄そうだ!

Page 24: The History of LINQ

LINQ to Events

イベントは時間軸に乗った無限リスト

time

間隔は不定期でも可

終わりがなくてもいい(無限に続く)

// モーションセンサーから来る回転速度をLINQで

var motion = new Motion();

motion.CurrentValueChangedAsObservable().Select(x => x.SensorReading.DeviceRotationRate).Subscribe(x => Debug.WriteLine(x));

motion.Start();

時間を横軸に捉えることでLINQになる!不思議!

Page 25: The History of LINQ

Sync/Async – Single/Multi

死角がない!

Page 26: The History of LINQ

Over the Language

Page 27: The History of LINQ

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はどこでも使える!普遍!

Page 28: The History of LINQ

Conclusion

Page 29: The History of LINQ

まとめ、じゃない

Cωはよく見るとヤボったい

何をどう変えると使いやすくなるのか見える

LINQはかんすーがたとおぶじぇくとしこーの融合

使いやすいのか使いやすくないのかが問題だ

C#はunsophisticated peopleに媚びた言語だから:)

汎用性と特化のせめぎあい

使いやすいは正義

でも別に無駄にキーワード増やしまくってるわけでもないけどね