Openjdk 入門してみた話

14
Openjdk ををををををを LINE Corp @tokuhirom

Transcript of Openjdk 入門してみた話

Page 1: Openjdk 入門してみた話

Openjdk を触ってみた話LINE Corp

@tokuhirom

Page 2: Openjdk 入門してみた話

触ったよ• 触るのはかんたんでした• 主に質問したら @sugarlife さんが答えてくれた ( 過去のスライドの URL を教えてくれた ) のでかんたんでした

Page 3: Openjdk 入門してみた話

結論

• @sugarlife さんの過去スライドを全部読めばいける

Page 4: Openjdk 入門してみた話

おさらい• 最近の oraclejdk は openjdk ベース• oraclejdk にしか入ってないコードもある• パッチを送るなら openjdk に送ればいい

Page 5: Openjdk 入門してみた話

ビルドしてみる• mercurial です• hg clone

http://hg.openjdk.java.net/jdk9/dev 9dev• bash ./get_source.sh• make

Page 6: Openjdk 入門してみた話

中身• だいたい C++ or Java で書かれている• わかりやすい

• 歴史を感じるコードはめっちゃある

• Network まわりの挙動とか hsperfdata とか触るときにはソース手元にあったほうが便利

Page 7: Openjdk 入門してみた話

go-hsperfdata• hsperfdata を golang で解析する。

• jcmd とかでできることがだいたいできる• ソース読んだらなんとなく動いた• java 起動しなくていいので起動はやくて便利

• https://github.com/tokuhirom/go-hsperfdata

Page 8: Openjdk 入門してみた話

openjdk 便利• ちょろっとソースいじったら自分専用の syntax 変えた javac とか作れる• → 作ってみた

Page 9: Openjdk 入門してみた話

Java 言語におけるよくある不満• 文字列リテラルが貧弱• 改行を含むような時文字列を書きたいけど無理• SQL とか。。

Page 10: Openjdk 入門してみた話

Tokenizer いじればできるなあ• 検索すると JavaTokenizer.java ってのがあるぞ• これをいじればよさそうだ〜

Page 11: Openjdk 入門してみた話

いじった1 diff -r 6e14043ceae4 src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java2 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Thu Aug 11 15:47:10 2016 +00003 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Tue Aug 30 06:13:27 2016 +09004 @@ -629,6 +629,39 @@5 break loop;6 case '\"':7 reader.scanChar();8 +9 + if (reader.ch == '\"' && reader.bp < reader.buflen) {10 + reader.scanChar();11 + if (reader.ch == '\"' && reader.bp < reader.buflen) { // """12 + reader.scanChar();13 + while (reader.bp < reader.buflen) { // allow CR, LF in """ literal14 + if (reader.ch == '\"' && reader.bp < reader.buflen) {15 + reader.scanChar();16 + if (reader.ch == '\"' && reader.bp < reader.buflen) {17 + reader.scanChar();18 + if (reader.ch == '\"' && reader.bp < reader.buflen) {19 + tk = TokenKind.STRINGLITERAL;20 + reader.scanChar();21 + break loop;22 + } else {23 + reader.putChar('"');24 + reader.putChar('"');25 + }26 + } else {27 + reader.putChar('"');28 + }29 + } else {30 + scanLitChar(pos);31 + }32 + }33 + lexError(pos, "unclosed.str.lit");34 + break loop;35 + } else { // Empty "" literal36 + tk = TokenKind.STRINGLITERAL;37 + break loop;38 + }39 + }40 +41 while (reader.ch != '\"' && reader.ch != CR && reader.ch != LF && reader.bp < reader.buflen)42 scanLitChar(pos);43 if (reader.ch == '\"') {

Page 12: Openjdk 入門してみた話

サンプルpublic class Foo {

public static void main() {

System.out.println(“””

Hello,

World“””);

}

}

Page 13: Openjdk 入門してみた話

便利〜

Page 14: Openjdk 入門してみた話

以上です