
ããžãã¹ããžãã¯ãèšè¿°ããããã»ã¹ã§ã¯ãå
éšäŸåé¢ä¿ãæã€éåææäœã®ã°ã©ããäœæããå¿
èŠãããå ŽåããããŸãã ã¿ã¹ã¯ãéåæã«å®è¡ãããããäžéšã®ã¿ã¹ã¯ã¯ä»ã®ã¿ã¹ã¯ã«äŸåããŠãããããéå§ã§ããããã«ãªããŸã§ãåŸ
æ©ãããå¿
èŠããããŸãã ãã®æçš¿ã§ã¯ãéçºè
ãäŸåé¢ä¿ã°ã©ããèŠèŠçã«èå¥ã§ããããã«ãã
ã°ã©ãã£ã«ã«DSLãäœæããããšã«ããããã®åé¡ã解決ããæ¹æ³ã瀺ããããšæããŸãã
泚ïŒè±èªã®èšäºãšãœãŒã¹ã³ãŒãã¯
ãã¡ãã¯ããã«
äžè¬çã«ããã¡ã€ã³åºæèšèªïŒãã¡ã€ã³åºæèšèªãç¥ããŠDSLïŒã«ã¯3ã€ã®åœ¢åŒããããŸãã æåã®çš®é¡ã¯ããã¹ãDSLã§ãããã¯ããã¹ããšæ§é ã«ãã£ãŠã®ã¿å®çŸ©ããããã®ããã¹ããã³ãŒãã«å€æããç¹å®ã®ããã»ã¹ã«é¢é£ä»ããããŠããŸãã 2çªç®ã®çš®é¡ã¯æ§é DSLã§ãã³ã³ãã³ãã¯ããªãŒãŸãã¯ã°ã©ãã®ãããªãšãã£ã¿ãŒã䜿çšããŠå®çŸ©ãããŸãã 3çªç®ã®ã¿ã€ãã§ããã°ã©ãã£ãã¯DSLã«ã€ããŠèª¬æããŸããéçºè
ã¯ã°ã©ãã£ãã¯ãšãã£ã¿ãŒã䜿çšããŠãåŸã§ã³ãŒãã«å€æã§ããèŠèŠçãªæ§é ãäœæããŸãã
ãã®èšäºã§ã¯ããšã³ããŠãŒã¶ãŒãéåææäœãå®çŸ©ã§ããåçŽãªã°ã©ãã£ã«ã«DSLãäœæããŸããéåææäœã¯ãPulseïŒWaitã¡ã«ããºã ã䜿çšããŠç·šæãããŸãã æ·»ä»ã®äŸãã³ã³ãã€ã«ããã«ã¯ãVisual Studio 2008ãšVisual Studio SDKãå¿
èŠã§ãã Microsoft DSLããŒã«ïŒSDKã«å«ãŸããŠããŸãïŒã䜿çšããŠDSLãäœæããŸãã
åé¡ã®èª¬æ
PulseïŒWaitã䜿çšããã®ã¯é£ãããããPulseïŒWaitã¡ã«ããºã ã䜿çšããŠæŽçã§ããæäœã®ã·ãŒã±ã³ã¹ã決å®ã§ããã°ã©ãã£ã«ã«ãªDSLãäœæããŸãã ç¹ã«ããšãã£ã¿ãŒã§éåæãããã¯ããã©ãã°ã¢ã³ãããããã§ããããã«ãããšãšãã«ããããã¯éã®é¢ä¿ãå®çŸ©ããŠãéåæã®äŸåå®è¡ã®ã«ãŒã«ãäœæã§ããããã«ããããšèããŠããŸãã
DSLäœæ
å§ããåã«ãDSLããŒã«ã䜿çšããéã®æãéèŠãªãã€ã³ãã®æŠèŠã説æããŸãã
- DSLããŒã«ã§ã¯ãã°ã©ãã£ãã¯DSLèªäœãã°ã©ãã£ãã¯DSLã䜿çšããŠäœæãããŸãã ããã¯äžèŠãããã«ãããããããŸããããååãšããŠãéåæDSLïŒããã§ã¯AsyncDslãšåŒã³ãŸãïŒã®ã»ãšãã©ã¯ããã°ã©ãã³ã°èšèªã§ã¯ãªãèŠèŠèŠçŽ ã䜿çšããŠéçºãããããšãç解ããå¿
èŠããããŸãã ãã¡ãããèå°è£ã«ã¯å€ãã®ã³ãŒãããããŸãããé »ç¹ã«ééããããšã¯ãããŸããã
- DSLããŒã«ã¯ãT4ãã¯ãããžãŒãå¹
åºãå©çšããŠããŸãã ã°ã©ãã£ã«ã«DSLã¯å®éã«ã¯XMLã®èŠèŠçè¡šçŸã«ããããT4ã¯ãã®XMLãã³ãŒãã«å€æããŸãã ããããã°ãDSLããŒã«ã§èŠèŠèŠçŽ ãç·šéãããšããå®éã«ã¯XMLãç·šéããŠããããšã«ãªããŸãã
- DSLã¯ãŸã CïŒã䜿çšããŠäœæãããã³ã³ãã€ã«ãããŸãã éšåã¯ã©ã¹ãªã©ã䜿çšããŠæ¡åŒµã§ããŸããããã«ãããDSLãç¹å®ã®æ¹æ³ã§åäœã§ããããã«ãªããŸãã ãã®èšäºã§ã¯ããã®ãããªããšã¯ããŸããã
- DSLããŒã«ã䜿çšããDSLã®äœæã¯ãèŠèŠçãªéšåïŒãŠãŒã¶ãŒãXMLã¢ãã«ãèŠèŠçã«äœæã§ããéšåïŒã«ã®ã¿é©çšãããŸãã ããããã¬ãŒã³ããã¹ãã³ãŒãã«å€æããéšåã¯ãåŸã§äŒãå¥ã®åé¡ã§ãã
Visual Studioã§DSLãããžã§ã¯ããäœæããã«ã¯ã[æ°èŠãããžã§ã¯ã]ãéžæãã[ãã®ä»ã®ãããžã§ã¯ãã¿ã€ã]â[æ¡åŒµæ§]â[ãã¡ã€ã³åºæã®èšèªãã¶ã€ããŒ]ãéžæããŸãã

[OK]ãã¯ãªãã¯ãããšãäœæããDSLã®æ©èœã®äžéšãç¹å®ã§ãããŠã£ã¶ãŒãã衚瀺ãããŸãã
- æåã®ããŒãžã§ã¯ãèšèªã®ååã決å®ããããšã«å ããŠãåæãã³ãã¬ãŒããéžæããããšãã§ããŸãã ãã®ãã³ãã¬ãŒãã¯ãDSLã®åææ©èœã決å®ããŸããããšãã°ãã¿ã¹ã¯ãããŒãéžæããããšã«ãããåæDSLèŠçŽ ããããŒãã£ãŒãã®ãããªæ§é ã«å±ããããšã決å®ããŸãã ãã®æ®µéã§éžæãããã³ãã¬ãŒãã«é¢ä¿ãªããæåã«çæãããèŠçŽ ãåé€ããããšã«ãããDSLã®åäœããã€ã§ãåå®çŸ©ã§ããŸãã
- 2çªç®ã®ããŒãžã§ã¯ãDSLã®ãã¡ã€ã«æ¡åŒµåïŒæ¡åŒµåïŒãéžæã§ããŸãã ãã®æ¡åŒµæ©èœã¯ãDSLãèªåã®ãããžã§ã¯ãã«åã蟌ãå Žæã«è¡šç€ºãããŸãã æ¡åŒµæ©èœã«å ããŠããŠã£ã¶ãŒãã¯ã¢ã€ã³ã³ãçæããŸãã
- 3çªç®ã®ããŒãžã§ã¯ãDSLãå±ãã補åã®ååãªã©ãDSLãå®çŸ©ããããã€ãã®è¡ãæå®ã§ããŸãã
- 4ããŒãžç®ã§ã¯ãæ¢åã®ã¢ã»ã³ããªãŸãã¯æ°ããããŒã®ããããã䜿çšããŠãã¢ã»ã³ããªã«å®éã«çœ²åããå¿
èŠããããŸãã
ãŠã£ã¶ãŒãã§ã®äœæ¥ãå®äºãããšãDSLå®çŸ©ãã¬ãŒã ã¯ãŒã¯ãååŸãããŸãã Visual Studioã§DSLæ©èœã䜿çšããããšããªãå Žåãã¹ã¯ãªãŒã³ã·ã§ããã¯å°ãã·ã§ãã¯ãåãããããããŸããã

次ã®èŠçŽ ãDSLç·šéããã»ã¹ã«é¢ä¿ããŠããŸãã
- Dsl DesignerããŒã«ããã¯ã¹ã ãã®ããã«ã«ã¯ãDSLã®èšèšæã«äœ¿çšãããã¹ãŠã®èŠçŽ ãå«ãŸããŠããŸãã ãããã®èŠçŽ ã¯ãããšãã°WinFormsã®å Žåãšåãæ¹æ³ã§äœ¿çšãããŸã-èŠçŽ ãåããããããšãã£ã¿ãŒãŠã£ã³ããŠïŒã€ãŸããå¥åŠãªããã¯ã¹ã®ããäžå€®ã®ãŠã£ã³ããŠïŒã«ãã©ãã°ããŸãã
- DSLãã¶ã€ããŒèªèº«ã å®éãããã¯æ¡åŒµåã
.dsl
ãã¡ã€ã«ã§ããã .dsl
ããšãã£ã¿ãŒã¯ã¡ã¬ããžã¥ã¢ã«ã§ã-åè¿°ããããã«ãDSLã¯åç¬ã§ä»ã®DSLã䜿çšããŠæ§ç¯ãããŸãã ãã®DSLã«ã¯2ã€ã®éšåããããŸã-å·ŠåŽã«ã¯ã¯ã©ã¹ãšã¯ã©ã¹éã®é¢ä¿ããããå³åŽã«ã¯èŠèŠèŠçŽ ããããŸãã ãšã³ããŠãŒã¶ãŒã䜿çšããDSLã®æŠå¿µã®èŠèŠçãªåæ ã ãããã£ãŠãDSLã¯æ¬¡ã®ããã«æ³åã§ããŸããå³åŽã¯èŠèŠåãå·ŠåŽã¯è«çã§ãã
- ãœãªã¥ãŒã·ã§ã³ãšã¯ã¹ãããŒã©ãŒã DSLãäœæãããšã 2ã€ã®ãããžã§ã¯ããäœæãããŸãã1ã€ã¯äœæããDSLãå®çŸ©ãããã1ã€ã¯DSLé¢é£ã³ã³ããŒãã³ãã®ãšãã£ã¿ãŒãå®çŸ©ããŸãã ããã«ã€ããŠã¯åŸã§è©³ãã説æããŸããä»ã®ãšããããã¹ãŠã®ãã³ãã¬ãŒããå€æãããã¿ã³ã1ã€ã ãããŒã¯ããããšãéèŠã§ãã

ããã¯éåžžã«éèŠãªãã¿ã³ã§ãã åã«ãèšã£ãããã«ãDSLã¯ã³ãŒãã«å€æãããXMLä»æ§ã§ãã ã€ãŸããDSLã®å®çŸ©ãæŽæ°ããã«ã¯ïŒå®çŸ©ãDSLã§ãïŒãCïŒã®ãã¹ãŠã®ãã³ãã¬ãŒããå€æããå¿
èŠããããŸãã äžã®ãã¿ã³ã¯ãŸãã«ãããè¡ããŸãã ãããã£ãŠãæçµçãªDSLã®å€æŽãçªç¶åæ ããããšç¢ºä¿¡ããŠããå Žåã¯ããã®ãã¿ã³ãã¯ãªãã¯ããã®ãå¿ããŠããŸããã
- DSLãšã¯ã¹ãããŒã©ãŒã ããã¯ã¹ã¿ãžãªã®æ°ããããã«ã§ãDSLãããªãŒåœ¢åŒã§è¡šç€ºãã次ã®ããã«ãªããŸãã

ãã®ããªãŒã¯ãDSLã®æ§é çãªåŽé¢ã®å€ããã«ãã»ã«åããŸãã ããªãŒã®äžéšã®ããŒãã«ã¯ç¬èªã®ããããã£ã»ããããããF4ããŒãæŒããšè¡šç€ºãããããšã«æ³šæããŠãã ããã
- ããããã£ããŒãžãç·šéããããã®ããŒãžã¯ãDSL ExplorerããªãŒã®èŠçŽ ãšDSLãšãã£ã¿ãŒã®èŠèŠèŠçŽ ã®äž¡æ¹ã«ååšããŸãã äžéšã®DSLèŠçŽ ã¯ããšãã£ã¿ãŒã§ãçŽæ¥ç·šéã§ããŸããããšãã°ãããããã£ããã«ãéããã«ã2ã€ã®èŠçŽ éã®é¢ä¿ã®åœ¢åŒïŒ1察å€ãå€å¯Ÿå€ãªã©ïŒãå®çŸ©ã§ããŸãã ãããã©ã®ããã«äŸ¿å©ã§ãããã¯ããªã次第ã§ãã
ããã§ã¯ãDSLãäœæããããã»ã¹ã詳ããèŠãŠãããŸãããã
èŠèŠèŠçŽ ã®é
眮
æ¢ã«æžããããã«ãããŒã«ããã¯ã¹ã«ã¯äœæ¥ããå¿
èŠããããã¹ãŠã®èŠçŽ ãå«ãŸããŠããŸãã ãããã®èŠçŽ ã¯ããè«çããšãèŠèŠãã®2ã€ã®ã°ã«ãŒãã«åããããŸãã ããžãã¯èŠçŽ ã¯ãDSLã®æ§é ïŒãã¡ã€ã³ïŒãå®çŸ©ãããã®ã§ãã èŠèŠèŠçŽ ã¯ããŠãŒã¶ãŒãDSLãæäœãããšãã«æäœãããããã®é·æ¹åœ¢ãç·ãããã³ãããèŠçŽ ãåæ ããŸãã
DSLè«çæ§é ã®äžå¿æŠå¿µã¯ããã¡ã€ã³ã¯ã©ã¹ã§ãã ãã®ã¯ã©ã¹ã¯ãäœæ¥ããŠãããµããžã§ã¯ãé åã«å¿ããŠã
å¿
èŠãª
ãã®ãè¡šã
ããšãã§ããŸã ã éåææäœã§äœæ¥ããããããã¡ã€ã³ã¯ã©ã¹ã®1ã€ã¯
Operation
ãšåŒã°ããŸãã

ãã¡ã€ã³ã¯ã©ã¹ã¯
ããããã£ãæã€ããšãã§ã
ãŸã ã ãŠãŒã¶ãŒãèšå®ã§ããå€ã
Operation
ã¯ã©ã¹ã«ã¯ããšã³ããŠãŒã¶ãŒã
Operation
ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãã¢ãã«ã«ãã©ãã°ããåŸã«æ±ºå®ã§ãã
Timeout
ã
Name
ããã³
Description
ããããã£ããããŸãã
å°ããªåé¡ããããŸã-å®éããŠãŒã¶ãŒã¯ãã¡ã€ã³ã¯ã©ã¹ãã¢ãã«ã«çŽæ¥ãã©ãã°ããŸããã 代ããã«ã
OperationShape
ã¢ãã«ã«èªåèªèº«ããã©ãã°ããŸããããã¯ã
Operation
èŠèŠçãªåæ ã§ãã ãã®ã¯ã©ã¹ã¯ã
GeometryShape
ïŒåãããŒã«ããã¯ã¹ããååŸïŒãã圢æãããŸãã

Operation
ãã¡ã€ã³ã¯ã©ã¹ãš
Operation
èŠèŠè¡šçŸãå®çŸ©ãããããããããã€ã³ãããå¿
èŠããããŸãïŒãã®ãŸãŸå®è¡ãããšãäœãæ©èœããŸããïŒã ãããè¡ãã«ã¯ããã€ã¢ã°ã©ã èŠçŽ ãããèŠçŽ ã䜿çšããŸãã å®éãããã¯2ã€ã®èŠçŽ ãæ¥ç¶ãããããã®éã®é¢é£ä»ããå®çŸ©ããç·ã§ãã ãã ããè¿œå ããŠããäœãæ©èœããŸããã
èŠçŽ éã®é¢ä¿
DSLã®ããŒã«ããã¯ã¹ã³ã³ãããŒã«ã®äœæãå§ããåã«ïŒããã¯æ¥œããã§ãïŒãèŠçŽ éã®é¢ä¿ã«ã€ããŠè©±ãå¿
èŠããããŸãã é¢ä¿ã«ã¯ãåã蟌ã¿é¢ä¿ãšåç
§é¢ä¿ã®2ã€ã®ã¿ã€ãããããŸãã åã蟌ã¿é¢ä¿ã䜿çšããå ŽåãèŠçŽ Aã¯èŠçŽ Bã§å®å
šã«å²ãŸããŸããããšãã°ãã¹ã€ã ã¬ãŒã³ïŒå€§ããªæ°Žå¹³æ¹åã®èŠèŠç©ºéïŒããããããã«ã¯ã©ã¹å
šäœãæ¿å
¥ããå¿
èŠãããå Žåãåã蟌ã¿é¢ä¿ã䜿çšããã®ã¯çã«ããªã£ãŠããŸãã ã³ã¡ã³ããæ·»ä»ããå¿
èŠã®ãããããã¯ã ããããã°ãåç
§é¢ä¿ã«ãªããŸãã
ç¹å®ã®ã¿ã¹ã¯ã«èŠçŽ ã䜿çšããæ¹æ³ãèŠãŠã¿ãŸãããã 猶ã®ãã«ãŒããã«
ExampleModel
èŠçŽ ããããŸãã ãã®èŠçŽ ã®ååãå€æŽããŸããããªããªãã æçµçãªDSLã«ã¯è¡šç€ºãããŸããã ã¢ãã«ã«ããã»ã¹ãšã³ã¡ã³ããå«ãŸããŠããããšãå€æããããã«ãããããã®ã¯ã©ã¹éã®åã蟌ã¿é¢ä¿ã®ç·ãåŒãã次ã®å³ãååŸããŸãã

ãªã¬ã³ãžè²ã®ããã¯ã¹ã¯é¢ä¿ã象城ããäž¡åŽã«ååãšåºæ¬çãªé¢ä¿ããããŸãã ã«ãŒãã£ããªãã£ã¯ãDSLãã¶ã€ããŒã«ãã£ãŠåŸããèŠå¶ãããããããšã³ããŠãŒã¶ãŒã¯ããã«éåããããšã¯ã§ããŸããã ãªã¬ãŒã·ã§ã³ã«ã€ããŠã¯ããããã®ãªã¬ã³ãžè²ã®ããã¯ã¹ã®æå³ã¯ãæ¢ã«å®æããDSLãç·šéãããšãã«ãç°ãªããã¡ã€ã³ã¯ã©ã¹ããã€ã³ãã§ããããšã§ãã
æ³šïŒ DSLãã¶ã€ããŒã¯å€ãã®ã«ãŒã«ãããªãã®èšèªã«é©çšããŸããããã®1ã€ã¯ãã¹ãŠã®èŠçŽ ãäœãã®äžéšã§ããããšãèŠæ±ããŸãã ããã¯ããã¹ãŠã®èŠçŽ ã1ã€ã®ãã³ã³ãããã³ã³ããã«æžããå¿
èŠãããããšãæå³ããŸãã ïŒDSL == XMLã§ããããšãæãåºãã°ããã®èŠä»¶ã®çç±ã¯æããã§ããïŒ
åã蟌ã¿é¢ä¿ã䜿çšããŠãDSLã«ããã»ã¹ãšã³ã¡ã³ãã®äž¡æ¹ãã¢ãã«å
šäœã®äžéšã§ããããšãäŒããŸããã ããã§ãåç
§é¢ä¿ã䜿çšããŠãããã»ã¹ã«ã³ã¡ã³ããä»ããããšãã§ããããã2ã€ã®èŠçŽ ããªã³ã¯ã§ããããšã確èªã§ããŸãã

äžèšã®ç Žç·ã¯ãåç
§é¢ä¿ãã€ãŸã ãã®å Žåãæäœã¯ã³ã¡ã³ãã
åç
§ããã ãã§ãã³ã¡ã³ãã¯å«ãŸããŸããã ãã¡ããããã®é¢ä¿ã«ã¯ç¬èªã®èŠèŠèŠçŽ ïŒæäœãšã³ã¡ã³ããçµã¶ç·ïŒããããŸããããã«ã€ããŠã¯ããããã説æããŸãã
æåŸã«ããŒã«ããã¯ã¹
DSLã®è«ççããã³èŠèŠçãªéšåãåãåã£ããããŠãŒã¶ãŒããã®DSLãããã¶ã€ããŒã«ã¢ã€ãã ããã©ãã°ã§ããããã«ããå¿
èŠããããŸãã ããããéå§ããŸã-DSL Explorerã®ãšãã£ã¿ãŒããŒãããïŒ

ããŒã«ããã¯ã¹ã®æ°ããèŠçŽ ãäœæããã«ã¯ãDSLå
šäœãå³ã¯ãªãã¯ããŸãã 次ã®ã¡ãã¥ãŒã衚瀺ãããŸãã

ã³ãã¯ã¿ãšèŠçŽ ã®2ã€ã®ãªãã·ã§ã³ããããŸãã ã³ãã¯ã¿ãŒã¯ãèŠçŽ ãæ¥ç¶ããç·ã§ãïŒç¢å°ãä»ããŠããå ŽåããããŸãïŒã èŠçŽ ã¯ãããã¯åã®æ§é ã§ãã
æ°ããèŠçŽ ãäœæããåŸãF4ãæŒããšããã®èŠçŽ ã®ããããã£ã衚瀺ãããŸãã

ããã§éèŠãªã®ã¯ããããã®ããããã£ã®ããã€ããå
¥åããå¿
èŠãããããšã§ããããããªããšãDSLã¯èµ·åããŸããã æããã«å®çŸ©ããå¿
èŠããããã®ã®ãã¡ãèŠçŽ ãåæ ãããã¡ã€ã³ã¯ã©ã¹ã®å®çŸ©ãããã³ã¢ã€ã³ã³ã®å®çŸ©ã ïŒããã€ãã®ããã©ã«ãã®ã¢ã€ã³ã³ããã§ã«æäŸãããŠãããããèªåã§äœæããã®ãé¢åãªå Žåã¯ãæ¢è£œã®ã¢ã€ã³ã³ã䜿çšã§ããŸããïŒ
çºå°ïŒ
DSLãäœæããããã»ã¹ãèŠçŽããŸãã
- ãŠã£ã¶ãŒãã䜿çšããŠåºæ¬çãªDSLãäœæããŸãã
- processãªã©ãå¿
èŠãªæŠå¿µãè¡šããã¡ã€ã³ã¯ã©ã¹ãè¿œå ããŸããã
- ãã¡ã€ã³ã¯ã©ã¹éã®é¢ä¿ãè¿œå ããŸããããã®äŸã§ã¯ãæäœãäžè¬ã¢ãã«ã«å±ããã³ã¡ã³ããããããšã確èªããŸããã ãŸããæäœéã®é·ç§»æäœãããã³éå§ãšçµäºã®èŠçŽ ãè¿œå ãããŸããã
- DSLã䜿çšããèŠèŠèŠçŽ ãç¹å®ããŸããã
- èŠèŠèŠçŽ ããã¡ã€ã³ã¯ã©ã¹ã«é¢é£ä»ããŸãã
- ããŒã«ããã¯ã¹ã³ã³ãããŒã«ãäœæãã察å¿ããã¯ã©ã¹ã«é¢é£ä»ããŸããã
DSLã®æºåã¯ååæŽã£ãŠããŸããèŠèŠçãªéšåã®ã¿ãå®çŸ©ããŠããŸãã ãã¹ãŠã®ãã³ãã¬ãŒããå€æããèšèªãèµ·åããããã€ãã«DSLã§éã¶ããšãã§ããŸãã

ã³ã³ã»ããã®
éåæDSLã«ã€ããŠã次ã®ã€ãã£ãªã ãç¹å®ããŸããã
- éå¶
ããã¯ãããè¶ãäœãããªã©ã®äœæ¥åäœã§ãã æäœã倱æããããšãªãå®è¡ã§ããããšãæå³ããŸãã
- åŠç
ããã»ã¹ã¯ãã°ã©ãå
ã®äžé£ã®æäœã§ãã ãã®èŠçŽ ãè¿œå ããå¯äžã®çç±ã¯ãåãã¯ã©ã¹ã«è€æ°ã®æäœã°ã©ããä¿æã§ããããã«ããããã§ãã
- éå§ãšçµäº
ããã»ã¹ã¯ã©ããã§éå§ããã³çµäºããå¿
èŠããããããéå§ãšçµäºã®ç¶æ
ãããŒã¯ãã2ã€ã®èŠçŽ ãäœæããŸããã
- çµäºããéå§ãžã®ç§»è¡
ãã®é·ç§»ã¯ãå¥ã®æäœãå®äºããåŸã«ã®ã¿æäœãéå§ã§ããããšã決å®ããŸãã
- éå§ããéå§ãžã®ç§»è¡
ãã®é·ç§»ã«ãããæäœã¯å¥ã®æäœãéå§ããããšãã«ã®ã¿éå§ã§ãããã以åã«ã¯éå§ã§ããªãããšã決å®ãããŸãã
å®éã®äŸãèŠãŠã¿ãŸãããïŒæé£ãé£ã¹ãããã»ã¹ïŒç§ã¯ç¥ã£ãŠããããããŸãè³¢ããªãïŒã æé£ãäœãã«ã¯ãããããå
¥ããŠãããŒã¹ã¿ãŒã«ãã³ãå
¥ããå¿
èŠããããŸã-ä»»æã®é åºã§ã ãã¹ãŠãæºåãããŠããéããžã£ã ãååŸãããã®ã§ãããããŒã¹ã¿ãŒããã§ã«ãªã³ã«ããŠããå Žåã®ã¿ã§ãã å®æãããã³ãšãžã£ã ãæã«å
¥ãããããµã³ãã€ãããäœãããšãã§ããŸãã ãããŠããµã³ãã€ãããšãè¶ã®äž¡æ¹ãæºåã§ãããšãã ããç§ã¯æé£ãé£ã¹å§ããããšãã§ããŸãã
DSLã䜿çšãããšãããã»ã¹å
šäœã次ã®ããã«å®çŸ©ã§ããŸãã

ãæ³åã®ãšããã倪ç·ã¯éå§ããçµäºãŸã§ãè¡šããç Žç·ã¯éå§ããéå§ãŸã§ãè¡šããŸãã
T4ã䜿çšããŠã¢ãã«ãå€æãã
èŠèŠçãªæé£ã¢ãã«ã¯DSLãšããŠã®ã¿ååšãããããT4ã䜿çšããŠæ¬æ Œçãªã³ãŒãã«å€æããå¿
èŠããããŸãã 幞ããªããšã«ãå€æãè¡ãå¿
èŠããããšããŸã§ã«ãã¢ãã«ã¯æ¢ã«XML圢åŒã«å€æãããŠããŸããæ®ãã¯ãããããã€ãã¹ããŠå¿
èŠãªãã®ãçæããããšã ãã§ãã
T4ã§ã®æçµçµæã®çæã¯ã
WriteLine()
ïŒå®å
ãã¡ã€ã«ã«è¡ãæžã蟌ãïŒã
Push/PopIndent()
ïŒã¹ã¿ãã¯äžã®ã€ã³ãã³ãã®æ°ãä¿æãã
Push/PopIndent()
ãªã©ã®ããã€ãã®æ¹æ³ã§ç§»åããŸãã
ããã§ã¯T4å€æã³ãŒãã玹ä»ããŸãããäžèšã®ãªã³ã¯ããããŠã³ããŒãã§ããŸãã 代ããã«ãæé£ã®å®çŸ©ããDSLãçæãããã®ã瀺ããŸãã
namespace Debugging<br/>
{<br/>
using System.Threading;<br/>
partial class Breakfast<br/>
{<br/>
private readonly object MakeSandwichLock = new object ();<br/>
private readonly object EatBreakfastLock = new object ();<br/>
private readonly object GetJamLock = new object ();<br/>
private bool MakeTeaIsDone;<br/>
private bool ToastBreadIsDone;<br/>
private bool GetJamIsDone;<br/>
private bool MakeSandwichIsDone;<br/>
private bool MakeTeaStarted;<br/>
private bool ToastBreadStarted;<br/>
private bool GetJamStarted;<br/>
private bool MakeSandwichStarted;<br/>
protected internal void MakeTea()<br/>
{<br/>
MakeTeaImpl();<br/>
lock (EatBreakfastLock)<br/>
{<br/>
MakeTeaIsDone = true ;<br/>
Monitor.PulseAll(EatBreakfastLock);<br/>
}<br/>
}<br/>
protected internal void ToastBread()<br/>
{<br/>
lock (GetJamLock)<br/>
{<br/>
ToastBreadIsDone = true ;<br/>
Monitor.PulseAll(GetJamLock);<br/>
}<br/>
ToastBreadImpl();<br/>
lock (MakeSandwichLock)<br/>
{<br/>
ToastBreadIsDone = true ;<br/>
Monitor.PulseAll(MakeSandwichLock);<br/>
}<br/>
}<br/>
protected internal void GetJam()<br/>
{<br/>
lock (GetJamLock)<br/>
if (!(ToastBreadStarted))<br/>
Monitor.Wait(GetJamLock);<br/>
GetJamImpl();<br/>
lock (MakeSandwichLock)<br/>
{<br/>
GetJamIsDone = true ;<br/>
Monitor.PulseAll(MakeSandwichLock);<br/>
}<br/>
}<br/>
protected internal void MakeSandwich()<br/>
{<br/>
lock (MakeSandwichLock)<br/>
if (!(ToastBreadIsDone && GetJamIsDone))<br/>
Monitor.Wait(MakeSandwichLock);<br/>
MakeSandwichImpl();<br/>
lock (EatBreakfastLock)<br/>
{<br/>
MakeSandwichIsDone = true ;<br/>
Monitor.PulseAll(EatBreakfastLock);<br/>
}<br/>
}<br/>
protected internal void EatBreakfast()<br/>
{<br/>
lock (EatBreakfastLock)<br/>
if (!(MakeTeaIsDone && MakeSandwichIsDone))<br/>
Monitor.Wait(EatBreakfastLock);<br/>
EatBreakfastImpl();<br/>
}<br/>
}<br/>
}<br/>
ããããã®ã³ãŒãïŒ ãã ãããã®ã³ãŒãã¯ãå®çŸ©ããæ§é ãåæ ããŠããŸãã ããšã¯ãçæãããæ§é ã䜿çšããã ãã§ãã
namespace Debugging<br/>
{<br/>
partial class Breakfast<br/>
{<br/>
AutoResetEvent eatHandle = new AutoResetEvent( false );<br/>
Random rand = new Random();<br/>
public void Prepare()<br/>
{<br/>
ThreadStart[] ops = new ThreadStart[] {<br/>
MakeTea,<br/>
GetJam,<br/>
ToastBread,<br/>
MakeSandwich,<br/>
EatBreakfast };<br/>
foreach (ThreadStart op in ops)<br/>
op.BeginInvoke( null , null );<br/>
eatHandle.WaitOne();<br/>
}<br/>
private int RandomInterval<br/>
{<br/>
get<br/>
{<br/>
return (1 + rand.Next() % 10) * 100;<br/>
}<br/>
}<br/>
public void MakeTeaImpl()<br/>
{<br/>
Thread.Sleep(RandomInterval);<br/>
Console.WriteLine( "Make tea" );<br/>
}<br/>
public void ToastBreadImpl()<br/>
{<br/>
Thread.Sleep(RandomInterval);<br/>
Console.WriteLine( "Toast bread" );<br/>
}<br/>
public void GetJamImpl()<br/>
{<br/>
Thread.Sleep(RandomInterval);<br/>
Console.WriteLine( "Get jam" );<br/>
}<br/>
public void MakeSandwichImpl()<br/>
{<br/>
Thread.Sleep(RandomInterval);<br/>
Console.WriteLine( "Make sandwich" );<br/>
}<br/>
public void EatBreakfastImpl()<br/>
{<br/>
Thread.Sleep(RandomInterval);<br/>
Console.WriteLine( "Eat breakfast" );<br/>
eatHandle.Set();<br/>
}<br/>
}<br/>
}<br/>
ãã®ã³ãŒããåŒã³åºããçµæã¯æ¬¡ã®ããã«ãªããŸãã
ãè¶ãå
¥ãã
ããŒã¹ããã³
ãžã£ã ãååŸ
ãµã³ãã€ãããäœã
æé£ãé£ã¹ã
ãã¹ãŠå®äº
ãã¡ããã
Make tea
ãš
Toast bread
ã¯ç°ãªãé åºã§è¡šç€ºãããå ŽåããããŸãã
ãããã«
DSL Toolsã¯ãæŽç·Žããã匷åãªããŒã«ãããã§ãã ãã®ããã±ãŒãžã®éèŠãªç¹åŸŽã¯ãå®çŸ©ãããåŸã®èšèªã®æ±ããããã§ãã ããã§ã¯ãDSLããŒã«ã䜿çšããäœæ¥ãè¡šé¢çã«ãã説æã§ããŸããã§ããã æ©äŒãšãã¥ã¢ã³ã¹ã¯ãããããããŸãã ãã®æçš¿ãã誰ããèªåã®ç 究ãè¡ãããåæ©ä»ããããããšãé¡ã£ãŠããŸãã â
