Javaãåµãã
ãã®è¨äºã¯Java Advent Calendarã®13æ¥ç®ã®è¨äºã§ãï¼
æ¨æ¥ã¯@kisããã®Java SE 8でパターンマッチを実装するã§ããï¼
ææ¥ã¯@megascusããã§ãï¼
çããã¯ããããæ®æ®µããJavaã使ã£ã¦ããã°ã©ã ãä½ã£ã¦ãããã¨æãã¾ãï¼
ãããªçããã¯Javaè¨èªã«ã¤ãã¦å¤ãã®æãã»æ³ããæã£ã¦ãããã¨æãã¾ãï¼
ä¾ãã°ï¼ããããªäºãã§ãããè¯ãã®ã«ãã ã£ããï¼ããããè¯ããªããã ããªããã¨ãã£ãå
·åã§ãï¼
ãããã£ãè¨èªç¹å¾´ã®è¿½å ãæ¹åãèªåã®æã§ã§ãããç´ æµã ã¨æãã¾ãããï¼
幸ãJavaã¯OpenJDKã¨ãããªã¼ãã³ã½ã¼ã¹ããã¸ã§ã¯ãã§éçºãè¡ããã¦ããï¼ç¬¬ä¸è
ã®åéã§ãã½ã¼ã¹ã³ã¼ããæã«å
¥ãèªç±ã«å¤æ´ãå ãããã¨ãã§ãã¾ãï¼*1
ãã®è¨äºã§ã¯è¨èªã®æ¡å¼µã®ä»æ¹ãè¿°ã¹ï¼OpenJDKãå®éã«ç¨ãã¦æ¥µã ç°¡åãªè¨èªç¹å¾´ãå®è£ ãã¦ã¿ã¾ãï¼
ã³ã³ãã¤ã©æ¦è¦
ã³ã³ãã¤ã©ã®æ¦è¦ã«ã¤ãã¦è»½ãè¿°ã¹ã¦ããã¾ãï¼
ããæ·±ãç¥èã«ã¤ãã¦ã¯ã³ã³ãã¤ã©é¢é£ã®æ¸ç±ãåèã«ãã¦ãã ããï¼
ã¾ãã³ã³ãã¤ã©ã¯ã½ã¼ã¹ã³ã¼ãã¨ãããæåãã®ä¸¦ã³ãããã¼ã¯ã³ãã®ä¸¦ã³(ãã¼ã¯ã³å)ã«å¤æãã¾ãï¼*2
ãã®å¤æãè¡ãªãã®ããã¼ã«ãã¤ã¶ã§ãï¼
ä¾ãã°Javaã®æ¬¡ã®ã³ã¼ãã¯ä»¥ä¸ã®ãããªãã¼ã¯ã³åã¨ãã¦è§£éããã¾ã
public static void main(String[] args) {}
PUBLIC
STATIC
VOID
IDENT("main")
LPAREN
IDENT("String")
LBRACKET
RBRACKET
IDENT("args")
RPAREN
LBRACE
RBRACE
ç¶ãã¦ãã®ãã¼ã¯ã³åãã·ã³ã¿ãã¯ã¹(æ§æ)ã«å¾ããã¼ã¹ãã¦ããã¾ãï¼
ããã¦ãã®çµæã¨ãã¦æ½è±¡æ§ææ¨(AST)ãçæãã¾ãï¼
ãã®æã«ã·ã³ã¿ãã¯ã¹ä¸ã®èª¤ããæ¤åºããã¾ãï¼
以éã¯ãã®æ½è±¡æ§ææ¨ãå
ã«ã»ãã³ãã£ãã¯ã¹(æå³è«)ã®æ¤æ»ãªã©ãè¡ãã¾ãï¼
ãã®æ®µéã§ã¯ã»ãã³ãã£ãã¯ã¹ä¸ã®èª¤ããæ¤åºããã¾ãï¼
ã»ãã³ãã£ãã¯ã¹ã®æ¤æ»ãªã©ãçµããã°ã³ã³ãã¤ã©ã¯ã³ã¼ãçæãè¡ãã¾ãï¼
Javaã®å ´åã§ã¯ã¯ã©ã¹ãã¡ã¤ã«ã§ããï¼
è¨èªç¹å¾´ã追å ããéã®æµã
è¨èªç¹å¾´ã追å ããéã¯ã¾ãè¨è¨ãè¡ãå®è£ ãè¡ãªã£ã¦ããã¾ãï¼
è¨è¨æ®µéã§ã¯ããããã©ã®ãããªç¹å¾´ãå®è£
ããã®ããã©ã®ãããªæ§æã«ããã®ãï¼ã¾ããã®ç¹å¾´ãã©ã®ãããªæå³è«ãæã¤ã®ããªã©ãæ¤è¨ãã¾ãï¼
ã¾ãï¼å¿
è¦ã§ããã°ãã¤ãã³ã¼ãå½ä»¤ã®æ¡å¼µãæ¤è¨ãã¾ãï¼
ç¶ãã¦å®è£ ãè¡ãã¾ãï¼
ãã¼ã«ãã¤ã¶ã»ãã¼ãµã®å®è£
é常ï¼æ°ããªç¹å¾´ã追å ããå ´åã¯æ°ããªæ§æã追å ãããï¼æ¢åã®æ§æãå¤æ´ããããããããã¼ãµã®å®è£
ãå¤ããå¿
è¦ãåºã¦ãã¾ãï¼
OpenJDKã§ã¯com.sun.tools.javac.parser.JavacParserãªã©ãå¼ãã¾ãï¼
ã¾ãï¼æ°ããªäºç´èªã追å ããå ´åãªã©ã¯ãã¼ã«ãã¤ã¶ãå¤æ´ããå¿
è¦ãããã¾ãï¼
ä¾ãã°enumã追å ããéã2é²æ°æ°å¤ã®è¿½å ãã©ã ãå¼ã追å ããéã«ã¯å¿
è¦ã§ããï¼
OpenJDKã§ã¯com.sun.tools.javac.parser.Tokensãcom.sun.tools.javac.parser.JavaTokenizerãªã©ãå¤æ´ãã¾ãï¼
ASTããã³ã¼ãçæã¾ã§ã®å®è£
ããã追å ããç¹å¾´ãæ¢åã®æ½è±¡æ§ææ¨ã«è½ã¨ããããªããã°æ°ããªæ½è±¡æ§ææ¨ãå®ç¾©ããå¿
è¦ãããã¾ãï¼
OpenJDKã§ã¯com.sun.tools.javac.tree.JCTreeãcom.sun.tools.javac.tree.TreeMakerãcom.sun.tools.javac.tree.JCTree.Visitorãç¶æ¿ãããã¹ã¦ã®ã¯ã©ã¹ãå¤æ´ãã¾ãï¼
ããã§ã¯æ°ããæ½è±¡æ§ææ¨ãæ¢åã®æ½è±¡æ§ææ¨ã¸å¸°çãããå¦çãã·ã³ãã«åãã»ãã³ãã£ãã¯ã¹ã®æ¤æ»ãªã©ãå®è£
ãã¾ãï¼
com.sun.tools.javac.compããã±ã¼ã¸ãcom.sun.tools.javac.codeããã±ã¼ã¸ããããå¤æ´ããå¿
è¦ãããã¾ãï¼
ã³ã¼ãçæã®å®è£
ãããæ°ããç¹å¾´ãæ°ããªã³ã¼ããçæããªããã°ãããªãå ´åã¯ã³ã¼ãçæç³»ã®å¦çã«å¤æ´ãå ãã¾ãï¼
com.sun.tools.javac.jvm,comp,codeãªã©ãå¤æ´ãã¾ãï¼
OpenJDKããã«ããã
ã§ã¯ï¼ã¾ãã¯ããã«OpenJDKã®ã½ã¼ã¹ã³ã¼ããæã«å
¥ãã¦ãã«ãããã¦ã¿ã¾ãããï¼
ãããã§ããªããã°å®è£
ããã¦ä½¿ã£ã¦ã¿ãã¨ãã£ãäºãã§ããªãã§ããï¼
åã®ç°å¢ãUbuntuãªã®ã§ããã§ã¯Ubuntuãã¼ã¹ã§è©±ãé²ãã¾ãï¼
OpenJDKã®ã½ã¼ã¹ã³ã¼ãã¯Mercurialã§ç®¡çããã¦ããã®ã§ã¾ãã¯Mercurialãæã«å ¥ãã¾ãããï¼
% sudo aptitude install mercurial
Mercurialãæã«å
¥ã£ããOpenJDKã®ã½ã¼ã¹ã³ã¼ããæã«å
¥ãã¾ãããï¼
ä»åã¯ç¾å¨éçºä¸ã®jdk8/tlã¨ãããªãã¸ããªã使ãã¾ãï¼
jdk7ã¨ã¯ãã«ãã®æé ãå¾®å¦ã«éãã¾ãã®ã§æ³¨æãã¦ãã ããï¼
% hg clone http://hg.openjdk.java.net/jdk8/tl MyJDK
ãããã1åãããããã«ã¯ãã¼ã³ãçµãããã¨æãã¾ãï¼
å®ã¯ããã ãã§ã¯ãã¹ã¦ã®ã½ã¼ã¹ã³ã¼ããæã«å
¥ãããã¨ã¯ã§ãã¾ããï¼
OpenJDKã®ã³ã¼ãã¯åéå¥ã§ãªãã¸ããªãåããã¦ããããããããåå¥ã§ã¯ãã¼ã³ããªããã°ãªãã¾ããï¼
ãã®ããã®ã¹ã¯ãªãããä»ã¯ãã¼ã³ãããªãã¸ããªã«ãããããããå®è¡ãã¾ãããï¼
% cd MyJDK % sh ./get_source.sh
ãã®ã¹ã¯ãªãããå®è¡ãããã¨ã§ãã«ãã«å¿
è¦ãªãã¹ã¦ã®ã½ã¼ã¹ã³ã¼ããæã«å
¥ãããã¨ãã§ãã¾ãï¼
ãããã¯ã¼ã¯ã®é½åã«ãããã¾ããæ°åç¨åº¦æãããã¨æãã¾ãï¼
以ä¸ã§ãã¹ã¦ã®ã½ã¼ã¹ã³ã¼ããæã«å ¥ãããã¨ãã§ãããã¨æãã¾ãï¼
å½¹å²ã§ãªãã¸ããªããããã¦ããã¨è¿°ã¹ã¾ãããï¼JDK8ã®OpenJDKã®ãªãã¸ããªã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãï¼
ãªãã¸ããªå | 説æ |
---|---|
.(root) | è¨å®ãmakeã®ä»çµã¿ãæä¾ |
hotspot | JVM(hotspot)ã®ã½ã¼ã¹ã³ã¼ãé¡ |
langtools | javacãªã©ã®è¨èªå¦çã®ãã¼ã«ã®ã½ã¼ã¹ã³ã¼ãé¡ |
jdk | ã³ã¢ã©ã¤ãã©ãªã®ã½ã¼ã¹ã³ã¼ã |
jaxp | JAXPã®ã½ã¼ã¹ã³ã¼ã |
jaxws | JAX-WSã®ã½ã¼ã¹ã³ã¼ã |
corba | Corbaã®ã½ã¼ã¹ã³ã¼ã |
nashorn | nashorn(JSã®å®è£ )ã®ã½ã¼ã¹ã³ã¼ã |
è¨èªç¹å¾´ã®è¿½å ã§ã¯langtoolsã¨hotspotã®ãªãã¸ããªã«å¯¾ãã¦å¤æ´ãå ãã¦ããã¾ãï¼
ããããã¯OpenJDKããã«ããã¦è¡ãã¾ãããï¼
ãã«ãã«ããã£ã¦ã¯ãMyJDK/README-builds.htmlãã¨ãããã¡ã¤ã«ãåèã«ãªãã¾ãï¼
è±èªã«ãªãã¾ããï¼åãã©ãããã©ã¼ã ãã¨ã®ãã«ãã®ä»æ¹ãæ¸ãã¦ããã¾ãï¼
ã¾ãï¼OpenJDKããã«ãã«ä¾åããããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ãã¾ãããï¼
% sudo aptitude build-dep openjdk-7-jdk % sudo aptitude install openjdk-7-jdk libmotif-dev
ç¶ãã¦configureãå®è¡ãã¾ãï¼
% bash ./configure.sh
configureãéãã°ãã«ãã§ãã¾ãã®ã§ãã«ããã¾ãããï¼
% make all
allãæå®ãããã¨ã«ãã£ã¦ã¤ã¡ã¼ã¸ã®ä½æãè¡ãªã£ã¦ããã¾ãï¼
使ç¨ããã³ã³ãã¥ã¼ã¿ã®æ§è½ã«å·¦å³ããã¾ãã30åãã1æéãããæããããããã¾ããï¼
ãããconfigureãmakeã失æããã以ä¸ã®è¨å®ãé©ç¨ãã¦ã¿ã¦ããä¸åº¦è¡ãªã£ã¦ã¿ã¦ãã ããï¼
export LANG=C export PATH="/usr/lib/jvm/java-7-openjdk/bin:${PATH}"
ãã«ããåºæ¥ãã°è¨èªç¹å¾´ã«å¤æ´ãå ãã¦è¡ãã¾ãããï¼
Javaã«æ°ããªç¹å¾´ã追å ãã
ã§ã¯ï¼æ°ããªç¹å¾´ã追å ãã¦è¡ãã¾ãããï¼
ä»åã¯ç°¡åãªä¾ã¨ãã¦å¾ç½®ãã£ã¹ãå¼ã追å ãã¾ãï¼
ã¾ãï¼æåã«å¾ç½®ãã£ã¹ãå¼ã«ã¤ãã¦èª¬æãã¦ããã¾ãããï¼
Javaã¯Cè¨èªãªã©ã¨åæ§ã«åç½®ãã£ã¹ãå¼ãæ¡ç¨ãã¦ããï¼ãã£ã¹ãæ¼ç®åããã£ã¹ããããå¼ã®åã«æ¸ãã¨ãããã®ã§ãï¼
以ä¸ã¯ä¸ä¾ã§ãï¼ä»¥ä¸ã®ãããªä¾ã§ããã°ã¸ã§ããªã¯ã¹ãªãã使ãã¹ãã§ãï¼
String s = (String)l.get();
ãã®åç½®ãã£ã¹ãå¼ã¯ã¡ã½ãããã§ã¤ã³ã®å ´åãªã©ã§ã¯ãã£ã¹ããã対象ã()ã§å²ãã§æ示ããªããã°ãªãã()ãããã¿èªã¿ã«ãããªãå ´åãããã¾ãï¼
int len = ((String)l.get()).length();
ãã®ãããScalaãªã©ã§ã¯ãã£ã¹ãæ¼ç®åããã£ã¹ããããå¼ã®å¾ã«æ¸ããããªã¹ã¿ã¤ã«ãæ¡ç¨ãã¦ãã¾ãï¼*3
val len = l.get.asInstanceOf[String].length
å
ç¨ã®ä¾ãããã¯é·ããªã£ã¦ãã¾ãã¾ãããï¼å·¦ããå³ã¸ã¨ããå¼ã®æµããç¶æããæµããããã«èªããã¨ãã§ããããã«ãªã£ã¦ãããã¨æãã¾ãï¼
ããã¨åæ§ã®æ©è½ãJavaã®è¨èªã®ç¹å¾´ã¨ãã¦å®è£
ãã¦ã¿ã¾ãããï¼
ã·ã³ã¿ãã¯ã¹ã®è¨è¨
æåã«è¿°ã¹ãéãã·ã³ã¿ãã¯ã¹ã®è¨è¨ããè¡ãã¾ãããï¼
åºæ¬çãªã·ã³ã¿ãã¯ã¹ã¯Scalaã®ãã®ãè¸è¥²ãã¾ãããï¼
Scalaã®ãã®ã¯ããã¾ã§ãã ã®ã¡ã½ããå¼ã³åºãã§ããï¼ãããæ§æã¨ãã¦æããå ´åã¯æ¬¡ã®ããã«ãªãã¾ãï¼
expr DOT asInstanceOf LBRACKET type RBRACKET
ããã§ã¯DOTã¯.ãLBRACKETã¯[ãRBRACKETã¯]ã示ãã¦ãã¾ãï¼
ã¾ãï¼exprã¯ä½ããã®å¼ãï¼typeã¯ä½ããã®åã示ãã¦ãã¾ãï¼
ãããå
ã«Javaãããã·ã³ã¿ãã¯ã¹ãèãã¦ã¿ã¾ãï¼
ã¾ãï¼Javaã«ã¯asInstanceOfã«åé¢ãä¼¼ãinstanceofã¨ããäºç´èªãããã¾ãï¼ãããasInstanceOfã®ä»£ããã«ä½¿ãã¾ãããï¼
ããã¦ï¼Javaã§ã¯åãå²ãæ§ãªè¨å·ã¯[]ã§ã¯ãªã<>ã使ã£ã¦ãã¾ãã®ã§ããã使ãããã«ãã¾ãããï¼
ããããå
ã«ããã¨ä»¥ä¸ã®ãããªã·ã³ã¿ãã¯ã¹ã«ãªãã¾ãï¼
expr DOT INSTANCEOF LT type GT
INSTANCEOFã¯instanceofã¨ããäºç´èªãï¼LTã¨GTã¯<ã¨>ã示ãã¦ãã¾ãï¼
å ç¨ã®ä¾ããã®æ§æã§æ¸ãã¨æ¬¡ã®ããã«ãªãã¾ãï¼
int len = l.get().instanceof<String>.length():
ã»ãã³ãã£ãã¯ã¹ã®è¨è¨
ç¶ãã¦ã»ãã³ãã£ãã¯ã¹ã®è¨è¨ããã¾ãããï¼
ã»ãã³ãã£ãã¯ã¹ã¯Javaã®ä»ã¾ã§ã®ãã£ã¹ãå¼ã¨åãã¨ãã¾ãããï¼
æ¬æ¥ã§ããã°ããã®å ´åã«ã¯ãã®ãããªæå³ãæã¤ãã§ãã£ããï¼ããã®ãããªå ´åã¯ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªããã¨ãã£ããããªãã¨ãæ°ãã«æ±ºããªããã°ãªãã¾ããï¼
ä»åã¯é½åããæ¢ã«Javaã«åæ§ã®ã»ãã³ãã£ãã¯ã¹ãåå¨ãã¦ãããããããæµç¨ãã¾ããï¼*4
ã»ãã³ãã£ãã¯ã¹ãåãã§ããããAST以éã¯ä»ã¾ã§ã®ãã£ã¹ãå¼ã¨åãç©ã使ãã¾ãï¼
ãã®ããã»ãã³ãã£ãã¯ã¹å¨ãã®å®è£
ã¯ã»ã¨ãã©ããã¾ããï¼*5
以ä¸ã§è¨è¨ã¯çµããã§ãï¼
ç¶ãã¦å®è£ ãè¡ãªã£ã¦è¡ãã¾ãããï¼
ãã¼ãµï¼ãã¼ã«ãã¤ã¶ã®å®è£
æ°ããªæ§æãä»ãå ãã¾ããï¼æ°ããªäºç´èªãå°å ¥ãããã¯ãã¾ããã®ã§ãã¼ã«ãã¤ã¶ãå¼ãå¿ è¦ã¯ããã¾ããï¼
ãã¼ãµã«å¤æ´ãå ããã®ã§langtoolsã®com.sun.tools.javac.parser.JavacParserãéãã¾ãããï¼
éããã¡ã¤ã«ã¯MyJDK/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.javaã«ããã¾ãï¼
Javaã®ãã¼ãµã§.ã§ç¹ãããå¼ã®è§£éã¯æ¬¡ã®äºã¤ã§å¥ãã¦ããï¼å¥ã
ã®ç®æã§è¡ããã¦ãã¾ãï¼
IDENT DOT ã
ãã®ä» DOT ã
IDENTã¯èå¥åã®ãã¨ã§ãï¼
IDENT DOT ãã§instanceOf<...>ãåãä»ããããã«æ¸ãæãã¾ãããï¼
該å½ããé¨åã¯1203è¡ç®ãããã§ãï¼
ããªãéä¸ãçç¥ãã¦ãã¾ãï¼
JavacParser#term3
case UNDERSCORE: case IDENTIFIER: case ASSERT: case ENUM: switch (token.kind) { case DOT: switch (token.kind) { case INSTANCEOF: if (typeArgs != null) return illegal(); // ident.<Type>instanceofã»ã»ã»ã¨ãªã£ã¦ãããã¨ã©ã¼ nextToken(); // INSTANCEOFãèªã¿é£ã°ã accept(LT); // 次ã®ãã¼ã¯ã³ãèªã¿åãLT(<)ã§ãªããã°ã¨ã©ã¼ // Create TypeCast tree accept(GT); // 次ã®ãã¼ã¯ã³ãèªã¿åãGT(>)ã§ãªããã°ã¨ã©ã¼ break loop; } }
ã³ã¡ã³ããæ¸ãã¦ãã¾ãã®ã§é°å²æ°ã¯ä¼ããã¨æãã¾ãï¼
ãã®ããã«æ¸ããã¨ã§ident.instanceof<>ã¨ãã£ãæ§æãåãä»ãããã¨ãã§ããããã«ãªãã¾ããï¼
ç¶ãã¦ãã®ä»ã®å ´åã«ã対å¿ããã¾ãï¼
該å½ããé¨åã¯1419è¡ç®ãããã§ãï¼
å
ã»ã©ã¨åæ§ããªãã®é¨åãçç¥ãã¦ãã¾ãï¼
JavacParser#term3Rest
} else if (token.kind == DOT) { nextToken(); } else if (token.kind == INSTANCEOF && (mode & EXPR) != 0) { if (typeArgs != null) return illegal(); nextToken(); accept(LT); // Create TypeCast tree accept(GT); } else {
è¡ãªã£ã¦ããå¦çã¯å ç¨ã¨ãã¾ãå¤ãã£ã¦ãã¾ããï¼
ç¶ãã¦åã®é¨åããã¼ã¹ãï¼ãã£ã¹ãå¼ã®ASTãçæãã¾ãï¼
ããã¯æ¢åã®ãã£ã¹ãå¼ã®ãã®ãæµç¨ã§ãã¾ãï¼
ã¾ãæ¢åã®ãã®ãã¡ã½ããåãã¾ãï¼
åç½®ãã£ã¹ãå¼ããã¼ã¹ãã¦ããé¨åã¯1094è¡ç®ä»è¿ã§ã
JavacParser#term3
case CAST: accept(LPAREN); mode = TYPE; int pos1 = pos; List<JCExpression> targets = List.of(t = term3()); while (token.kind == AMP) { checkIntersectionTypesInCast(); accept(AMP); targets = targets.prepend(term3()); } if (targets.length() > 1) { t = toP(F.at(pos1).TypeIntersection(targets.reverse())); } accept(RPAREN); mode = EXPR; JCExpression t1 = term3(); return F.at(pos).TypeCast(t, t1);
ãã®ã³ã¼ããä¸é¨ã次ã®ããã«ã¡ã½ããã«æ¬ãåºãã¾ãï¼
JavacParser#parseCastType
public JCExpression parseCastType(int pos) { int pos1 = pos; JCExpression t; List<JCExpression> targets = List.of(t = term3()); while (token.kind == AMP) { checkIntersectionTypesInCast(); accept(AMP); targets = targets.prepend(term3()); } if (targets.length() > 1) { t = toP(F.at(pos1).TypeIntersection(targets.reverse())); } return t; }
ããã¦ï¼ãã£ã¹ãããã¼ã¹ããä¸ã¤ã®ã³ã¼ãã§ãã®ã¡ã½ãããå¼ã³åºãããã«ããã°å®æã§ãï¼
å®æããã½ã¼ã¹ã³ã¼ãã¯ä»¥ä¸ã®ãªãã¸ããªã«ããã¦ãã¾ãï¼
https://bitbucket.org/bitter_fox/openjdk-langtools-postfix-cast
ã¾ãï¼Diffã¯こちらã«ãªãã¾ãï¼
æå¾ã«ããä¸åº¦ãã«ããè¡ãªã£ã¦åé¡ããªãã使ã£ã¦ã¿ã¦å®æã«ãªãã¾ãï¼*6
ã¾ã¨ã
ããªãé§ã足ã§ãããJavaè¨èªãæ¡å¼µããæµãã説æãã¾ããï¼
ãã®ããã«ãã¦è¦ã¦ã¿ãã¨åéï¼ä¸è¬éçºè
ã§ãJavaãåµããæ°ããã¦ãã¾ãããï¼
Java(OpenJDK)ã¯ä»ã®OSSã¨åæ§ã«åéã®ãããªä¸è¬éçºè
ãJavaã®éçºè
(Javaãåµã人)ã¨ãã¦åãå
¥ããæ§ãªåå£ãããã¾ãï¼
ããããããæ©è½ããã£ãããããªãã¨æã人ã¯èªåã§å®è£
ããã¦ã¿ã¦ProjectCoinãAdopt a JSRã¨ãã£ãå ´ã§ææ¡ãã¦ã¿ã¦ã¯ãããã§ããããï¼
*7
ã¾ãï¼javacãªã©ã®ãã°ãè¦ã¤ããæã«ãã°ãã¬ã¼ãã¸å ±åããã®ã¯å¿è«ï¼ä¸åº¦èªåã§ç´ããªããåãçµãã§ã¿ã¦ã¯ãããã§ããããï¼
*1:å½ç¶OpenJDKã®ã©ã¤ã»ã³ã¹ã®ç¯å²å ã«ã¯ãªãã¾ããï¼
*2:OpenJDKã§ã¯ãã¼ã¹ããªããå¿ è¦ã«å¿ãã¦ãã¼ã¯ã³åãã¦ããã¾ã
*3:Scalaã§ã¯è¨èªã®ç¹å¾´ã¨è¨ãããã¯ã©ã¤ãã©ãªã®ç¹å¾´(Anyã¯ã©ã¹ã®ã¡ã½ãã)ã¨ãã¦ç¨æããã¦ãã
*4:åç½®ãã£ã¹ãå¼ã§ãã
*5:ã»ãã³ãã£ãã¯ã¹å¨ãã®å®è£ ãçç¥ã§ãããããªã楽ã«ãªãã®ã§å¾ç½®ãã£ã¹ãã¨ããç¹å¾´ãé¸ã³ã¾ãã:)
*6:å®éã¯ãã¹ããæ¸ãã¦æ¬å½ã®å®æã§ã
*7:å®è£ ãç¡ãã¦ãææ¡ã¯ã§ããã®ã§ã¢ã¤ãã£ã¢ãããã°ãã²ç©æ¥µçã«ææ¡ãã¾ããã