scala×silverlight

46
Scala Scala Scala Scala × ×× × Silverlight Silverlight Silverlight Silverlight terurou terurou terurou terurou ( (YAGI.Teruo YAGI.Teruo YAGI.Teruo YAGI.Teruo) ) 大名古屋, DSTokai FLOSS桜山, DeLLa.JS, Python東海, ...

Upload: terurou

Post on 05-Dec-2014

2.559 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Scala×silverlight

ScalaScalaScalaScala××××SilverlightSilverlightSilverlightSilverlight

terurou terurou terurou terurou ((((YAGI.TeruoYAGI.TeruoYAGI.TeruoYAGI.Teruo))))大名古屋, DSTokai

FLOSS桜山, DeLLa.JS, Python東海, ...

Page 2: Scala×silverlight

Agenda

Page 3: Scala×silverlight

Agenda

• 本題に入る前の予習

• Scala×Silverlight

• まとめなど

Page 4: Scala×silverlight

本題に入る前の予習

Page 5: Scala×silverlight

本題に入る前の予習

Question1Question1Question1Question1

• Scalaって何だっけ?

Page 6: Scala×silverlight

本題に入る前の予習

Question1Question1Question1Question1

• Scalaって何だっけ?

AnswerAnswerAnswerAnswer

• JavaVM上で動作するこれからの時代の言語。JavaVMって言いたっかったんだ。。。

Page 7: Scala×silverlight

本題に入る前の予習

Question2Question2Question2Question2

• Silverlightって何だっけ?

Page 8: Scala×silverlight

本題に入る前の予習

Question2Question2Question2Question2

• Silverlightって何だっけ?

AnswerAnswerAnswerAnswer

• 超簡単に言うと、Microsoft版Flash。

• マルチプラットフォームなブラウザPlugin。

• .NET Frameworkのサブセット(mini-CLR)を実行エンジンとして搭載

Page 9: Scala×silverlight

本題に入る前の予習

Question3Question3Question3Question3

• LTタイトルの「Scala×Silverlight」ってScalaをSilverlight上で動かすって意味?

Page 10: Scala×silverlight

本題に入る前の予習

Question3Question3Question3Question3

• LTタイトルの「Scala×Silverlight」ってScalaをSilverlight上で動かすって意味?

AnswerAnswerAnswerAnswer

• Yes、それ以外にないだろ。

Page 11: Scala×silverlight

本題に入る前の予習

Question4Question4Question4Question4

• SilverlightでScalaは動かねーだろw

• そもそも.NETとJavaってVMがちがうwww

Page 12: Scala×silverlight

本題に入る前の予習

Question4Question4Question4Question4

• SilverlightでScalaは動かねーだろw

• そもそも.NETとJavaってVMがちがうwww

AnswerAnswerAnswerAnswer

• scala-msilを使うと.NETでも動くよ(キリッ

Page 13: Scala×silverlight

本題に入る前の予習

Question5Question5Question5Question5

• えっ、scala-msilって何?

Page 14: Scala×silverlight

本題に入る前の予習

Question5Question5Question5Question5

• えっ、scala-msilって何?

AnswerAnswerAnswerAnswer

• Scalaプログラムを.NETプログラム(MSIL)に変換してくれる。

• というか、はじめからscalacのオプションにtarget:msilってオプションあるんだけど、それをもうちょっと使いやすくしてくれる。

Page 15: Scala×silverlight

本題に入る前の予習

Question6Question6Question6Question6

• MSILとか言われても。。。何それ?

Page 16: Scala×silverlight

本題に入る前の予習

Question6Question6Question6Question6

• MSILとか言われても。。。何それ?

AnswerAnswerAnswerAnswer

• MicroSoft Intermediate Language、実行可能コードを記述するための中間言語。

• 要はCLR(.NETのVM)用のアセンブリ言語。

• 次のページでもう少し詳しく説明するます。

Page 17: Scala×silverlight

本題に入る前の予習

MSILMSILMSILMSILととととCLRCLRCLRCLR((((.NET Framework.NET Framework.NET Framework.NET Framework))))

だいたいこんな感じ。

Page 18: Scala×silverlight

本題に入る前の予習

Question7Question7Question7Question7

• つまり、、、どういうことだってばよ!?

Page 19: Scala×silverlight

本題に入る前の予習

Question7Question7Question7Question7

• つまり、、、どういうことだってばよ!?

AnswerAnswerAnswerAnswer

• scala-msil→ilasmで.NETバイナリができる。

• Silverlightの実行エンジンはmini-CLR。

• .NETとSilverlightの実行バイナリ(PE)は同一フォーマット。

• つまり動作する見込みあり!

Page 20: Scala×silverlight

Scala×Silverlight

Page 21: Scala×silverlight

Scala×Silverlight

scala-msilscala-msilscala-msilscala-msilのインストールと使い方のインストールと使い方のインストールと使い方のインストールと使い方

• インストールインストールインストールインストール$ sbaz install scala-net

• .scala.scala.scala.scalaををををMSILMSILMSILMSILに変換に変換に変換に変換$ scalac-net hoge.scala

• MSILMSILMSILMSILを実行バイナリ(を実行バイナリ(を実行バイナリ(を実行バイナリ(DLLDLLDLLDLL)にアセンブル)にアセンブル)にアセンブル)にアセンブル$ ilasm /dll hoge.msil

• scala-msilscala-msilscala-msilscala-msilで作ったバイナリの依存性で作ったバイナリの依存性で作ったバイナリの依存性で作ったバイナリの依存性scalaruntime.dllとpredef.dllに依存。scala/libからコピーすること。

Page 22: Scala×silverlight

Scala×Silverlight

scala-msil scala-msil scala-msil scala-msil 使用上の注意使用上の注意使用上の注意使用上の注意

• どうやらscala2.8.0のscalacはバグ持ち。target:msilオプションをつけると落ちる。

• trunkやnightly buildやらを色々試したが、マトモに動きそうなのはscala 2.7.7。scala-msilを試したい人はscala 2.7.7を使うと良い。

• DLLだけでなくEXEも作れるはずだが、そこも微妙にバグってたりとか。対策は簡単だが、今回のテーマから外れるので割愛。

Page 23: Scala×silverlight

Scala×Silverlight

とりあえず安直に試してみるとりあえず安直に試してみるとりあえず安直に試してみるとりあえず安直に試してみる

• .NETとSilverlightの実行バイナリ(PE)は同じファイルフォーマットなんだから、意外とそのまま動いたりするかも?

• 適当なソースをビルドしてDLLを作成して、VisualStudio/Silverlightプロジェクトから参照させてみる。

Page 24: Scala×silverlight

Scala×Silverlight

生贄となるコード(生贄となるコード(生贄となるコード(生贄となるコード(Hoge.scalaHoge.scalaHoge.scalaHoge.scala))))

このコードをDLLにビルドして参照させる。

class Hoge() {

def add(x:Int, y:Int) = {

x + y

}

}

Page 25: Scala×silverlight

Scala×Silverlight

試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。

• ビルド自体は問題なくできた。

• ビルドしたDLL以前に、scalaruntime.dllが参照できねーじゃん!

Page 26: Scala×silverlight

Scala×Silverlight

SilverlightSilverlightSilverlightSilverlight用の依存用の依存用の依存用の依存DLLDLLDLLDLLが必要。。。が必要。。。が必要。。。が必要。。。

• やっぱりSilverlightで.NET用のバイナリは使えませんよねー。

• scala-msilにはSilverlight用のバイナリは付属してない。

• どうすんの。。。

Page 27: Scala×silverlight

Scala×Silverlight

ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。

Page 28: Scala×silverlight

Scala×Silverlight

ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。

バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。

天使ちゃんマジ天使

Page 29: Scala×silverlight

Scala×Silverlight

まずはバイナリの調査からまずはバイナリの調査からまずはバイナリの調査からまずはバイナリの調査から

• ildasmでも良いが、.NETの逆アセンブラといえば.NET Reflector。http://www.red-gate.com/products/reflector/

• バイナリからMSIL、C#、VB.NET、F#、Delphiなどに逆アセンブリ可能!

• 今回は簡単なバイナリの解析に利用。

Page 30: Scala×silverlight

Scala×Silverlight

.NET Reflector.NET Reflector.NET Reflector.NET Reflectorででででscalaruntime.dllscalaruntime.dllscalaruntime.dllscalaruntime.dllを調査を調査を調査を調査

• scalaruntime.dllから参照されているのは、.NET 2.0のmscorlib.dllのみ。

• IntRefなどの基本的な型クラスのみが存在。

Page 31: Scala×silverlight

Scala×Silverlight

同様に同様に同様に同様にpredef.dellpredef.dellpredef.dellpredef.dellも調査も調査も調査も調査

• こちらもmscorlib.dll(あれ、.NET 1.1用?)とscalaruntime.dllの2つしか参照していない。

• TuppleやCollectionなどの基本的なクラスが存在。

Page 32: Scala×silverlight

Scala×Silverlight

mscorlibmscorlibmscorlibmscorlibって何?って何?って何?って何?

• .NET Frameworkの根幹をなすライブラリ。

– IntegerやCharなどの基本的な型クラス

– ArrayListやHashtableなどのCollection

–ファイルI/O

– Thread

– Console、Debug

– Reflection

• 当然、Silverlightにもサブセットが存在。

Page 33: Scala×silverlight

Scala×Silverlight

見えてきた勝算見えてきた勝算見えてきた勝算見えてきた勝算

• 両DLLともmscorlibしか参照していない。

• バイナリを流し見たところ、特殊なクラスやメソッドは使用していないようだ。

• Silverlightのmscorlibを参照するようにバイナリを改変したら動作しそうな感じ。

Page 34: Scala×silverlight

Scala×Silverlight

依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(1111))))

• DLLをMSILに逆アセンブリ$ ildasm /out=scalaruntime.msil \> /utf8 scalaruntime.dll

$ ildasm /out=predef.msil /utf8 \> predef.dll

Page 35: Scala×silverlight

Scala×Silverlight

依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(2222))))

• Silverlightのmscorlibを参照するようにMSILの「.assembly extern mscorlib」を書き換える。.assembly extern mscorlib{ .publickeytoken = (7C EC 85 D7 BE A7 79 8E ) .ver 2:0:5:0}

Page 36: Scala×silverlight

Scala×Silverlight

依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(3333))))

• 修正したMSILからDLLを再作成する。$ ilasm /resource=scalaruntime.res \> /dll scalaruntime.msil

$ ilasm /dll predef.msil

Page 37: Scala×silverlight

Scala×Silverlight

実行プログラムの実行プログラムの実行プログラムの実行プログラムのMSILMSILMSILMSILも修正するも修正するも修正するも修正する

• scala-msilの出力するMSILも、当然.NET用のmscorlib.dllを参照しているので修正する。

• 修正方法は全く同じなので手順省略。

• 修正したらilasm。

Page 38: Scala×silverlight

Scala×Silverlight

さあ、リベンジだ!さあ、リベンジだ!さあ、リベンジだ!さあ、リベンジだ!

• ちゃんと参照できて動いたよ!

Page 39: Scala×silverlight

まとめなど

Page 40: Scala×silverlight

まとめなど

ScalaScalaScalaScalaプログラムをプログラムをプログラムをプログラムをSilverlightSilverlightSilverlightSilverlightで動かす手順で動かす手順で動かす手順で動かす手順

• scalaruntime.dll、predef.dllのバイナリの.assembly extern mscorlibの部分を改変し、Silverlightに対応させる。

• scalac-netで生成したMSILもSilverlightで動作するよう.assembly extern mscorlibの箇所を修正してからアセンブリする。

Page 41: Scala×silverlight

Scala×Silverlight

scala-msilscala-msilscala-msilscala-msilを触って気がついた問題点を触って気がついた問題点を触って気がついた問題点を触って気がついた問題点

• Actorがない。。。たぶん他にも色々無い。

• コンパイラがたまに不可解なエラーを吐く。

• そもそもコンパイラが中途半端。(mscorlib|scalaruntime|predef).dllに存在しないパッケージやクラスを参照しようとすると、「そんなもんねーよ」って怒る。

Page 42: Scala×silverlight

まとめなど

今後の展開今後の展開今後の展開今後の展開

え、今後も続けるの・・・?

Page 43: Scala×silverlight

まとめなど

今後の展開今後の展開今後の展開今後の展開

• とりあえずDLLをビルドしてみただけなので、簡単なアプリまでは作ってみたい気はする。

• SilverlightアプリのEntryPoint(起動時にキックされる部分)だけを橋渡しするようにごにょってしまえば、だいたいPure-ScalaでSilverlightを書けるようになるはず。

• Scala製Silverlightプレゼンツールぐらいは作れるんじゃね?技術的な目処はついてる。

Page 44: Scala×silverlight

Scala×Silverlight

本セッションの総括本セッションの総括本セッションの総括本セッションの総括

Page 45: Scala×silverlight

Scala×Silverlight

本セッションの総括本セッションの総括本セッションの総括本セッションの総括

MSILたのしいです。

Page 46: Scala×silverlight

ご清聴ありがとうございました。