関ジャバ 20130731 invokedynamic

381 views

Published on

20130731に関ジャバで発表したinvokedynamicのスライドです。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
381
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

関ジャバ 20130731 invokedynamic

  1. 1. 関西Javaエンジニアの会 JVMでの動的言語サポート フリュー株式会社 @jyukutyo 阪田 浩一 #kanjava 1 113年8月22日木曜日
  2. 2. @jyukutyo 著書 3冊 関西Javaエンジニアの会 (関ジャバ) 発起人・運営 Fight the Future http://jyukutyo.hatenablog.com/ フリュー株式会社 所属 プリ機と連携する 画像SNS「ピクトリンク」 開発・運用に従事. 会員数500万人! Scalaカンファレンス スポンサー企業! エンジニア歴10年 34歳 SI業界での客先常駐 9年 Web系? 1年強 デブサミ関西2012 スピーカー 文学部哲学科卒 2 塾講師アルバイト 213年8月22日木曜日
  3. 3. JVMはいまや 多言語プラットフォーム 3 313年8月22日木曜日
  4. 4. 4 Java Virtual Machine Java Groovy Scala JRuby 413年8月22日木曜日
  5. 5. JVMはJava言語仕様を まったく理解していない 5 513年8月22日木曜日
  6. 6. classファイル形式の バイナリのみ理解する 6 613年8月22日木曜日
  7. 7. つまり 7 713年8月22日木曜日
  8. 8. 仕様を満たした classファイルだったら なんでもいい 8 813年8月22日木曜日
  9. 9. とはいうものの 9 913年8月22日木曜日
  10. 10. JVMは 静的型付け言語である Java向けに 作成されている 10 1013年8月22日木曜日
  11. 11. それはJVMの メソッド呼び出し命令 に現れている 11 1113年8月22日木曜日
  12. 12. Java6までのJVMのメソッド呼び出し命令 12 命令 説明 invokestatic staticメソッドを呼び出し invokespecial コンストラクタ、 privateなインスタンスメソッド、 superクラスのメソッドの呼び出し invokevirtual private以外のインスタンスメソッドの 呼び出し invokeinterface レシーバの型がインタフェースである インスタンスメソッドの呼び出し 1213年8月22日木曜日
  13. 13. これでわかること 13 1313年8月22日木曜日
  14. 14. レシーバの型が わかる前提での 命令しかない 14 1413年8月22日木曜日
  15. 15. かたや動的言語たち… 15 1513年8月22日木曜日
  16. 16. モンキーパッチあり 16 1613年8月22日木曜日
  17. 17. 既存のクラスに フィールドやメソッドを 追加したり削除したり 17 1713年8月22日木曜日
  18. 18. Java6までは 動的言語の側で こうしたことを実現する 実装をしていました 18 1813年8月22日木曜日
  19. 19. リフレクションとか 動的プロキシとか 19 1913年8月22日木曜日
  20. 20. まあパフォーマンス 悪くなりますよね 20 2013年8月22日木曜日
  21. 21. しかもJITコンパイル 適用できないし 21 2113年8月22日木曜日
  22. 22. そこでJava7から! invokedyanmicの 登場ですよ 22 2213年8月22日木曜日
  23. 23. JSR 292: Supporting Dynamically Typed Languages on the Java Platform 23 2313年8月22日木曜日
  24. 24. 簡単に言うと、 呼び出し対象の解決を 実行時まで遅らせる 仕組みです 24 2413年8月22日木曜日
  25. 25. カスタムリンケージを 定義できる、 とか言うみたいです 25 2513年8月22日木曜日
  26. 26. JVMにおける 5つ目の メソッド呼び出し命令 です 26 2613年8月22日木曜日
  27. 27. JVMに導入することで JITコンパイルの 恩恵も受けられる 27 2713年8月22日木曜日
  28. 28. 実現したいこと: Cにある関数ポインタ的な ものを使い、 これが指す処理を呼び出す 仕組み 28 2813年8月22日木曜日
  29. 29. (僕はCに詳しくないので イメージでの理解です) 29 2913年8月22日木曜日
  30. 30. その関数ポインタ的 なものが MethodHandle(以下MH) です 30 3013年8月22日木曜日
  31. 31. MHは 実際に呼び出す処理と 結びついています 31 3113年8月22日木曜日
  32. 32. 32 対象の 処理 MH 3213年8月22日木曜日
  33. 33. 動的言語のプログラミング で処理が変更されたら、 別のMHを 生成するわけです 33 3313年8月22日木曜日
  34. 34. 34 対象の 処理 MH 別の 処理 新しい MH 3413年8月22日木曜日
  35. 35. MHはただの 関数ポインタなので、 35 3513年8月22日木曜日
  36. 36. どういうコンテキストで MHが作られたか 別のオブジェクトが 把握します 36 3613年8月22日木曜日
  37. 37. それがCallSite 37 3713年8月22日木曜日
  38. 38. CallSiteはMHを保持し、 呼び出し元の コンテキストを表す オブジェクト 38 3813年8月22日木曜日
  39. 39. 39 対象の 処理 MH Call Site 3913年8月22日木曜日
  40. 40. invokedynamic命令は CallSiteを取得して、 MHを通して処理を 呼び出す 40 4013年8月22日木曜日
  41. 41. ではどうやって CallSiteを取得するのか? 41 4113年8月22日木曜日
  42. 42. それが bootstrapメソッド 42 4213年8月22日木曜日
  43. 43. CallSiteオブジェクトを 返すstaticメソッド 43 4313年8月22日木曜日
  44. 44. 各invokedynamic命令が 最初に実行されるときに 必ずbootstrapメソッドが 呼び出される仕組み 44 4413年8月22日木曜日
  45. 45. bootstrapメソッドが CallSiteオブジェクトを 返し… 45 4513年8月22日木曜日
  46. 46. invokedynamic命令と CallSiteオブジェクトが 関連づけられる 46 4613年8月22日木曜日
  47. 47. 47 対象の 処理 MH Call Site boot strap 生成 invokedynamic初回実行時に呼び出し MHを保持する 関連づく 4713年8月22日木曜日
  48. 48. 用語のまとめ 48 命令 説明 bootstrap メソッド invokedynamicが最初に実行されるとき、 JVMから呼び出されるstaticメソッド。 戻り値はCallSiteオブジェクト。 CallSite 呼び出し元を表すオブジェクト。 MethodHandleを保持する。 MethodHandle ある処理をポイントするオブジェクト。 これを使ってその処理を呼び出せる。 4813年8月22日木曜日
  49. 49. これらのオブジェクトは APIとして提供されている 49 4913年8月22日木曜日
  50. 50. java.lang.invoke パッケージ 50 5013年8月22日木曜日
  51. 51. たとえばMHを 生成するには… 51 5113年8月22日木曜日
  52. 52. 52 Lookup lookup = MethodHandles.lookup(); MethodHandle mh = lookup.findVirtual( String.class, "startsWith", MethodType.methodType( boolean.class, String.class ) ); MHの生成 5213年8月22日木曜日
  53. 53. MHの生成メソッド(いくつか) 53 メソッド 説明 Lookup#findVirtual インスタンスメソッドを呼び出す MHを返す Lookup#findConstructor コンストラクタを呼び出す MHを返す Lookup#findSetter フィールドへ書き込む MHを返す MethodHandles.constant つねに定数を返す MHを返す 5313年8月22日木曜日
  54. 54. CallSiteを生成するには… 54 5413年8月22日木曜日
  55. 55. 55 CallSite cs = new ConstantCallSite(methodHandle); CallSiteの生成 5513年8月22日木曜日
  56. 56. CallSiteの具象クラス 56 クラス 説明 ConstantCallSite MHを変更できない MutableCallSite MHを変更できる VolatileCallSite MHを変更でき、 かつすべてのスレッドに 即時反映される 5613年8月22日木曜日
  57. 57. bootstrapメソッドでは これらを使って CallSiteを生成すればよい 57 5713年8月22日木曜日
  58. 58. 僕が今わからないこと: JVM命令inovkedynamicが bootstrapメソッドを 見つけて呼び出す部分 58 5813年8月22日木曜日
  59. 59. Java 8からJavaでも indyが 使われるようになった! 59 5913年8月22日木曜日
  60. 60. ラムダ式 60 6013年8月22日木曜日
  61. 61. 昔は匿名クラスに コンパイルされていた けど… 61 6113年8月22日木曜日
  62. 62. (なのでラムダ式は 匿名クラスの シンタックスシュガーでは ないのです) 62 6213年8月22日木曜日
  63. 63. ラムダのクラスを 実行時に生成する。 そしてインスタンス化する MHを生成する。 63 6313年8月22日木曜日
  64. 64. サンプル実行 64 6413年8月22日木曜日
  65. 65. なぜラムダ式で indyを使うのか 65 6513年8月22日木曜日
  66. 66. 66 クラスファイルを少なくするため インスタンスの生成方法をJVMが選択できる ようにして、最適化するため 6613年8月22日木曜日
  67. 67. たとえば引数の値しか 使わない処理の場合は、 シングルトンインスタンス を戻すMHを生成する ようにする 67 6713年8月22日木曜日
  68. 68. indy自体は 言語やミドルウェアを 実装する人にとって 便利な機能 68 6813年8月22日木曜日
  69. 69. JooFluxという 研究プロダクトでは、 indyを使って 動的なアスペクト志向? を実現しているらしい 69 6913年8月22日木曜日
  70. 70. 70 Java 7 invokedynamic の概要 http://www.slideshare.net/miyakawataku/java-7- invokedynamic-in-a-nutshell めっちゃ勉強させてもらったサイトのご紹介 7013年8月22日木曜日
  71. 71. ご清聴 ありがとう ございました! 71 7113年8月22日木曜日
  72. 72. 72 ここからはじめる、JSR-356 WebSocket エスケイプ・フロム・レガシーJ2EE Java プラットフォームにおける Batch アプリ ケーション (JSR 352) エンタープライズ環境における並列処理の 実装方法について 7213年8月22日木曜日

×