狠狠撸

狠狠撸Share a Scribd company logo
Openjdk を触ってみた
話
LINE Corp
@tokuhirom
触ったよ
? 触るのはかんたんでした
? 主に質問したら @sugarlife さんが答えてくれた(
過去のスライドの URL を教えてくれた) のでか
んたんでした
結論
? @sugarlife さんの過去スライドを全部読めばい
ける
おさらい
? 最近の oraclejdk は openjdk ベース
? oraclejdk にしか入ってないコードもある
? パッチを送るなら openjdk に送ればいい
ビルドしてみる
? mercurial です
? hg clone http://hg.openjdk.java.net/jdk9/dev 9dev
? bash ./get_source.sh
? make
中身
? だいたい C++ or Java で書かれている
? わかりやすい
? 歴史を感じるコードはめっちゃある
? Network まわりの挙動とか hsperfdata とか触ると
きにはソース手元にあったほうが便利
go-hsperfdata
? hsperfdata を golang で解析する。
? jcmd とかでできることがだいたいできる
? ソース読んだらなんとなく動いた
? java 起動しなくていいので起動はやくて便利
? https://github.com/tokuhirom/go-hsperfdata
openjdk 便利
? ちょろっとソースいじったら自分専用の syntax
変えた javac とか作れる
? → 作ってみた
Java 言語におけるよくある不満
? 文字列リテラルが貧弱
? 改行を含むような時文字列を書きたいけど無理
? SQL とか。。
Tokenizer いじればできるな
あ
? 検索すると JavaTokenizer.java ってのがあるぞ
? これをいじればよさそうだ?
いじった
1 diff -r 6e14043ceae4 src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java
2 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Thu Aug 11 15:47:10 2016 +0000
3 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Tue Aug 30 06:13:27 2016 +0900
4 @@ -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 """ literal
14 + 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 "" literal
36 + 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 == '"') {
サンプル
public class Foo {
public static void main() {
System.out.println(“””
Hello,
World
“””);
}
}
便利?
以上です

More Related Content

Openjdk 入門してみた話

  • 2. 触ったよ ? 触るのはかんたんでした ? 主に質問したら @sugarlife さんが答えてくれた( 過去のスライドの URL を教えてくれた) のでか んたんでした
  • 4. おさらい ? 最近の oraclejdk は openjdk ベース ? oraclejdk にしか入ってないコードもある ? パッチを送るなら openjdk に送ればいい
  • 5. ビルドしてみる ? mercurial です ? hg clone http://hg.openjdk.java.net/jdk9/dev 9dev ? bash ./get_source.sh ? make
  • 6. 中身 ? だいたい C++ or Java で書かれている ? わかりやすい ? 歴史を感じるコードはめっちゃある ? Network まわりの挙動とか hsperfdata とか触ると きにはソース手元にあったほうが便利
  • 7. go-hsperfdata ? hsperfdata を golang で解析する。 ? jcmd とかでできることがだいたいできる ? ソース読んだらなんとなく動いた ? java 起動しなくていいので起動はやくて便利 ? https://github.com/tokuhirom/go-hsperfdata
  • 8. openjdk 便利 ? ちょろっとソースいじったら自分専用の syntax 変えた javac とか作れる ? → 作ってみた
  • 9. Java 言語におけるよくある不満 ? 文字列リテラルが貧弱 ? 改行を含むような時文字列を書きたいけど無理 ? SQL とか。。
  • 10. Tokenizer いじればできるな あ ? 検索すると JavaTokenizer.java ってのがあるぞ ? これをいじればよさそうだ?
  • 11. いじった 1 diff -r 6e14043ceae4 src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java 2 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Thu Aug 11 15:47:10 2016 +0000 3 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Tue Aug 30 06:13:27 2016 +0900 4 @@ -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 """ literal 14 + 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 "" literal 36 + 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 == '"') {
  • 12. サンプル public class Foo { public static void main() { System.out.println(“”” Hello, World “””); } }