scala×silverlight
DESCRIPTION
TRANSCRIPT
ScalaScalaScalaScala××××SilverlightSilverlightSilverlightSilverlight
terurou terurou terurou terurou ((((YAGI.TeruoYAGI.TeruoYAGI.TeruoYAGI.Teruo))))大名古屋, DSTokai
FLOSS桜山, DeLLa.JS, Python東海, ...
Agenda
Agenda
• 本題に入る前の予習
• Scala×Silverlight
• まとめなど
本題に入る前の予習
本題に入る前の予習
Question1Question1Question1Question1
• Scalaって何だっけ?
本題に入る前の予習
Question1Question1Question1Question1
• Scalaって何だっけ?
AnswerAnswerAnswerAnswer
• JavaVM上で動作するこれからの時代の言語。JavaVMって言いたっかったんだ。。。
本題に入る前の予習
Question2Question2Question2Question2
• Silverlightって何だっけ?
本題に入る前の予習
Question2Question2Question2Question2
• Silverlightって何だっけ?
AnswerAnswerAnswerAnswer
• 超簡単に言うと、Microsoft版Flash。
• マルチプラットフォームなブラウザPlugin。
• .NET Frameworkのサブセット(mini-CLR)を実行エンジンとして搭載
本題に入る前の予習
Question3Question3Question3Question3
• LTタイトルの「Scala×Silverlight」ってScalaをSilverlight上で動かすって意味?
本題に入る前の予習
Question3Question3Question3Question3
• LTタイトルの「Scala×Silverlight」ってScalaをSilverlight上で動かすって意味?
AnswerAnswerAnswerAnswer
• Yes、それ以外にないだろ。
本題に入る前の予習
Question4Question4Question4Question4
• SilverlightでScalaは動かねーだろw
• そもそも.NETとJavaってVMがちがうwww
本題に入る前の予習
Question4Question4Question4Question4
• SilverlightでScalaは動かねーだろw
• そもそも.NETとJavaってVMがちがうwww
AnswerAnswerAnswerAnswer
• scala-msilを使うと.NETでも動くよ(キリッ
本題に入る前の予習
Question5Question5Question5Question5
• えっ、scala-msilって何?
本題に入る前の予習
Question5Question5Question5Question5
• えっ、scala-msilって何?
AnswerAnswerAnswerAnswer
• Scalaプログラムを.NETプログラム(MSIL)に変換してくれる。
• というか、はじめからscalacのオプションにtarget:msilってオプションあるんだけど、それをもうちょっと使いやすくしてくれる。
本題に入る前の予習
Question6Question6Question6Question6
• MSILとか言われても。。。何それ?
本題に入る前の予習
Question6Question6Question6Question6
• MSILとか言われても。。。何それ?
AnswerAnswerAnswerAnswer
• MicroSoft Intermediate Language、実行可能コードを記述するための中間言語。
• 要はCLR(.NETのVM)用のアセンブリ言語。
• 次のページでもう少し詳しく説明するます。
本題に入る前の予習
MSILMSILMSILMSILととととCLRCLRCLRCLR((((.NET Framework.NET Framework.NET Framework.NET Framework))))
だいたいこんな感じ。
本題に入る前の予習
Question7Question7Question7Question7
• つまり、、、どういうことだってばよ!?
本題に入る前の予習
Question7Question7Question7Question7
• つまり、、、どういうことだってばよ!?
AnswerAnswerAnswerAnswer
• scala-msil→ilasmで.NETバイナリができる。
• Silverlightの実行エンジンはmini-CLR。
• .NETとSilverlightの実行バイナリ(PE)は同一フォーマット。
• つまり動作する見込みあり!
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からコピーすること。
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も作れるはずだが、そこも微妙にバグってたりとか。対策は簡単だが、今回のテーマから外れるので割愛。
Scala×Silverlight
とりあえず安直に試してみるとりあえず安直に試してみるとりあえず安直に試してみるとりあえず安直に試してみる
• .NETとSilverlightの実行バイナリ(PE)は同じファイルフォーマットなんだから、意外とそのまま動いたりするかも?
• 適当なソースをビルドしてDLLを作成して、VisualStudio/Silverlightプロジェクトから参照させてみる。
Scala×Silverlight
生贄となるコード(生贄となるコード(生贄となるコード(生贄となるコード(Hoge.scalaHoge.scalaHoge.scalaHoge.scala))))
このコードをDLLにビルドして参照させる。
class Hoge() {
def add(x:Int, y:Int) = {
x + y
}
}
Scala×Silverlight
試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。試してみたが、考えが安直すぎた。。。
• ビルド自体は問題なくできた。
• ビルドしたDLL以前に、scalaruntime.dllが参照できねーじゃん!
Scala×Silverlight
SilverlightSilverlightSilverlightSilverlight用の依存用の依存用の依存用の依存DLLDLLDLLDLLが必要。。。が必要。。。が必要。。。が必要。。。
• やっぱりSilverlightで.NET用のバイナリは使えませんよねー。
• scala-msilにはSilverlight用のバイナリは付属してない。
• どうすんの。。。
Scala×Silverlight
ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。
Scala×Silverlight
ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。ふと、私の中の天使が囁いた。
バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。バイナリ弄ったらいいじゃない。
天使ちゃんマジ天使
Scala×Silverlight
まずはバイナリの調査からまずはバイナリの調査からまずはバイナリの調査からまずはバイナリの調査から
• ildasmでも良いが、.NETの逆アセンブラといえば.NET Reflector。http://www.red-gate.com/products/reflector/
• バイナリからMSIL、C#、VB.NET、F#、Delphiなどに逆アセンブリ可能!
• 今回は簡単なバイナリの解析に利用。
Scala×Silverlight
.NET Reflector.NET Reflector.NET Reflector.NET Reflectorででででscalaruntime.dllscalaruntime.dllscalaruntime.dllscalaruntime.dllを調査を調査を調査を調査
• scalaruntime.dllから参照されているのは、.NET 2.0のmscorlib.dllのみ。
• IntRefなどの基本的な型クラスのみが存在。
Scala×Silverlight
同様に同様に同様に同様にpredef.dellpredef.dellpredef.dellpredef.dellも調査も調査も調査も調査
• こちらもmscorlib.dll(あれ、.NET 1.1用?)とscalaruntime.dllの2つしか参照していない。
• TuppleやCollectionなどの基本的なクラスが存在。
Scala×Silverlight
mscorlibmscorlibmscorlibmscorlibって何?って何?って何?って何?
• .NET Frameworkの根幹をなすライブラリ。
– IntegerやCharなどの基本的な型クラス
– ArrayListやHashtableなどのCollection
–ファイルI/O
– Thread
– Console、Debug
– Reflection
• 当然、Silverlightにもサブセットが存在。
Scala×Silverlight
見えてきた勝算見えてきた勝算見えてきた勝算見えてきた勝算
• 両DLLともmscorlibしか参照していない。
• バイナリを流し見たところ、特殊なクラスやメソッドは使用していないようだ。
• Silverlightのmscorlibを参照するようにバイナリを改変したら動作しそうな感じ。
Scala×Silverlight
依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(1111))))
• DLLをMSILに逆アセンブリ$ ildasm /out=scalaruntime.msil \> /utf8 scalaruntime.dll
$ ildasm /out=predef.msil /utf8 \> predef.dll
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}
Scala×Silverlight
依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(依存バイナリを改変してみる(3333))))
• 修正したMSILからDLLを再作成する。$ ilasm /resource=scalaruntime.res \> /dll scalaruntime.msil
$ ilasm /dll predef.msil
Scala×Silverlight
実行プログラムの実行プログラムの実行プログラムの実行プログラムのMSILMSILMSILMSILも修正するも修正するも修正するも修正する
• scala-msilの出力するMSILも、当然.NET用のmscorlib.dllを参照しているので修正する。
• 修正方法は全く同じなので手順省略。
• 修正したらilasm。
Scala×Silverlight
さあ、リベンジだ!さあ、リベンジだ!さあ、リベンジだ!さあ、リベンジだ!
• ちゃんと参照できて動いたよ!
まとめなど
まとめなど
ScalaScalaScalaScalaプログラムをプログラムをプログラムをプログラムをSilverlightSilverlightSilverlightSilverlightで動かす手順で動かす手順で動かす手順で動かす手順
• scalaruntime.dll、predef.dllのバイナリの.assembly extern mscorlibの部分を改変し、Silverlightに対応させる。
• scalac-netで生成したMSILもSilverlightで動作するよう.assembly extern mscorlibの箇所を修正してからアセンブリする。
Scala×Silverlight
scala-msilscala-msilscala-msilscala-msilを触って気がついた問題点を触って気がついた問題点を触って気がついた問題点を触って気がついた問題点
• Actorがない。。。たぶん他にも色々無い。
• コンパイラがたまに不可解なエラーを吐く。
• そもそもコンパイラが中途半端。(mscorlib|scalaruntime|predef).dllに存在しないパッケージやクラスを参照しようとすると、「そんなもんねーよ」って怒る。
まとめなど
今後の展開今後の展開今後の展開今後の展開
え、今後も続けるの・・・?
まとめなど
今後の展開今後の展開今後の展開今後の展開
• とりあえずDLLをビルドしてみただけなので、簡単なアプリまでは作ってみたい気はする。
• SilverlightアプリのEntryPoint(起動時にキックされる部分)だけを橋渡しするようにごにょってしまえば、だいたいPure-ScalaでSilverlightを書けるようになるはず。
• Scala製Silverlightプレゼンツールぐらいは作れるんじゃね?技術的な目処はついてる。
Scala×Silverlight
本セッションの総括本セッションの総括本セッションの総括本セッションの総括
Scala×Silverlight
本セッションの総括本セッションの総括本セッションの総括本セッションの総括
MSILたのしいです。
ご清聴ありがとうございました。