SlideShare une entreprise Scribd logo
1  sur  14
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
“””);
}
}
便利〜
以上です

Contenu connexe

Tendances

How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
akirahiguchi
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
Akio Ishida
 
TCP connectionの保存と復元
TCP connectionの保存と復元TCP connectionの保存と復元
TCP connectionの保存と復元
mittyorz
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
 
OpenSSH User EnumerationTime-Based Attack と Python-paramiko
OpenSSH User EnumerationTime-Based Attack と Python-paramikoOpenSSH User EnumerationTime-Based Attack と Python-paramiko
OpenSSH User EnumerationTime-Based Attack と Python-paramiko
(^-^) togakushi
 

Tendances (20)

CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
誰得コマンド&オプション35連発
誰得コマンド&オプション35連発誰得コマンド&オプション35連発
誰得コマンド&オプション35連発
 
SSH Tips & Tricks
SSH Tips & TricksSSH Tips & Tricks
SSH Tips & Tricks
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
リトライでtime.Sleepを使ったら積んだ話
リトライでtime.Sleepを使ったら積んだ話リトライでtime.Sleepを使ったら積んだ話
リトライでtime.Sleepを使ったら積んだ話
 
Mongo dbのgridfsについて
Mongo dbのgridfsについてMongo dbのgridfsについて
Mongo dbのgridfsについて
 
Jailが起動しないので調査してみた
Jailが起動しないので調査してみたJailが起動しないので調査してみた
Jailが起動しないので調査してみた
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
TCP connectionの保存と復元
TCP connectionの保存と復元TCP connectionの保存と復元
TCP connectionの保存と復元
 
FreeBSDでおうちのルーター
FreeBSDでおうちのルーターFreeBSDでおうちのルーター
FreeBSDでおうちのルーター
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
 
Json rpc 2_0
Json rpc 2_0Json rpc 2_0
Json rpc 2_0
 
about Tcpreplay
about Tcpreplayabout Tcpreplay
about Tcpreplay
 
SSH力をつけよう
SSH力をつけようSSH力をつけよう
SSH力をつけよう
 
ret2libc
ret2libcret2libc
ret2libc
 
OpenSSH User EnumerationTime-Based Attack と Python-paramiko
OpenSSH User EnumerationTime-Based Attack と Python-paramikoOpenSSH User EnumerationTime-Based Attack と Python-paramiko
OpenSSH User EnumerationTime-Based Attack と Python-paramiko
 

En vedette

Beautiful Audi for sale, slight body damage
Beautiful Audi for sale, slight body damageBeautiful Audi for sale, slight body damage
Beautiful Audi for sale, slight body damage
Andrew Rosca
 
Ideal career framework for men
Ideal career framework for menIdeal career framework for men
Ideal career framework for men
success4employees
 

En vedette (20)

Fluency - Yet another fluent logger
Fluency - Yet another fluent loggerFluency - Yet another fluent logger
Fluency - Yet another fluent logger
 
jcmd #javacasual
jcmd #javacasualjcmd #javacasual
jcmd #javacasual
 
How to cook lettuce @Java casual
How to cook lettuce @Java casualHow to cook lettuce @Java casual
How to cook lettuce @Java casual
 
SCM, CI and Maven Repo
SCM, CI and Maven RepoSCM, CI and Maven Repo
SCM, CI and Maven Repo
 
properties, yaml, and me
properties, yaml, and meproperties, yaml, and me
properties, yaml, and me
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
 
アメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpringアメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpring
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
 
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
 
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
今どきのアーキテクチャ設計戦略 - QCon Tokyo 2016
 
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイントドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
 
Archer
ArcherArcher
Archer
 
Devel::NYTProf::Apache
Devel::NYTProf::ApacheDevel::NYTProf::Apache
Devel::NYTProf::Apache
 
Beautiful Audi for sale, slight body damage
Beautiful Audi for sale, slight body damageBeautiful Audi for sale, slight body damage
Beautiful Audi for sale, slight body damage
 
Ideal career framework for men
Ideal career framework for menIdeal career framework for men
Ideal career framework for men
 
madeye agents
madeye agentsmadeye agents
madeye agents
 

Plus de Tokuhiro Matsuno

最近のPerlバイナリマネージャー Perl 編
最近のPerlバイナリマネージャー Perl 編最近のPerlバイナリマネージャー Perl 編
最近のPerlバイナリマネージャー Perl 編
Tokuhiro Matsuno
 
Server::Starter meets Java
Server::Starter meets JavaServer::Starter meets Java
Server::Starter meets Java
Tokuhiro Matsuno
 
MySQL のチューニングについて考えてみた
MySQL のチューニングについて考えてみたMySQL のチューニングについて考えてみた
MySQL のチューニングについて考えてみた
Tokuhiro Matsuno
 

Plus de Tokuhiro Matsuno (20)

20190126 yapc tokyo keynote
20190126 yapc tokyo keynote 20190126 yapc tokyo keynote
20190126 yapc tokyo keynote
 
最近のPerlバイナリマネージャー Perl 編
最近のPerlバイナリマネージャー Perl 編最近のPerlバイナリマネージャー Perl 編
最近のPerlバイナリマネージャー Perl 編
 
Plenv and perl build, and search.cpan.org
Plenv and perl build, and search.cpan.orgPlenv and perl build, and search.cpan.org
Plenv and perl build, and search.cpan.org
 
MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介  MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介
 
Yapc fukuoka crust
Yapc fukuoka crustYapc fukuoka crust
Yapc fukuoka crust
 
Perl6 と web 開発と
Perl6 と web 開発とPerl6 と web 開発と
Perl6 と web 開発と
 
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
 
Perl6 web-app
Perl6 web-appPerl6 web-app
Perl6 web-app
 
Perl6 meets JVM
Perl6 meets JVMPerl6 meets JVM
Perl6 meets JVM
 
Server::Starter meets Java
Server::Starter meets JavaServer::Starter meets Java
Server::Starter meets Java
 
Java web application testing
Java web application testingJava web application testing
Java web application testing
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
 
[jjug] Java と Benchmark
[jjug] Java と Benchmark[jjug] Java と Benchmark
[jjug] Java と Benchmark
 
MySQL のチューニングについて考えてみた
MySQL のチューニングについて考えてみたMySQL のチューニングについて考えてみた
MySQL のチューニングについて考えてみた
 
MySQL::NameLocker
MySQL::NameLockerMySQL::NameLocker
MySQL::NameLocker
 
Inside MF
Inside MFInside MF
Inside MF
 
Web Application FLow
Web Application FLowWeb Application FLow
Web Application FLow
 
madeye classes
madeye classesmadeye classes
madeye classes
 
How to generate CSV from HTML with Sledge.
How to generate CSV from HTML with Sledge.How to generate CSV from HTML with Sledge.
How to generate CSV from HTML with Sledge.
 

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 “””); } }