Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

jvm

Java 11 / JEP 181のNestmatesでのバイトコードの変更を見比べる

JEP 181: Nest-Based Access Controlというものがあります。これはNestmates(ネストメイト)と呼ばれるものです。 http://openjdk.java.net/jeps/181 Nestmatesは、クラスやインタフェースをネストして作成したとき、ネストする側される側の両方を指す言葉…

HotSpot VMビルド時のADファイル処理

jvm

以前HotSpot VMのIntrinsicsを見ました。ビルド時にAD(Architecture Description)ファイルから各CPUアーキテクチャに合わせたC++のソースファイルを生成しています。 www.sakatakoichi.com しかし、ADファイルからどのようにC++のソースを生成しているのか…

JVM(HotSpot VM)におけるIntrinsics(C2/Graal)

Project Loomのソースを読んでいると、また遭遇しました。 public class Continuation { ... @HotSpotIntrinsicCandidate private static int doYield(int scopes) { throw new Error("Intrinsic not installed"); }; ... } @HotSpotIntrinsicCandidateアノ…

LINE Fukuoka様でのDeveloper Meetupで登壇しました

LINE様が東京を始め京都、大阪、福岡などで頻繁に開催されているいわゆる勉強会、Developer Meetupがあります。 2018年7月に福岡のLINE Fukuoka様で開催されたDeveloper Meetupに登壇しました。こちらの模様をLINE様のEngineer Blogに書いていただきました。…

Value Typesもろもろ

以前Project ValhallaのL-World Value Typesのアーリーアクセスビルドを試しました。 www.sakatakoichi.com 今回もう少し触ってみます。 利用バージョン $ java -version openjdk version "11-lworldea" 2018-09-25 OpenJDK Runtime Environment 18.9 (build…

詳説GraalVM(4) GraalVMが組み込まれたデータベース

こちらのツイートが話題になっていました。 MySQL MLE Pluginはマルチ言語VMであるGraalVMを内包することでMySQL上で複数の開発言語でストアドプログラムを作成/実行可能とする。近日中にMySQL Labsで利用可能となる予定。まずはJavaScriptのサポートから。M…

詳説GraalVM(3) Polyglot

今回は他言語実行環境としてのGraalVM、Polyglotに着目します。現時点での最新版、1.0.0-rc5を使います。 http://www.graalvm.org/downloads/ なお、rc5からCommunity EditionがmacOSに対応しました(今まではEnterprise Editionだけでした)。こちらを使い…

Project ValhallaのL-World Value Typesをちょっと試す

Project ValhallaのL-World Value Typesのアーリーアクセスビルドが出ています。 Valhalla Early-Access Builds Value Typesは、L-WorldではないQタイプのMinimal Value Types(MVT)という初期のプロトタイプがありました。 www.infoq.com 現在は従来のLタ…

Run Fiber from Project Loom

Project Loomの(プロトタイプ的な)ソースコードが公開されました。chiroitoさんがさっそく試されています。 chiroito.hatenablog.jp 記事はLinuxですが、私もmacOSで動作させることができました。 Project Loomって何?という方はこちらをご覧ください。 w…

JVM Language Summit 2018に参加しました

2018年7月30、31日にオラクルのサンタクララオフィス(つまりあのデータベース型の建物ではない)で開催された、JVM Language Summit(通称JVMLS)に参加しました。 http://openjdk.java.net/projects/mlvm/jvmlangsummit/ JVM Language Summitとは The JVM …

日本中がGraalに湧いた日

Java Day Tokyo 2018で、"Graal: How to use the new JVM JIT compiler in real life"というセッションがありました。スピーカはTwitter社のChris Thalingerさんです。 www.oracle.co.jp Chrisさんは今年Voxxed DaysやOracle Codeなどさまざまなカンファレン…

Graalのグラフ、IR

以前(昨年2017年)、Graal(JITコンパイラ)のグラフやIR(Intermediate Representation)について調べました。 www.sakatakoichi.com www.sakatakoichi.com このとき、理解が浅く中途半端なままでした。 JKUのwebサイトhttp://ssw.jku.at/Research/Project…

詳説GraalVM(2) 背景事情と情報収集法

詳説GraalVMの第1回として、GraalVMの概要を書きました。 www.sakatakoichi.com 第2回は開発の背景事情と情報収集方法を書きます。使い方はきっといろんな方が書いておられると考えたからです。GraalVMファンとして、他の方があまり書かないマニアック情報を…

詳説GraalVM(1) イントロダクション

GraalVMが1.0.0 RC1を出し、公式サイトを公開しました! http://www.graalvm.org/ 日本の技術ブログメディアPublickeyさんも取り上げておられます。 www.publickey1.jp そのこともあって、Graalで検索しこのブログへたどり着いた方も多かったです。私は1年ほ…

(超簡易な)コンパイラを(参考コードありで)書いてみた

じゅくちょーです。私はJava製JITコンパイラGraalにとても強く興味を持っています。 Graal の検索結果 - Fight the Future Graalのコードを読んでいる内に、自分はGraalの前にそもそもコンパイラをよく理解していないと感じるようになりました。コンパイラに…

Serviceability Agentをjhsdbから読み進めてみる

Serviceability Agentやjhsdbについては、OpenJDK Reviewerの末永さんのスライドが大変参考になります。 Java 9で進化する診断ツール from Yasumasa Suenaga www.slideshare.net JDK 8まで、HSDB (CLHSDB)を使うにはjavaコマンドで実行しました。 $ java -Ds…

海外カンファレンスJfokusに参加してきた

www.jfokus.se 日程: 2018/02/05(VM tech summit)、02/06-07(カンファレンス本体) 場所: ストックホルム、スウェーデン 参加者数: 2000人弱(VM tech summitは30名ほど) 費用: 10万円(航空券、ホテル別) 感想 カンファレンスでは各セッションの講演と…

Fiber - Project Loom

Project Loomをご存知でしょうか? http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html Project Loomは軽量スレッドであるFiberと、継続(Continuation)をJavaに導入することを狙っています。Project Loomはまだ提案されたばかりで、OpenJDKの…

GraalのJavaバイトコードからグラフ生成の実装

jvm

今回はGraalのJavaバイトコードからグラフ生成の処理を、JVMCIコンパイラの実装クラスであるorg.graalvm.compiler.hotspot.HotSpotGraalCompilerから見ていきます。 /** * Gets a graph produced from the intrinsic for a given method that can be compile…

GraalでAOTする

GraalでAOT(Ahead Of Time)コンパイルしました。GraalはJava 9でのAOT実装としても使われています。Java 9ではLinuxのみjaotcコマンドがありAOTコンパイルできますが、GraalではMacでもできました。バイトコードをマシンコードにするのがJITコンパイルであ…

GraalでのPHI

以前SSAそしてPHIとは何かについて学びました。 jyukutyo.hatenablog.com 今回はGraalでのPHIについて調べます。 "static single assignment"で検索すると、org.graalvm.compiler.lir.ssa.SSAUtilクラスを見つけました。 ドキュメンテーションコメントはこう…

SSA: 静的単一代入

jvm

SSAとはStatic Single Assignment Form、つまり静的単一代入のことです。 各変数が一度のみ代入されるよう定義されたものである。 静的単一代入 - Wikipedia 変数は再代入できるプログラミング言語は多いです。たとえばnというローカル変数に2回代入している…

JVMのControl Flow Graph可視化

jvm

GraalでのOSRを見たとき、"Control Flow Graph: 制御フローグラフ"(CFG)が出てきました。 Register AllocationとCFGは密接に関わります。さて、JavaでのCFGを検索すると論文が出てきました。 Thomas Würthingerさんの"Visualization of Java Control Flow …

GraalでのOSR

jvm

以前JITコンパイルでのOSR(on-stack replacement)について見ました。 jyukutyo.hatenablog.com 次は、GraalでのOSRの実装を見てみます。org.graalvm.compiler.hotspot.phases.OnStackReplacementPhaseです。各Phaseクラスではrun(StructuredGraph)を実装し…

JITコンパイルでのOSRとは

jvm

JITコンパイルのログなどを見ると、OSR(on-stack replacement)という単語が出てきます。このブログでも以前JITWatchを触ったときに少し書きました。 OSRはOn-Stack replacementのことで、ループ内の最適化のことを指します。 jyukutyo.hatenablog.com で、…

Java 8リリース以降のG1GCに対する改善

jvm

JavaOne 2017のセッションで、Java 8のリリース以降に実施されたG1GCの改善を解説するものがありました。 youtu.be 主要な改善は5つあります。 String deduplication (JDK 8u20) Class unloading with concurrent mark (JDK 8u40) Eagerly reclaim humongous…

JITWatchが進化してる

jvm

JITWatchはJITコンパイルを可視化し分析するためのツールなのですが、これは2014年にこのブログにも書きました。 jyukutyo.hatenablog.com Twitterでこのツイートを見て、新機能を知りました。 New #JITWatch visualisations! See compiler thread queues, t…

英語論文を初めて読み終えた話

Christian Wimmerさんの"Linear Scan Register Allocation for the Java HotSpot™ Client Compiler"、約110ページを読み終えました。 http://www.christianwimmer.at/Publications/Wimmer04a/Wimmer04a.pdf オーストリアのヨハネス・ケプラー大学での修士論…

インナークラスからアウタークラスのprivateメソッドへのアクセスでの奇妙なバイトコード

JVM Language Summit 2017のセッション動画を見ていると、おもしろいコードがありました。 youtu.be JEP 181: Introduce "nests" as an explicit access control contextに関するセッションです。 こんな感じのコードです。mainメソッドは僕が追加しています…

GraalでのTrace Register Allocation

Graalのレジスタ割り付けアルゴリズムはlinear scan allocationでした。 jyukutyo.hatenablog.com ただ、org.graalvm.compiler.lir.phases.AllocationStageクラスを見ていると、こういうコードでした。 public class AllocationStage extends LIRPhaseSuite<AllocationContext> </allocationcontext>…