名古屋Javaユーザグループ2018年4月に参加してバイトコードについて考えた #nagoya_jug
地方(?)イベント初参加
よく"出張のついでに地方のイベントに参加"なんて話を聞くことがあり、そんな都合のいい事があるかいな、と思っていましたが、幸運なことにそれが訪れたので初参加です。(勝手がわからないので緊張しますね)
smogamiさん: NJUG紹介・参加者の自己紹介
全員自己紹介するのって初めてだったので緊張。
「飲み歩きが趣味で、バーでたまたま隣に居た人がPHPerでtype safetyでケンカしかけた」など全PHPerを敵に回すようなブッコミをしてしまいスミマセン。事実に変わりないですが、ちょっと面白い事言おうとしただけです。
(スクリプト言語好きですよ!)
sh-ogawa さん: テストコードと運用
テストとCI。カバレッジ100%を目指すなとか、エラーを放置するなとか、そんな話。
Sonar Qube使ってみよう。Dockerリポジトリはここ。
https://hub.docker.com/_/sonarqube/
質問でWork In Progress Pull Request開発の話が出ましたが、これってちゃんと用語があってドキュメントに纏まっていたんですね。
https://ben.straub.cc/2015/04/02/wip-pull-request/
PRのタイトルが変わってhookが取れないと質問していましたが、そうなのかな。。
bleit-tift さん: JVM入門
はじめて書いたプログラミング言語がコンパイラという猛者の、JVMについてのとてもわかりやすい解説。
CASLとかZ80でアセンブリとかをやっていた身としては、バイトコードも結局脳内デバッグとあまり変わらないな、という印象だったのですが、後の発表でさっそく活きる場面が。
skrbさん: Project Amberの話
Project CoinがSmall Lang. ChangesならAmberはSmall to Big Lang. Changesということで、各JEPにより言語仕様がどう変わっていくのか、という話。
Javaは最近では他の言語仕様の影響や、周辺ライブラリの影響を受けて進化している印象がありますが、今回も同じです。
内容については既に公開されているスライドを見て頂くとして、感想としてはJEP 326 Raw String Literalsに変数のバインディングができるともっといいのにと思いました。
var weather = "sunny";
System.out.println(`It's a ${weather} day today.`);
(コンパイルしたらnew StringBuilder().append().append().toString()やString.formatと等価になるとか)
yuji38kwmtさん: Java7からJava8に移行した際にClassCastException発生
P14. Java8ではhogeの型パラメータはchar、とあるが実際はObjectで変わらず。
これはEclipse Compilerの間違い。
バイトコード上でcheckcastが入るJava8だとエラー。
会場でもなぜJava7だと入らないんだろう…もしかしてこっそり修正された?との話も。
下の画像で比較してみました。左側がJava7、右側がJava8です。
確かに右側(Java8)には、59行目にcheckcastが入っているのが確認できます。
ここで、実行時エラーになるわけですね。
更に見ていくと、ジェネリクスのメソッドhoge()内の定数"hoge"が、Java7ではString、Java8ではcharになっていることが確認できます。
#4 = String #13 // hoge
#13 = Utf8 hoge
#3 = Class #22 // "[C"
#22 = Utf8 [C
コンパイル時のジェネリクスの型消去の際にStringではなくchar[]で生成されるようになっています。こちらも気になります。
先のセッションでバイトコードの話を聞いていたので、アレルギーなく読めました^^
まとめ
- javapだいじ
- javapが少し身近になった
内容の組み合わせや順序がとても良かったように感じました。
懇親会まで行けたら本当は良かったのですが、他にもやることがあったので退散してしまった。会場挙手時点で50%ぐらい挙がってたのが意外(?)でした。