å®å®åç®æšïŒ 1.38.0ïŒããŒã¿ã«ãã2019-08-15ïŒ
ããã¯ãå®è¡å¯èœãªæå°éã®éåæ/åŸ æ©æ©èœãå®å®ãããããã®ææ¡ã§ããããã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
async
ã¢ãããŒã·ã§ã³ã«ãããè©äŸ¡ãé
ãã代ããã«å°æ¥ã«è©äŸ¡ãããŸããawait
æŒç®åã async
ã³ã³ããã¹ãå
ã§ã®ã¿æå¹ã§ããããã¯ãåŒæ°ãšããŠæªæ¥ãåããåŸ
æ©äžã®æªæ¥ãå®äºãããŸã§ããã®ç¯å²å
ã®å€åŽã®æªæ¥ã«å¶åŸ¡ãè²ããŸããRFCïŒ
std::task
ãšstd::future::Future
å®å®ãããåé¡ã®è¿œè·¡ïŒ
å®å®åïŒ
return
åŒã«äžèŽããåïŒã䜿çšããŸããawait expression
ãŸãã¯å¥ã®ä»£æ¿æ§æãšã¯å¯Ÿç
§çã«ããæ¥å°ŸèŸãããæ§æã expression.await
ã§ããasync
ãšawait
çŸåšãTLSã«äŸåããŠæ©èœããŸãã ããã¯ãèšèšã®äžéšã§ã¯ãªãå®è£
ã®åé¡ã§ãããå®å®åããããã¯ããŠããŸããããæçµçã«è§£æ±ºããããšãç®çãšããŠããŸããasync
ã¯ãããã§ã¯å®å®ããŠããŸããã ã©ã€ãã¿ã€ã ã®ããéåæã¯ããŒãžã£ã§ã®ãã£ããã£ãšæœè±¡åã«é¢ããŠã¯ãããã«å€ãã®èšèšäœæ¥ãå¿
èŠã§ãããã³ããããã³ã°IOã®åŠçã¯ãæ¬çªãŠãŒã¶ãŒãã倧ããªé¢å¿ãéããŠããRustã®ã¿ãŒã²ãããŠãŒã¹ã±ãŒã¹ã§ããé«æ§èœãããã¯ãŒã¯ãµãŒãã¹ãéçºããããã«éåžžã«éèŠã§ãã ãã®ãããéããããã³ã°IOã䜿çšããŠãµãŒãã¹ãäœæããããšã人éå·¥åŠçãã€å®çŸå¯èœã«ããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãé·ãéRustã®ç®æšã§ããã éåæ/åŸ æ©æ©èœã¯ããã®åªåã®é倧æã§ãã
1.0ããåã®Rustã«ã¯ãéããããã³ã°IOã®äžã«æ§ç¯ããã代æ¿ã®èšèªã¬ãã«ã®ã¹ã¬ããããªããã£ããæäŸããã°ãªãŒã³ã¹ã¬ããã·ã¹ãã ããããŸããã ãã ãããã®ã·ã¹ãã ã¯ããã€ãã®åé¡ãåŒãèµ·ãããŸãããæãéèŠãªã®ã¯ãããã䜿çšããªãããã°ã©ã ã§ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããèšèªã©ã³ã¿ã€ã ã®å°å ¥ãFFIã®ãªãŒããŒãããã®å€§å¹ ãªå¢å ãããã³ã°ãªãŒã³ã¹ã¬ããã¹ã¿ãã¯ã®å®è£ ã«é¢é£ããããã€ãã®äž»èŠãªæªè§£æ±ºã®èšèšäžã®åé¡ã§ãã ã
ã°ãªãŒã³ã¹ã¬ããã®åé€åŸãRustãããžã§ã¯ãã®ã¡ã³ããŒã¯ãå ç©ã®æœè±¡åã«åºã¥ãã代æ¿ãœãªã¥ãŒã·ã§ã³ã®éçºã«çæããŸããã promiseãšãåŒã°ããããšããããŸãããfuturesã¯ãéããããã³ã°IOã®ã©ã€ãã©ãªããŒã¹ã®æœè±¡åãšããŠä»ã®èšèªã§éåžžã«æåããŠãããé·æçã«ã¯async / awaitæ§æã«ããŸããããã³ã°ããããããå©äŸ¿æ§ããããã«äœäžããå¯èœæ§ãããããšãç¥ãããŠããŸãããå®å šã«èŠããªãã°ãªãŒã³ã¹ã¬ããã·ã¹ãã ã
å ç©æœè±¡åã®éçºã«ãããäž»ãªãã¬ãŒã¯ã¹ã«ãŒã¯ãå ç©ã®ããŒãªã³ã°ããŒã¹ã®ã¢ãã«ã®å°å ¥ã§ããã ä»ã®èšèªã¯ã³ãŒã«ããã¯ããŒã¹ã®ã¢ãã«ã䜿çšããŸããã³ãŒã«ããã¯ããŒã¹ã®ã¢ãã«ã§ã¯ãã³ãŒã«ããã¯ãå®äºãããšãã«å®è¡ãããããã«ã¹ã±ãžã¥ãŒã«ãèšå®ããŸãããRustã¯ããšã°ãŒãã¥ãŒã¿ããã¥ãŒãã£ãŒãå®äºãŸã§ããŒãªã³ã°ãã責任ãããããŒãªã³ã°ããŒã¹ã®ã¢ãã«ã䜿çšããŸãã futureã¯ãWakeræœè±¡åã䜿çšããŠããã«é²æ©ããæºåãã§ããŠããããšããšã°ãŒãã¥ãŒã¿ã«éç¥ããã ãã§ãã ãã®ã¢ãã«ã¯ãããã€ãã®çç±ã§ããŸãæ©èœããŸããã
ïŒæåŸã®2ã€ã®ãã€ã³ãã¯ãããããçå®ã§ã¯ãªãä»ã®èšèªããæ¥ãŠããããã®èšèªããã®æåŸ ããããããŠãŒã¶ãŒã«ãšã£ãŠæ··ä¹±ã®åå ãšããŠãç¹å®ãããŠããŸãããã ãããããã®ããããã£ã¯äž¡æ¹ãšããããŒãªã³ã°ããŒã¹ã®ã¢ãã«ã®é¿ããããªãããããã£ã§ããããã«ã¯ä»ã«ãæãããªå©ç¹ãããããŠãŒã¶ãŒãç解ããã°æçãªç¹æ§ã§ãããšç§ãã¡ã¯èããŠããŸããïŒ
ãã ããäžè«èª¿æ»ããŒã¹ã®ã¢ãã«ã¯ãåç §ãšçžäºäœçšãããšãã«æ·±å»ãªäººéå·¥åŠçåé¡ã«æ©ãŸãããŠããŸããã åºæ¬çã«ãéäŒç¹ããŸãããåç §ã¯ãå®å šã§ããã¯ããªã®ã«ã解決ã§ããªãã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããŸããã ããã«ãããã¢ãŒã¯ããã¥ãŒããã¯ã¹ãããã³ç§»åã¯ããŒãžã£ã§ãã£ã±ãã®è€éã§ãã€ãºã®å€ãã³ãŒããçæãããŸãããããããã¯ããããå³å¯ã«ã¯å¿ èŠãããŸããã§ããã ãã®åé¡ãèã«çœ®ããŠããèšèªã¬ãã«ã®ããªããã£ãããªããã°ãå°æ¥ã¯ãé«åºŠã«ãã¹ããããã³ãŒã«ããã¯ãäœæããã¹ã¿ã€ã«ã«ãŠãŒã¶ãŒã匷å¶ããããšã«èŠãã¿ãŸããã
ãã®ãããéäŒç¹å
šäœã§ã®åç
§ã®éåžžã®äœ¿çšããµããŒãããéåæ/åŸ
æ©æ§æç³è¡£æ§æãè¿œæ±ããŸããã ã€ãŒã«ããã€ã³ãå
šäœã®åç
§ãå®å
šã«ãµããŒãã§ããPin
æœè±¡åãå°å
¥ããåŸãé¢æ°ãããŒãªã³ã°ããŒã¹ã®æªæ¥ã«ã³ã³ãã€ã«ãããã€ãã£ãã®async / awaitæ§æãéçºããŸãããããã«ããããŠãŒã¶ãŒã¯éåæIOã®ããã©ãŒãã³ã¹äžã®å©ç¹ã次ã®ããã«åŸãããšãã§ããŸããæšæºã®åœä»€åã³ãŒããšéåžžã«ãã䌌ãã³ãŒããèšè¿°ããªãããå
ç©ã ãã®æåŸã®æ©èœã¯ããã®å®å®åã¬ããŒãã®äž»é¡ã§ãã
async
修食åããŒã¯ãŒãasync
ã¯ã次ã®2ã€ã®å Žæã«é©çšã§ããŸãã
_ïŒéåæé¢æ°ã®ä»ã®å Žæ-ããšãã°ãã¯ããŒãžã£ãŒãªãã©ã«ããã¬ã€ãã¡ãœããã¯ããã«éçºãããå°æ¥çã«å®å®åãããŸããïŒ_
async修食åã¯ããæªæ¥ã«å€ãããããšã«ãã£ãŠå€æŽããã¢ã€ãã ã調æŽããŸãã ãããã¯ã®å Žåããããã¯ã¯ãã®çµæã§ã¯ãªãããã®çµæã®å°æ¥ã«å¯ŸããŠè©äŸ¡ãããŸãã é¢æ°ã®å Žåããã®é¢æ°ãåŒã³åºããšãæ»ãå€ã§ã¯ãªããæ»ãå€ã®æªæ¥ãè¿ãããŸãã éåæ修食åã«ãã£ãŠå€æŽãããã¢ã€ãã å ã®ã³ãŒãã¯ãéåæã³ã³ããã¹ãã«ãããšåŒã°ã
async修食åã¯ãã¢ã€ãã ãfutureã®çŽç²ãªã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠè©äŸ¡ããåŒæ°ãšãã£ããã£ãfutureã®ãã£ãŒã«ããšããŠååŸããããšã«ããããã®å€æŽãå®è¡ããŸãã ååŸ æ©ãã€ã³ãã¯ããã®ã¹ããŒããã·ã³ã®åå¥ã®ããªã¢ã³ããšããŠæ±ãããfutureã®ãpollãã¡ãœããã¯ããŠãŒã¶ãŒãèšè¿°ããã³ãŒãã®å€æã«åºã¥ããŠãæçµçã«æçµç¶æ ã«éãããŸã§ããããã®ç¶æ ãä»ããŠfutureãé²ããŸãã
async move
修食åã¯ããŒãžã£ãšåæ§ã«ãéåæãããã¯ã¯åšå²ã®ã¹ã³ãŒãå
ã®å€æ°ãå°æ¥ã®ç¶æ
ã«ãã£ããã£ã§ããŸãã ã¯ããŒãžã£ãšåæ§ã«ããããã®å€æ°ã¯ããã©ã«ãã§åç
§ã«ãã£ãŠãã£ããã£ãããŸãã ãã ãã代ããã«ã move
修食åã䜿çšããŠïŒã¯ããŒãžã£ãŒãšåæ§ã«ïŒå€ã§ãã£ããã£ã§ããŸãã async
ã¯move
ã«ããããããã®ãããã¯ãasync move { }
ãããã¯ã«ããŸãã
await
æŒç®åéåæã³ã³ããã¹ãå
ã§ã¯ã次ã®æ§æã䜿çšããŠãåŒãawait
æŒç®åãšçµã¿åãããããšã«ãããæ°ããåŒã圢æã§ããŸãã
expression.await
awaitæŒç®åã¯éåæã³ã³ããã¹ãå
ã§ã®ã¿äœ¿çšã§ããé©çšãããåŒã®ã¿ã€ãã¯Future
ç¹æ§ãå®è£
ããå¿
èŠããããŸãã awaitåŒã¯ãé©çšãããfutureã®åºåå€ã«è©äŸ¡ãããŸãã
awaitæŒç®åã¯ãéåæã³ã³ããã¹ããé©çšãããfutureãå®äºãããŸã§ãéåæã³ã³ããã¹ããè©äŸ¡ããfutureã®å¶åŸ¡ãçæããŸãã ã³ã³ãããŒã«ãçæãããã®æäœã¯ããµãŒãã§ã¹æ§æã§èšè¿°ã§ããŸããããå¯èœã§ããã°ïŒãã®äŸã§ã¯æ§æYIELD_CONTROL!
ããŠïŒãawaitã®è±ç³ã¯ãããã次ã®ããã«ãªããŸãã
loop {
match $future.poll(&waker) {
Poll::Ready(value) => break value,
Poll::Pending => YIELD_CONTROL!,
}
}
ããã«ãããå
ç©ãéåæã³ã³ããã¹ãã§ã®è©äŸ¡ãçµäºããã®ãåŸ
ã€ããšãã§ããå¶åŸ¡ã®è²æ©ãPoll::Pending
ãä»ããŠæãå€åŽã®éåæã³ã³ããã¹ãã«è»¢éããæçµçã«ã¯å
ç©ãçæããããšã°ãŒãã¥ãŒã¿ã«è»¢éããŸãã
ç§ãã¡ã®éåæé¢æ°ãšãããã¯ã¯ãããã«çæãããŸã-ããããæ§ç¯ããããšã¯ãéåæã³ã³ããã¹ãã®æ¬äœã§ã³ãŒããå®è¡ããåã«ããããåæç¶æ ã«ããçŽç²é¢æ°ã§ãã ãã®æªæ¥ã®ããŒãªã³ã°ãéå§ãããŸã§ãããã£ã³ãŒãã¯å®è¡ãããŸããã
ããã¯ãéåæé¢æ°ããªã¬ãŒã®åŒã³åºããããã«éå§ããããã«æ©èœããä»ã®å€ãã®èšèªãšã¯ç°ãªããŸãã ãããã®ä»ã®èšèªã§ã¯ãasyncã¯æ¬è³ªçã«äžŠè¡æ§é ã§ããéåæé¢æ°ãåŒã³åºããšãå¥ã®ã¿ã¹ã¯ãããªã¬ãŒãããçŸåšã®ã¿ã¹ã¯ãšåæã«å®è¡ãéå§ãããŸãã ãã ããRustã§ã¯ãå ç©ã¯æ¬è³ªçã«äžŠè¡ããŠå®è¡ãããŸããã
éåæã¢ã€ãã ãçŽç²ã«ããã®ã§ã¯ãªããæ§ç¯æã«æåã®åŸ æ©ãã€ã³ããŸã§å®è¡ãããããšã
ãªãã¡ã¬ã³ã¹ïŒ
éåæé¢æ°ã®æ§æã¯ããå€éšãã®æ»ãåã§ã¯ãªãããå éšãã®æ»ãåã䜿çšããŸãã ã€ãŸãã圌ãã¯ããã®ã¿ã€ãã®æªæ¥ãè¿ããšèšãã®ã§ã¯ãªããæçµçã«è©äŸ¡ããã¿ã€ããè¿ããšèšããŸãã
ããã¬ãã«ã§ã¯ãããã¯ã©ã®çš®é¡ã®æå¿«ãã奜ãŸãããã«ã€ããŠã®æ±ºå®ã§ãã眲åã«ã¯async
泚éãå«ãŸããŠãããããæªæ¥ãè¿ããšããäºå®ã¯çœ²åã§æ瀺ãããŸãã ãã ããasyncããŒã¯ãŒãã«ãæ°ä»ããªããŠããé¢æ°ãfutureãè¿ãããšããŠãŒã¶ãŒã確èªãããšåœ¹ç«ã€å ŽåããããŸãã ããããæ
å ±ã¯async
ããŒã¯ãŒãã«ãã£ãŠãäŒéãããããããããå®åæã®ããã«æããããŸãã
ç§ãã¡ã«ãšã£ãŠæ¬åœã«ã¹ã±ãŒã«ãã²ã£ããè¿ããã®ã¯ãç涯ã®ãšãªãžãªã³ã®åé¡ã§ããã éåæé¢æ°ã®ãå€éšãæ»ãåã¯impl Future<Output = T>
ãããã§ã T
ã¯å
éšæ»ãåã§ãã ãã ãããã®futureã¯ãå
¥ååŒæ°èªäœã®åç¶æéããã£ããã£ããŸããããã¯ãå
¥åã©ã€ãã¿ã€ã ãæå®ããªãéãååŸããªããšæ³å®ãããimplTraitã®ããã©ã«ãã®å察ã§ãã èšãæãããšãå€éšæ»ãåã䜿çšãããšããããšã¯ãéåæé¢æ°ãã©ã€ãã¿ã€ã ãšãªãžãªã³ã®æ©æµãåããªãããšãæå³ããŸãïŒéåæé¢æ°ãšä»ã®é¢æ°ã§ã©ã€ãã¿ã€ã ãšãªãžãªã³ã«ãŒã«ã®åäœãç°ãªããªã©ãããã«çããããšãããå Žåãé€ããŸãïŒã
å€åŽã®ãªã¿ãŒã³ã¿ã€ããå®éã«ã©ã®ããã«åé·ã§ççŽã«æ··ä¹±ããããèãããšãããããŠãŒã¶ãŒã«æžã蟌ã¿ãèŠæ±ããæªæ¥ãè¿ããšããè¿œå ã®ã·ã°ãã«äŒéã®äŸ¡å€ã¯ãªããšå€æããŸããã
éåæã³ã³ããã¹ãã§ã®ãã¹ãã©ã¯ã¿ã®é åºã¯ãééåæã³ã³ããã¹ãã®å Žåãšåãã§ãã æ£ç¢ºãªã«ãŒã«ã¯å°ãè€éã§ãããã§ã¯ç¯å²å€ã§ãããäžè¬ã«ãå€ãç¯å²å€ã«ãªããšå€ãç Žæ£ãããŸãã ãã ããããã¯ã䜿çšåŸãã¯ãªãŒã³ã¢ããããããŸã§ãã°ããã®éååšãç¶ããããšãæå³ããŸãã ãã®æéã«åŸ æ©ã¹ããŒãã¡ã³ããå«ãŸããŠããå Žåããããã®ã¢ã€ãã ã¯ãé©åãªæéã«ãã¹ãã©ã¯ã¿ãå®è¡ã§ããããã«ãå°æ¥ã®ç¶æ ã§ä¿åããå¿ èŠããããŸãã
å°æ¥ã®ç¶æ ã®ãµã€ãºã®æé©åãšããŠã代ããã«ãäžéšãŸãã¯ãã¹ãŠã®ã³ã³ããã¹ãã§ãã¹ãã©ã¯ã¿ãããæ©ã䞊ã¹æ¿ããããšãã§ããŸãïŒããšãã°ãæªäœ¿çšã®é¢æ°åŒæ°ã¯ãå°æ¥ã®ç¶æ ã«æ ŒçŽãããã®ã§ã¯ãªããããã«åé€ãããå¯èœæ§ããããŸãïŒã ããããç§ãã¡ã¯ãããããªãããšã«æ±ºããŸããã ãã¹ãã©ã¯ã¿ã®é åºã¯ããŠãŒã¶ãŒã«ãšã£ãŠåä»ã§çŽããããåé¡ã«ãªãå¯èœæ§ããããããã°ã©ã ã®ã»ãã³ãã£ã¯ã¹ã«ãšã£ãŠéåžžã«éèŠãªå ŽåããããŸãã å¯èœãªéãåçŽãªãã¹ãã©ã¯ã¿ã®é åºãä¿èšŒããããã«ããã®æé©åãæŸæ£ããããšãéžæããŸãããasyncããŒã¯ãŒããšawaitããŒã¯ãŒãããã¹ãŠåé€ãããå Žåãåããã¹ãã©ã¯ã¿ã®é åºã«ãªããŸãã
ïŒãã€ã®æ¥ãããã¹ãã©ã¯ã¿ãçŽç²ã§å泚æå¯èœãªãã®ãšããŠããŒã¯ããæ¹æ³ãè¿œæ±ããããšã«èå³ããããããããŸãããããã¯ãéåæ/åŸ æ©ãšã¯é¢ä¿ã®ãªã圱é¿ãäžããå°æ¥ã®èšèšäœæ¥ã§ããïŒ
ãªãã¡ã¬ã³ã¹ïŒ
ä»ã®èšèªã®async / awaitæ©èœãšã®å€§ããªéãã®1ã€ã¯ãawaitæŒç®åã®æ§æã§ãã ããã¯ãRustã®èšèšã§è¡ã£ãä»ã®ã©ã®æ±ºå®ããããèšå€§ãªéã®è°è«ã®å¯Ÿè±¡ãšãªã£ãŠããŸãã
2015幎以éãRustã«ã¯äººéå·¥åŠçãªãšã©ãŒåŠçã®ããã®æ¥å°ŸèŸ?
æŒç®åããããŸãã 1.0ãããã£ãšåãããRustã«ã¯ãã£ãŒã«ãã¢ã¯ã»ã¹ãšã¡ãœããåŒã³åºãã®ããã®æ¥å°ŸèŸ.
æŒç®åããããŸããã å
ç©ã®äž»èŠãªãŠãŒã¹ã±ãŒã¹ã¯ããçš®ã®IOãå®è¡ããããšã§ãããããå
ç©ã®å€§éšåã¯Result
ãšè©äŸ¡ãããŸãã
äžçš®ã®ãšã©ãŒã ããã¯ãå®éã«ã¯ãã»ãŒãã¹ãŠã®awaitæäœã?
ãŸãã¯ãã®åŸã®ã¡ãœããåŒã³åºãã®ããããã§ã·ãŒã±ã³ã¹ãããããšãæå³ããŸãã ãã¬ãã£ãã¯ã¹æŒç®åãšãã¹ããã£ãã¯ã¹æŒç®åã®æšæºçãªåªå
é äœãèãããšãããã«ãããã»ãŒãã¹ãŠã®åŸ
æ©æŒç®åã(await future)?
ãšèšè¿°ãããããšã«ãªããããã¯éåžžã«é人éçã§ãããšèŠãªãããŸããã
ãããã£ãŠã ?
ããã³.
æŒç®åã§éåžžã«ããæ§æãããåŸçœ®æ§æã䜿çšããããšã«ããŸããã å€ãã®ç°ãªãæ§æãªãã·ã§ã³ãæ€èšããåŸã .
æŒç®åã®åŸã«awaitããŒã¯ãŒãã䜿çšããããšãéžæããŸããã
ãªãã¡ã¬ã³ã¹ïŒ
Rustã¯ãåäžã®ã¹ã¬ããã§å®è¡ãããããã°ã©ã ãäœæãã人ã«ã³ã¹ãããããããšãªãã䞊è¡ããã°ã©ã ãšäžŠåããã°ã©ã ã®äœæã容æã«ããããã«èšèšãããŠããŸãã ã·ã³ã°ã«ã¹ã¬ãããšã°ãŒãã¥ãŒã¿ãšãã«ãã¹ã¬ãããšã°ãŒãã¥ãŒã¿ã®äž¡æ¹ã§éåæé¢æ°ãå®è¡ã§ããããšãéèŠã§ãã ããã2ã€ã®ãŠãŒã¹ã±ãŒã¹ã®äž»ãªéãã¯ããã«ãã¹ã¬ãããšã°ãŒãã¥ãŒã¿ã¯Send
ã«ãã£ãŠã¹ããŒã³ã§ããå
ç©ãå¶éããã·ã³ã°ã«ã¹ã¬ãããšã°ãŒãã¥ãŒã¿ã¯å¶éããªãããšã§ãã
impl Trait
æ§æã®æ¢åã®åäœãšåæ§ã«ãéåæé¢æ°ã¯ãè¿ãå°æ¥ã®èªåç¹æ§ãããªãŒã¯ãããŸãã ã€ãŸããçºä¿¡è
ã¯ãå€éšãªã¿ãŒã³ã¿ã€ããæªæ¥ã§ãããã©ããã確èªããã ãã§ãªãããã®æ¬äœã®æ€æ»ã«åºã¥ããŠããã®ã¿ã€ããéä¿¡ãåæãã確èªããããšãã§ããŸãã ããã¯ãéåæfnã®ãªã¿ãŒã³ã¿ã€ãããã«ãã¹ã¬ãããšã°ãŒãã¥ãŒã¿ã«ã¹ã±ãžã¥ãŒã«ãããŠããå Žåããããå®å
šãã©ããããã§ãã¯ã§ããããšãæå³ããŸãã ãã ããã¿ã€ãã¯Sendã§ããå¿
èŠã¯ãªã
éåæé¢æ°ãã¡ãœããã«æ¡åŒµãããšããããããŸãæ©èœããªããšããæžå¿µããããŸããããããã€ãã®è°è«ã®çµæãç¶æ³ã«å€§ããªéãã¯ãªããšå€æãããŸããã
ãªãã¡ã¬ã³ã¹ïŒ
åé¡ïŒïŒ52924
ã¹ããŒããã·ã³ãžã®éåæå€æãçŸåšå®è£ ãããŠããæ¹æ³ã¯ãŸã£ããæé©ã§ã¯ãªããç¶æ ãå¿ èŠä»¥äžã«å€§ãããªã£ãŠããŸãã ç¶æ ãµã€ãºã¯å®éã«ã¯è¶ ç·åœ¢ã«å€§ãããªããããç¶æ ãµã€ãºãéåžžã®ã·ã¹ãã ã¹ã¬ããã®ãµã€ãºããã倧ãããªããšãå®éã®ã¹ã¿ãã¯ã§ã¹ã¿ãã¯ãªãŒããŒãããŒãããªã¬ãŒãããå¯èœæ§ããããŸãã ãµã€ãºãããåççã§ãå°ãªããšãéåžžã®äœ¿çšã§ã¹ã¿ãã¯ãªãŒããŒãããŒãåŒãèµ·ããã»ã©æªããªãããã«ããã®codegenãæ¹åããããšã¯ãããããã³ã°ãã°ä¿®æ£ã§ãã
åé¡ïŒïŒ56238
éåæé¢æ°ã¯ãã·ã°ããã£ã«è€æ°ã®ã©ã€ãã¿ã€ã ãæã€ããšãã§ããå¿
èŠããããŸãããããã¯ãã¹ãŠãé¢æ°ãåŒã³åºããããšãã«è©äŸ¡ãããå°æ¥ã«ããã£ããã£ããããŸãã ãã ããã³ã³ãã€ã©å
ã§ã®çŸåšã®impl Future
ãžã®äžãã¯ãè€æ°ã®å
¥åã©ã€ãã¿ã€ã ããµããŒãããŠããŸããã äœæããã«ã¯ãããæ·±ããªãã¡ã¯ã¿ãªã³ã°ãå¿
èŠã§ã
ãã®äœåã ãŠãŒã¶ãŒã¯è€æ°ã®ïŒãããããã¹ãŠçç¥ãããïŒå
¥åã©ã€ãã¿ã€ã ãæã€é¢æ°ãäœæããå¯èœæ§ãéåžžã«é«ããããããã¯ããããã³ã°ãã°ä¿®æ£ã§ãã
ãããã¯ãã¹ãŠæ¢ç¥ã§ãããMVPã®éåžžã«åªå 床ã®é«ãæ¡åŒµæ©èœã§ãããasync / awaitã®åæããŒãžã§ã³ãåºè·ããããããã«äœæ¥ãéå§ããäºå®ã§ãã
æåã®RFCã§ã¯ãã¯ããŒãžã£ãŒãªãã©ã«ã®ä¿®é£ŸåãšããŠéåæ修食åããµããŒãããå¿åã®éåæé¢æ°ãäœæããŸããã ãã ãããã®æ©èœã䜿çšããçµéšããããã®ãŠãŒã¹ã±ãŒã¹ãå®å®ãããåã«è§£æ±ºãã¹ãèšèšäžã®è³ªåããŸã ããããããããšãããããŸããã
awaitæŒç®åã®çŸåšã®å®è£ ã§ã¯ãTLSãå éšã®æªæ¥ãããŒãªã³ã°ãããšãã«ããŠã§ã€ã«ãŒãäžã«æž¡ãå¿ èŠããããŸãã ããã¯æ¬è³ªçã«ãTLSã䜿çšããã·ã¹ãã ã§æ§æãã§ããã ãæ©ãæ©èœãããããã®ãããã¯ãã§ãã é·æçã«ã¯ããã®TLSã®äœ¿çšã確çŽããã€ããã¯ãªããéåžžã®é¢æ°ã®åŒæ°ãšããŠwakerãæž¡ãããšããå§ãããŸãã ãã ããããã«ã¯ãåŒæ°ãåãããšãåŠçã§ããããã«ãã¹ããŒããã·ã³çæã³ãŒããããã«æ·±ãå€æŽããå¿ èŠããããŸãã
ãã®å€æŽã®å®è£ ããããã¯ããŠããŸããããTLSããµããŒãããŠããªãã·ã¹ãã ã§éåæ/åŸ æ©ã䜿çšã§ããªããããåªå 床ãé«ããšèããŠããŸãã ããã¯çŽç²ãªå®è£ ã®åé¡ã§ããã·ã¹ãã ã®èšèšã§ã¯ãTLSã䜿çšããå¿ èŠã¯ãããŸããã
çŸåšããã¬ã€ãã§éåæé¢é£ã®é¢æ°ãŸãã¯ã¡ãœãããèš±å¯ããŠããŸããã ããã¯ã fn
æžã蟌ãããšãã§ãããã async fn
ãæžã蟌ãããšãã§ããªãå¯äžã®å Žæã§ãã éåæã¡ãœããã¯æããã«åŒ·åãªæœè±¡åã§ãããç§ãã¡ã¯ãããããµããŒãããããšèããŠããŸãã
éåæã¡ãœããã¯ãfutureãå®è£ ããé¢é£åãè¿ãã¡ãœãããšããŠæ©èœçã«æ±ãããŸãã åéåæã¡ãœããã¯ããã®ã¡ãœãããå€æããã¹ããŒããã·ã³ã®äžæã®futureã¿ã€ããçæããŸãã
ãã ãããã®futureã¯ãã¹ãŠã®å ¥åããã£ããã£ãããããå ¥åã®æå¹æéãŸãã¯ã¿ã€ããã©ã¡ãŒã¿ããã®ç¶æ ã§ãã£ããã£ããå¿ èŠããããŸãã ããã¯ããžã§ããªãã¯é¢é£åãšåŒã°ããæŠå¿µãšåçã§ããããã¯ãç§ãã¡ãé·ãéæãã§ããæ©èœã§ããããŸã é©åã«å®è£ ãããŠããŸããã ãããã£ãŠãéåæã¡ãœããã®è§£æ±ºã¯ããžã§ããªãã¯é¢é£ã¿ã€ãã®è§£æ±ºã«é¢é£ä»ããããŠããŸãã
æªè§£æ±ºã®èšèšäžã®åé¡ããããŸãã ããšãã°ãéåæã¡ãœããã¯ãåãã·ã°ããã£ãæã€å°æ¥ã®åãè¿ãã¡ãœãããšäºææ§ããããŸããïŒ ããã«ãéåæã¡ãœããã䜿çšããŠãã¬ã€ããæœè±¡åãããšãã«ãäžéšã®éåæã¡ãœããã«ãã£ãŠè¿ãããfutureã«èªåãã¬ã€ããå®è£ ããããã«èŠæ±ããå¿ èŠãããå Žåããããããéåæã¡ãœããã«ã¯èªåãã¬ã€ãã«é¢ããè¿œå ã®åé¡ããããŸãã
ãã®æå°éã®ãµããŒãããããã°ãéåæã¡ãœãããããªããžã§ã¯ãã»ãŒããã«ããå¯èœæ§ãªã©ãå°æ¥ã®æ¡åŒµã®ããã®ä»ã®èšèšäžã®èæ ®äºé ããããŸãã
åãã³ã«ãŒãã³ã¹ããŒããã·ã³å€æã䜿çšããŠãè€æ°ã®å€ãçæããé¢æ°ãååŸããããããã¹ããŒããã·ã³ã«å€æãããäžå®å®ãªãžã§ãã¬ãŒã¿ãŒæ©èœããããŸãã ãã®æ©èœã®æãæçœãªäœ¿çšäŸã¯ãéåæé¢æ°ãã³ã³ãã€ã«ãããã®ãšåãããã«ããã€ãã¬ãŒã¿ãã«ã³ã³ãã€ã«ãããé¢æ°ãäœæããããšã§ãã
å
ç©ã åæ§ã«ãããã2ã€ã®æ©èœãæ§æããŠãéåæãžã§ãã¬ãŒã¿ãŒïŒã€ãã¬ãŒã¿ãŒãšåçã®éåææ§ã§ãããã¹ããªãŒã ãã«ã³ã³ãã€ã«ãããé¢æ°ïŒãäœæããããšãã§ããŸãã ãããã¯ãŒã¯ããã°ã©ãã³ã°ã§ã¯ãããã«ã¯éåžžã«æ確ãªäœ¿çšäŸããããŸããããã«ã¯ãã·ã¹ãã éã§éä¿¡ãããã¡ãã»ãŒãžã®ã¹ããªãŒã ãå«ãŸããããšããããããŸãã
ãžã§ãã¬ãŒã¿ãŒã¯ãå€ãã®å¯èœãªãªãã·ã§ã³ãåããéåžžã«æè»ãªæ©èœã§ãããããå€ãã®æªè§£æ±ºã®èšèšäžã®è³ªåããããŸãã æ§æãšã©ã€ãã©ãªAPIã«é¢ããRustã®ãžã§ãã¬ãŒã¿ãŒã®æçµçãªèšèšã¯ããŸã éåžžã«ç©ºäžã§ãããäžç¢ºå®ã§ãã
@rfcbotfcpããŒãž
ããŒã ã¡ã³ããŒ@withoutboatsã¯ãããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã¡ã³ããŒã«ããã¬ãã¥ãŒã§ãã
æžå¿µïŒ
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠæ倧2ã€ã®æ¿èªãæªè§£æ±ºã«ãªããšïŒããããæçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ïŒäžèšã®ã¬ããŒãã«æ¢åã®ãããã«ãŒãç»é²ããŠãã¹ãªããããªãããã«ããŠãã ããïŒ
@rfcbotã¯å®è£ -äœæ¥-ãããã¯-å®å®åã«é¢ä¿ããŸã
ããŒã ã¡ã³ããŒ...ãããããŒãžããããšãææ¡
Githubã®åé¡ïŒãã«ãªã¯ãšã¹ãã§ã¯ãªãïŒãã©ã®ããã«ããŒãžã§ããŸããïŒ
@viãããã¯å°ã
ãããŒãå æ¬çãªèŠçŽãããããšãïŒ ç§ã¯æ¥ç·æ¹åã«ãããã©ããŒããŠããŸããããããªãããã¹ãŠã®äžã«ãããšå®å šã«ç¢ºä¿¡ããŠããŸãã
@rfcbotã¬ãã¥ãŒ
ãããªã¢ãŒãžAsyncAwait-äžæãªåé¡ããå®å®åãããã«ãŒã«æ瀺çã«è¿œå ããïŒããã³/ãŸãã¯ãã®æžå¿µãç»é²ããïŒããšã¯å¯èœã§ããããïŒ
ç§ã¯https://github.com/rust-lang/rust/issues/60414ãéèŠã ãšæããŸãïŒæããã«ãããã¯ç§ã®ãã°ã§ãïŒpïŒãå°ãªããšãå®å®åã®åã«æ瀺çã«å»¶æããããšæããŸã:)
RustããŒã ããã®æ©èœã«æ³šåããŠãããã³ãã¥ããã£ã«æè¬ã®æãè¡šããããšæããŸãã å€ãã®èšèšãè°è«ãããã³ã³ãã¥ãã±ãŒã·ã§ã³ã®ããã€ãã®æ éããããŸããããå°ãªããšãç§ããããŠé¡ããã°ä»ã®å€ãã®äººã¯ããããéããŠç§ãã¡ãRustã®ããã«å¯èœãªæè¯ã®è§£æ±ºçãèŠã€ãããšç¢ºä¿¡ããŠããŸãã ïŒå€ç°ïŒ
ïŒãšã¯ãããå°æ¥ã®å¯èœæ§ãšããŠãå®äºããŒã¹ã®éåæãã£ã³ã»ã«ã·ã¹ãã APIãžã®ããªããžã³ã°ã«é¢ããåé¡ã«ã€ããŠèšåããããšæããŸããTL; DRãŸã ææãããŠãããããã¡ãŒãæž¡ãå¿
èŠããããŸããããã¯ã©ã€ãã©ãªã®åé¡ã§ããã1ã€ã§ããèšåããŠãïŒ
ãŸããå®äºããŒã¹ã®APIã®åé¡ã«ã€ããŠãèšåããããšæããŸãã ïŒã³ã³ããã¹ãã«ã€ããŠã¯ããã®å
éšã¹ã¬ãããåç
§ããŠãã ããïŒIOCPãšio_uring
å°å
¥ãèãããšãLinuxã§ã®éåæIOã®æ¹æ³ã«ãªãå¯èœæ§ããããããããããåŠçããããã®æ確ãªæ¹æ³ãçšæããããšãéèŠã ãšæããŸãã IIUCã®ä»®æ³éåæããããã®ã¢ã€ãã¢ã¯å®å
šã«å®è£
ã§ãããææãããã¡ãæž¡ãããšã¯å©äŸ¿æ§ãäœäžããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãïŒããšãã°ãããŒã«ãªãã£ãæªåããããã³ããŒãè¿œå ããããããããïŒã
@newpavlov Fuchsiaã«ãåæ§ã®ããšãå®è£ ããŸããããéåæãããããªãã§å®è¡ããããšã¯å®å šã«å¯èœã§ãã ãããè¡ãã«ã¯ãããã€ãã®ç°ãªãã«ãŒãããããŸããããšãã°ããªãœãŒã¹ã®ååŸã§å€ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããäœæ¥ãå®äºãããŸã§åŸ æ©ããå¿ èŠããããªãœãŒã¹ããŒãªã³ã°ã䜿çšããå Žåãªã©ã§ãã çŸåšã®futuresAPIã¯ãæ¬çªã·ã¹ãã ã§ãããã®åé¡ãå¹æçã«è§£æ±ºããããã«äœ¿çšã§ãã䜿çšãããŠããŸããã
ãã ãããã®åé¡ã¯ããã§ã«å®å®ããŠããå ç©APIèšèšãšçŽäº€ããasync / awaitã®å®å®åã«é¢ãããã®ã§ãã ããã«è³ªåãããããå ç©-rsã¬ãã«é¢ããè°è«ã®ããã«åé¡ãéããŠãã ããã
@Ekleog
ãããªã¢ãŒãžAsyncAwait-äžæãªåé¡ããå®å®åãããã«ãŒã«æ瀺çã«è¿œå ããïŒããã³/ãŸãã¯ãã®æžå¿µãç»é²ããïŒããšã¯å¯èœã§ããããïŒ
ãããããã¯ç§ãã¡ãæ¯é±ãã£ãŠããããšã§ãã ãã®ç¹å®ã®åé¡ïŒïŒ60414ïŒãWRTãããšãããã¯éèŠã§ãããä¿®æ£ãããããšãæãã§ãããšæããŸãããç¹ã«-> impl Trait
ãã§ã«èŠ³å¯å¯èœã§ãããããå®å®åããããã¯ããå¿
èŠããããã©ããã¯ãŸã 決å®ã§ããŠããŸãã
@cramertjããããšãããããŸãïŒ ïŒ60414ã®åé¡ã¯åºæ¬çã«ããšã©ãŒã¯ããã«çºçããå¯èœæ§ãããããšæããŸããã -> impl Trait
ãããšããããŸã§èª°ãæ°ã¥ããªãã£ãããã«èŠããŸãããšã«ãã延æãããŠãåé¡ãããŸãããããã€ãã®åé¡ããããŸãã :)ïŒFWIWãããã¯ç§ãäž¡æ¹ãè¿ãé¢æ°ã®äžã§èªç¶ãªã³ãŒãã§çºçããå¿
èŠããããŸã()
å Žæãšã§T::Assoc
IIRCã¯ãããã³ã³ãã€ã«ããããã«ååŸããç§ã¯ã§ããªãäœãããå¥ã®ã -ãã ããïŒ60414ãéããŠããã³ãŒãããã§ãã¯ããŠããªãã®ã§ãç§ã®èšæ¶ãééã£ãŠããå¯èœæ§ããããŸãïŒ
@Ekleogãããããã¯çã«ããªã£ãŠããïŒ ãªããããèŠçã«ãªãã®ãã¯ã¯ã£ãããšããããŸãããã®ç¹å®ã®åé¡ãããã«æãäžããããã«ãã
ç·šéïŒæ°ã«ããªãã§ãã ãããç§ã¯1.38
ã¿ãŒã²ãããéããŸããã
@cramertj
ãããè¡ãã«ã¯ãããã€ãã®ç°ãªãã«ãŒãããããŸããããšãã°ããªãœãŒã¹ã®ååŸã§å€ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããäœæ¥ãå®äºãããŸã§åŸ æ©ããå¿ èŠããããªãœãŒã¹ããŒãªã³ã°ã䜿çšããå Žåãªã©ã§ãã
å°æ¥ã®ç¶æ
ã®äžéšãšããŠãããã¡ãŒãä¿æããå Žåãšæ¯èŒããŠãå¹çãäœäžããŸãããïŒ ç§ã®äž»ãªæžå¿µã¯ãçŸåšã®èšèšããŒãã³ã¹ãã§ã¯ãªãïŒ async
æœè±¡åãåé€ããããšã§ããå¹ççãªã³ãŒããäœæã§ãããšããæå³ã§ïŒãå®äºããŒã¹ã®APIã§ã¯äººéå·¥åŠçã§ã¯ãªããšããããšã§ãããããä¿®æ£ããæ確ãªæ¹æ³ã¯ãããŸããã 決ããŠç®ç«ããªããã®ã§ã¯ãããŸãããããã®ãããªãã¶ã€ã³ã®æ¬ é¥ãå¿ããªãããšãéèŠã ãšæããŸãã®ã§ãOPã§èšåããŠããã ããããšæããŸãã
@theduke
ãã¡ãããlangããŒã ã¯ãããç§ãããããå€æã§ããŸãããå®å®ããå®è£ ã確ä¿ããããã«
1.38
ã«é ãããããšã¯ãã¯ããã«è³¢æãªããã«æãããŸãã
ãã®åé¡ã¯1.38ã察象ãšããŠããŸãã説æã®æåã®è¡ãåç §ããŠãã ããã
@huxiããããšããç§ã¯ãããéããã ã³ã¡ã³ããç·šéããŸããã
@newpavlov
å°æ¥ã®ç¶æ ã®äžéšãšããŠãããã¡ãŒãä¿æããå Žåãšæ¯èŒããŠãå¹çãäœäžããŸãããïŒ ç§ã®äž»ãªæžå¿µã¯ãçŸåšã®èšèšããŒãã³ã¹ãã§ã¯ãªãïŒéåææœè±¡åãåé€ããããšã§ããå¹ççãªã³ãŒããäœæã§ãããšããæå³ã§ïŒãå®äºããŒã¹ã®APIã§äººéå·¥åŠçã§ã¯ãªããä¿®æ£ããæ確ãªæ¹æ³ããªãããšã§ããããã 決ããŠç®ç«ããªããã®ã§ã¯ãããŸãããããã®ãããªãã¶ã€ã³ã®æ¬ é¥ãå¿ããªãããšãéèŠã ãšæããŸãã®ã§ãOPã§èšåããŠããã ããããšæããŸãã
ããããå¿ ããããããšã¯éããŸããããasync / awaitã®å®å®åãšã¯é¢ä¿ããªãããããã®ãã£ã¹ã«ãã·ã§ã³ãå¥ã®ã¹ã¬ããã®åé¡ã«ç§»ããŸãããã
ïŒãšã¯ãããå°æ¥ã®å¯èœæ§ãšããŠãå®äºããŒã¹ã®éåæãã£ã³ã»ã«ã·ã¹ãã APIãžã®ããªããžã³ã°ã«é¢ããåé¡ã«ã€ããŠèšåããããšæããŸããTL; DRãŸã ææãããŠãããããã¡ãŒãæž¡ãå¿ èŠããããŸããããã¯ã©ã€ãã©ãªã®åé¡ã§ããã1ã€ã§ããèšåããŠãïŒ
ãŸããå®äºããŒã¹ã®APIã®åé¡ã«ã€ããŠãèšåããããšæããŸãã ïŒã³ã³ããã¹ãã«ã€ããŠã¯ããã®å éšã¹ã¬ãããåç §ããŠãã ããïŒLinuxã§ã®éåæIOã®æ¹æ³ã«ãªãå¯èœæ§ã®ããIOCPãšio_uringã®å°å ¥ãèæ ®ãããšãããããåŠçããããã®æ確ãªæ¹æ³ãçšæããããšãéèŠã ãšæããŸãã
ãã®åé¡ç©ºéã§ã®APIèšèšã®è°è«ã¯ãããã¯ããå€ãããšãããã€ã©ãŒã«åæããŸãããéåæ/å®å®ååŸ ã¡ã«é¢é£ãããããã®ã³ã¡ã³ãã®1ã€ã®ç¹å®ã®åŽé¢ïŒããã³äžè¬çãªio_uringã«é¢ãããã®è°è«ïŒã«å¯ŸåŠããããšæããŸããã¿ã€ãã³ã°ã
io_uringã¯ã2019幎ã«Linuxã«ç»å Žããã€ã³ã¿ãŒãã§ãŒã¹ã§ããRustãããžã§ã¯ãã¯ã4幎åã®2015幎ããå ç©ã®æœè±¡åã«åãçµãã§ããŸãã å®äºããŒã¹ã®APIãããããŒãªã³ã°ããŒã¹ãåªå ãããšããåºæ¬çãªéžæã¯ã2015幎ãš2016幎ã«è¡ãããŸããã2015幎ã®RustCampã§ã Carl Lercheã¯ãåºç€ãšãªãIOæœè±¡åã§ããmioã§ãã®éžæãè¡ã£ãçç±ã«ã€ããŠè©±ããŸããã 2016幎ã®ãã®ããã°æçš¿ã§ã Aaron Turonã¯ãããé«ãã¬ãã«ã®æœè±¡åãäœæããããšã®å©ç¹ã«ã€ããŠè©±ããŸããã ãããã®æ±ºå®ã¯ãã£ãšåã«è¡ããããã®ã§ãããç§ãã¡ã¯ãããããªããã°ä»ã®ãšããã«å°éããããšã¯ã§ããŸããã§ããã
åºç€ãšãªãå ç©ã¢ãã«ãåæ€èšããå¿ èŠããããšããææ¡ã¯ã3ã4幎åã®ç¶æ ã«æ»ããŠããã®æç¹ããããçŽãå¿ èŠããããšããææ¡ã§ãã ã¢ãŒãã³ã説æããããã«ãããé«ãã¬ãã«ã®ããªããã£ãã«ãªãŒããŒããããå°å ¥ããããšãªããå®äºããŒã¹ã®IOã¢ãã«ãã«ããŒã§ããã®ã¯ã©ã®ãããªæœè±¡åã§ããïŒ ãã®ã¢ãã«ãããŠãŒã¶ãŒãasync / awaitã®ããã«ãéåžžã®Rust +ãã€ããŒã¢ãããŒã·ã§ã³ããèšè¿°ã§ããæ§æã«ã©ã®ããã«ãããã³ã°ããŸããïŒ ãããã®ã¹ããŒããã·ã³ã§ãã³ã䜿çšããŠè¡ã£ãããã«ããããã¡ã¢ãªã¢ãã«ã«çµ±åããæ¹æ³ãã©ã®ããã«åŠçã§ããã§ããããã ãããã®è³ªåãžã®åçãæäŸããããšããããšã¯ããã®ã¹ã¬ããã§ã¯ãããã¯ããå€ããŸãã éèŠãªã®ã¯ããããã«çããæ£ããçãã蚌æããããšãä»äºã§ãããšããããšã§ãã ãããŸã§ã®ãšãããããŸããŸãªè²¢ç®è ã®éã§10幎éã®åŽå幎æ°ã«çžåœãããã®ã¯ãããäžåºŠããçŽãå¿ èŠããããŸãã
éã®ç®æšã¯ã人ã ã䜿çšã§ãã補åããããŠæã ãåºè·ããªããã°ãªããªãããšãæå³ãåºè·ããããšã§ãã æ¥å¹Žå€§äºã«ãªããããããªãå°æ¥ãèŠæ®ããŠããããåãå ¥ããããã«èšèšããã»ã¹ãåéããããšãåžžã«æ¢ããããããã§ã¯ãããŸããã ç§ãã¡ã¯èªåãã¡ã眮ãããŠããç¶æ³ã«åºã¥ããŠæåãå°œãããŸããæããã«ã倧ããªããšãã»ãšãã©èŠéããŠããªãããã«æããã®ã¯ã€ã©ã€ã©ãããããããŸããããçŸç¶ã§ã¯ãaïŒæè¯ã®çµæã«ã€ããŠã®å šäœåããããŸããã io_uringãåŠçããããã«ã¯ãbïŒãšã³ã·ã¹ãã å šäœã§io_uringãã©ãã»ã©éèŠã«ãªããã ããã«åºã¥ããŠ4幎éã®äœæ¥ãå ã«æ»ãããšã¯ã§ããŸããã
ä»ã®ã¹ããŒã¹ã§ã¯ãRustã«ã¯ãã§ã«åæ§ã®ãããããããã«æ·±å»ãªå¶éããããŸãã å»å¹Žã®ç§ã«ããã¯ã»ãã£ãããžã§ã©ã«ããšäžç·ã«èŠããã®ãwasmGCçµ±åã匷調ããããšæããŸãã wasmã§ç®¡ç察象ãªããžã§ã¯ããåŠçããèšç»ã¯ãåºæ¬çã«ã¡ã¢ãªã¹ããŒã¹ãã»ã°ã¡ã³ãåããŠã管ç察象å€ãªããžã§ã¯ããšã¯å¥ã®ã¢ãã¬ã¹ç©ºéã«ååšããããã«ããããšã§ãïŒå®éããã€ãã¯å€ãã®åå¥ã®ã¢ãã¬ã¹ç©ºéã«ååšããŸãïŒã Rustã®ã¡ã¢ãªã¢ãã«ã¯ãåå¥ã®ã¢ãã¬ã¹ã¹ããŒã¹ãåŠçããããã«èšèšãããŠããªãã ãã§ãããä»æ¥ã®ããŒãã¡ã¢ãªãåŠçããå®å šã§ãªãã³ãŒãã¯ãã¢ãã¬ã¹ã¹ããŒã¹ã1ã€ãããªãããšãåæãšããŠããŸãã ç Žå£çãªè§£æ±ºçãšæè¡çã«ç Žå£çã§ã¯ãªããéåžžã«ç Žå£çãªæè¡ç解決çã®äž¡æ¹ãã¹ã±ããããŸããããRustã®å¶éã«å¯ŸåŠããŠãããããwasmGCã¹ããŒãªãŒãå®å šã«æé©ã§ã¯ãªãå¯èœæ§ãããããšãåãå ¥ããããšãæãå¯èœæ§ã®é«ãæ¹æ³ã§ãããããååšããŸãã
ããã§å®å®ããŠããèå³æ·±ãåŽé¢ã¯ãå®å
šãªã³ãŒãããèªå·±åç
§æ§é äœãå©çšã§ããããã«ããŠããããšã§ãã ãããé¢çœãããŠããã®ã¯ã Pin<&mut SelfReferentialGenerator>
ããžã§ãã¬ãŒã¿ãŒã®ç¶æ
å
šäœãæãå¯å€åç
§ïŒ Pin
ãã£ãŒã«ããšããŠæ ŒçŽãããŠããïŒãããããã®ç¶æ
å
ã«ãã€ã³ã¿ãŒãããããšã§ããç¶æ
ã®å¥ã®éšåã«ã ãã®å
éšãã€ã³ã¿ã¯ãå¯å€åç
§ã§ãšã€ãªã¢ã¹ããŸãïŒ
ç§ã®ç¥ãéããå¯å€åç
§ã¯ãå¥ã®ãã£ãŒã«ããžã®ãã€ã³ã¿ãæãã¡ã¢ãªã®éšåã«å®éã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸããã ïŒç¹ã«ãèªå·±åç
§ä»¥å€ã®ãã€ã³ã¿ãŒã䜿çšããŠãã€ã³ã¿ãŒå
ãã£ãŒã«ããèªã¿åãclone
ã¡ãœãããªã©ã¯ãããŸãããïŒããã§ããããã¯ãã³ã¢ãšã³ã·ã¹ãã ã®ä»ã®äœããããç¹ã«rustcèªäœã«ä»å±ããŠãããã®ã ããã§ä¹ã£ãŠãããç·ãã¯éåžžã«çŽ°ããªã£ãŠããã®ã§ãå¯å€åç
§ã«åºã¥ããŠå®è¡ããããããã®åªããæé©åããã¹ãŠå€±ããªãããã«æ³šæããå¿
èŠããããŸãã
ç¹ã«Pin
ã¯ãã§ã«å®å®ããŠãããããçŸæç¹ã§ã§ããããšã¯ããããã»ãšãã©ãããŸãããããšã€ãªã¢ã·ã³ã°ãèš±å¯ãããŠããã«ãŒã«ãæçµçã«ã©ã®ãããªãã®ã§ãã£ãŠããããã¯ããšãææãã䟡å€ããããŸããããã§ã¯ãããŸããã Stacked Borrowsãè€éã ãšæã£ãå Žåã¯ãäºæ
ãæªåããããšã«åããŠãã ããã
Cc https://github.com/rust-lang/unsafe-code-guidelines/issues/148
ç§ã®ç¥ãéããå¯å€åç §ã¯ãå¥ã®ãã£ãŒã«ããžã®ãã€ã³ã¿ãæãã¡ã¢ãªã®éšåã«å®éã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸããã
ããããã¹ãŠã®ã³ã«ãŒãã³ã¿ã€ãã«Debug
å®è£
ãããããšã«ã€ããŠäººã
ã¯è©±ããŸãããããã®äŒè©±ã§ã¯ãå®å
šã§ãªãã³ãŒãã¬ã€ãã©ã€ã³ãçµ±åããŠãå°å·ããããã°ããŠãå®å
šãã©ããã確èªããå¿
èŠãããããã§ãã
人ã ã¯ããããã¹ãŠã®ã³ã«ãŒãã³ã¿ã€ãã«ãããã°ãå®è£ ãããããšã«ã€ããŠè©±ããŸãããããã®äŒè©±ã¯å®å šã§ãªãã³ãŒãã¬ã€ãã©ã€ã³ãçµ±åããŠãäœãå®å šã«ãããã°ã§ãããã確èªããå¿ èŠãããããã§ãã
ããã¯ããã ãã®ãããªDebug
å®è£
ã¯ãèªå·±åç
§ãã£ãŒã«ããåºåããå Žåããžã§ãã¬ãŒã¿ãŒå
ã§ã®MIRã¬ãã«ã®åç
§ããŒã¹ã®æé©åãçŠæ¢ããå¯èœæ§ããããŸãã
ãããã«ãŒã«é¢ããæŽæ°ïŒ
2ã€ã®é«ã¬ãã«ãããã«ãŒã¯äž¡æ¹ãšã倧ããªé²æ©ãéããŠãããå®éã«ã¯äž¡æ¹ãšãçµäºããå¯èœæ§ããããŸãïŒïŒïŒã ããã«é¢ãã@ cramertj @ tmandryãš@nikomatsakisããã®è©³çŽ°æ å ±ã¯çŽ æŽãããã§ãããïŒ
ããã«ããããã®æ©èœãå®å®ãããäžã§ã®äž»èŠãªé害ãšããŠãããã¥ã¡ã³ããšãã¹ããæ®ããŸãã @Centrilã¯ãæ©èœãååã«ãã¹ããŸãã¯æŽç·ŽãããŠããªããšããæžå¿µãäžè²«ããŠè¡šæããŠããŸãã @Centrilã¯ããã®æ©èœãå®å®ãããããã«ãã§ãã¯ãªãã§ããç¹å®ã®æžå¿µäºé ãåæããå Žæã¯ãããŸããïŒ
誰ããããã¥ã¡ã³ããé転ããŠãããã©ããã¯ããããŸããã æ¬ããªãã¡ã¬ã³ã¹ãªã©ã®ããªãŒå ã®ããã¥ã¡ã³ãã®æ¹åã«éäžããã人ã¯èª°ã§ãçŽ æŽããããµãŒãã¹ãæäŸããã§ãããïŒ å ç©ã¬ããareweasyncyetã®ãããªããªãŒå€ã®ããã¥ã¡ã³ãã«ã¯ãå°ãäœåãªæéããããŸãã
ä»æ¥ã®æç¹ã§ãããŒã¿çãã«ããããããŸã§6é±éããã®ã§ããããã®äœæ¥ãå®äºããããã«4é±éïŒ8æ1æ¥ãŸã§ïŒããããšããŸãããã1.38ãã¹ãªããããªããšç¢ºä¿¡ããŠããŸãã
ãµã€ãºã®åé¡ã¯ãããããŸãã§ãã ããã¹ãæé©åã¯åžžã«ãã£ãšãããŸãããæãããªææ°é¢æ°çå¢å ã®ãããã¬ã³ãåé¿ãããšããäœãææã¯ã»ãšãã©è§£æ±ºããããšæããŸããïŒ
ç§ã¯ããä¿¡ããŠããŸãããããŠä»ã®ããã€ããæè¿ééãããŸããã ããããä»ã«ãããããã³ã°ã®åé¡ã
@Centrilã¯ããã®æ©èœãå®å®ãããããã«ãã§ãã¯ãªãã§ããç¹å®ã®æžå¿µäºé ãåæããå Žæã¯ãããŸããïŒ
ãã¹ãããããã®ã®ãªã¹ããèšèŒãããããããããã¯ã¹ããŒããŒãããã httpsïŒ//github.com/rust-lang/rust/issues/62121ããã
æ¬ããªãã¡ã¬ã³ã¹ãªã©ã®ããªãŒå ã®ããã¥ã¡ã³ãã®æ¹åã«éäžããã人ã¯èª°ã§ãçŽ æŽããããµãŒãã¹ãæäŸããã§ãããïŒ
ããã¯ãã; åèãŸã§ã«PRã確èªãããŠããã ããŸãã ãŸããcc @ ehussã
ãŸãã async unsafe fn
MVPããç¬èªã®æ©èœã²ãŒãã«ç§»åããããšæããŸããaïŒã»ãšãã©äœ¿çšãããŠããªããbïŒç¹ã«ååã«ãã¹ããããŠããªããcïŒè¡šé¢äžã .await
ãã€ã³ãã¯ã unsafe { ... }
ãæžãå Žæã§ã¯ãããŸãããããã¯ãããªãŒã¯å®è£
POVãããã¯ç解ã§ããŸããããšãã§ã¯ãPOVããã¯ããã»ã©ç解ã§ããŸãããdïŒè°è«ãã»ãšãã©èŠããããRFCã«å«ãŸããŠããŸããã§ããããŸãããã®ã¬ããŒããããã³eïŒ const fn
ã䜿çšããŠãããå®è¡ãããšãããæ£åžžã«æ©èœããŸããã ïŒæ©èœã²ãŒãã£ã³ã°PRãæžãããšãã§ããŸãïŒ
async unsafe fn
ãäžå®å®ã«ããããšã¯åé¡ãããŸããããçŸåšã®ãã¶ã€ã³ãšã¯ç°ãªããã¶ã€ã³ã«ãªã£ãŠããŸãããšã«æççã§ãã ãããããããç解ããæéãäžããã®ã¯è³¢æãªããã§ãïŒ
async unsafe fn
ãå¥ã®æ©èœã²ãŒãã«ç§»åããããã®https://github.com/rust-lang/rust/issues/62500ãäœæãããããã«ãŒãšããŠãªã¹ãããŸããã ãããããé©åãªè¿œè·¡ã®åé¡ãäœæããå¿
èŠããããšæããŸãã
async unsafe fn
å¥ã®èšèšã«å°éããããšã«éåžžã«æççã§ãããå®å®åã®æåã®ã©ãŠã³ãã«ãããå«ããªããšãã決å®ã«é©ããŠããŸãã å®å
šã§ã¯ãªãasync fn
ããã€ãæžããã®ã§ãããããasync fn really_this_function_is_unsafe()
ãäœãã«ããã§ãããã ããã¯ãåŒã³åºãã«unsafe { ... }
ãå¿
èŠãšããé¢æ°ãå®çŸ©ã§ãããšããç¹ã§ãRustãŠãŒã¶ãŒãæã£ãŠããåºæ¬çãªæåŸ
ã®ååž°ã®ããã§ãã ããã«å¥ã®æ©èœã²ãŒãã¯ã async
/ await
ãæªå®æã§ãããšããå°è±¡ã«è²¢ç®ããŸãã
@cramertjã¯ç§ãã¡ãè°è«ãã¹ãã ãšæãããŸãïŒ ãã®è¿œè·¡ã®åé¡ãéè² è·ã«ãªããªãããã«ããããã«ã
å°æ¥ã®ãµã€ãºã«é¢ããŠã¯ããã¹ãŠã®await
ãã€ã³ãã«åœ±é¿ããã±ãŒã¹ãæé©åãããŸãã ç§ãç¥ã£ãŠããæåŸã®æ®ãã®åé¡ã¯ïŒ59087ã§ããããã§ã¯ãåŸ
ã€åã«æªæ¥ãåãããšããã®æªæ¥ã«å²ãåœãŠããããµã€ãºã2åã«ãªãå¯èœæ§ããããŸãã ããã¯ããªãæ®å¿µãªããšã§ãããããã§ã以åãããããªãè¯ããªã£ãŠããŸãã
ç§ã¯ãã®åé¡ãä¿®æ£ããæ¹æ³ãèããŠããŸããããããç§ãç解ããŠãããããã¯ããã«äžè¬çã§ãªãéããå®å®ããMVPã®åŠšãã«ãªãã¹ãã§ã¯ãããŸããã
ããã¯èšã£ãŠãããããã®æé©åããã¯ã·ã¢ã«äžãã圱é¿ã調ã¹ãå¿ èŠããããŸãïŒãã°ããã®éãããã¯ãããŠããŸããããä»æ¥ãŸãã¯ææ¥ã¯è§£æ¶ãããã¯ãã§ãïŒã ããå€ãã®ã±ãŒã¹ãçºèŠããå¯èœæ§ã¯ååã«ããããããã®ããããããããã¯ããå¿ èŠããããã©ãããå€æããå¿ èŠããããŸãã
@cramertj ïŒãªãã€ã³ããŒïŒç§ã¯async / awaitã䜿çšããasync unsafe
ãå®å®ãããããã§ã¯ãªããasync / awaitã®å®å®åãé
ãããããã®è°è«ã®ããã«èãããŸãã
ç¹ã«RFCã«å«ãŸããŠããªãã£ãããããã®æ¹æ³ã§åŒ·å¶ãããå Žåãå¥ã®ãåŒæ°ã®äœçœ®ã«æé»ã®ç¹æ§ãã®ã·ããã¹ããŒã ãçºçããå¯èœæ§ããããŸãã
[ããã§å®éã«è°è«ãã䟡å€ã®ãªãè£è¶³ïŒãããã«å¥ã®æ©èœã²ãŒãã¯ãasync / awaitãæªå®æã§ãããšããå°è±¡ãäžããããããasync / awaitã䜿çšãããšãæ°æéããšã«ãã°ãèŠã€ãããå°æ°ã®äººã«åºãã£ãŠããŸãã rustcããŒã ãããããä¿®æ£ããããã«åæ³çã«å¿ èŠãªææ°ã§ãããããã¯ç§ã«ãããæªå®æã§ãããšèšããããã®ã§ãã æåŸã®ãã®ã¯æ°æ¥åã«ä¿®æ£ãããŸãããæ°ããrustcã§ã³ãŒããã³ã³ãã€ã«ããããšãããšãã«ãå¥ã®ãã®ãèŠã€ãããªãããšãæ¬åœã«æãã§ããŸããâŠ]
ããªãã®è°è«ã¯ãé©åãªå®éšãšæèãªãã«ä»ã®ãšããå®å šã§ãªãéåæãå®å®ãããããã§ã¯ãªããéåæ/åŸ æ©ã®å®å®åãé ãããããã®è°è«ã®ããã«èãããŸãã
ããããããã¯ãã®ããã®è°è«ã§ã¯ãããŸããã async unsafe
æºåãã§ããŠãããšæããŸãããä»ã®ãã¶ã€ã³ã¯æ³åã§ããŸããã ãã®æåã®ãªãªãŒã¹ã«ãããå«ããªãããšã«ã¯ããã€ãã¹ã®çµæãããªããšæããŸãã async
/ await
å
šäœãç¹ã«async unsafe
ãé
ãããããšã§ãããè¯ãçµæãåŸããããšã¯æããŸããã
ä»ã®ãã¶ã€ã³ã¯æ³åã§ããŸãã
代æ¿èšèšã§ãããè€éãªæ¡åŒµã確å®ã«å¿
èŠã§ãã async unsafe fn
ã¯.await
ã§ã¯ãªãã unsafe
ãã.await
call()
ã§ãã ãã®èåŸã«ããçç±ã¯ã async fn
ãåŒã³åºãããŠimpl Future
äœæãããæç¹ã§ããå®å
šã§ãªãããšã¯äœããšã§ãã ãã®ã¹ããããè¡ãã®ã¯ãããŒã¿ãæ§é äœã«è©°ã蟌ãããšã ãã§ãïŒå®éããã¹ãŠã®async fn
ã¯åŒã³åºãconst
ã§ãïŒã å®å
šã§ãªãå®éã®ãã€ã³ãã¯ã poll
æªæ¥ãåé²ãããããšã§ãã
ïŒã€ãŸãã unsafe
ãå³æã®å Žåã¯ã unsafe async fn
æ¹ãçã«ããªã£ãŠããã unsafe
ãé
ããŠããå Žåã¯ã async unsafe fn
æ¹ãçã«ããªã£ãŠããŸããïŒ
ãã¡ãããç§ãã¡ã¯æ±ºããŠèšã£ãŠæ¹æ³ãååŸããªãå Žåã¯äŸãã°unsafe Future
ã®ãã¹ãŠã®ã¡ãœããã©ãFuture
ããã®åŸããå·»ãäžãããåŒã³åºãããšãå®å
šã§ã¯ãªãunsafe
ã®äœæã«impl Future
ããããŠãã®unsafe
ã®å¥çŽã¯ãçµæãšããŠçããæªæ¥ãå®å
šãªæ¹æ³ã§äœ¿çšããããšã§ãã ããããããã¯ã async
ãããã¯ã«æåã§ãè±ç³ãããã ãã§unsafe async fn
ãªãã§ã»ãŒââç°¡åã«è¡ãããšãã§ããŸãïŒ unsafe fn os_stuff() -> impl Future { async { .. } }
ã
ãã ããããã«å ããŠãäœææã«ä¿æããå¿
èŠã®ãªãpoll
ingãéå§ãããããä¿æããå¿
èŠã®ããäžå€æ¡ä»¶ãå®éã«ååšãããæ¹æ³ãååšãããã©ãããšããåé¡ããããŸãã Rustã§ã¯ãå®å
šãªåã«unsafe
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããã®ãäžè¬çãªãã¿ãŒã³ã§ãïŒäŸïŒ Vec::from_raw_parts
ïŒã ããããéèŠãªã®ã¯ãæ§ç¯åŸãã¿ã€ãã誀çšããããšã¯_ã§ããªã_ãšããããšã§ãã unsafe
ã¹ã³ãŒãã¯çµäºããŸããã ãã®å®å
šæ§ã®ç¯å²ã¯ãRustã®ä¿èšŒã®éµã§ãã ããŒãªã³ã°ã®æ¹æ³ãšã¿ã€ãã³ã°ã®èŠä»¶ãåããå®å
šãªimpl Future
ãäœæããunsafe async fn
ãå°å
¥ãããããå®å
šãªã³ãŒãã«æž¡ããšããã®å®å
šãªã³ãŒãã¯çªç¶å®å
šã§ãªãéå£ã®å
åŽã«ãªããŸãã ãããŠãããã¯ãå€éšã³ã³ãããŒã¿ãééããå¯èœæ§ãé«ãããããã®æªæ¥ãããã«åŸ
ã€ä»¥å€ã®æ¹æ³ã§äœ¿çšãããšããã«çºçããå¯èœæ§ããããŸãã
ããã®TL; DRã¯ãå®å®ãããåã«é©åã«è°è«ããå¿
èŠãããasync unsafe fn
ã³ãŒããŒãééããªãããããšã ãšæããŸããç¹ã«ã const Trait
ã®æ¹åæ§ãå°å
¥ãããå¯èœæ§ããããŸãïŒãã©ããããã°ããããŸãïŒãããã匱ããå¹æã·ã¹ãã ã«äžè¬åããããšã«ã€ããŠã®æçš¿ïŒ fn
-modifyingããŒã¯ãŒãïŒã ãã ãã unsafe async fn
ã¯ãå®éã«ã¯ãå®å®ããããã«unsafe
ã®ãé åºä»ãã/ãé
眮ãã«ã€ããŠååã«æ確ã§ããå¯èœæ§ããããŸãã
ãšãã§ã¯ãããŒã¹ã®unsafe Future
ç¹æ§ã¯ãä»æ¥ã®èšèªãã³ã³ãã€ã©ã§è¡šçŸããæ¹æ³ãç¥ã£ãŠãããã®ã®æã®å±ããªããšããã«ããã ãã§ãªããè¿œå ã®ãšãã§ã¯ãã®ããã«æçµçã«ã¯ããæªãèšèšã«ãªããšæããŸã-ã³ã³ãããŒã¿ãå¿
èŠãšããå€åã
async fnãåŒã³åºãããimpl Futureãäœæãããæç¹ã§ã¯ãå®å šã§ãªãããšã¯äœãã§ããŸããã ãã®ã¹ããããè¡ãã®ã¯ãããŒã¿ãæ§é äœã«è©°ã蟌ãããšã ãã§ãïŒäºå®äžããã¹ãŠã®async fnã¯constãåŒã³åºããŸãïŒã å®å šã§ãªãå®éã®ãã€ã³ãã¯ãäžè«èª¿æ»ã§æªæ¥ãåé²ãããããšã§ãã
ããã¯ã以æ¥ãäºå®ã async fn
åã«ããããšã«ãã¹ãŠã®ãŠãŒã¶ãŒã³ãŒããå®è¡ããããšã¯ã§ããŸãã.await
ç·šããããŸã§ããã¹ãŠã®æªå®çŸ©ã®åäœãå¯èœæ§ãé
ããããšã«ãªã.await
åŒã°ããŸããã ãã ããUBã®ãã€ã³ããšunsafe
tyã®ãã€ã³ãã«ã¯éèŠãªéãããããšæããŸãã unsafe
tyã®å®éã®ãã€ã³ãã¯ãAPIäœæè
ããéçã«æ€èšŒã§ããªãäžå€æ¡ä»¶ã®ã»ãããæºããããããšããŠãŒã¶ãŒãçŽæããå¿
èŠããããšå€æããå Žåããããã®äžå€æ¡ä»¶ã«éåããçµæãUBãåŒãèµ·ãããªãå Žåã§ãã§ããåŸã§ä»ã®å®å
šãªã³ãŒãã§ã ãã®äžè¬çãªäŸã®1ã€ã¯ãå®å
šãªã¡ãœããïŒæ£ç¢ºã«ã¯ãããäœã§ãããïŒã䜿çšããŠãã¬ã€ããå®è£
ããå€ãäœæããunsafe
é¢æ°ã§ãã ããã¯ãããšãã°ãå®è£
ãunsafe
äžå€æ¡ä»¶ã«äŸåããVisitor
-trait-implementingåããåãæ§ç¯ããããã«unsafe
ãèŠæ±ããããšã«ãããé©åã«äœ¿çšã§ããããã«ããããã«äœ¿çšãããŸãã ä»ã®äŸã«ã¯ã slice::from_raw_parts
ãããªãã®ãå«ãŸããŸããããèªäœã¯UBãåŒãèµ·ãããŸãããïŒåã®æå¹æ§ã®äžå€æ¡ä»¶ã¯å¥ãšããŠïŒãçµæã®ã¹ã©ã€ã¹ãžã®ã¢ã¯ã»ã¹ã¯åŒãèµ·ãããŸãã
async unsafe fn
ãããã§ãŠããŒã¯ã§èå³æ·±ãã±ãŒã¹ãè¡šããŠãããšã¯æããŸãããããã¯ã unsafe
èŠæ±ããããšã«ãããå®å
šãªã€ã³ã¿ãŒãã§ã€ã¹ã®èåŸã§unsafe
åäœãå®è¡ããããã®ç¢ºç«ããããã¿ãŒã³ã«åŸããŸããã³ã³ã¹ãã©ã¯ã¿ã
@cramertjããªããããã«ã€ããŠè°è«ããªããã°ãªããªããšããäºå®ïŒãããŠç§ã¯çŸåšã®è§£æ±ºçãæªããã®ã ãšæãããŸãã¯ç§ãããè¯ãèããæã£ãŠãããšç§ã¯ç€ºåããŠããŸããïŒã¯ãç§ã«ãšã£ãŠããã®è°è«ã¯ãã³ãæ°ã«ãã人ãåŸãã¹ãå ŽæïŒRFCãªããžããªã
念ã®ãããReadmeããã®åŒçšïŒ
次ã®å Žåã¯ããã®ããã»ã¹ã«åŸãå¿ èŠããããŸã[...]ïŒ
- ãã°ä¿®æ£ã§ã¯ãªãèšèªãžã®ã»ãã³ãã£ãã¯ãŸãã¯æ§æã®å€æŽã
- [...ãããŠåŒçšãããŠããªããã®]
çŸåšã®ãã¶ã€ã³ã«å€æŽãçãããšèšã£ãŠããããã§ã¯ãããŸããã å®ã¯ãæ°åèããŠã¿ããšãæãã€ãéãæé«ã®ãã¶ã€ã³ã ãšæããŸãã ããããããã»ã¹ã¯ç§ãã¡ã®ä¿¡å¿µãRustã«ãšã£ãŠå±éºã«ãªãã®ãé¿ããããšãå¯èœã«ãããã®ã§ãããRFCãªããžããªããã©ããŒããŠããããããã§ã®ããã»ã¹ã«åŸããªãããšã«ãã£ãŠãã¹ãŠã®åé¡ãèªãã§ããªãå€ãã®äººã ã®ç¥æµã倱ã£ãŠããŸãã
ããã»ã¹ã«åŸããªãããšãçã«ããªã£ãŠããå ŽåããããŸãã ããã§ã¯ã2é±éã®FCPé 延ãåé¿ããããã ãã«ãããã»ã¹ãç¡èŠããå¿ èŠãããç·æ¥æ§ã¯èŠåœãããŸããã
ã§ããããéãã³ãã¥ããã£ã«æ£çŽã«èšã£ãŠããããç¬èªã®readmeã§äžããçŽæã«ã€ããŠæ£çŽã«èšã£ãŠãã ããããããŠãå°ãªããšãåãå ¥ããããRFCããããã§ããã°å®éã«ãããããã«äœ¿çšããããŸã§ããã®æ©èœãæ©èœã²ãŒãã®äžã«çœ®ããŠãã ããã ãããasync / awaitæ©èœã²ãŒãå šäœã§ããããšãå®å šã§ãªãéåææ©èœã²ãŒãã ãã§ããããšãç§ã¯æ°ã«ããŸããããïŒAFAIKïŒasync-wgãè¶ ããŠã»ãšãã©äœ¿çšãããŠããããã³ãã¥ããã£å šäœã
ç§ã¯æ¬ã®åèè³æã§æåã®ãã¹ãæžããŠããŸãã éäžã§ãasync-await RFCãã ?
æŒç®åã®åäœããŸã 決å®ãããŠããªããšèšã£ãŠããããšã«æ°ã¥ããŸããã ããã§ããéåæãããã¯ïŒéã³å ŽïŒã§ã¯æ£åžžã«æ©èœããŠããããã§ãã ãããå¥ã®æ©èœã²ãŒãã«ç§»åããå¿
èŠããããŸããïŒ ãããšããããã¯ããæç¹ã§è§£æ±ºãããŸãããïŒ å®å®åã¬ããŒãã«ã¯è¡šç€ºãããŸããã§ããããèŠèœãšããå¯èœæ§ããããŸãã
ïŒç§ã¯Zulipã§ããã®è³ªåã
ã¯ãã return
ã break
ã continue
ã®åäœãšãšãã«è°è«ããã³è§£æ±ºãããŸããã alã ãããã¯ãã¹ãŠãå¯äžå¯èœãªããšããå®è¡ããã¯ããŒãžã£å
ã§ã®åäœãšåãããã«åäœããŸãã
let f = unsafe { || {...} };
ãå®å
šã«åŒã³åºãããšãã§ããIIRCã¯unsafe
ãã¯ããŒãžã£ãŒã®å
åŽã«ç§»åããã®ãšåãã§ãã
unsafe fn foo() -> impl Fn() { || {...} }
ã«ã€ããŠãåãã§ãã
ããã¯ãç§ã«ãšã£ãŠãã unsafe
ã¹ã³ãŒããé¢ããåŸã«å±éºãªããšãèµ·ãããããã®ååãªåäŸã§ãã
åãããšãä»ã®å Žæã«ãåœãŠã¯ãŸããŸãã 以åã«ææããããã«ã unsafe
ã¯ãæœåšçãªUBãååšããå Žæã§ãããšã¯éããŸããã äŸïŒ
let mut vec: Vec<u32> = Vec::new();
unsafe { vec.set_len(100); } // <- unsafe
let val = vec.get(5).unwrap(); // <- UB
println!("{}", val);
ç§ã«ã¯å®å šã§ã¯ãªããšãã誀解ã®ããã«æããŸããå®å šã§ã¯ãªããšããããšã¯ããããã§å®å šã§ãªãæäœãçºçããããšããããšã§ã¯ãªãããããã§å¿ èŠãªäžå€æ¡ä»¶ãæ¯æããŠããããšãä¿èšŒããŠããããšããããšã§ãã åŸ æ©ãã€ã³ãã§äžå€æ¡ä»¶ãæ¯æããŠããå¯èœæ§ããããŸãããå€æ°ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããªããããäžå€æ¡ä»¶ãæ¯æããŠããããšã確èªããããã®éåžžã«æçœãªãµã€ãã§ã¯ãããŸããã åŒã³åºããµã€ãã§äžå€æ¡ä»¶ãç¶æããããšãä¿èšŒããããšã¯ãã¯ããã«çã«ããªã£ãŠãããå®å šã§ãªããã¹ãŠã®æœè±¡åãã©ã®ããã«æ©èœããããšã¯ããã«äžè²«ããŠããŸãã
ããã¯ãå®å šã§ãªãããšãå¹æãšããŠèããããšãäžæ£ç¢ºãªçŽæã«ã€ãªããçç±ã«é¢é£ããŠããŸãïŒã©ã«ããæšå¹Žãã®ã¢ã€ãã¢ãæåã«æèµ·ããããšãã«äž»åŒµããããã«ïŒã å®å šæ§ã¯ãå ·äœçã«ã¯ãæå³çã«ãæææ§ã§ã¯ãããŸããã ä»ã®å®å šã§ãªãé¢æ°ãåŒã³åºãããã®äžå€æ¡ä»¶ãåŒã³åºãã¹ã¿ãã¯ã«è»¢éããã ãã®å®å šã§ãªãé¢æ°ãäœæããããšã¯ã§ããŸãããããã¯å®å šã§ãªãé¢æ°ã䜿çšãããéåžžã®æ¹æ³ã§ã¯ãªããå®éã«ã¯ãå€ã®ã³ã³ãã©ã¯ããå®çŸ©ããŠæåã§ãã§ãã¯ããããã«äœ¿çšãããæ§æããŒã«ãŒã§ããããªãã¯ããããæ¯æããŸãã
ãããã£ãŠããã¹ãŠã®èšèšæ±ºå®ã«RFCå šäœãå¿ èŠãªããã§ã¯ãããŸãããã決å®ãã©ã®ããã«è¡ããããã«ã€ããŠãããæ確ã§æ§é ãæäŸããããã«åãçµãã§ããŸããã ãã®å·ã®åé ã®äž»èŠãªæ±ºå®ç¹ã®ãªã¹ãã¯ãã®äžäŸã§ãã ç§ãã¡ãå©çšã§ããããŒã«ã䜿çšããŠãå®å šã§ãªãéåæfnsã®ãã®åé¡ã«é¢ããæ§é åãããã³ã³ã»ã³ãµã¹ãã€ã³ããçªãåºãããã®ã§ãããã¯äžè«èª¿æ»ãå«ãèŠçŽæçš¿ã§ãã
async unsafe fn
async unsafe fnsã¯ãå®å šã§ãªããããã¯å ã§ã®ã¿åŒã³åºãããšãã§ããéåæé¢æ°ã§ãã 圌ãã®äœã®äžã¯å±éºãªã¹ã³ãŒããšããŠæ±ãããŸãã äž»ãªä»£æ¿èšèšã¯ãéåæå®å šã§ã¯ãªãFNSå±éºãªåŸ ã€ã®ã§ã¯ãªãããžã®åŒã³åºããè¡ãããšã§ãããã åŒã³åºãã®ãå®å šã§ãªãèšèšã奜ã確ããªçç±ã¯ããã€ããããŸãã
@rfcbot ask langãå®å®åéåæå®å šã§ãªãfnããåŒã³åºãã®ãå®å šã§ãªãéåæfnãšããŠåãå ¥ããŸããïŒã
rfcbotã§æ祚ããæ¹æ³ãããããŸããããå°ãªããšãæåããŸããã
ããŒã ã¡ã³ããŒ@withoutboatsãããŒã ã«è³ªåããŸããïŒT-langãã³ã³ã»ã³ãµã¹ã®ããã«ïŒ
ãå®å®åéåæå®å šã§ãªãfnããåŒã³åºãã®ãå®å šã§ãªãéåæfnãšããŠåãå ¥ããŸããïŒã
@withoutboats
å®å šã§ãªãéåæfnsã®ãã®åé¡ã«é¢ããæ§é åãããã³ã³ã»ã³ãµã¹ãã€ã³ããçªãåºãããã®ã§ãããã¯æ祚ä»ãã®èŠçŽæçš¿ã§ãã
èšäºãããããšãã è°è«ã®çµæãä»æ¥ã¯æ¯æ©æ©èœããasync unsafe fn
ãæ£ããåäœããããšã確信ããŸããã ïŒãŸã°ãã«èŠããã®ã§ãããããããã€ãã®ãã¹ããè¿œå ããå¿
èŠããããŸããïŒãŸããã¬ããŒãã®äžéšãšasync unsafe fn
åäœã®èª¬æã䜿çšããŠãã¬ããŒãã®äžéšãä¿®æ£ããŠãã ããã
ããã¯ãäžè¬çã«å®å šã§ãªãããšãã©ã®ããã«æ©èœããããšããäžèŽããŠããŸãã å®å šã§ãªãé¢æ°ã¯ãåŒã³åºãå ã«ãã£ãŠæ¯æãããŠããããã€ãã®äžå€æ¡ä»¶ã«äŸåããæœè±¡åã§ãã ã€ãŸãããå®å šã§ãªãæäœãçºçããå ŽæããããŒã¯ããããšã§ã¯ãªãããäžå€æ¡ä»¶ãç¶æãããããšãä¿èšŒãããå ŽæããããŒã¯ããããšã«ã€ããŠã§ãã åŒæ°ãéžæãããŠæ€èšŒããããšããšã¯å¥ã«ãåŸ æ©ãµã€ãããããåŒæ°ãå®éã«æå®ãããŠããåŒã³åºããµã€ãã§äžå€æ¡ä»¶ãæ¯æãããŠããããšã確èªããæ¹ãã¯ããã«è³¢æã§ãã ããã¯äžè¬çã«å®å šã§ãªãé¢æ°ã§ã¯ããæ®éã®ããšã§ãããä»ã®å®å šãªé¢æ°ãæ£ãããšæåŸ ããç¶æ ã決å®ããããšããããããŸãã
ããŸã泚æãæã£ãŠããªã人ãšããŠãç§ã¯åæããããã§ã®è§£æ±ºçã¯åªããããã¥ã¡ã³ãã ãšæããŸãã
ç§ã¯ããã§ããŒã¯ããå€ããŠãããããããŸãããããããèãããš
ç¹å®ã®åŸ æ©äžã®äœ¿çšæ³/åäœã«äŸåããäžå€æ¡ä»¶ã¯ãæªãèããšå®å šã§ãããšå€æããããšã¯äžå¯èœã®éã®ã©ããã«ããããã«ç§ã«ã¯æããŸãã
åŸ æ©äžã®åºåå€ãäžå€æ¡ä»¶ã®ç¶æã«é¢ä¿ããŠããå Žåãããå Žåãå°æ¥ã¯ã次ã®ããã«ãå®å šã§ãªãã¢ã¯ã»ã¹ãå¿ èŠãšããã©ãããŒã§ããåºåãæã€å¯èœæ§ããããšæããŸãã
struct UnsafeOutput<T>(T);
impl<T> UnsafeOutput<T> {
unsafe fn unwrap(self) -> T { self.0 }
}
ãã®ãåæã®å®å
šã§ã¯ãªããã®unsafe
ãã¹ãasync
ãã¹ã®åã«ããããšãèãããšã修食åã®é åºãasync unsafe fn
ãããunsafe async fn
æ¹ãã¯ããã«å¹žãã§ãã async unsafe fn
ã unsafe (async fn)
ã¯ã async (unsafe fn)
ãããæããã«ãã®åäœã«ãããã³ã°ãããããã§ãã
ã©ã¡ããåãã§åãå
¥ããŸãããããã§å
¬éãããŠããã©ããã³ã°ã®é åºã¯å€åŽã«unsafe
ããããšåŒ·ãæããŠããã修食åã®é åºããããæ確ã«ããã®ã«åœ¹ç«ã¡ãŸãã ïŒ unsafe
ã®æ¹è³ªå€ã§ããasync fn
ãã§ã¯ãªãasync
ã«ä¿®é£Ÿåunsafe fn
ïŒã
ã©ã¡ããåãã§åãå ¥ããŸãããããã§å ¬éãããŠããã©ããã³ã°ã®é åºã¯å€åŽã«
unsafe
ããããšåŒ·ãæããŠããã修食åã®é åºããããæ確ã«ããã®ã«åœ¹ç«ã¡ãŸãã ïŒunsafe
ã®æ¹è³ªå€ã§ããasync fn
ãã§ã¯ãªãasync
ã«ä¿®é£Ÿåunsafe fn
ïŒã
ç§ã¯ããªãã®æåŸã®æ¬åŒ§ã§å²ãŸãããã€ã³ããŸã§ããªããšäžç·ã«ããŸããã @withoutboatsã®èšäºã¯ãå®å
šæ§ãã³ãŒã«ãµã€ãã§åŠçãããå Žåãå®éã«æã£ãŠããã®ã¯unsafe fn
ïŒéåæã³ã³ããã¹ãã§åŒã³åºãããïŒã§ããããšãç§ã«ã¯ã£ãããšç€ºããŠããŸãã
ãã€ã¯ã·ã§ããasync unsafe fn
ããã€ã³ããããšæããŸãã
async unsafe fn
æ¹ãçã«ããªã£ãŠãããšæããŸãããéåæãå®å
šã§ãªããå®æ°ã®éã®ä»»æã®é åºãææ³çã«åãå
¥ããå¿
èŠããããšãæããŸãã ãããã async unsafe fn
ã¯ãéåæãåé€ããæ»ãã¿ã€ãããè±ç³ãã«å€æŽãããšããæŠå¿µã§ãç§ã«ã¯ããçã«ããªã£ãŠããŸãã
代æ¿æ¡ã¯ãçæçãŸãã¯äžæçïŒæ°å¹Žãæå³ããïŒã§å®æœããããšã¯å®è¡å¯èœã§ã¯ãããŸããã çŸåšèšèšãããŠããRustèšèªã§ããŒãªã³ã°ããã®ãå®å šã§ãªãæªæ¥ãäœæããæ¹æ³ã¯ãããŸããã
FWIW unsafe fn
å
ã®ã¯ããŒãžã£ãšé¢æ°ç¹æ§ã«é¢ããŠã unsafe async fn
ãå®å
šãªpoll
ã¡ãœããã§Future
unsafe async fn
ãè¿ããšã¯æã£ãŠããŸããã§ãããã代ããã«unsafe
UnsafeFuture
ãè¿ããŸãããããŒãªã³ã°ã¡ãœããã ïŒ*ïŒ unsafe { }
ãããã¯å
ã§äœ¿çšãããŠããå Žåã .await
ãUnsafeFuture
.await
ã§ãæ©èœãããããšãã§ããŸããããã以å€ã®å Žåã¯æ©èœããŸããã
ãããã®2ã€ã®å°æ¥ã®ç¹æ§ã¯ãçŸåšã®ç¹æ§ã«é¢ããŠå€§ããªå€åã§ãããããããå€ãã®æ§æå¯èœæ§ã®åé¡ãåŒãèµ·ããã§ãããã ãããã£ãŠã代æ¿æ¡ã暡玢ããããã®è¹ã¯ããããåºèªããŸããã ç¹ã«ãããã¯ä»æ¥ã®Fn
ãã¬ã€ãã®åäœãšã¯ç°ãªãããïŒããšãã°ã UnsafeFn
ãã¬ã€ããªã©ããªãã RFC2585ã§ã®ç§ã®åé¡ã¯ã unsafe fn
å
ã«ã¯ããŒãžã£ãŒãäœæããããšimpls Fn()
ã¯ããŒãžã£ãŒãè¿ããŸããã€ãŸãããã®ã¯ããŒãžã£ãŒã¯å®å
šã§ãªãé¢æ°ãåŒã³åºãããšãã§ããŸãããå®å
šã«åŒã³åºãããšãã§ããŸãã
ãå®å šã§ãªããæªæ¥ãééãäœæããããšã¯åé¡ã§ã¯ãããŸãããåé¡ã¯ãããããããšãå®å šã§ããããšã蚌æããã«ããããåŒã³åºãããšã§ããç¹ã«ã圌ãã®ã¿ã€ãããããè¡ãå¿ èŠããããšèšã£ãŠããªãå Žåã¯ããã§ãã
ïŒ*ïŒãã¹ãŠã®Future
ã«UnsafeFuture
å
æ¬çå®è£
ãæäŸã§ããŸãããŸãã UnsafeFuture
ã«unsafe
ã¡ãœãããæäŸããŠããèªäœããã¢ã³ã©ãããããããšãã§ããŸãã Future
ã«å®å
šã§ããpoll
ã
ãããç§ã®2ã»ã³ãã§ãïŒ
unsafe
éåæé¢æ°ãæ£ããèšèšã§ããããšãç§ã«ç¢ºä¿¡ãããŸããunsafe
ãšasync
åºå®ãããé åºãéåžžã«å¥œã¿ãŸãunsafe async fn
ã®é åºä»ããå°ã奜ã¿ãŸãã ãé«éé»æ°èªåè»ããšãé»æ°é«éèªåè»ãã«äŒŒãŠããŸãã äž»ãªçç±ã¯ã async fn
fn
è±ç³ããããã§ãã ãããã£ãŠã2ã€ã®ããŒã¯ãŒããé£ãåã£ãŠããããšã¯çã«ããªã£ãŠããŸããlet f = unsafe { || { ... } }
ã¯f
å®å
šã«ããã¹ãã§ããã UnsafeFn
ç¹æ§ã¯æ±ºããŠå°å
¥ãããã¹ãã§ã¯ãªããå
éšçãª.await
ingãšasync unsafe fn
ã¯å®å
šãªã UnsafeFuture
ã¯ã匷åãªæ£åœåãå¿
èŠã§ãã
unsafe
ã¯æ瀺çã§ããå¿
èŠããããRustã¯ããªããå®å
šãªåå°ã«æ»ãå¿
èŠããããããããã¯ãã¹ãŠç¶ããŸãã ãŸãããã®ããŒã¯ã³ã«ãã£ãŠã f
ã®...
ã¯å®å
šã§ãªããããã¯ã§ã¯ãªãã httpsïŒ//github.com/rust-lang/rfcs/pull/2585ãæ¡çšãã async unsafe fn
ã¯å®å
šãªããã£ã§ããå¿
èŠããããŸãã
ãã®æåŸã®ç¹ã¯ããªãéèŠã ãšæããŸãã ãã¹ãŠã®async unsafe fn
ãunsafe
ãããã¯ã䜿çšããå¯èœæ§ããããŸãããåæ§ã«ã»ãšãã©ã®å Žåãå®å
šæ§åæã®æ©æµãåããå€ãã®å Žåãééããç¯ããããã»ã©è€éã«èãããŸãã
ç¹ã«ã¯ããŒãžã£ããã£ããã£ãããšãã¯ããããŒãã§ãã«ãŒããã€ãã¹ããªãã§ãã ããã
ã ããããã«ç§ã®ã³ã¡ã³ãïŒ https ïŒ//github.com/rust-lang/rust/issues/62149#issuecomment-511116357ã¯éåžžã«æªãèãã§ãã
UnsafeFuture
ç¹æ§ã§ã¯ãçºä¿¡è
ã¯å°æ¥ãããŒãªã³ã°ããããã«unsafe { }
ãæžã蟌ãå¿
èŠããããŸãããããšãã°Box<dyn UnsafeFuture>
ãååŸããå Žåãçºä¿¡è
ã¯ããã§ã©ã®çŸ©åã蚌æããå¿
èŠããããããããŸããã unsafe { future.poll() }
å®å
šã§ããïŒ ãã¹ãŠã®æªæ¥ã®ããã«ïŒ ããããªãã ãããã£ãŠã @ rpjohnstãåæ§ã®UnsafeFn
ç¹æ§ã®äžåã«ã€ããŠææããããã«ãããã¯å®å
šã«åœ¹ã«ç«ããªãã§ãããã
Futureãåžžã«ããŒãªã³ã°ã«å¯ŸããŠå®å
šã§ããããã«èŠæ±ããããšã¯çã«ããªã£ãŠãããããŒãªã³ã°ã«å¯ŸããŠå®å
šã§ãªããã°ãªããªãFutureãæ§ç¯ããããã»ã¹ã¯å®å
šã§ãªãå¯èœæ§ããããŸãã ãããasync unsafe fn
ã ãšæããŸãã ãã ãããã®å Žåã fn
ã¢ã€ãã ã¯ãè¿ãããæªæ¥ãå®å
šã«ããŒãªã³ã°ã§ããããã«ãäœãæ¯æããå¿
èŠãããããææžåã§ããŸãã
@rfcbotã®å®è£ -äœæ¥-ãããã¯-å®å®å
ç§ã®ç¥ãéãããŸã 2ã€ã®æ¢ç¥ã®å®è£ ãããã«ãŒãããïŒhttps://github.com/rust-lang/rust/issues/61949ãhttps://github.com/rust-lang/rust/issues/62517ïŒãããã§ãããã€ãã®ãã¹ããè¿œå ããã®ã¯è¯ãããšã§ãã rfcbotãæéçã«ãããã«ãŒã«ãªããªãããã«ãããšããæžå¿µã解決ãã代ããã«å®éã«ä¿®æ£ããããã¯ããŸãã
@rfcbotã¯å®è£ -äœæ¥-ãããã¯-å®å®åã解決ããŸã
https://github.com/rust-lang/rust/pull/63209ã«å®å®åPRãæåºããŸãã
äžèšã®ããŒãžããåŸåã®ããæåŸã®ã³ã¡ã³ãæéãå®äºããŸããã
ã¬ããã³ã¹ããã»ã¹ã®èªååããã代衚ãšããŠãèè ãšä»ã®ãã¹ãŠã®è²¢ç®è ã«æè¬ããŸãã
RFCã¯ãŸããªãããŒãžãããŸãã
ããã§å®å®ããŠããèå³æ·±ãåŽé¢ã¯ãå®å šãªã³ãŒãããèªå·±åç §æ§é äœãå©çšã§ããããã«ããŠããããšã§ãã ãããèå³æ·±ããã®ã«ããŠããã®ã¯ãPin <ïŒmut SelfReferentialGenerator>ã«ããžã§ãã¬ãŒã¿ãŒã®ç¶æ å šäœãæãå¯å€åç §ïŒPinã®ãã£ãŒã«ããšããŠæ ŒçŽãããŠããïŒãããããã®ç¶æ å ã«ç¶æ ã®å¥ã®éšåãæããã€ã³ã¿ãŒãããããšã§ãã ã ãã®å éšãã€ã³ã¿ã¯ãå¯å€åç §ã§ãšã€ãªã¢ã¹ããŸãïŒ
ããã®ãã©ããŒã¢ãããšããŠã @ comexã¯å®éã«ã LLVMã®noalias
ã¢ãããŒã·ã§ã³ã«éåããïŒå®å
šãªïŒéåæRustã³ãŒãããçŸåšã®æ¹æ³ã§ããšã«æåããŸããã ãã ããTLSã䜿çšããŠãããããšæãããçŸåšã誀ã³ã³ãã€ã«ã¯ãããŸããã
æãåèã«ãªãã³ã¡ã³ã
äžèšã®ããŒãžããåŸåã®ããæåŸã®ã³ã¡ã³ãæéãå®äºããŸããã
ã¬ããã³ã¹ããã»ã¹ã®èªååããã代衚ãšããŠãèè ãšä»ã®ãã¹ãŠã®è²¢ç®è ã«æè¬ããŸãã
RFCã¯ãŸããªãããŒãžãããŸãã