ç£æ¥çšãœãããŠã§ã¢ã®éç«ã£ãç¹åŸŽã¯ãéåžžã«é£ããããšã§ã...ãã®ãããªã·ã¹ãã ã®è€éãã¯äººéã®ç¥çèœåãè¶
ããŠããŸã...ãã®è€éããå
æããããšã¯ã§ããŸããã決ããŠããããªããããšã¯ã§ããŸããã
ã°ã©ãã£ã»ããŒã
æ°å幎åã«æ»ã£ãŠããããã®å¹Žã®å
žåçãªããã°ã©ã ãã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã ãããããåœä»€çãªã¢ãããŒããæ¯é
çã§ããã èšç®ããã»ã¹ãããã°ã©ã ãå®å
šã«å¶åŸ¡ããããšã§ããã®ååãä»ããããããšãæãåºããŠãã ãããããã°ã©ã ã¯ãäœããã€è¡ãã¹ãããæ確ã«ç€ºããŠããŸãã 倩çã®åœä»€ã®ã»ããã®ããã«ã ã»ãšãã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãå®è¡å¯èœããã°ã©ã ãäœæããããã«ãã®ã¢ãããŒããææ¡ããŠããŸãã ããšãã°ãããŸããŸãªçš®é¡ã®ãŠãŒãã£ãªãã£ãäœæãããšããªã©ãä»æ¥ãŸã§åºã䜿çšãããŠããŸãã ããã«ããã®ã¢ãããŒãã§ãåŠæ ¡ã§ã®ããã°ã©ãã³ã°ã®ç 究ãå§ãŸããŸãã ãã®äººæ°ã®çç±ã¯äœã§ããïŒ å®éãåœä»€åã¯éåžžã«ã·ã³ãã«ã§ç解ãããããã®ã§ãã ãã¹ã¿ãŒããã¯é£ãããããŸããã
äŸãèŠãŠã¿ãŸãããã ã³ãŒããå€é¢šãªãã®ã«ããããã«Pascalãéžã³ãŸããã ããã°ã©ã ã¯ãå€æ°ãxãã®å€ãå
¥åããããããã³ãããåºããå
¥åãããå€ãã³ã³ãœãŒã«ããèªã¿åããå€æ°ãyãã«ã€ããŠãåæ§ã«ãæåŸã«ãxããšãyãã®åèšã衚瀺ããŸãã ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãããã°ã©ã ã«ãã£ãŠéå§ãããŸãïŒå
¥åãšåºåã®äž¡æ¹ïŒã å³å¯ãªé åºã§ã
var x, y: integer; begin write('x = '); readln(x); write('y = '); readln(y); writeln('x + y = ', x + y); end.
次ã«ãããã°ã©ã ã®äž»ãªã¢ã¯ã·ã§ã³ã匷調ããããã«ãã³ãŒããå°ãæžãçŽããŠãããã€ãã®æœè±¡åãå°å
¥ããŸãïŒã¯ãããæœè±¡åããšããçšèªã¯OOPã®ããããã£ã§ã¯ãããŸããïŒã
var x, y: integer; begin x := receiveArg; y := receiveArg; sendResult('x + y = ', x + y); end.
å®éãæœè±¡åãå°å
¥ããããšã¯ãæœè±¡åãªãã§è¡ãããšãå¯èœã§ãããšæãããå Žåã«ãè€éããå
æãããã1ã€ã®ããŒã«ã§ãã ã¯ã©ã¹ãå¯èŠæ§ä¿®é£Ÿåããªãå Žåã§ããããã¯åãã«ãã»ã«åã§ãã åŸã§ãã®ã³ãŒããæãåºããŸãã ãããŸã§ã®éãç¶ããŠãã ããã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®é²åã«ãããã°ã©ãã£ã«ã«ã¹ãã³ãåºçŸããåœä»€åã¹ã¿ã€ã«ãæ¯é
çã«ãªããŸããã ã°ã©ãã£ã«ã«ã·ã§ã«ãåããOSã¯ãããã°ã©ã ã®æ§é ã«å¯ŸããŠãŸã£ããç°ãªãã¢ãããŒãããããã ã€ãã³ãé§ååã¢ãããŒãã ãã®ã¢ãããŒãã®æ¬è³ªã¯ãããã°ã©ã ãã»ãšãã©ã®æéã¢ã€ãã«ç¶æ
ã§ãããäœãããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã®ãåºæ¿ç©ãã«ã®ã¿å¿çããããšã§ãã äºå®ãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãŠãŒã¶ãŒã«ãã¹ãŠã®ãŠã£ã³ããŠã³ã³ãããŒã«ãžã®åæã¢ã¯ã»ã¹ãæäŸããåœä»€åããã°ã©ã ã®å Žåã®ããã«ããããé çªã«èª¿ã¹ãããšã¯ã§ããŸããã ããã©ããããããžãã¯ã«ãã£ãŠæäŸãããå ŽåããŸãã¯ãŠãŒã¶ãŒã«ãã£ãŠæåŸ
ãããå Žåãããã°ã©ã ã¯ãŠã£ã³ããŠã®ä»»æã®éšåã§ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å³åº§ã«å¿çããå¿
èŠããããŸãã ã€ãã³ãé§ååã¢ãããŒãã¯ãã¢ããªã±ãŒã·ã§ã³éçºè
ã®éžæã§ã¯ãªããOSéçºè
ã®éžæã§ãã ãã®ã¢ãã«ã«ããããã·ã³ãªãœãŒã¹ãããå¹ççã«äœ¿çšã§ããŸãã ããã«ãOSã¯ã°ã©ãã£ã«ã«ã·ã§ã«ãåŠçãããã®æå³ã§ãã¯ã©ã€ã¢ã³ãããã°ã©ã ãšã¢ããªã±ãŒã·ã§ã³ããã°ã©ã ã®éã®ãåããäžéäœã§ãã å®éãæè¡çã«é©çšãããããã°ã©ã ã¯äŸç¶ãšããŠäžå¯æ¬ ã§ãã 圌ãã¯åœä»€çãªæ žå°äœããããã ã¡ãã»ãŒãžã«ãŒããŸãã¯ã€ãã³ãã«ãŒãã ããããã»ãšãã©ã®å Žåããã®æ žå°äœã¯å
žåçã§ãããããã°ã©ããŒã䜿çšããã°ã©ãã£ãã¯ã©ã€ãã©ãªã®è
žã«é ãããŠããŸãã
ã€ãã³ãé§ååã¢ãããŒãã¯ããœãããŠã§ã¢éçºã®é²åçéçºã§ããïŒ ããããããã¯å¿
èŠã§ãã åçŽã§çµæžçã§ããããšãå€æããŸããã ãã®ã¢ãããŒãã«ã¯æ¬ ç¹ãç¥ãããŠããŸãã ãŸã第äžã«ãåœä»€åã¢ãããŒããããäžèªç¶ã§ãããè¿œå ã®ãªãŒããŒããããçºçããŸãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã ãã®çç±ããããã®ã¢ãããŒãã«ã€ããŠè©±ããŸãããå®éããã®ã¢ãããŒãã¯ã¢ããªã±ãŒã·ã§ã³ãœãããŠã§ã¢ãã¯ããã«è¶
ããŠåºãã£ãŠããŸãã ããããã»ãšãã©ã®ãµãŒããŒã®å€éšã€ã³ã¿ãŒãã§ãŒã¹ã®ä»çµã¿ã§ãã 倧ãŸãã«èšãã°ãå
žåçãªãµãŒããŒã¯ãå®è¡ã§ããã³ãã³ãã®ãªã¹ãã宣èšããŸãã ã°ã©ãã£ãã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã«ããµãŒããŒã¯ãåŠçå¯èœãªå€éšããã€ãã³ãã³ãã³ããå°çãããŸã§ã¢ã€ãã«ç¶æ
ã§ãã ã€ãã³ãé§åã¢ãããŒãããµãŒããŒã¢ãŒããã¯ãã£ã«ç§»è¡ããã®ã¯ãªãã§ããïŒ çµå±ã®ãšãããOSã®ã°ã©ãã£ã«ã«ã·ã§ã«ã®éšåã«å¶éã¯ãããŸããã ããã€ãã®çç±ããããšæããŸãïŒããã¯äž»ã«ã䜿çšããããããã¯ãŒã¯ãããã³ã«ã®æ©èœïŒååãšããŠãæ¥ç¶ã¯ã¯ã©ã€ã¢ã³ãã«ãã£ãŠéå§ãããïŒãšããã·ã³ãªãœãŒã¹ãç¯çŽããåãå¿
èŠæ§ã§ããããã®æ¶è²»ã¯ã€ãã³ãé§ååã¢ãããŒãã§ç°¡åã«èª¿æŽã§ããŸãã
Response onRequest(Request request) { switch (request.type) { case "sum": int x = request.get("x"); int y = request.get("y"); return new Response(x + y); ...
ããã§ãã€ãã³ãé§ååã¢ãããŒãã®é倧ãªæ¬ ç¹ã®1ã€ã«æ³šç®ããããšæããŸããããã¯ãå€ãã®ãªãŒããŒãããã§ããããµãŒããŒã®åäœããžãã¯ãåæ ããã³ãŒãã®æ瀺çãªæœè±¡åã®æ¬ åŠã§ãã ãŸãããµãŒããŒã宣èšããããŸããŸãªã³ãã³ãéã®é¢ä¿ãæå³ããŸãããã¹ãŠã®ã³ãã³ããç¬ç«ããŠããããã§ã¯ãªããç¹å®ã®é åºã§å®è¡ããå¿
èŠãããã³ãã³ãããããŸãã ããããä»¥æ¥ ã€ãã³ãé§ååã䜿çšããå ŽåãããŸããŸãªæäœéã®é¢ä¿ãåžžã«åæ ã§ãããšã¯éããŸããããªãŒããŒãããã¯ãåæäœã®ã³ã³ããã¹ãã埩å
ãã圢åŒã§è¡šç€ºããããã®æäœãå®è¡ã§ããããšã確èªããããã«å¿
èŠãªè¿œå ãã§ãã¯ã®åœ¢åŒã§è¡šç€ºãããŸãã èšãæãããšããµãŒããŒã«ãã£ãŠå®è£
ããããããã³ã«ãè€éãªå Žåãã€ãã³ãé§ååã¢ãããŒãã䜿çšããŠãªãœãŒã¹ãç¯çŽããããšã¯ããã»ã©æçœã§ã¯ãããŸããã ããããããã«ãããããããããã䜿çšããä»ã®æ£åœãªçç±ããããŸãïŒäœ¿çšãããèšèªããŒã«ãæšæºãããã³ã©ã€ãã©ãªã¯ãéçºè
ã«éžæè¢ãæ®ããŸããã ãã ããããæ°å¹Žã§çºçããéèŠãªå€æŽã«ã€ããŠãããã³ãã®ã¢ãããŒããæ°ããçŸå®ãšããŸãé©åããããšã«ã€ããŠããã«ã話ãããããšæããŸãã
ããã§ããµãŒããŒã³ãŒããèšè¿°ãããšãã«åœä»€åã¹ã¿ã€ã«ã䜿çšãããããšã«æ³šæããå¿
èŠããããŸããããã¯ãp2pæ¥ç¶ããŸãã¯äœ¿çšããããªãœãŒã¹ã®éãå¶éãããŠããã²ãŒã ãªã©ã®ããªã¢ã«ã¿ã€ã ãããã°ã©ã ã«éåžžã«é©ããŠããããµãŒããŒåŽããã®åå¿é床ãéåžžã«éèŠã§ãã
for (;;) { Request request = receive(); switch (request.type) { case "sum": int x = receiveInt(); int y = receiveInt(); send(new Response(x + y)); break; ...
receiveArgããã³sendResultãªãã¬ãŒã·ã§ã³ãè¿œå ããPascalã³ãŒããæãåºããŠãã ããã ãã®äŸã«èŠããããã®ãšéåžžã«äŒŒãŠããããšã«åæããŸããåŒæ°ãé çªã«èŠæ±ããçµæãéä¿¡ããŸãã å¯äžã®éãã¯ãããã§ã¯ã³ã³ãœãŒã«ã®åœ¹å²ãã¯ã©ã€ã¢ã³ããšã®ãããã¯ãŒã¯æ¥ç¶ã«ãã£ãŠæããããããšã§ãã åœä»€åã¹ã¿ã€ã«ã¯ãé¢é£ããæäœãåŠçããéã®ãªãŒããŒããããæé€ããŸãã ãã ããåŸã§èª¬æããç¹å¥ãªã¡ã«ããºã ã䜿çšããªããšããã·ã³ã®ãªãœãŒã¹ãããç©æ¥µçã«æŽ»çšããããå€ãã®æ¥ç¶ãæäŸãããµãŒããŒã®å®è£
ã«ã¯äžé©åã§ãã èªåã§å€æããïŒã€ãã³ãé§ååã®ã¢ãããŒãã§ãã¹ã¬ãããå¥ã®æäœã«å²ãåœãŠãããå Žåãã¹ã¬ããã¯å°ãªããšã寿åœãã¯ããã«é·ãã»ãã·ã§ã³ã«å²ãåœãŠãããŸãã ãã¿ãã¬ïŒåœä»€åã¢ãããŒãã§ãªãœãŒã¹ãç©æ¥µçã«äœ¿çšããããšã¯ãå埩å¯èœãªæ¬ ç¹ã§ãã
次ã«ããå
žåçãªããµãŒããŒå®è£
ãèŠãŠã¿ãŸãããã以äžã®ã³ãŒãã¯ã©ã®ãã¬ãŒã ã¯ãŒã¯ã«ãæ¥ç¶ãããŠãããããªã¯ãšã¹ãåŠçã¹ããŒã ã®ã¿ãåæ ããŠããŸãã åºç€ãšããŠãç§ã¯SMSã³ãŒãã«ãã確èªã§æ°ãããŠãŒã¶ãŒãç»é²ããæé ãåããŸããã ãã®æé ã¯ãç»é²ãšç¢ºèªã®2ã€ã®é¢é£æäœã§æ§æãããŸãã
Response onReceived(Request request) { switch (request.type) { case "register": User user = registerUser(request); user.confCode = generateConfirmationCode(); sendSms("Confirmation code " + user.confCode); return Response.ok; case "confirm": String code = request.get("code"); User user = lookupUser(request); if (user == null || !Objects.equals(code, user.confCode)) { return Response.fail; } return user.confirm() ? Response.ok : Response.fail; ...
ã³ãŒããèŠãŠã¿ãŸãããã ç»é²æäœã ããã§ã¯ããªã¯ãšã¹ãã®ããŒã¿ã䜿çšããŠæ°ããã¯ã©ã€ã¢ã³ããäœæããŸãã ããããã¯ã©ã€ã¢ã³ããäœæããããã»ã¹ã«å«ãŸãããã®ãèããŠã¿ãŸããããããã¯ãæœåšçã«ã1ã€ãŸãã¯è€æ°ã®å€éšã·ã¹ãã ãžã®äžé£ã®åŒã³åºãïŒã³ãŒãçæãSMSã®éä¿¡ïŒããã£ã¹ã¯æäœã§ãã ããšãã°ãsendSmsæäœã¯ãã³ãŒããå«ãSMSã¡ãã»ãŒãžããŠãŒã¶ãŒã«æ£åžžã«éä¿¡ãããåŸã«ã®ã¿å¶åŸ¡ãè¿ããŸãã å€éšã·ã¹ãã ãžã®åŒã³åºãïŒã¯ãšãªã®é
ä¿¡æéãåŠçæéãçµæãæ»ãæéïŒããã³ãã£ã¹ã¯æäœã«ã¯æéãããããçŸåšã®ã¹ããªãŒã ã®ããŠã³ã¿ã€ã ã«ã€ãªãããŸãã 泚ïŒçæãããã³ãŒããã¯ã©ã€ã¢ã³ãã«ãã€ã³ãããŸãïŒconfCodeãã£ãŒã«ãïŒã å®éããã®ãªã¯ãšã¹ããåŠçããåŸããã³ãã©ãŒãçµäºãããã¹ãŠã®ããŒã«ã«å€æ°ããªã»ãããããŸãã 確èªèŠæ±ãå°çãããšãã«ãåŸç¶ã®æ¯èŒã®ããã«ã³ãŒããä¿åããå¿
èŠããããŸãã åŠçãããšããæåã«å®è¡ã³ã³ããã¹ãã埩å
ããŸãã ãããã¯ãç§ã話ããã®ãšåããªãŒããŒãããã§ãã
ãã®äŸã®ããã«ããªã¯ãšã¹ãã®åæåŠçã¯ã貎éãªã·ã¹ãã ãªãœãŒã¹ã®ããŠã³ã¿ã€ã ã«ã€ãªãã倧éã®ããããã³ã°æäœã«é¢é£ä»ããããŠããŸãã ãããŠããã¹ãŠã¯åé¡ãããŸãããããµãŒãã¹ã·ã¹ãã ã¯ãã¹ã«ãŒããããšå¿çæéã«å¯ŸãããããŸã§ä»¥äžã®èŠæ±ã«çŽé¢ããŠããŸãã ã·ã¹ãã ãªãœãŒã¹ã®ããŠã³ã¿ã€ã ã¯å®¹èªã§ããªãèŽ
æ²¢ã«ãªãã€ã€ãããŸãã ãã£ãŒããèŠãŠã¿ãŸãããã
ããã§ã¯ãããããã³ã°ã³ãŒã«ã瀺ããŸããã 網æãéšåã¯åçŽãªåŒã³åºããããŒã§ãã éèŠã§ããïŒ ã·ã¹ãã ã§äœ¿çšãããã¿ã€ã ã¢ãŠãã®ãµã€ãºãšæ°ãæãåºããŠãã ããã ããŠã³ã¿ã€ã ã®å¯èœæ§ã«ã€ããŠéåŒã«èª¬æããŸãã ããã¯çŽããªç§ã§ã¯ãªããæ°åç§ãæã«ã¯æ°åã§ãã 1000 TpSã®è² è·ã§ã¯ã1ç§ã®ããŠã³ã¿ã€ã ã¯ãè¿œå ã®ãªãœãŒã¹ãå²ãåœãŠãããåŠçã®ããã®1000ã®æäœãæå³ããŸãã
ã¹ã«ãŒããããé«ããå¿çæéãççž®ããããã«ãæ¥çã¯ã©ã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŠããŸããïŒ ããšãã°ãéã®éçºè
ã¯ãã«ãã³ã¢ãæäŸããŠããŸãã ã¯ããããã¯åäžã®ãã·ã³ã®æ©èœãæ¡åŒµããŸãã ã€ãã³ãé§ååã®ã¢ãããŒãã¯ããã®ã¹ã±ãŒã©ããªãã£ã®ãããã§ãæ°ãããªãœãŒã¹ãç°¡åã«å©çšããŸãã ãã ããèŠæ±ãã³ãã©ãŒã®åæå®è£
ã«ãããã¹ã¬ããã®äœ¿çšã¯éå¹ççã«ãªããŸãã ãããŠãããã§éåæåŒã³åºããå©ãã«ãªããŸãã
éåæåŒã³åºãã®ã¿ã¹ã¯ã¯ãã§ããã ãæ©ãæäœãéå§ããŠå¶åŸ¡ãè¿ãããšã§ãã æäœã®çµæãã³ãŒã«ããã¯é¢æ°ãååŸããè¿œå ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ããŸãã ãããã£ãŠããã®ãããªåŒã³åºãã®çŽåŸã«ãäœæ¥ãç¶è¡ããããçµæãåŸããããŸã§å®äºããããšãã§ããŸãã ãµã³ãã«ãå€æŽããŠãéåæã¹ã¿ã€ã«ã§æžãçŽããŸãããã
void onReceived(Request request) { switch (request.type) { case "register": registerUser(request, user -> { generateConfirmationCode(code -> { user.confCode = code; sendSms("Confirmation code " + code, () -> { reply(Response.ok); }); }); }); break; ...
ããã§ã¯ãã¬ãžã¹ã¿æäœã1ã€ã ãæå®ããŸããã ããããéåæã¹ã¿ã€ã«ã®äž»ãªæ¬ ç¹ã§ããã³ãŒãã®ææªã®å¯èªæ§ããµã€ãºã®å¢å ãèŠãã«ã¯ãããã§ãã§ã«ååã§ãã äžé£ã®åæåŒã³åºãã§ã¯ãªããã³ãŒã«ããã¯ã®ãã©ããŒãã®åºçŸã ãã®äŸã¯ãã©ã ãã®ãããã§ã®ã¿èš±å®¹ã§ããããã«èŠããŸãã ãããããªããã°ãéåæã³ãŒãã®èªèã¯ã¯ããã«å°é£ã«ãªããŸãã ã€ãŸããJavaèšèªã¯æ°ããèŠä»¶ã«ããŸãé©åããŠããŸããã éåæã³ãŒãã§ã®äœæ¥ãããå¿«é©ã«ããããã«å¿
èŠãªããŒã«ãäžè¶³ããŠããŸãã
ã©ãããïŒ åæã³ãŒãã§ã®äœæ¥ã®å¿«é©ããç¶æããåæã«éåæã¡ã«ããºã ã䜿çšããŠãã®äž»èŠãªæ¬ ç¹ãåãé€ãæ¹æ³ã¯ãããŸããïŒ
ã¯ãããã®ãããªæ¹æ³ããããŸãã
ç¶ç¶
ç¶ç¶æ§ã¯ãïŒã«ãŒããæ¡ä»¶åå²ãã¡ãœããåŒã³åºããªã©ã«å ããŠïŒããã°ã©ã å®è¡ã®ã³ãŒã¹ãå¶åŸ¡ããããã®å¥ã®ã¡ã«ããºã ã§ãããçŸåšã®ã¹ã¬ããã®ãªãªãŒã¹ã§ç¹å®ã®ãã€ã³ãã§ã¡ãœããã®å®è¡ãäžæåæ¢ã§ããŸãã
ãã®ããŒã«ã®äž»ãªææç©ã¯æ¬¡ã®ãšããã§ãã
- äžæåæ¢å¯èœãªã¡ãœãã -ç¡æéã«äžæåæ¢ããŠããåéã§ããã¡ãœãã
- ã³ã«ãŒãã³ / ãã¡ã€ããŒã¯äžæåæ¢æã«ã¹ã¿ãã¯ãä¿æããŸãã äžæåæ¢ãããã¡ãœããã®å®è¡ãåéããããã«ãã¹ã¿ãã¯ããããã¯ãŒã¯çµç±ã§å¥ã®ãã·ã³ã«è»¢éã§ããŸã
- CoIteratorã䜿çšãããšããžã§ãã¬ãŒã¿ãŒïŒManaã©ã€ãã©ãªã«å®è£
ïŒãšåŒã°ããçš®é¡ã®ã€ãã¬ãŒã¿ãŒãäœæã§ããŸãã
ããã¯å®å
šãªãªã¹ãã§ã¯ãããŸããã
Channel ã
Reactive dataflowã Actorãªã©ã®ã¢ãŒãã£ãã¡ã¯ããéåžžã«å¥œå¥å¿ã匷ãã§ããããããã¯åã
ã®èšäºã®ãããã¯ã§ãã ããã§ã¯èããŸããã
çŸåšãç¶ç¶ã¯å€ãã®Webãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãµããŒããããŠããŸãã æ®å¿µãªãããJavaã§ç¶ç¶ã䜿çšã§ããäžè¬çãªãœãªã¥ãŒã·ã§ã³ã¯ãæã§æ°ããããšãã§ããŸãã æè¿ãŸã§ããããã¯ãã¹ãŠå€§éšåãè·äººæïŒå®éšïŒãŸãã¯éåžžã«æ代é
ãã§ããã
- Jau VM -JVMã®ã¢ããªã³ããå®éšçããããžã§ã¯ãïŒ2005ïŒ
- JavaFlow-ãã£ãã¿ã«ã©ã€ãã©ãªã®äœæã®è©Šã¿ã2008幎以éãµããŒããããŠããŸãã
- jyield-å°ããªãå®éšçããããžã§ã¯ãïŒ2010幎2æïŒ
- ã³ã«ãŒãã³ -å¥ã®ããã€ãããããããžã§ã¯ãïŒ2010幎10æïŒ
- jcontã¯æ¯èŒçæè¿ã®è©Šã¿ã§ãïŒ2013ïŒ
- Matis Mans Continuationsã©ã€ãã©ãª -ç§ã®æèŠã§ã¯ãJavaçšã®æãã·ã³ãã«ã§æåãããœãªã¥ãŒã·ã§ã³
人éã«ãã£ãŠå®è£
ãããæŠå¿µã¯ãã·ã³ãã«ã§åŠã³ãããã§ãã æ®å¿µãªãããçŸåšãµããŒããããŠããŸããã ããã«ãã©ã€ãã©ãªã説æããå
ã®èšäºã¯æè¿ã¢ã¯ã»ã¹ã§ããªããªããŸããã
ãããããã¹ãŠãããã»ã©æªãããã§ã¯ãããŸããã
Parallel Universeã®çŽ³å£«ãã¡ã¯ãManaã©ã€ãã©ãªãŒãåºç€ãšããŠããããäœãçŽãããã§ã«ééã®ããããŒãžã§ã³ã§ãã
Quasarã«ããŸãã ã
Quasarã¯ãManaã©ã€ãã©ãªããäž»èŠãªã¢ã€ãã¢ãç¶æ¿ããããããéçºããŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãè¿œå ããŸããã ããã«ãçŸæç¹ã§ã¯ãããã
Java 8ã§æ©èœããå¯äžã®ãœãªã¥ãŒã·ã§ã³ã§ãã
ãã®ããŒã«ã¯äœãæäŸããŸããïŒ ãŸããåæã³ãŒãã®å¯èŠæ§ã倱ãããšãªããéåæã³ãŒããèšè¿°ããæ©äŒãåŸãŸãã ããã«ããµãŒããŒåŽã®ã³ãŒããåœä»€åã¹ã¿ã€ã«ã§èšè¿°ã§ããããã«ãªããŸããã
for (;;) { Request request = receive(); switch (request.type) { case "register": User user = registerUser(request); int confCode = generateConfirmationCode(); sendSms("Confirmation code " + confCode); reply(Response.confirm); String code = receiveConfirmationCode(); if (Objects.equals(code, confCode) && user.confirm()) { reply(Response.ok); } else { reply(Response.fail); } break; ...
ããã¯ãåããŠãŒã¶ãŒç»é²ã®äŸã§ãã ç»é²/ãã¢ã®ç¢ºèªãªã¯ãšã¹ãã®æ®ãã¯1ã€ã®ã¿ã§ããããšã«æ³šæããŠãã ããïŒç»é²ã æ¶ããŠããç¢ºèª ããã§ã¯ãã圌ã¯å¿
èŠãããŸããã ãã®å®è£
ã§ã¯ããªãŒããŒããããæå°éã«æããããŸããæäœã®ã³ã³ããã¹ãå
šäœãããŒã«ã«å€æ°ã«ä¿åãããããããŠãŒã¶ãŒãåäœæããããã«çæãããã³ãŒããèŠããå¿
èŠã¯ãããŸããã ç»é²ããŠãã³ãŒããçæããSMSãéä¿¡ããåŸãã¯ã©ã€ã¢ã³ããããã®ã³ãŒããåä¿¡ããã ãã§ããã以äžã¯åä¿¡ããŸããã å€æ°ã®è¿œå å±æ§ãå«ãæ°ãããªã¯ãšã¹ãã§ã¯ãªãã1ã€ã®ã³ãŒãã®ã¿ã§ãïŒ
ã©ã®ããã«æ©èœããŸããïŒ Manaã©ã€ãã©ãªãŒããå§ããããšããå§ãããŸãã ã©ã€ãã©ãªã«ã¯å°æ°ã®ã¯ã©ã¹ã®ã¿ãå«ãŸããŠããããã®äž»ãªãã®ã¯ã³ã«ãŒãã³ã§ãã
Coroutine co = new Coroutine(new CoroutineProto() { @Override public void coExecute() throws SuspendExecution { ... Coroutine.yield();
ã³ã«ãŒãã³ã¯ãæ¬è³ªçã«Runnableã®ã·ã§ã«ã§ãã ããæ£ç¢ºã«ã¯ãæšæºã®Runnndableçšã§ã¯ãªãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¹å¥ãªããŒãžã§ã³ã§ããCoroutineProtoçšã§ãã ã³ã«ãŒãã³ã®ã¿ã¹ã¯ã¯ãåã蟌ã¿ã¿ã¹ã¯ã®å®è¡ãäžæãããç¬éã®ã¹ã¿ãã¯ã®ç¶æ
ãä¿åããããšã§ãã ã³ã«ãŒãã³èªäœã¯äœãå®è¡ããŸãããrunã¡ãœããã«ãã£ãŠéå§ãããå Žåããã¹ãããããã®ã®å®è¡ã¯ãcoExecuteã¡ãœããå
ã®ã³ãŒãã®å®è¡ãåæ¢ãŸãã¯åéããåŸãåéããŸãã runã¡ãœããããã®ã³ã³ãããŒã«ã¯ãcoExecuteã¡ãœãããäœæ¥ãçµäºããããéçãªCoroutine.yieldã¡ãœãããåŒã³åºããŠäžæåæ¢ããåŸã«æ»ããŸãã coExecuteã¡ãœããã®ç¶æ
ã¯ãCouroutine.getStateãåŒã³åºãããšã§ç¢ºèªã§ããŸãã å®ã¯ãrunãyieldãgetStateã®3ã€ã®ã¡ãœããã¯ãCoroutineã¯ã©ã¹ã®æå³ã®ããã€ã³ã¿ãŒãã§ãŒã¹å
šäœãèšè¿°ããŠããŸãã ãã¹ãŠãéåžžã«ç°¡åã§ãã SuspendExecutionäŸå€ã«æ³šæããŠãã ããã ãŸããã¡ãœãããäžæåæ¢ããå¯èœæ§ãããããšã瀺ãããŒã«ãŒã§ãã Manaã©ã€ãã©ãªã®ç¹åŸŽã¯ããã®äŸå€ãäžæåæ¢ã®ç¬éã«å®éã«ã¹ããŒãããããšã§ãïŒå¯äžã®ã空ã®ãã€ã³ã¹ã¿ã³ã¹-ã¹ã¿ãã¯ãªãïŒã ãã®å®è¡ããçµã殺ããããšã¯ã§ããŸããã ããã¯ãã©ã€ãã©ãªã®æ¬ ç¹ã®1ã€ã§ãã
Corutin Manã¯ãç¹å¥ãªçš®é¡ã®å埩åãäœæãã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ããžã§ãã¬ãŒã¿ãŒãèŠãŸããã ã©ããããManaïŒããã³åœŒã®åä»»è
ïŒã¯ãçºé»æ©ã®ãµããŒãã以äžãå«ãå€ãã®èšèªã§å©çšå¯èœã§ãããšããäºå®ã«æå§ãããŠããŸãã CïŒïŒå©åããªã¿ãŒã³ãå©åããã¬ãŒã¯ïŒã 圌ã®ã©ã€ãã©ãªãŒã«ã¯ãIteratorã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããç¹å¥ãªCoIteratorã¯ã©ã¹ãå«ãŸããŠããŸããã ãžã§ãã¬ãŒã¿ãŒãäœæããã«ã¯ãCoIteratorãç¶æ¿ããäžæåæ¢ãããæœè±¡runã¡ãœãããå®è£
ããå¿
èŠããããŸãã CoIteratorã³ã³ã¹ãã©ã¯ã¿ãŒã§ãæœè±¡runã¡ãœããã«ãã£ãŒãããã³ã«ãŒãã³ãçæãããŸãã
class TestIterator extends CoIterator<String> { @Override public void run() throws SuspendExecution { produce("A"); produce("B"); for(int i = 0; i < 4; i++) { produce("C" + i); } produce("D"); produce("E"); } }
ã©ã€ãã©ãªå
ã®Manaã®ã¢ã€ãã¢ãæ確ã«ãªããšãQuasarããã¹ã¿ãŒããã®ã¯ç°¡åã§ãã Quasarã¯ãããã«ç°ãªãçšèªã䜿çšããŸãã ããšãã°ãQuasarã§ã³ã«ãŒãã³ãšããŠäœ¿çšãããFiberã¯ãå®éã«ã¯ã¹ããªãŒã ã®è»œéããŒãžã§ã³ã§ãïŒãã®çšèªã¯ãããããããªã以åãããã¡ã€ããŒãååšããŠããWin APIããåçšããããã®ã§ãïŒã ããã䜿çšããã®ã¯ãã³ã«ãŒãã³ãšåããããç°¡åã§ãã
Fiber fiber = new Fiber (new SuspendableRunnable() { public void run() throws SuspendExecution, InterruptedException { ... Fiber.park();
ããã§ã¯ãããªãã¿ã®SuspendExecutionã確èªããŸãã ãã ããã¯ãšãŒãµãŒã§ã¯ã圌ã¯æ£çŽã«ããŒã«ãŒã®åœ¹å²ãæãããŠãããå¿
é ã§ã¯ãããŸããã 代ããã«ã@ Suspendableã¢ãããŒã·ã§ã³ã䜿çšã§ããŸãã
class C implements I { @Suspendable public int f() { try { return g() * 2; } catch(SuspendExecution s) { assert false; } } }
ãããã£ãŠãã»ãšãã©ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã®äžæåæ¢å¯èœãªå®è£
ãäœæããæ©äŒããããŸãããManaã©ã€ãã©ãªã§ã¯ãããè¡ãããšãã§ãããããŒã«ãŒäŸå€ãå¿
èŠã«ãªããŸããã
Quasarã©ã€ãã©ãªã«ã¯ãéåæã€ã³ã¿ãŒãã§ã€ã¹ãæ¬äŒŒåæã€ã³ã¿ãŒãã§ã€ã¹ã«ãå€ãããããã«å¿
èŠãªãã¹ãŠã®ãã®ããããã¯ã©ã€ã¢ã³ãã³ãŒãã«åæã®å¯èŠæ§ãšéåæã®å¹çæ§ãæäŸããŸãã ããã«ãFiberã€ã³ã¹ã¿ã³ã¹ã¯ã·ãªã¢ã«åå¯èœã§ãã ç°ãªããã·ã³ã§éšåçã«å®è¡ã§ããŸãã1ã€ã®ããŒãã§éå§ããäžæåæ¢ãããããã¯ãŒã¯ãä»ããŠå¥ã®ããŒãã«è»¢éããããã§å®è¡ãåéããŸãã
ãã¡ã€ããŒã®ãã¯ãŒãç解ããããã«ã次ã®ç¶æ³ãæ³åããŠã¿ãŸãããã ãªã¯ãšã¹ãã®åæåŠçãè¡ãå€å
žçãªãµãŒããŒããããšããŸãã ãŠãŒã¶ãŒã®ãªã¯ãšã¹ããåŠçãããµãŒããŒãå€éšãªãœãŒã¹ã«æã
ã¢ã¯ã»ã¹ããããã«ããŸãã ããšãã°ãããŒã¿ããŒã¹ãžã ãµãŒããŒãæ©èœããããã«1000åã®ã¹ã¬ãããå²ãåœãŠããšããŸãã ãããŠä»ãããæç¹ã§ãå€éšãªãœãŒã¹ããéåããå§ããŸããã ãã®å Žåããã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããéã®æ°ãããªã¯ãšã¹ãã®ãã³ãã©ãŒã¯ããªãŒãºãå§ãããããŒããããã¯ããŸãã ãµãŒããŒã®è² è·ãé«ããšãã¹ã¬ããããŒã«ã¯ããã«æ¶è²»ããããªãã€ã¬ã¯ããéå§ãããŸãã ã¹ã¬ããããŒã«ãå
±éã§ããå Žåãå€éšãªãœãŒã¹ã«æ¥ç¶ãããŠããªãèŠæ±ããªãã€ã¬ã¯ããããŸãã ãã ãããµãŒããŒã¯äœãããªãå ŽåããããŸãã ã·ã¹ãã å
šäœã®ããã«ããã¯ã¯ãè² è·ã«å¯ŸåŠã§ããã«å€±æããå€éšãªãœãŒã¹ã§ããã
ç¹ç¶ã¯ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ ãã¡ã€ããŒã¯ãåæãã³ãã©ãŒãéåæã«å€ããŸãã ããã§ãå€éšãªãœãŒã¹ã«ã¢ã¯ã»ã¹ãããšãã«ãã¹ããªãŒã ãå®å
šã«ããŒã«ã«æ»ããçŸåšã®å®è¡ã¹ã¿ãã¯ãä¿åããããã«ãã·ã³ããå°ãã®ã¡ã¢ãªã®ã¿ãèŠæ±ã§ããŸãã å€éšãªãœãŒã¹ããå¿çãåä¿¡ãããšãããŒã«å
ã®ç©ºãã¹ããªãŒã ãååŸããã¹ã¿ãã¯ã埩å
ããŠãªã¯ãšã¹ãã®åŠçãç¶è¡ããŸãã çŸäººïŒ
ãã ããããã§äºçŽãè¡ãå¿
èŠããããŸããããã¯ãå€éšãªãœãŒã¹ãžã®ã€ã³ã¿ãŒãã§ã€ã¹ãéåæã®å Žåã«ã®ã¿æ©èœããŸãã
æ®å¿µãªãããå€ãã®ã©ã€ãã©ãªã¯åæã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ãæäŸããŸããJDBCã®å
žåçãªäŸããã ããJavaãéåæã«åãã£ãŠããããšã«æ³šæããŠãã ãããå€ãã€ã³ã¿ãŒãã§ãŒã¹ã¯æžãæãããïŒNIOãAIOãCompletableFutureãServlet 3.0ïŒãæ°ããã€ã³ã¿ãŒãã§ãŒã¹ã¯æåã¯éåæã§ããããšãå€ãïŒNettyãZooKeeperïŒããã¡ãããç§ã¯Oracleãããã®æ¹åãžã®é²å±ãèŠãããšæã£ãŠããŸããäœæ¥ã¯é²è¡äžã§ãããéåžžã«é
ããããJavaã®æ¬¡ã®ããŒãžã§ã³ã§ã¯ç¶ç¶ã®ãã«ã¿ã€ã ãµããŒãã¯äºå®ãããŠããŸãããQuasarã©ã€ãã©ãªãä»ã«é¡ãèŠãªããã®ã«ãªãããšãæåŸ
ããŸããããéåæã³ãŒãã®èšè¿°ãç°¡åãã€äŸ¿å©ã«ãããããå€ãã®èå³æ·±ããœãªã¥ãŒã·ã§ã³ãèŠã€ããã§ãããã