ãã®ææžã¯ãThe Architecture of Open Source Applications Volume II: Structure, Scale, and a Few More Fearless Hacksã«åé²ãããŠããThe Dynamic Language Runtime and the Iron Languagesã®æ¥æ¬èªèš³ã§ããåæãšåæ§ãæ¥æ¬èªèš³ãcc-by unported 3.0ã«ãã£ãŠå ¬éãããŸãã
Jeff Hardy (åæ) / Atsushi Eno (æ¥æ¬èªèš³)
Ironèšèªã¯ãIronPythonãã¯ãããšããŠã"Iron"ãååã«å«ããåçš®èšèªå®è£ ã®éå ¬åŒãªéåäœã§ãããããã®èšèªã«ã¯ãå°ãªããšãã²ãšã€å ±éããŠããããšããããŸãããããã¯ãå ±éèšèªã©ã³ã¿ã€ã ïŒCLRïŒã察象ãšããåçèšèªã§ãããåçèšèªã©ã³ã¿ã€ã ïŒDLRïŒã®äžã«æ§ç¯ãããŠããŸããCLRã¯ãããã.NET FrameworkãšããŠç¥ãããŠããã§ããããïŒ"CLR"ã¯ããæ±çšçãªçšèªã§ãã.NET Frameworkã¯Microsoftã®å®è£ ã§ããããã®ä»ã«ãªãŒãã³ãœãŒã¹ã®å®è£ ã§ããMonoããããŸããïŒãDLRã¯ãCLRäžã§åçèšèªãé«åºŠã«ãµããŒãããããã®ãCLRçšã©ã€ãã©ãªã®éåäœã§ããIronPythonãšIronRubyã¯ãäœåãã®ã¯ããŒãºããœãŒã¹ãããã¯ãªãŒãã³ãœãŒã¹ã®ãããžã§ã¯ãã§äœ¿çšãããŠãããããããã¢ã¯ãã£ãã«éçºãããŠããŸããDLRã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ããšããŠå§ããããŸããããããã¯.NET FrameworkãšMonoã®äžéšãšãªã£ãŠããŸãã
ã¢ãŒããã¯ãã£ãšããŠã¯ãIronPythonãIronRubyãDLRã¯ãåçŽã§ããããæªéçãªãŸã§ã«è€éã§ããããŸãã髿°Žæºãªãšããã§ã¯ããã®èšèšã¯ä»ã®å€ãã®èšèªå®è£ ã«äŒŒãŠãããããŒãµãã³ã³ãã€ã©ãŒãã³ãŒããžã§ãã¬ãŒã¿ãŒããæã£ãŠããŸããããããå°ãè¿å¯ã£ãŠã¿ããšããã®é¢çœã詳现éšåãé¡ãåºããŠããŸããã³ãŒã«ãµã€ãïŒcall sitesïŒããã€ã³ããŒãé©çšçã³ã³ãã€ã«ïŒadaptive compilationïŒããã®ä»åçš®æè¡ã«ãã£ãŠãéçèšèªçšã«èšèšããããã©ãããã©ãŒã äžã§ããåçèšèªãéçèšèªã«ã»ãŒå¹æµããããã©ãŒãã³ã¹ãåºããããã«ãªã£ãŠããŸãã
Ironèšèªã®æŽå²ã¯2003幎ã«å§ãŸããŸãã Jim Huguninã¯ããã®æãã§ã«ãJavaä»®æ³ãã·ã³ïŒJVMïŒçšã«ãJythonãšåŒã°ããPythonã®å®è£ ãæžããŠããŸãããäžæ¹ãã®é ã.NET Frameworkã®å ±éèšèªã©ã³ã¿ã€ã ïŒCLRïŒã¯ãPythonã®ãããªåçèšèªãå®è£ ããã®ã«ã¯é©ããŠããªãããšèããããŠããŸããïŒèª°ã«ãã£ãŠããšãããšå®ãã§ã¯ãããŸãããïŒãæ¢ã«JVMçšã«Pythonãå®è£ ããŠããJimã¯ããªãMicrosoftã.NETãJavaãããã£ãšå£ããã®ã«äœãäžããããã®ããäžæè°ã«æã£ãŠããŸããã2006幎9æã®ããã°ã®æçš¿ã§ãåœŒã¯æ¬¡ã®ããã«æžããŠããŸã:
ç§ã¯ãMicrosoftãã©ããã£ãŠCLRãJVMãããåçèšèªã®çšéã«å£ããã©ãããã©ãŒã ãšããŠäœãäžããããšãåºæ¥ãã®ããçè§£ãããã£ããç§ã®èšç»ã¯ãCLRäžã§åäœããPythonå®è£ ã®ãããã¿ã€ããæ°é±éãããŠæ§ç¯ãããããçšããŠãCLRãåçèšèªã«å šç¶åããªããã©ãããã©ãŒã ã§ããçç±ããšãã£ã±ããšé¡ããèšäºãæžãäºå®ã ã£ãããã®ãããã¿ã€ãã«çæããŠã»ã©ãªããç§ã®èšç»ã¯å€æŽãšãªã£ããPythonã¯ãCLRäžã§éåžžã«åªããåäœãèŠããã®ã ã£ããå€ãã®ã±ãŒã¹ã§ãCããŒã¹ã®å®è£ ãããèããé«éã ã£ããæšæºã®pystoneãã³ãããŒã¯ã«ãããŠãCLRäžã®IronPythonã¯ãCããŒã¹ã®å®è£ ãã1.7åãããé«éã ã£ãã
ïŒååã®"Iron"ãšããéšåã¯ãJimã®åœæã®äŒç€Ÿåã§ãããWant of a Nail Softwareã®ååããã®èšèéã³ã§ä»ããããŠããŸããïŒ
[蚳泚: ãã㯠"for want of a nail" ãšãããäžæ¬ã®éãè¶³ããªãããšã§è¹éããã¡ã«ãªããè¹éããã¡ã«ãªã£ãããšã§éЬãèµ°ããªããªãã銬ãèµ°ããªããªã£ãããšã§äŒä»€ãåããªããªããäŒä»€ãæ©èœããªãã£ãããšã§æŠã«æããæŠã«æããããšã§åœãæ» ã³ããäžæ¬ã®è¹éã®éãåå ã ã£ãã®ã ããšããè©©ã«ç±æ¥ããã]
ã»ã©ãªããJimã¯ã.NETãããåçèšèªã«é©ãããã©ãããã©ãŒã ãšããã¹ããMicrosoftã«éãããããšã«ãªããŸãããJimïŒãããŠãã®ä»ã®å€ãã®äººã ïŒã¯ãããšã®IronPythonã®ã³ãŒããããèšèªäžç«ã®èŠçŽ ãæãåºããŠãDLRãšããŸãããDLRã¯ã.NETçšã®åçèšèªãå®è£ ããããã®å ±éã®ã³ã¢ãæäŸããã¹ãèšèšããã.NET 4ã®äž»èŠãªæ°æ©èœãšãªããŸããã
ïŒ2007幎4æã«ïŒDLRãã¢ããŠã³ã¹ãããæãMicrosoftã¯ãDLRäžã§åäœããæ°ããããŒãžã§ã³ã®IronPythonïŒIronPython 2.0ïŒãšåæã«ãDLRã®å€èšèªã®é©çšå¯èœæ§ã瀺ãã¹ãIronRubyãDLRã«åºã¥ããŠéçºããããšãã¢ããŠã³ã¹ããŸãããïŒ2010幎10æã«ãMicrosoftã¯IronPythonãšIronRubyã®éçºã忢ãããããã¯ç¬ç«ãããªãŒãã³ãœãŒã¹ã®ãããžã§ã¯ããšãªããŸãããïŒãDLRãçšããåçèšèªãšã®çµ±åã¯ãC#ããã³Visual Basicã«ãšã£ãŠãäž»èŠãªéšåãšãªããæ°ããããŒã¯ãŒãïŒ dynamic ïŒããDLRã§å®è£
ãããèšèªãä»»æã®åçããŒã¿ãœãŒã¹ã®åŒã³åºãããç°¡åã«åºæ¥ãããã«ããŸãããCLRã¯ãã§ã«éçèšèªãå®è£
ããè¯ããã©ãããã©ãŒã ã§ããããDLRããããã®èšèªãäžçŽåžæ°ãšããŠæŒãäžããã®ã§ãã
Microsoftå€éšã§ããIronSchemeãIronJSãšãã£ããDLRã䜿çšããèšèªå®è£ ããããŸããããã«ãMicrosoftã®PowershellããŒãžã§ã³3ã§ã¯ããã®ç¬èªã®åçãªããžã§ã¯ãã·ã¹ãã ã®ä»£ããã«DLRã䜿çšããŸãã
CLRã¯ãéçèšèªãåæã«èšèšãããŠããŸããåã«é¢ããæ å ±ã¯ãã©ã³ã¿ã€ã ã®å¥¥æ·±ãã«ãŸã§çŒãä»ããããŠããããã®ããŒãšãªãã²ãšã€ã®åæãšããŠãåã¯å€åããªããšããããšãæããããŸãã倿°ã¯ãã®åã倿Žããããšã¯ãªãããŸããåã¯ããã°ã©ã ã®å®è¡äžã«ãã£ãŒã«ããã¡ã³ããŒã远å ããããåé€ããããããããšã¯ãããŸãããããã¯C#ãJavaã®ãããªèšèªã«ãããŠã¯åé¡ãããŸããããåçèšèªã¯ãå®çŸ©äžããããã®èŠåã«åŸããŸããããŸããCLRã¯ãéçãªåã®å ±éãªããžã§ã¯ãã·ã¹ãã ãæäŸããŠãããããã«ãã£ãŠããããªã.NETèšèªãä»ã®.NETèšèªã«ãã£ãŠæžããããªããžã§ã¯ãããç¹å¥ãªäœæ¥ãèŠããããšãªãåŒã³åºãããšãã§ããŸãã
DLRãç¡ãå Žåããã¹ãŠã®åçèšèªããç¬èªã®ãªããžã§ã¯ãã¢ãã«ãæäŸããªããã°ãªããªãã£ãã§ããããåçš®ã®åçèšèªããä»ã®åçèšèªã§æžããããªããžã§ã¯ããåŒã³åºãããšã¯ããªãããC#ããIronPythonãIronRubyãçããæ±ãããšãã§ããªãã£ãã¯ãã§ããããªãã¡ãDLRã®äžæ žã¯ãåçãªããžã§ã¯ããå®è£ ãã€ã€ããã€ã³ããŒãçšããŠèšèªç¬èªã®æ¯ãèããã«ã¹ã¿ãã€ãºããããšãå¯èœã«ãããæšæºåãããæ¹æ³ãªã®ã§ããããã«ã¯ãåçãªåœä»€ãå¯èœãªéãé«éåã§ããããã«ããã³ãŒã«ãµã€ããã£ãã·ã¥ãšåŒã°ããã¡ã«ããºã ããã³ãŒããããŒã¿ãšããŠç°¡åã«æäœã§ããããã«ããåŒããªãŒãæ§ç¯ããããã®ã¯ã©ã¹çŸ€ãå«ãŸããŸãã
CLRã¯ãåçèšèªã䟿å©ã«ããããã®æ©èœãããã€ãæäŸããŠããŸããé«åºŠãªã¬ããŒãžã³ã¬ã¯ã¿ãŒã.NETã®ã³ã³ãã€ã©ãŒãçæããå
±éäžéèšèªïŒILïŒãã€ãã³ãŒããå®è¡æã«ãã·ã³ã³ãŒãã«å€æãããžã£ã¹ãã€ã³ã¿ã€ã ïŒJITïŒã³ã³ãã€ã©ãŒããããŠæåŸã«ãå®è¡æã«ã³ãŒããçæããéçã¡ãœããåŒã³åºãããããããã«å€ããªãŒããŒãããã®ã¿ã§å®è¡ã§ããåçã¡ãœããïŒãŸãã¯è»œéã³ãŒãçæïŒããããŸããïŒJVMã¯ãJava 7ã§ invokedynamic ãšããé¡äŒŒã®æ©èœãåŸãŸãããïŒ
ãã®DLRã®èšèšã®ææãšããŠãIronPythonãIronRubyã®ãããªèšèªã¯ãå
±éã®åçãªããžã§ã¯ãã¢ãã«ã䜿çšããããšã«ãã£ãŠãäºãã®ïŒãããŠä»ã®ä»»æã®DLRèšèªã®ïŒãªããžã§ã¯ããåŒã³åºããããã«ãªããŸããããã®ãªããžã§ã¯ãã¢ãã«ã®ãµããŒãã¯ãC# 4ã§ïŒ dynamic ããŒã¯ãŒãã«ãã£ãŠïŒããŸãVisual Basic 10ã§ïŒVBã®æ¢åã®ãé
å»¶ãã€ã³ãã£ã³ã°ãã®ææ³ã«å ããŠïŒè¿œå ãããåæ§ã«ãããã®ãªããžã§ã¯ãã«å¯ŸããåçãªåŒã³åºããå®è¡ã§ããããã«ãªããŸãããããããŠDLRã¯ãåçèšèªã.NETã«ãããäžçŽåžæ°ãšããã®ã§ãã
é¢çœãããšã«ãDLRã¯å®å šã«.NET 2.0äžã§ããã«ãããŠå®è¡ã§ããã©ã€ãã©ãªã®éåäœãšããŠå®è£ ãããŸããããããå®è£ ããããã«ããããªãCLRã®å€æŽãå¿ èŠã§ã¯ãªãã£ããšããããã§ãã
ã©ã®èšèªå®è£
ã«ãããµãã€ã®åºæ¬çãªã¹ããŒãžããããŸããããŒã¹ïŒããã³ããšã³ãïŒãšã³ãŒãçæïŒããã¯ãšã³ãïŒã§ããDLRã«ãããŠã¯ãããããã®èšèªãç¬èªã®ããã³ããšã³ãã§ããèšèªããŒãµãŒãšææ³ããªãŒçæãå®è£
ããŸããDLRã¯åŒããªãŒãåãåã£ãŠCLRãå©çšã§ãããããªäžéèšèªïŒILïŒãçæããå
±éã®ããã¯ãšã³ããæäŸããŸããCLRã¯ãã®ILããããã»ããµãå®è¡ãããã·ã³ã³ãŒããçæãããžã£ã¹ãã€ã³ã¿ã€ã ïŒJITïŒã³ã³ãã€ã©ãŒã«æž¡ããŸããå®è¡æã«å®çŸ©ãããïŒããã³ eval ãçšããŠå®è¡ãããïŒã³ãŒããåæ§ã«åŠçãããŸãããå
šãŠã¯ãã¡ã€ã«ã®èªã¿èŸŒã¿æã§ã¯ãªã eval ã®ã³ãŒã«ãµã€ãã§è¡ãããŸãã
èšèªã®ããã³ããšã³ãã®äž»èŠãªéšåãå®è£ ããæ¹æ³ã¯ããã€ããããIronPythonãšIronRubyãéåžžã«äŒŒãŠããã«ããããããïŒå®ã®ãšãããããã¯äžŠè¡ããŠéçºãããŠããããã§ãïŒããããã¯ããã€ãã®äž»èŠãªéšåãç°ã«ããŠããŸããIronPythonãIronRubyãããããŠæšæºçãªããŒãµãŒã®èšèšãçšããŠãããããã¹ããããŒã¯ã³ã«åå²ããããŒã¯ãã€ã¶ãŒïŒããã㯠lexer ïŒãšãããŒã¯ã³ãããã°ã©ã ãè¡šãæœè±¡æ§æããªãŒïŒASTïŒã«å€æããããŒãµãŒãå©çšããŠããŸããããããªããããããã®èšèªã¯ãããã®å®è£ ãå®å šã«å¥ã ã«ããŠããŸãã
IronPythonã®ããŒã¯ãã€ã¶ãŒã¯ IronPython.Compiler.Tokenizer ã¯ã©ã¹ã«ãããããŒãµãŒã¯ IronPython.Compiler.Parser ã¯ã©ã¹ã«ãããŸããããŒã¯ãã€ã¶ãŒã¯Pythonã®ããŒã¯ãŒãã»æŒç®åã»ååãèªèããŠå¯Ÿå¿ããããŒã¯ã³ãçæããææžãã®ã¹ããŒããã·ã³ã§ããããããã®ããŒã¯ã³ã«ã¯ãä»»æã®è¿œå æ
å ±ïŒå®æ°å€ãååãªã©ïŒãšããã®ããŒã¯ã³ã®ãœãŒã¹äžã®äœçœ®ãããããã°ã®è£å©æ
å ±ãšããŠå«ãŸããŸãããããŠãããŒãµãŒã¯ããã®ããŒã¯ã³ã®éåãåãåã£ãŠãPythonææ³ã«åºã¥ããŠè§£èªããæ£ããPythonçæèŠåã«åŸã£ãŠãããã倿ããŸãã
IronPythonã®ããŒãµãŒã¯LL(1)ã®ååž°äžéæ§æããŒãµãŒïŒrecursive decent parserïŒã§ãããã®ããŒãµãŒã¯å ¥åããŒã¯ã³ãèŠãŠããã®ããŒã¯ã³ã蚱容ãããã倿ãã颿°ãåŒã³åºãã蚱容ãããªãå Žåã¯ãšã©ãŒãè¿ããŸããååž°äžéæ§æããŒãµãŒã¯ãçžäºã«ååž°çãªé¢æ°ã®éåããæ§ç¯ãããŸãããããã®é¢æ°ã¯ç©¶æ¥µçã«ã¯ã²ãšã€ã®ã¹ããŒããã·ã³ãå®è£ ããããšã«ãªããããããã®æ°ããããŒã¯ã³ãã²ãšã€ã®ç¶æ é·ç§»ãããªã¬ãŒããŸããããŒã¯ãã€ã¶ãŒãšåæ§ã«ãIronPythonã®ããŒãµãŒã¯ææžãã§äœãããŠããŸãã
äžæ¹ãIronRubyã¯ãGardens Point Parser GeneratorïŒGPPGïŒãçæããããŒã¯ãã€ã¶ãŒããã³ããŒãµãŒããã£ãŠããŸããããŒãµãŒã¯ Parser.y ãã¡ã€ã«ïŒ Languages/Ruby/Ruby/Compiler/Parser/Parser.y ïŒã«èšè¿°ãããŠããŸããããã¯ãææ³ãèšè¿°ããèŠåã«åºã¥ããŠãIronRubyã®ææ³ãé«ã¬ãã«ã§èšè¿°ãã yacc ãã©ãŒãããã®ãã¡ã€ã«ã§ããGPPG㯠Parser.y ãåãåã£ãŠãå®éã®ããŒãµãŒé¢æ°ããã³ããŒãã«ãäœæããŸãããã®åºåã¯ããŒãã«ã«åºã¥ãLALR(1)ã®ããŒãµãŒãšãªããŸããçæãããããŒãã«ã¯æŽæ°ã®é·ãé
å矀ã§ãããããã®æŽæ°ãç¶æ
ã衚ããŸãããã®ããŒãã«ã¯ãçŸåšã®ç¶æ
ãšçŸåšã®ããŒã¯ã³ãããæ¬¡ã«ã©ã®ç¶æ
ã«é·ç§»ããããæ±ºå®ããŸããIronPythonã®ååž°äžéããŒãµãŒã¯éåžžã«èªã¿ããããã®ã§ãããIronRubyã®çæãããããŒãµãŒã¯ããã§ã¯ãããŸãããé·ç§»ããŒãã«ã¯èšå€§ãªãã®ã§ïŒ540çš®é¡ã®ç¶æ
ãš45,000ã®é·ç§»ïŒããããæäœæ¥ã§ä¿®æ£ããã®ã¯ã»ãŒäžå¯èœã§ãã
çµå±ã®ãšãããããã¯ãšã³ãžãã¢ãªã³ã°ã®ãã¬ãŒããªãã§ããIronPythonã®ããŒãµãŒã¯æäœæ¥ã§ä¿®æ£ããã®ã¯ç°¡åã§ãããèšèªã®æ§é ãææ§ã«ããŠããŸãçšåºŠã«ã¯è€éã§ããäžæ¹ãIronRubyã®ããŒãµãŒã¯ã Parser.y ãã¡ã€ã«ã§èšèªã®æ§é ãçè§£ããã®ã¯ç°¡åã§ããããµãŒãããŒãã£ã®ããŒã«ã«äŸåããŠã«ã¹ã¿ã ã®ïŒãšã¯ããã»ãŒæ¢ç¥ã§ããïŒãã¡ã€ã³åºæèšèªïŒDSLïŒã䜿çšããããç¹æã®ãã°ãç¬èªæ§ã«æ©ãŸãããããšã«ãªããŸãããã®å ŽåãIronPythonããŒã ã¯å€éšããŒã«äŸåæ§ã«èžã¿èŸŒã¿ããã¯ãªããäžæ¹ã§IronRubyããŒã ã¯ãããæ°ã«ç ãŸãªãã£ããšããããšã§ãã
ãšã¯ããããããªããã§ãŒãºã®è§£æã«ãããŠããã¹ããŒããã·ã³ãéèŠã§ããããšã¯æããã§ãããããªãè§£æã¿ã¹ã¯ã«ãããŠãããããã©ãã ãç°¡åãªãã®ã§ãã£ãŠããã¹ããŒããã·ã³ãåžžã«æ£ããè§£ãªã®ã§ãã
ã©ã¡ãã®èšèªã«ã€ããŠããããŒãµãŒã®åºåçµæã¯æœè±¡æ§æããªãŒïŒASTïŒã§ããããã¯ããã°ã©ã ã®æ§é ãé«ã¬ãã«ã§èšè¿°ãããã®ã§ãããããã®ããŒãã¯èšèªã®çæèŠåã§ãããæãŸãã¯åŒã«å¯Ÿå¿ããŸãããããã®ããªãŒã¯ãå®è¡æã«æäœã§ããæãšããŠã³ã³ãã€ã«åã«ããã°ã©ã ã®æé©åãæœãããŸããããããªãããèšèªã®ASTã¯ãã®èšèªã«å¯æ¥ã«çµã³ã€ããŠããŸããDLRã¯ããããªãèšèªç¬èªã®çæèŠåãå«ãŸãªããæ±çšçãªãã®ã®ã¿ãå«ãããªãŒããæäœããå¿ èŠããããŸãã
åŒããªãŒããŸããå®è¡æã«æäœã§ããããã°ã©ã ã®è¡šçŸã§ãããããäœã¬ãã«ãªãèšèªç¬ç«ã®åœ¢åŒã§ãã.NETã§ã¯ãããŒãã®å㯠System.Linq.Expressions ããŒã ã¹ããŒã¹ã«ãããå
šãŠã®ããŒãã®åã¯æœè±¡å Expression ã¯ã©ã¹ããæŽŸçããŸããïŒãã®ããŒã ã¹ããŒã¹ã«ã¯æŽå²çãªèæ¯ããããŸããåŒããªãŒã¯ãããšããšã¯.NET 3.5ã§LINQããšèšèªçµ±åã¯ãšãªãå®è£
ããããã«è¿œå ããããã®ã§ãDLRã®åŒããªãŒã¯ãããæ¡åŒµããã®ã§ããïŒããããã®åŒããªãŒã¯ãå®ã®ãšãããåãªãåŒä»¥äžã®ãã®ãã«ããŒããŠããã if æã try ãããã¯ããã«ãŒããªã©ã®ããŒãã®åããããŸããèšèªã«ãã£ãŠã¯ïŒããšãã°Rubyã§ã¯ïŒããããã¯åŒã§ãã£ãŠãæã§ã¯ãããŸããã
ãããã¯ãã²ãšã€ã®ããã°ã©ãã³ã°èšèªã§å¿
èŠãšãããã§ããããã»ãŒãã¹ãŠã®æ©èœãã«ããŒããããŒã矀ã§ããããããªããããããã¯åŸãŠããŠäœã¬ãã«ã«å®çŸ©ãããŠããŸãã ForExpression ã WhileExpression ãªã©ãšãã£ããã®ã®ä»£ããã«ã LoopExpression ãã²ãšã€ã ãååšããŠããã ãã㯠GotoExpression ãšçµã¿åãããããšã«ãã£ãŠãã©ã®çš®é¡ã®ã«ãŒããèšè¿°ããããšãã§ããŸããèšèªãããé«ã¬ãã«ã§èšè¿°ããããã«ãèšèªã§ã¯ããã®ç¬èªã®ããŒããã Expression ããæŽŸçããŠãReduce() ã¡ãœããããªãŒããŒã©ã€ãããŠå¥ã®åŒããªãŒãè¿ãããã«ããããšã§ãå®çŸ©ã§ããŸããIronPythonã§ã¯ããã®è§£æããªãŒããŸãDLRåŒããªãŒã§ãããããã¯DLRãéåžžã¯è§£ããªããããªã«ã¹ã¿ã ããŒããæ°å€ãå«ãã§ããŸãïŒããšãã° ForStatement ãªã©ïŒããããã®ã«ã¹ã¿ã ããŒãã¯ãDLRãçè§£ã§ãããããªããã¡ã®åŒããªãŒïŒ LoopExpression ãš GotoExpression ã®çµã¿åãããªã©ïŒã«è§£æ¶ïŒreduceïŒããããšãã§ããŸããã«ã¹ã¿ã åŒããŒãã¯ãå¥ã®ã«ã¹ã¿ã åŒããŒã矀ã«è§£æ¶ã§ãããã®è§£æ¶åŠçã¯ãDLRã«å
åšããããŒãã®ã¿ãæ®ãããã«ãååž°çã«è¡ãããŸããIronPythonãšIronRubyã®å€§ããªéãã®äžã€ã¯ãIronPythonã§ã¯ASTããŸãåŒããªãŒã§ããã®ã«æ¯ã¹ãIronRubyã§ã¯ãããªã£ãŠããªããšããããšã§ããIronRubyã§ã¯ãASTã¯æ¬¡ã®ã¹ããŒãžã«é²ãåã«åŒããªãŒã«å€æãããŸããASTãåŒããªãŒã§ãããããšãå®éã«æçšã§ãããåŠãã¯ãè°è«ã®äœå°ããããIronRubyã¯ãã®ãããªå®è£
ãè¡ããªãã£ããšããããšã«ãªããŸãã
åããŒãã®åã¯ãèªèº«ãè§£æ¶ããæ¹æ³ãç¥ã£ãŠããããããŠäžæ¹åã«ã®ã¿è§£æ¶ã§ããŸããããªãŒã®å€åŽã®ã³ãŒãã«ãã倿åŠçãããšãã°å®æ°æãç³ã¿ïŒconstant foldingïŒæé©åããPythonçæç³»ã®IronPythonå®è£
ãã«ãããŠã¯ã ExpressionVisitor ã®ãµãã¯ã©ã¹ã䜿çšãããŸãã ExpressionVisitor ã«ã¯ Visit() ã¡ãœãããããããã㯠Expression ã¯ã©ã¹ã® Accept() ã¡ãœãããåŒã³åºãããã® Expression ã®ãµãã¯ã©ã¹ã¯ Accept() ããªãŒããŒã©ã€ãããŠãVisitBinary() ãªã©ã ExpressionVisitor ã®åå¥ã® Visit() ã®ã¡ãœãããåŒã³åºããŸããããã¯ã蚪åïŒvisitïŒã§ããéãããåã®ããŒã矀ãšãããã«å¯Ÿããç¡éæ°ã®æäœããæããæç§æžçãªGammaãã®Visitorãã¿ãŒã³ã®å®è£
ã§ããåŒããžã¿ãŒã¯ãããŒãã蚪åããŠãéåžžã¯ååž°çã«ãã®åããŒã矀ã蚪åããããã«ãã®åããŒã矀ãããã«ãã®åâŠãšãããªãŒãäžéçã«èŸ¿ããŸããããããåŒããªãŒã¯äžå€ïŒimmutableïŒãªã®ã§ãExpressionVisitor ã¯ãèªãã蚪åããŠããããªãŒã«æãå ããããšã¯ã§ããŸããããããã®åŒããžã¿ãŒãããŒããä¿®æ£ããå¿
èŠãããå Žåã¯ïŒåãåé€ããå Žåãªã©ïŒããã®å€ãããŒãã眮ãæããæ°ããããŒããšããã®ïŒåã®ïŒèŠªãåæ§ã«çæããŠããå¿
èŠããããŸãã
ãã£ããåŒããªãŒãçæãããè§£æ¶ããã蚪åããããšãããã¯æçµçã«å®è¡ãããå¿ èŠããããŸãã åŒããªãŒã¯çŽæ¥ILã³ãŒãã«ã³ã³ãã€ã«ããããšãã§ããŸãããIronPythonãšIronRubyã§ã¯ããããããŸãã€ã³ã¿ãŒããªã¿ãŒã«æž¡ããŸããçŽæ¥çãªILãžã®ã³ã³ãã€ã«ã¯ã³ã¹ããããããã®ã§ãã»ãã®æ°åããå®è¡ãããªããããããªãã³ãŒãã«ã¯ãã£ãããªãã®ã§ãã
.NETã®ããã«ãJITã³ã³ãã€ã©ã䜿ãããšã®åé¡ç¹ã®ã²ãšã€ã¯ãèµ·åæã«ãILãã€ãã³ãŒããããã»ããµãå®è¡ã§ãããã·ã³ã³ãŒãã«å€æããã®ã«æéãããããšããããšã§ããJITã³ã³ãã€ã«ã§ã¯ãã€ã³ã¿ãŒããªã¿ã«æ¯ã¹ããšå®è¡é床ã¯éåžžã«éãã§ãããããããšããŠããããšã«ãã£ãŠã¯ãåæã³ã¹ããã²ã©ãé«ããšããããšããããŸããããšãã°ãWebã¢ããªã±ãŒã·ã§ã³ãªã©é·æéçåãããµãŒããŒããã»ã¹ã§ã¯ãèµ·åæéã¯ã»ãŒç¡é¢ä¿ã§ããªã¯ãšã¹ãããšã®æéãããã¯ãªãã£ã«ã«ã§ãããåäžã®ã³ãŒããå埩çã«å®è¡ããåŸåãããã®ã§ãJITã®å©çã享åããŸããäžæ¹ã§ããã£ãã«å®è¡ããããšã¯ãªããçæéã§å®è¡ãããããã°ã©ã ãããšãã°Mercurialã®ã³ãã³ãã©ã€ã³ã¯ã©ã€ã¢ã³ããªã©ã¯ãçãèµ·åæéã®æ¹ãéèŠã§ãããå ããªã³ãŒããäžåºŠã ãå®è¡ããããšãå€ããJITãããã³ãŒããéããªã©ãšããäºå®ã¯ãããé·ãèµ·åæéãããããšããäºå®ã«åããã®ã§ã¯ãªãããã§ãã
.NETã¯ãILã³ãŒããçŽæ¥å®è¡ããããšã¯åºæ¥ãŸãããåžžã«ãã·ã³ã³ãŒãã«JITã³ã³ãã€ã«ãããããã«ã¯æéãããããŸããç¹ã«ãããã°ã©ã èµ·åæéã¯ãå€ãã®ã³ãŒããJITã³ã³ãã€ã«ãããªããã°ãªããªã.NET Frameworkã®åŒ±ç¹ã®äžã€ã§ããéçãª.NETã®ããã°ã©ã ã«ã€ããŠã¯ããã®JITããã«ãã£ãåé¿ããæ¹æ³ããããŸããïŒãã€ãã£ãã€ã¡ãŒãžçæãNGENïŒãããã¯åçããã°ã©ã ã«ã¯æ©èœããŸãããIronRubyãšIronPythonã§ã¯ãåžžã«çŽæ¥ILã«ã³ã³ãã€ã«ãã代ããã«ãJITã³ã³ãã€ã«ãããã³ãŒãã»ã©é«éã§ã¯ãªããã©èµ·åã«ãããæéãèããå°ãªããèªåã®ã€ã³ã¿ãŒããªã¿ãŒïŒ Microsoft.Scripting.Interpreter ã«ãããŸãïŒã䜿çšããŸãããã®ã€ã³ã¿ãŒããªã¿ãŒã¯ãããšãã°ã¢ãã€ã«ãã©ãããã©ãŒã ãªã©ãåçã³ãŒãçæãèš±ãããŠããªãç¶æ³ã«ãããŠãæå¹ã§ããããã§ãªããã°ãDLRèšèªã¯å
šãå®è¡ã§ããªãããšã«ãªããŸãã
å®è¡åã«ãåŒããªãŒå
šäœããå®è¡å¯èœã«ãªãããã«ãã²ãšã€ã®é¢æ°ã®äžã«ã©ãããããªããã°ãªããŸãããDLRã§ã¯ã颿°ã¯ LambdaExpression ããŒããšããŠè¡šçŸãããŸããã»ãšãã©ã®èšèªã«ãããŠãã©ã ãã¯å¿å颿°ã§ãããDLRã«ã¯ååã®æŠå¿µããããŸãããå
šãŠã®é¢æ°ã¯å¿åã§ãããã® LambdaExpression ã ããã Compile() ã¡ãœããã«ãã£ãŠããªã²ãŒãã«ã³ã³ããŒãã§ãããšãããŠããŒã¯ãªç¹åŸŽãæããŠããŸããdelegateã¯ã.NETã颿°ãšããŠåŒã³åºãããšãã§ããäžçŽåžæ°ã§ããããªã²ãŒãã¯ãCã®é¢æ°ãã€ã³ã¿ã«è¿ãååšã§ã宿
ã¯åŒã³åºãå¯èœãªã³ãŒãã®æçãæããåãªããã³ãã«ã§ãã
æåã«ãåŒããªãŒã¯ LightLambdaExpression ã®äžã«ã©ãããããããããŸãå®è¡å¯èœãªããªã²ãŒããçæåºæ¥ãŸãããããã¯ILã³ãŒããçæããïŒåŸã£ãŠJITãåŒã³åºãïŒä»£ããã«ãåŒããªãŒãã³ã³ãã€ã«ããŠã€ã³ã¿ãŒããªã¿ã®ç°¡åãªVMã§å®è¡ã§ãããããªåœä»€ã®ãªã¹ããçæãããã®ã§ãããã®ã€ã³ã¿ãŒããªã¿ãŒã¯ãç°¡åãªã¹ã¿ãã¯ããŒã¹ã®ãã®ã§ããåœä»€ã¯ãã¹ã¿ãã¯ããå€ãåãåºããŠãæŒç®ãå®è¡ããçµæãã¹ã¿ãã¯ã«æ ŒçŽããŸããããããã®åœä»€ã¯ Microsoft.Scripting.Interpreter.Instruction ããæŽŸçããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ããïŒããšãã° AddInstruction ã BranchTrueInstruction ïŒããããã¯ãã¹ã¿ãã¯ããå€ãããã€åãåºããŠãããã€æ ŒçŽãããã瀺ãããããã£ããã¹ã¿ãã¯ããåãåºããŠåœä»€ãå®è¡ãå€ãæ ŒçŽããŠæ¬¡ã®åœä»€ãžã®ãªãã»ãããè¿ã Run() ã¡ãœãããæããŠããŸãããã®ã€ã³ã¿ãŒããªã¿ãŒã¯ãåœä»€ã®ãªã¹ããåãåã£ãŠãããããã²ãšã€ãã€å®è¡ãã Run() ã¡ãœããã®æ»ãå€ã«å¿ããŠååŸã«ãžã£ã³ãããŸãã
ã³ãŒãã®æçãäžå®åæ°å®è¡ããããšããã㯠LightLambdaExpression.Reduce() ãåŒã³åºãããšã«ãã£ãŠå®å šãª LambdaExpression ã«ã³ã³ããŒãããããããŠïŒã¡ãã£ãšãã䞊ååŠçã䌎ãããã¯ã°ã©ãŠã³ãã¹ã¬ããäžã§ïŒ DynamicMethod ããªã²ãŒãã«ã³ã³ãã€ã«ãããå€ãããªã²ãŒãã®ã³ãŒã«ãµã€ãã¯ãæ°ããé«éãªãã®ã«çœ®ãæããããŸããããã«ãã£ãŠãããã°ã©ã ã®main颿°ãªã©ãæ°åã ãå®è¡ãããå®è¡é¢æ°ã®ã³ã¹ããå€§å¹ ã«æžå°ããäžæ¹ã§å ±éçã«åŒã³åºããã颿°ã¯å¯èœãªéãé«éã«å®è¡ã§ããããã«ãªããŸããããã©ã«ãã§ã¯ããã®ã³ã³ãã€ã«ã®éŸå€ã¯32åã®å®è¡ã§ãããããã¯ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ããã¹ãããã°ã©ã ã«ãã£ãŠå€æŽã§ãããããã¯ãã³ã³ãã€ã«ãªããã€ã³ã¿ãŒããªã¿ãŒãå®å šã«çŠæ¢ããããšãã§ããŸãã
ã€ã³ã¿ãŒããªã¿ã§å®è¡ãããããããã¯ILãžã³ã³ãã€ã«ããããããããã®èšèªã®åœä»€ããåŒããªãŒã³ã³ãã€ã©ãŒã«ãã£ãŠããŒãã³ãŒããããããšã¯ãããŸãããããããã³ã³ãã€ã©ã¯ãåçãããããªãååœä»€ïŒãšããã®ã¯å®ã®ãšããã»ãŒãã¹ãŠïŒã«ã€ããŠãã³ãŒã«ãµã€ããçæããŸãããããã®ã³ãŒã«ãµã€ãã¯ãããã©ãŒãã³ã¹ã髿°Žæºã«ç¶æãã€ã€åçãªæ¯ãèããå®è£ ããæ©äŒãããªããžã§ã¯ãã«äžããŸãã
éçãª.NETèšèªã§ã¯ãã©ã®ã³ãŒããåŒã³åºããããã¯ãå šãŠã³ã³ãã€ã«æã«æ±ºå®ãããŠããŸãããäŸãã°ã次ã®ãããªC#ã®ã³ãŒãããã£ããšããŸã:
var z = x + y;
C# ã³ã³ãã€ã©ã¯ã'x' ããã³ 'y' ã®åãšãããããå ç®å¯èœã§ãããã©ãããç¥ã£ãŠããŸããC#ã³ã³ãã€ã©ã¯ãæŒç®åãªãŒããŒããŒãå倿ããã®ä»ãã®ã³ãŒããé©åã«åŠçããããã«å¿ èŠãšãªããé©åãªã³ãŒããåºåã§ããŸããããã¯ãé¢é£ããåã«ã€ããŠã®ãå®å šã«éçãªæ å ±ã«åºã¥ããŠããŸããããã§ã以äžã®Pythonã³ãŒããèããŠã¿ãŸããã:
z = x + y
IronPythonã³ã³ãã€ã©ã¯ããããåºçŸããæã«ãäœãããå¿
èŠãããã®ããå
šãããããŸããã x ãš y ãäœã§ããããç¥ãããä»®ã«ç¥ã£ããšããŠãã x ãš y ã®å ç®ã®å¯åŠã¯ãå®è¡æã«ã¯å€ãã£ãŠãããããããªãããã§ããïŒåççã«ã¯å¯èœãããããŸããããIronPythonãIronRubyããåæšè«ã è¡ããŸãããïŒãIronPythonã¯ãæ°å€ãå ç®ããILã³ãŒããçæãã代ããã«ããããå®è¡æã«è§£æ±ºããããã®ã³ãŒã«ãµã€ããåºåããŸãã
ã³ãŒã«ãµã€ãã¯ãåŠçïŒoperationïŒãå®è¡æã«æ±ºå®ããããã®ãã¬ãŒã¹ãã«ããŒã§ããããã㯠System.Runtime.CompilerServices.CallSite ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠå®è£
ãããŠããŸããRubyãPythonã®ãããªåçèšèªã§ã¯ãå
šãŠã®åŠçãåçã³ã³ããŒãã³ãã§ããåçãªåŠç㯠DynamicExpression ããŒãã®åŒããªãŒã«è¡šçŸãããŸããåŒããªãŒã³ã³ãã€ã©ã¯ããããã³ãŒã«ãµã€ãã«å€æãã¹ãã§ãããšç¥ã£ãŠããŸããã³ãŒã«ãµã€ããçæãããæç¹ã§ã¯ãæåŸ
ãããåŠçãã©ã®ããã«è¡ããã¯ãæªç¥ã®ç¶æ
ã§ããããããããã¯çŸåšäœ¿çšäžã®èšèªã«åºæã®ã³ãŒã«ãµã€ãã»ãã€ã³ããŒã®ã€ã³ã¹ã¿ã³ã¹ãçšããŠçæããããã®åŠçãè¡ãããã«å¿
èŠãªæ
å ±ãå
šãŠå«ãã§ããŸãã
å³8.1: ã³ãŒã«ãµã€ãã®ã¯ã©ã¹å³
ããããã®èšèªã«ã¯ãããããã®åŠçã«å¿ããå¥ã ã®ã³ãŒã«ãµã€ãã»ãã€ã³ããŒãååšãããããã®ãã€ã³ããŒã¯ããã®ã³ãŒã«ãµã€ãã«æž¡ãããåŒæ°ã«å¿ããŠåŠçãå®è¡ããæ¹æ³ããæãšããŠæ°å€ããç¥ã£ãŠããŸããããããªããããããã®ã«ãŒã«ãçæããã®ã¯ã³ã¹ããé«ãã€ãããïŒç¹ã«ãå®è¡ã§ããããªã²ãŒããžã®å€æããŠ.NETã®JITã®åŒã³åºãã䌎ããªã©ïŒããã®ã³ãŒã«ãµã€ãã«ã¯ãè€æ°ã¬ãã«ã®ã³ãŒã«ãµã€ãã»ãã£ãã·ã¥ããããããã«ã¯åŸã ã®å©çšã®ããã«çæãããã«ãŒã«ãæ ŒçŽããŸãã
æåã®ã¬ãã«L0ã¯ãã³ãŒã«ãµã€ãã®ã€ã³ã¹ã¿ã³ã¹èªèº«ããããã CallSite.Target ããããã£ã§ããããã«ã¯ããã®ã³ãŒã«ãµã€ãã§æãçŽè¿ã«äœ¿çšããã«ãŒã«ãä¿åãããŸãã倧åã®ã³ãŒã«ãµã€ãã«ã€ããŠã¯ãã²ãšçµã®åŒæ°åã«ã€ããŠåŒã³åºãããã®ã¿ãªã®ã§ãããã ããå¿ èŠã§ãããã®ã³ãŒã«ãµã€ãã«ã¯å¥ã®ãã£ãã·ã¥L1ããããããã«ã¯ä»ã«10ä»¶ã®ã«ãŒã«ãæ ŒçŽã§ããŸãããã Target ããã®åŒã³åºãã«å¯ŸããŠæå¹ã§ãªãå ŽåïŒããšãã°ãåŒæ°åãç°ãªã£ãå ŽåïŒããã®ã³ãŒã«ãµã€ãã¯ãŸããã®ã«ãŒã«ãã£ãã·ã¥ããã§ãã¯ããŠã以åã®åŒã³åºãã§æ¢ã«é©åœãªããªã²ãŒããçæãããŠããªãããèŠãŠããããæ°ãããã®ãçæãã代ããã«åå©çšããŸãã
ã«ãŒã«ããã£ãã·ã¥ã«æ ŒçŽãããšããã®ã¯æéçãªéœåã«ãããã®ã§ããæ°ããã«ãŒã«ãå®éã«ã³ã³ãã€ã«ããã®ã¯ãæ¢åã®ã«ãŒã«ããã§ãã¯ãããããæéãããããŸãã倧ãŸãã«èšãã°ãã«ãŒã«ã®è¿°èªãšããŠæãäžè¬çã§ãããã²ãšã€ã®å€æ°ã«å¯Ÿããåãã§ãã¯ãè¡ãã®ã«ã¯10ããç§ããããŸãïŒäºå€é¢æ°ã®ãã§ãã¯ã«ã¯20ããç§ã以äžåæ§ïŒãäžæ¹ãdoubleãå ç®ããåçŽãªã¡ãœãããã³ã³ãã€ã«ããã«ã¯ãã ããã80ãã€ã¯ãç§ããããŸããæ°ååé·ãã®ã§ãããã®ãã£ãã·ã¥ã®ãµã€ãºã¯ãå šãŠã®ã³ãŒã«ãµã€ãã§äœ¿çšãããå šãŠã®ã«ãŒã«ãèšæ¶ããŠã¡ã¢ãªã浪費ããªããããéãããŠããŸããåçŽãªå ç®ã«ã€ããŠã¯ãããããã®ããªãšãŒã·ã§ã³ã§çŽ1KBã®ã¡ã¢ãªãå¿ èŠã«ãªããŸãããããããããã¡ã€ãªã³ã°ã瀺ãçµæã§ã¯ã10çš®é¡ã®ããªãšãŒã·ã§ã³ãèŠããã³ãŒã«ãµã€ãã¯ã»ãšãã©ãããŸããã
æåŸã«ããã€ã³ããŒã®ã€ã³ã¹ã¿ã³ã¹èªèº«ã«æ ŒçŽãããL2ãã£ãã·ã¥ããããŸããã²ãšã€ã®ã³ãŒã«ãµã€ãã«é¢é£ä»ãããããã€ã³ããŒã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ããã®ã³ãŒã«ãµã€ãåºæã®è¿œå æ
å ±ãæ ŒçŽãããããããŸãããããããã«ãããã³ãŒã«ãµã€ãã®å€§åã¯ãŠããŒã¯ãªãã®ã§ã¯ãªããåäžã®ãã€ã³ããŒã€ã³ã¹ã¿ã³ã¹ãå
±æã§ããŸããããšãã°ãPythonã§ãå ç®ã®åºæ¬çãªã«ãŒã«ã¯ããã°ã©ã å
šäœãéããŠåäžã§ãããã㯠+ ã®äž¡ç«¯ã«ãã2ã€ã®åã«äŸåãããããã ãã§ãããã®ããã°ã©ã äžã§ã¯ãå
šãŠã®å ç®åŠçã¯åäžã®ãã€ã³ããŒãå
±æããããL0ãšL1ã®ãã£ãã·ã¥ãç¡ãå Žåããã®L2ãã£ãã·ã¥ã«ã¯ãããã°ã©ã å
šäœãéããŠåéãããããã£ãšå€ãïŒ128ä»¶ïŒã®ææ°ã«ãŒã«ãå«ãŸããŠããŸããããããã³ãŒã«ãµã€ããåããŠå®è¡ããããšããŠãããã®L2ãã£ãã·ã¥ã«é©åœãªã«ãŒã«ãèŠã€ããå¯èœæ§ãååã«ãããŸãããããæãå¹ççã«æ©èœãããããIronPythonãšIronRubyã®ãããããå ç®ãªã©å
±éã®åŠçã§äœ¿çšããããå
žåçãªïŒcanonicalïŒãã€ã³ããŒã€ã³ã¹ã¿ã³ã¹ã®éåããã£ãŠããŸãã
L2ãã£ãã·ã¥ãç¡ãã£ãå Žåããã®ãã€ã³ããŒã¯ããã®ã³ãŒã«ãµã€ãã«ãçŸåšã®åŒæ°åãïŒãããã¯ããã«å€ãïŒèæ
®ããå®è£
ãäœæããããèŠæ±ããŸããäžèšã®äŸã§ã¯ããã x ãš y ãdoubleã§ããã°ïŒãããã¯ä»ã®ãã€ãã£ãåã§ããã°ïŒããã®å®è£
ã¯åçŽã«ããããdoubleã«ãã£ã¹ãããŠãILã® add åœä»€ãåŒã³åºããŸãããã®ãã€ã³ããŒã¯ãåŒæ°ããã§ãã¯ããŠãããããã®å®è£
ã«é©åããããšãä¿èšŒããããã®ãã¹ããçæããŸãããã®å®è£
ãšãã¹ããçµã¿åããã£ãŠãã²ãšã€ã®ã«ãŒã«ã«ãªããŸããã»ãšãã©ã®å Žåãå®è£
ãšãã¹ãã¯åŒããªãŒãšããŠçæããæ ŒçŽãããŸããïŒã³ãŒã«ãµã€ãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãŒã¯ãåŒããªãŒã«äŸåããŸãããããªã²ãŒãåäœã§å©çšãããããšããããŸããïŒ
ãããã®åŒããªãŒãC#ã§è¡šçŸããããšããããããã¯æ¬¡ã®ãããªãã®ã«ãªããŸã:
if(x is double && y is double) { // doubleåããã§ãã¯
return (double)x + (double)y; // doubleãªãå®è¡
}
return site.Update(site, x, y); // doubleã§ãªãã®ã§ããã®åã«
// å¿ããã«ãŒã«ãæ¢çŽ¢/äœæ
ãã€ã³ããŒã¯ããã®åŸããã®åŒããªãŒããããªã²ãŒããçæããŠãã«ãŒã«ãILã«ãããã«ãã·ã³ã³ãŒãã«ãã³ã³ãã€ã«ããŸãã2ã€ã®æ°å€ãå ç®ããå Žåãããã¯ãåã®ã¯ã€ãã¯ãã§ãã¯ãšæ°å€ãå ç®ãããã·ã³åœä»€ã«ãªãã§ãããã以äžã®å šãŠãå«ããŠããæçµçãªçµæã¯éçãªã³ãŒããããããããã«é ãã ãã§ããããIronPythonãšIronRubyã«ã¯ãããªããã£ãåã®å ç®ãªã©å ±éã®åŠçã®ã³ã³ãã€ã«æžã¿ã«ãŒã«ãå«ãŸããŠãããå®è¡æã®çæãäžèŠã«ããŠæéãç¯çŽããŠã代ããã«ãã£ã¹ã¯ã¹ããŒã¹ã幟åãäœèšã«æ¶è²»ããŠããŸãã
èšèªã€ã³ãã©ã¹ãã©ã¯ãã£ãŒãšã¯å¥ã®ãDLRã®ããã²ãšã€ã®äž»èŠãªéšåã¯ãããèšèªïŒãã¹ãèšèªïŒããå¥ã®èšèªïŒãœãŒã¹èšèªïŒã§å®çŸ©ããããªããžã§ã¯ãã«ãåçãªåŒã³åºããè¡ããèœåã§ãããããå¯èœã«ããããã«ãDLRã¯ããããªããžã§ã¯ãäžã§ã©ã®åŠçãæå¹ã§ããããããã®ãªããžã§ã¯ããäœæããèšèªãåããã«ã倿ã§ããªããã°ãªããŸãããPythonãšRubyã¯é¡äŒŒã®ãªããžã§ã¯ãã¢ãã«ãæããŠããŸãããJavaScriptã¯æ ¹æ¬çã«ç°ãªãããããã¿ã€ãããŒã¹ã®ïŒæ®ããããŒã¹ãšã¯ç°ãªãïŒåã·ã¹ãã ãæããŠããŸããDLRã§ã¯ããããã®æ§ã ãªåã·ã¹ãã ãçµ±åãã代ããã«ãããããSmalltalkã¹ã¿ã€ã«ã®ã¡ãã»ãŒãžæž¡ãã«åºã¥ããŠæ±ããŸãã
ã¡ãã»ãŒãžç§ã®ãªããžã§ã¯ãæåã·ã¹ãã ã§ã¯ããªããžã§ã¯ãã¯ä»ã®ãªããžã§ã¯ãã«ïŒæ®éã¯ãã©ã¡ãŒã¿ä»ãã§ïŒã¡ãã»ãŒãžãæž¡ãããã®ãªããžã§ã¯ãã¯çµæãšããŠãŸããªããžã§ã¯ããè¿ããŸããããããŠããªããžã§ã¯ãã®äœããããããããã®èšèªã«ãããŠæ§æ³ã§ããããã«ãã€ã€ãã¡ãœããåŒã³åºãããªããžã§ã¯ãéã®ã¡ãã»ãŒãžãšããŠèŠãã ãã§ããããã®ã»ãŒãã¹ãŠãåçã«æ±ããããã«ãªãã®ã§ãããã¡ãããéçãªOOèšèªã«ãããŠãããããã®ã¢ãã«ã¯ããçšåºŠé©åããŸããåçèšèªã§éãã®ã¯ãåŒã³åºãããã¡ãœãããã³ã³ãã€ã«æã«æ¢ç¥ã§ããå¿
èŠã¯ãªãããããã¯ãªããžã§ã¯ãäžã«ååšããŠããªããŠãè¯ãïŒããšãã°Rubyã® method_missing ïŒããããã¯ãã¿ãŒã²ãããªããžã§ã¯ããéåžžçã«å¿
èŠã«å¿ããŠã¡ãã»ãŒãžã«ä»å
¥ããŠãç°ãªãããæ¹ã§åŠçããæ©äŒããããŸãïŒããšãã°Pythonã® __getattr__ ïŒã
DLRã§ã¯ã以äžã®ã¡ãã»ãŒãžãå®çŸ©ãããŠããŸã:
{Get|Set|Delete}Member: ãªããžã§ã¯ãã®ã¡ã³ããŒãæäœããåŠç{Get|Set|Delete}Index: ã€ã³ããã¯ã¹ã®ãããªããžã§ã¯ãã®åŠçïŒé åãèŸæžãªã©ïŒInvoke,InvokeMember: ãªããžã§ã¯ãã®ã¡ã³ããŒã®åŒã³åºãCreateInstance: ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®çæConvert: ãªããžã§ã¯ããããåããå¥ã®åã«å€æããUnaryOperation,BinaryOperation: åŠå®ïŒ ! ïŒãå ç®ïŒ ! ïŒã®ãããªãæŒç®åããŒã¹ã®åŠçãå®è¡ãã
ããããããã°ãã©ããªèšèªã®ãªããžã§ã¯ãã¢ãã«ãå®è£ ããã«ãååã§ããã¯ãã§ãã
CLRã¯æ¬æ¥çã«éçåä»ããªã®ã§ãåçèšèªã®ãªããžã§ã¯ãããã¯ãéçãªã¯ã©ã¹ã«ãã£ãŠè¡šçŸãããªããã°ãªããŸãããéåžžã®ãã¯ããã¯ã¯ã PythonObject ã®ãããªéçãªã¯ã©ã¹ãäœããå®éã®Pythonãªããžã§ã¯ãããã®ã¯ã©ã¹ãããã¯ãã®æŽŸçã¯ã©ã¹ã®ãªããžã§ã¯ããšãªãããã«ããããšããããæ¹ã§ããçžäºéçšæ§ãšããã©ãŒãã³ã¹ãšããçç±ãããDLRã®ã¡ã«ããºã ã¯ãããããã¯ããã«è€éãªãã®ã§ããèšèªåºæã®ãªããžã§ã¯ããæ±ã代ããã«ãDLRã§ã¯ã System.Dynamic.DynamicMetaObject ã®ãµãã¯ã©ã¹ã§ãäžèšã®ã¡ãã»ãŒãžãæ±ãã¡ãœãã矀ãå«ããã¡ã¿ãªããžã§ã¯ããæ±ããŸããããããã®èšèªã«ã¯ããã®èšèªã®ãªããžã§ã¯ãã¢ãã«ãå®è£
ãã DynamicMetaObject ã®ãµãã¯ã©ã¹ããããŸããIronPythonã§ã¯ MetaPythonObject ã§ãããããã®ã¡ã¿ã¯ã©ã¹ã¯ã察å¿ãã System.Dynamic.IDynamicMetaObjectProtocol ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ããã¡ãŸããããããDLRã§åçãªããžã§ã¯ããèå¥ããæ¹æ³ãšããŠçšããããŸãã
DLRã¯ã IDynamicMetaObjectProtocol ãå®è£
ããã¯ã©ã¹ãããGetMetaObject() ãåŒã³åºã㊠DynamicMetaObject ãååŸã§ããŸãããã® DynamicMetaObject ã¯èšèªã«ãã£ãŠæäŸããããã®ãªããžã§ã¯ãã«å¿
èŠãªãã€ã³ãã£ã³ã°ã®æ©èœãå®è£
ããŸããããããã® DynamicMetaObject ã«ã¯ãããæäŸãããŠããã°ããã®ãªããžã§ã¯ãã®å
éšçãªå€ãšåãå«ãŸããŸããæåŸã«ãDynamicMetaObject ã¯ãã³ãŒã«ãµã€ã ãã€ã³ããŒã«ã䌌ãŠããŸãããçŸæç¹ã§ã®ã³ãŒã«ãµã€ããããããåŒããªãŒãšããã®åŒã«å¯Ÿããããããå¶çŽãæ ŒçŽããŠããŸãã
DLRã¯ããŠãŒã¶ãŒå®çŸ©ã¯ã©ã¹äžã®ã¡ãœããã«å¯ŸããåŒã³åºããã³ã³ãã€ã«ããæããŸãã¯ã³ãŒã«ãµã€ãïŒããªãã¡ CallSite ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒãçæããŸãããã®ã³ãŒã«ãµã€ãã¯ãäžèšã® "Dynamic Call Sites" ã§èª¬æãããéãã®ãã€ã³ãã£ã³ã° ããã»ã¹ãéå§ããããã¯æçµçã« OldInstance ã®ã€ã³ã¹ã¿ã³ã¹äžã«ãã£ãŠ MetaOldInstance ãè¿ã GetMetaObject() ãåŒã³åºããŸããïŒPythonã¯å€ãã¹ã¿ã€ã«ãšæ°ããã¹ã¿ã€ã«ã®ã¯ã©ã¹ããããŸããããã®è©±ã¯ãããšã¯ç¡é¢ä¿ã§ããïŒã次ã«ããã€ã³ããŒãåŒã³åºããïŒ PythonGetMemberBinder.Bind() ïŒãç¶ã㊠MetaOldInstance.BindGetMember() ãåŒã³åºãããŸããããã¯ããã®ãªããžã§ã¯ãããã¡ãœãããååã§ã«ãã¯ã¢ããããæ¹æ³ãèšè¿°ãããæ°ãã DynamicMetaObject ãè¿ããŸãããããšãããã²ãšã€ã®ãã€ã³ã㌠PythonInvokeBinder.Bind() ãåŒã³åºããããã㯠MetaOldInstance.BindInvoke() ãåŒã³åºããå
ã»ã©ã® DynamicMetaObject ã«ãã«ãã¯ã¢ãããããã¡ãœãããåŒã³åºãæ¹æ³ããã©ããããŸããã€ãŸããããã«ã¯ãå
ã®ãªããžã§ã¯ããã¡ãœããåãã«ãã¯ã¢ããããåŒããªãŒããã®ã¡ãœãããžã®åŒæ°ã衚ã DynamicMetaObject ããå«ãŸããŸãã
ãã£ããåŒã®äžã§æçµç㪠DynamicMetaObject ãçæããããããã®åŒããªãŒããã³å¶çŽãããã®ãã€ã³ãã£ã³ã°ãéå§ããã³ãŒã«ãµã€ããžè¿ãããŸãããããããšããã®ã³ãŒãã¯ããã®ã³ãŒã«ãµã€ã ãã£ãã·ã¥ã®äžã«æ ŒçŽããããšãã§ããä»ã®åçåŒã³åºããšåçã®é床ã§ããããŠéçåŒã³åºããšã»ãŒåçã®é床ã§ããã®ãªããžã§ã¯ãäžã®æäœãè¡ãããšãã§ããã®ã§ãã
åçèšèªäžã®åçãªåŠçãå®è¡ããããã¹ãèšèªã¯ããã®ãã€ã³ããŒã DynamicMetaObjectBinder ããæŽŸçããªããã°ãªããŸããããã® DynamicMetaObjectBinder ã¯ããŸãã¿ãŒã²ãã ãªããžã§ã¯ãã«å¯ŸããŠåŠçã®ãã€ã³ããèŠæ±ããŠïŒããã¯åè¿°ã® GetMetaObject() ã®åŒã³åºããšãã以éã®ãã€ã³ãã£ã³ã°ã®ããã»ã¹ã«ãããŸãïŒããããããã¹ãèšèªã®ãã€ã³ãã£ã³ã°ã®ã»ãã³ãã£ã¯ã¹ã«ãã©ãŒã«ããã¯ããŸããã€ãŸããããšãã° IronRubyã®ãªããžã§ã¯ããIronPythonã®ããã°ã©ã ããã¢ã¯ã»ã¹ãããå Žåããã®ãã€ã³ãã£ã³ã°ã¯ãŸãRubyïŒã¿ãŒã²ããèšèªïŒã®ã»ãã³ãã£ã¯ã¹ã詊ã¿ãããããããã倱æãããã ãã® DynamicMetaObjectBinder ã¯PythonïŒãã¹ãèšèªïŒã®ã»ãã³ãã£ã¯ã¹ã«ãã©ãŒã«ããã¯ããŠããŸãããããã€ã³ãããããªããžã§ã¯ããåçã§ãªãã£ãå ŽåïŒã€ãŸã IDynamicMetaObjectProvider ãå®è£ ããŠããªãå ŽåïŒãããšãã°.NETã®åºæ¬ã¯ã©ã¹ã©ã€ãã©ãªã®ã¯ã©ã¹ã§ãã£ãå Žåãããã¯.NETã®ãªãã¬ã¯ã·ã§ã³ãçšããŠããã¹ãèšèªã®ã»ãã³ãã£ã¯ã¹ã§ã¢ã¯ã»ã¹ãããŸãã
èšèªåŽã§ãããã©ã®ããã«å®è£
ãããã«ã€ããŠã¯ãå€å°ã®èªç±ããããŸããIronPythonã® PythonInvokeBinder 㯠InvokeBinder ããæŽŸçããŠããŸãããPythonãªããžã§ã¯ãã«åºæã®è¿œå åŠçãå¿
èŠã«ãªãããã§ããPythonãªããžã§ã¯ãã®ã¿ãæ±ã£ãŠããéããããã¯åé¡ãããŸããããã IDynamicMetaObjectProvider ãå®è£
ããŠããã Python ã®ãã®ã§ã¯ãªããªããžã§ã¯ãã«ééããå Žåããã㯠InvokeBinder ãç¶æ¿ããŠããŠå€éšã®ãªããžã§ã¯ããæ£åžžã«åŠçã§ãã CompatibilityInvokeBinder ã¯ã©ã¹ã«ãåŠçãå§è²ããŸãã
ãã©ãŒã«ããã¯ã«ãã£ãŠåŠçããã€ã³ãåºæ¥ãªãã£ãå ŽåãäŸå€ã¯æããããŸããã代ããã«ããšã©ãŒã衚ã DynamicMetaObject ãè¿ãããŸãããããããããã¹ãèšèªã®ãã€ããŒã¯ããã®ãã¹ãèšèªãªãã®é©åãªææ³ã«åºã¥ããŠããããæ±ããŸããããšãã°ãä»®å®çãªJavaScriptå®è£
ã«ãããŠãIronPythonã®ãªããžã§ã¯ãäžã«å¯ŸããŠãååšããªãã¡ã³ããŒã«ã¢ã¯ã»ã¹ããããšããå Žå㯠undefined ãè¿ãããããšã«ãªããåæ§ã«IronPythonããJavaScriptã®ãªããžã§ã¯ãã«å¯ŸããŠåæ§ã®æäœãè¡ããš AttributeError ãçºçããããšã«ãªãã§ãããã
DLRã¯ãèšèªå ±éã®å®è£ ã®è©³çްã«å ããŠãå ±æããããã¹ãã£ã³ã° ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŠããŸãããã®ãã¹ãã£ã³ã° ã€ã³ã¿ãŒãã§ãŒã¹ã¯ããã¹ãèšèªã«ãã£ãŠïŒéåžžã¯C#ã®ãããªéçèšèªã§ãïŒãPythonãRubyãšãã£ãå¥ã®èšèªã§æžãããã³ãŒããå®è¡ããããã«äœ¿çšãããŸããããã¯ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµã§ããããã«ããããã®äžè¬çãªãã¯ããã¯ã§ãããDLRã¯ãããããã«é²ããŠãDLRå®è£ ãæããä»»æã®ã¹ã¯ãªããèšèªãç°¡åã«äœ¿çšã§ããããã«ããŸããããã®ãã¹ãã£ã³ã° ã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ã4ã€ã®äž»èŠãªéšåããããŸããã©ã³ã¿ã€ã ããšã³ãžã³ã>ãœãŒã¹ã>ãããŠã¹ã³ãŒãã§ãã
ScriptRuntimeã¯ãäžè¬çã«ã¯ãã²ãšã€ã®ã¢ããªã±ãŒã·ã§ã³äžã®ã»ãŒå
šãŠã®åçèšèªã§å
±æãããŸãããã®ã©ã³ã¿ã€ã ã¯ãããŒããããŠããèšèªã§äœ¿çšãããŠããå
šãŠã®çŸåšå©çšå¯èœãªã¢ã»ã³ããªåç
§ãæ±ãããã¡ã€ã«ã®ã¯ã€ãã¯å®è¡ãè¡ãã¡ãœãããæäŸããæ°ãããšã³ãžã³ãäœæããã¡ãœãããæäŸããŸããåçŽãªã¹ã¯ãªããã£ã³ã°ã®ã¿ã¹ã¯ã«ã¯ããã®ã©ã³ã¿ã€ã ã®ã¿ãå¿
èŠãªã€ã³ã¿ãŒãã§ãŒã¹ãšãªããŸãããDLRã§ã¯ã¹ã¯ãªããã®å®è¡æ¹æ³ãããæè»ã«å¶åŸ¡ã§ããããã«ããã¯ã©ã¹ãæäŸããŸãã
éåžžãã²ãšã€ã®ã¹ã¯ãªããèšèªã«ã¯ã²ãšã€ã® ScriptingEngine ã䜿çšãããŸããDLRã®ã¡ã¿ãªããžã§ã¯ããããã³ã«ã¯ãã²ãšã€ã®ããã°ã©ã ãè€æ°ã®èšèªããã®ã¹ã¯ãªãããããŒãã§ããããããã®èšèªã§äœæããããªããžã§ã¯ããã·ãŒã ã¬ã¹ã«çžäºéçšã§ããããšããããšãæå³ããŸãããã®ãšã³ãžã³ã¯ãèšèªåºæã® LanguageContext ïŒããšãã° PythonContext ã RubyContext ïŒãã©ããããŠããã¡ã€ã«ãæååããã³ãŒããå®è¡ããŠãDLRããã€ãã£ãã§ãµããŒãããªãèšèªïŒããšãã°.NET 4以åã®C#ïŒãããåçãªããžã§ã¯ãã®åŠçãè¡ãããã«äœ¿çšãããŸãããšã³ãžã³ã¯ã¹ã¬ããã»ãŒãã§ãããåã¹ã¬ãããç¬ç«ããã¹ã³ãŒãã«ããéããè€æ°ã®ã¹ã¯ãªãããåæã«å®è¡ã§ããŸããã¹ã¯ãªãããœãŒã¹ãäœæããã¡ãœãããæäŸãããŠãããããã«ãã£ãŠã¹ã¯ãªããã®å®è¡ããã现ããå¶åŸ¡ã§ããããã«ãªã£ãŠããŸãã
ScriptSource ã¯ãå®è¡ãããã³ãŒãçã衚ããŸããããã¯ãå®éã®ã³ãŒããä¿æãã SourceUnit ãªããžã§ã¯ããããã®ãœãŒã¹ãäœæãã ScriptEngine ã«ãã€ã³ãããŸãããã®ã¯ã©ã¹ã¯ãã³ãŒããã³ã³ãã€ã«ãããïŒãããããš CompiledCode ãªããžã§ã¯ããåºåããããã£ãã·ã¥å¯èœã«ãªããŸãïŒãçŽæ¥å®è¡ããããéžã¹ãããã«ããŸãããããã®ã³ãŒãçãç¹°ãè¿ãå®è¡ãããããã§ããã°ããŸãã³ã³ãã€ã«ããŠããã®ã³ã³ãã€ã«æžã¿ã³ãŒããã¹ã¯ãªããäžã§å®è¡ããã®ããã¹ãã§ããäžåºŠããå®è¡ãããªãã³ãŒãã¯ãçŽæ¥å®è¡ããã®ããã¹ãã§ãã
ããããæçµçã«ã³ãŒããå®è¡ãããéã«ã¯ãScriptScope ãå®è¡ãããã³ãŒãã«ã€ããŠæäŸãããªããã°ãªããŸããããã®ã¹ã³ãŒãã¯ãã¹ã¯ãªããã®å
šå€æ°ãä¿æããããå¿
èŠã§ããã°ã倿°ãšåãããŠãã¹ãããäºåããŒãã§ããããã«ãªã£ãŠããŸããããã«ãã£ãŠãã¹ã¯ãªããã®å®è¡æã«ãã¹ãåŽããã«ã¹ã¿ã ãªããžã§ã¯ããæäŸã§ããããã«ãªããŸããããšãã°ãç»åãšãã£ã¿ã¯ããã®ã¹ã¯ãªããã§åŠçããç»åã®ãã¯ã»ã«ããŒã¿ã«ã¢ã¯ã»ã¹ããæ¹æ³ãæäŸãããããããŸããããã£ããã¹ã¯ãªãããå®è¡ããããšãçæããããããªã倿°ãããã®ã¹ã³ãŒãããèªã¿åããŸããã¹ã³ãŒãã®ããã²ãšã€ã®äž»ãªçšéã¯ãç¬ç«åã®å®çŸã§ããããã«ãã£ãŠãè€æ°ã®ã¹ã¯ãªãããçžäºã«å¹²æžãåãããšç¡ãåæã«ããŒãããŠå®è¡ã§ããããã«ãªããŸãã
ãããã®ã¯ã©ã¹å
šãŠããèšèªã§ã¯ãªãDLRããæäŸãããŠãããšããããšãéèŠã§ãããšã³ãžã³ã«ãã£ãŠäœ¿çšãããŠãã LanguageContext ã®ã¿ãããã®èšèªå®è£
ã«ç±æ¥ããŠããŸãããã®èšèªã³ã³ããã¹ãããã³ãŒãã®ããŒããã¹ã³ãŒãã®çæãã³ã³ãã€ã«ãå®è¡ãåçãªããžã§ã¯ãã®åŠçãšãã£ãããã¹ãèšèªã«ãã£ãŠå¿
èŠãšãããå
šãŠã®æ©èœãæäŸããæ®ãã®DLRãã¹ãã£ã³ã°ã¯ã©ã¹ãããããã®æ©èœã«ã¢ã¯ã»ã¹ããããã®äŸ¿å©æ©èœãæäŸããŸããããã«ãã£ãŠãåããã¹ãã£ã³ã°ã®ã³ãŒãããä»»æã®DLRããŒã¹ã®èšèªããã¹ãã§ãããšããããã§ãã
Cã§æžãããåçèšèªå®è£
ïŒãªãªãžãã«ã®PythonãRubyïŒã«ã€ããŠã¯ãåçèšèªã§æžãããŠããªãã³ãŒãã«ã¢ã¯ã»ã¹ããããã«ã¯ãç¹å¥ãªã©ãããŒã³ãŒããæžãããªããã°ãªãããããã¯ãµããŒãããã¹ã¯ãªããããšã«è¡ãããå¿
èŠããããŸãããããç°¡åã«ããSWIGã®ãããªãœããwãã¯ååšããŸãããããã§ãPythonãRubyã®ã¹ã¯ãªããã£ã³ã° ã€ã³ã¿ãŒãã§ãŒã¹ãããã°ã©ã ã«çµã¿èŸŒãã§ããã®ãªããžã§ã¯ãã¢ãã«ãå€éšã¹ã¯ãªããã«ããå®è¡ã«åããŠå
¬éããã®ã¯ãç°¡åãªããšã§ã¯ãããŸããããããã.NETã®ããã°ã©ã ã«ã€ããŠã¯ãã©ã³ã¿ã€ã ãã»ããã¢ããããŠãããã°ã©ã ã®ã¢ã»ã³ããªãã©ã³ã¿ã€ã ã«ããŒãããŠã ScriptScope.SetVariable() ã䜿çšããŠããã°ã©ã ã®ãªããžã§ã¯ããã¹ã¯ãªããããå©çšå¯èœã«ããããšããã ãã®ããšã§ãã¹ã¯ãªããã£ã³ã°ãç°¡åã«ã§ããŸãã.NETã¢ããªã±ãŒã·ã§ã³ã§ã¹ã¯ãªããã£ã³ã°ã®ãµããŒãã远å ããã®ã¯ãã»ãã®å
ããªæéã§å¯èœã§ãããDLRã®å€§ããªããŒãã¹ãã€ã³ãã§ãããŸãã
DLRã¯ãCLRã®äžéšãšã¯ç¬ç«ããŠçºå±ããŠãããããCLRã«å«ãŸããéšåïŒã³ãŒã«ãµã€ããåŒããªãŒããã€ã³ããŒãã³ãŒãçæãåçã¡ã¿ãªããžã§ã¯ãïŒãšIronLanguagesãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«å«ãŸããéšåïŒãã¹ãã£ã³ã°ãã€ã³ã¿ãŒããªã¿ãŒããããŠããã§è°è«ããªãã£ãããã€ãã®éšåïŒãåãããŠããŸããCLRã«å«ãŸããŠããéšåã¯ãIronLanguagesãããžã§ã¯ãã«ã Microsoft.Scripting.Core ãšããŠå«ãŸããŠããŸããDLRã®éšåã¯ããã«2ã€ã®ã¢ã»ã³ããªã«å¥ããŸããMicrosoft.Script ã¯ãã¹ãã£ã³ã°APIãã Microsoft.Dynamic ã¯COMçžäºéçšãã€ã³ã¿ãŒããªã¿ãŒããã®ä»åçèšèªã®å
±ééšåããããããå«ãã§ããŸãã
èšèªèªäœããåæ§ã«2ã€ã«åãããŠããŠã IronPython.dllãš IronRuby.dll ã¯èšèªèªäœïŒããŒãµãŒããã€ã³ããŒãªã©ïŒãå®è£
ããŠããŠã IronPython.Modules.dll ãš IronRuby.Libraries.dll ã¯ãã¯ã©ã·ãã¯Pythonããã³Rubyã®å®è£
ã«ãããŠãCã§å®è£
ãããŠããæšæºã©ã€ãã©ãªã®éšåãå®è£
ããŠããŸãã
DLRã¯ãéçã©ã³ã¿ã€ã äžã§æ§ç¯ãããåçèšèªã®ããã®èšèªäžç«ãã©ãããã©ãŒã ãšããŠæçšãªäŸã§ããããã§é«ããã©ãŒãã³ã¹ãªåçã³ãŒããå®çŸããããã«çšãããããã¯ããã¯ã¯ãé©åã«å®è£ ããã®ã¯ããªãããŒãªãã®ãªã®ã§ãDLRããã®ãã¯ããã¯ãåŒãåããŠå šãŠã®åçèšèªã®å®è£ ã§å©çšã§ããããã«ããã®ã§ãã
IronPythonããã³IronRubyã¯ãDLRäžã§èšèªããã«ãããè¯ãäŸã§ããå®è£ ã¯è¿ãããŒã ãåæã«éçºããŠããããã«éåžžã«é¡äŒŒããŠããŸãããå®è£ ã«ã¯ãã¯ããããªãã®éããèŠãããŸããå ±åã§éçºãããè€æ°ã®ç°ãªãèšèªïŒIronPythonãIronRubyãJavaScriptã®ãããã¿ã€ããå®å šã«åçãªããŒãžã§ã³ã®VBãšèšãããè¬ã®VBxïŒãšãC#ããã³VBã®dynamicã®æ©èœã«ãã£ãŠãDLRã®èšèšã¯éçºäžã«å€å€§ãªãã¹ããåŸãããããšã«ãªããŸããã
IronPythonãIronRubyããããŠDLRã®ãå®éã®éçºã¯ãåææã«Microsoftã§è¡ãããŠãããããžã§ã¯ãã®å€§åãšã¯ã倧ããç°ãªãããã¡ã§è¡ãããŠããŸãããéåžžã«ã¢ãžã£ã€ã«ãªå埩çéçºã¢ãã«ã§ããã忥ããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã皌åããŠããŸãããããã«ãã£ãŠãå¿ èŠã«å¿ããŠéåžžã«çŽ æ©ãç©äºã倿Žããããšãåºæ¥ãŠãDLRãC#ã®dynamicæ©èœãšããŠéçºã®æ©ãæç¹ã§çµ±åã§ããããšããã£ãŠãè¯ãããšã§ãããDLRã®ãã¹ãã¯éåžžã«éããåæ°ç§çšåºŠã§çµãããã®ã§ãããèšèªã®ãã¹ããå®è¡ããã«ã¯é·ãæéãããããŸãïŒIronPythonã®ãã¹ãã¹ã€ãŒãã¯ã䞊åå®è¡ããŠãã ããã45åããããŸãïŒããã®éšåãæ¹åããããšã§ãå埩ã®ã¹ããŒããæ¹åããããšãã§ããã§ããããæçµçã«ã¯ããããã®å埩ã¯çŸåšã®DLRã®èšèšã«åæãããéšåçã«ã¯éåžžã«è€éã«ãªãã§ãããããå šäœçã«ã¯äž¡è ãããããŠè¯ãããã¡ã«é©åããããšã§ãããã
DLRãC#ã«çµ±åãããããšã¯ãDLRã®å± å Žæã確ä¿ãããç®çãããã£ããšããç¹ã§ã倧å€ã«éèŠãªããšã§ãããããã£ããC#ã®dynamicæ©èœãå®äºãããšãæ¿æ²»çãªé°å²æ°ãå€ããïŒããŸããŸæ¯æ°ååãå€ãã£ãããšãããïŒãIronèšèªã¯ç€Ÿå ã§æ¥éã«æ¯æã倱ã£ãŠè¡ããŸãããããšãã°ããã¹ãã£ã³ã°APIã.NET Frameworkã«çµ±åãããããšã¯ãããŸããã§ããïŒãããŠã»ãŒééããªããä»åŸãç¡ãã§ãããïŒãããã¯ã€ãŸããPowerShell 3ã¯ãããããŸãDLRã«åºã¥ããŠããã®ã§ãããIronPythonãIronRubyãšã¯å šãç°ãªããã¹ãã£ã³ã°APIã®éåã䜿çšãããããåè¿°ã®éããã®ãªããžã§ã¯ãã¯çžäºéçšã§ããããšããããšã«ãªããŸããïŒDLRããŒã ã®ã¡ã³ããŒã®äœäººãã¯ãIronPythonãIronRubyã®ãã¹ãã£ã³ã°APIã®é åçãªä»£æ¿åãçã¿åºããC#ã®ãµãŒãã¹ãšããŠã®ã³ã³ãã€ã©ãã³ãŒãããŒã "Roslyn"ãå®çŸããã©ã€ãã©ãªã®ä»äºã«åããŸãããïŒããããããªãŒãã³ãœãŒã¹ã©ã€ã»ã³ã¹ã®é©ç°ã®åã«ãã£ãŠããããã¯çãæ®ãç¶ããããã«ç¹æ ãç¶ããããšã§ãããã


