1. Runtime Aspect Weaving Through Metaprogramming
Jason Baker Wilson Hsieh
University of Utah, School of Computing
50 South Central Campus Drive, Room 3190
Salt Lake City, Utah 84112–9205
{jbaker,wilson}@cs.utah.edu
ABSTRACT
Ð ×× ×¸ ÛÖ ÔÔ Ö×
Ò ¬Ò Û Ø Ò
Ð ××
Ð Ö Ø ÓÒ×
Ï ×
Ö Ò ÜØ Ò× ÓÒ ØÓ Ø Â Ú Ð Ò Ù ¸ À Ò ¹ÏÖ Ô¸ ÓÖ Ñ Ø Ó Ó ×º Ï Ú Ò ×
ÓÑÔÐ × Ø ÖÓÙ wrap
Ø Ø ×ÙÔÔÓÖØ× Û Ú Ò ×Ô
Ø× ÒØÓ
Ó Ø ÖÙÒØ Ñ º ×¹ ×Ø Ø Ñ ÒØ׺ À Ò ¹ÏÖ Ô ÒØ Ö Ø × Ñ Ø Ó Ú
ÒØÓ Ø
Ô
Ø× Ò À Ò ¹ÏÖ Ô Ø Ø ÓÖÑ Ó Ñ Ø Ó ÛÖ ÔÔ Ö׸
ÓÑÔÓÒ ÒØ ÑÔÐ Ñ ÒØ Ø ÓÒ Ð Ò Ù ÑÓÖ Ø ØÐÝ Ø Ò Ð Ò¹
Û
ÐÐÓÛ ×Ô
Ø
Ó ØÓ Ò× ÖØ ÖÓÙÒ Ñ Ø Ó Ó ¹ Ù × ×Ù
× ×Ô
غ ÐØ ÓÙ Ø × ÒØ Ö Ø ÓÒ ÐÐÓÛ×
×Ð Ú
Ò ×Ô
غ À Ò ¹ÏÖ Ô Ó« Ö× × Ú Ö Ð Ú Ò¹ ×Ô
Ø
Ó ØÓ
Ð ÒÐÝ × Ô Ö Ø ÖÓÑ ÓØ Ö
Ó ¸ Ø Ó ×
Ø × ÓÚ Ö ×Ø Ø
×Ô
Ø Ð Ò Ù × ×Ù
× ×Ô
غ Ö×ظ ÒÓØ Ö ÕÙ Ö × Ô Ö Ø ÓÒº ÁÒ
ظ À Ò ¹ÏÖ Ô³× Ø Ø ÒØ Ö ¹
×Ô
Ø×
Ò ÛÓÚ Ò ÒØÓ Ò ÖÝ Ð Ö Ö ×º Ë
ÓÒ ¸ ÛÖ Ô¹ Ø ÓÒ Û Ø Â Ú ÐÐÓÛ× ÑÓÖ Ò × Ó Û Ú Ò ØÓ ÜÔÖ ×× º
Ô Ö Ò À Ò ¹ÏÖ Ô × ¬Ö×ع
Ð ×× Â Ú Ú ÐÙ ¸ Û
ÐÐÓÛ× ÏÖ ÔÔ Ö×
Ò ÛÓÚ Ò ÒØÓ
Ð ×× × Û Ø Ð Ü
ÐÐÝ ×
ÓÔ
Ù× Ö× ØÓ ÜÔÐÓ Ø Â Ú Ñ
Ò ×Ñ× ØÓ ¬Ò Ò Û Ú ÛÖ Ô¹ Ò Ñ × × Ò
Û Ú Ò ×Ø Ø Ñ ÒØ×
Ò ÔÔ Ö Ò ÒÝ ×
ÓÔ º
Ô Ö׺ ÓÖ Ü ÑÔÐ ¸ ÛÖ ÔÔ Ö×
Ò Ô ×× ÜÔÐ
Ø
ÓÒ¹ ÏÖ ÔÔ Ö×
Ò Ð×Ó ÛÓÚ Ò ÒØÓ Ñ Ø Ó × Ó ÒÓÒÝÑÓÙ×
×ØÖÙ
ØÓÖ Ö ÙÑ ÒØ׸ Ò ÛÖ ÔÔ Ö Ó
Ø×
Ò
ÓÑÔÓ× º
Ð ×× × Ø ÖÓÙ Ò Û
Ð Ö Ø ÓÒ ÑÓ ¬ Öº
Ò ÐÐݸ Ñ Ø Ó × Ò ÐÐ Â Ú
Ð ×× ×¸ Ò
ÐÙ Ò ÒÓÒÝÑÓÙ× ÝÒ Ñ
×Ô
Ø Û Ú Ò ÔÖÓÚ × ÓØ Ö Ò ¬Ø׺ Ö×ظ
Ð ×× ×¸
Ò ÛÖ ÔÔ º ÔÖÓØÓØÝÔ Ó À Ò ¹ÏÖ Ô × Ñ¹ ÛÖ ÔÔ Ö× Ñ Ý Ô ×× ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ Ô Ö Ñ Ø Ö× Ò
ÔÐ Ñ ÒØ Ò
ÓÑÔ Ð ¹Ø Ñ Ñ Ø ÔÖÓ Ö ÑÑ Ò ×Ý×Ø Ñ ÓÖ Ø ÑÔÐ
Ø Ô Ö Ñ Ø Ö× ÖÓÑ Ø Ö Ð Ü
Ð ÒÚ ÖÓÒÑ Òغ Ë
¹
Â Ú ¸
ÐÐ Å Ý Û Ö Ý ×
Ö ÓÛ Å Ý ³× ØÙÖ × ÓÒ ¸ Ñ Ø Ó Ò ÒÓØ Ö
ÓÑÔ Ð Û Ò ÛÖ ÔÔ Ö × ÛÓ¹
×ÙÔÔÓÖØ À Ò ¹ÏÖ Ôº Ú Ò ÒØÓ Øº ÐÐÓÛ Ò Û Ú Ò ÓÒ Ò Ö × × × × Ô Ö Ø ¹
Ú ÐÓÔÑ Òغ ÁÒ Ø ÓÒ¸ Ø × ÓÖØ Ò× Ø
ÓÑÔ Ð » Ø» Ù
Ý
Ð Û Ò Ú ÐÓÔÑ ÒØ ×Ô
Ø× ×Ù
× ØÖ
Ò Ò
ÓÒ¹
1. INTRODUCTION ØÖ
Ø Ò ÓÖ
Ñ ÒØ Ö Ù× º Ò ÐÐݸ Ú ÐÓÔÑ ÒØ ×Ô
Ø×
ÁÒ ×Ô
عÓÖ ÒØ ÔÖÓ Ö ÑÑ Ò ¸ Û Ú Ò Ú
ÒØÓ Ñ ¹
Ò ÛÓÚ Ò ÒØÓ ÖÙÒÒ Ò ÔÖÓ Ö Ñ¸ Ù× Ò Ò ÒØ ÖÔÖ Ø Ö
Ø Ó ÑÓÙÒØ× ØÓ Ö ¬Ò Ò Ø Ñ Ø Ó × Ø
ÓÑÔÓ× Ø ÓÒ Ó ×Ù
× ÒË ÐÐ ¾½℄ ÓÖ Ã Û ℄º
Ø× Ó Ý Û Ø Ú
º ÀÓÛ Ú Ö¸
ÙÖÖ ÒØ ×Ô
Ø Ð Ò Ù × Ó ÆÓÖÑ ÐÐݸ À Ò ¹ÏÖ Ô Ö ÕÙ Ö × Ø Ø ÛÖ ÔÔ Ö× Ú Ü¹
ÒÓØ ÐÐÓÛ Ú
Ø× Ð ØÓ ¬Ò
ÓÑÔÓ× Ø ÓÒ ÐÐݺ ÓÖ Ü¹
ØÐÝ Ø × Ñ × Ò ØÙÖ × × Ø Ñ Ø Ó × Ø Ø Ø Ý ÛÖ Ôº
ÑÔÐ ¸ Ò ×Ô
ØÂ ¾ ℄ ×Ô
Ø ¬Ò Ø ÓÒ× Ñ Ý ÓÒÐÝ Ö Ù× Ë Ò
Ò ×Ô
Ø ×Ý×Ø Ñ Ø Ø Ö ×ØÖ
Ø× Ö Ù× Ó Ú
ØÓ Ñ Ø ¹
Ø ÖÓÙ Ò Ö Ø Ò
º Ï ÔÖ × ÒØ Ò ÜØ Ò× ÓÒ ØÓ Â Ú ¸
ÐÐ Ó ×ÛØ ÒØ
Ð × Ò ØÙÖ × ÛÓÙÐ ÒÓØ ×Ô
ÐÐÝ Ù× Ùи
À Ò ¹ÏÖ Ô¸ Ø Ø ÐÐÓÛ× ÐÐ Ó Â Ú ³×
Ó Ö Ù× Ø
Ò Õ٠׸ À Ò ¹ÏÖ Ô ×ÙÔÔÓÖØ× Ò
Ö × ÔÓÐÝÑÓÖÔ ×Ñ Ý ÖÒ
Ò
ÐÙ Ò Ó
Ø
ÓÑÔÓ× Ø ÓÒ Ò Ô Ö Ñ Ø Ö Þ
ÓÒ×ØÖÙ
¹ ×ÓÑ ØÝÔ
Ò ØÓ ÖÙÒØ Ñ º À Ò ¹ÏÖ Ô ÐÐÓÛ× ÛÖ Ô¹
ØÓÖ׸ ØÓ Ù× Û Ø Ñ Ø Ó Ú
º Ô Ö× ØÓ ¬Ò ÓÒ Ö ØÖ ÖÝ Ö ÙÑ ÒØ Ò Ö ØÙÖÒ ØÝÔ ×º
Ç
Ø
ÓÑÔÓ× Ø ÓÒ × Ô ÖØ
ÙÐ ÖÐÝ ÑÔÓÖØ ÒØ Ö Ù× Ø
¹ Ø ÓÒ ÐÐݸ ÛÖ ÔÔ Ö× Ñ Ý ÔÓÐÝÑÓÖÔ
ÓÚ Ö Ø ÒÙѹ
Ò ÕÙ Ò Ð Ò Ù × Ø Ø Ù× ¬Ü × Ò Ð ¹ Ò Ö Ø Ò
Ö Ö¹ Ö Ó Ö ÙÑ ÒØ× Ø Ý Ø º
ݸ ×Ù
× Â Ú º ÍÒÐ Ð Ò Ù × Ø Ø ×ÙÔÔÓÖØ Ñ Ü Ò× ½ ¸ À Ò ¹ÏÖ Ô × ÑÔÐ Ñ ÒØ Ò Å Ý × Ò ÜØ Ò× ÓÒ ØÓ
¾ ℄¸ Â Ú Ó × ÒÓØ ÐÐÓÛ
Ð ×× × ØÓ Ù ÐØ ÖÓÑ × Ú Ö Ð
Ð ×× Ø Å Ý ÔÖÓ Ö ÑÑ Ò Ð Ò Ù ¾¸ ¿℄º Å Ý ×
ÓÑÔ Ð ¹
Ò Ñ Ü Ò ¬Ò Ø ÓÒ׺ ÁÒ×Ø ¸ × Ò Ð
Ð ×× ÑÙ×Ø ×Ô ¹ Ø Ñ Ñ Ø ÔÖÓ Ö ÑÑ Ò ×Ý×Ø Ñ ÓÖ Â Ú Ø Ø ÐÐÓÛ× Ù× Ö×
Ð Þ Û Ø Ò Û ÙÒ
Ø ÓÒ Ð Øݺ Ç
Ø
ÓÑÔÓ× Ø ÓÒ ÐÐÓÛ× ØÓ ¬Ò Ð Ò Ù ÜØ Ò× ÓÒ׺ Å Ý ÐÐÓÛ× Ù× ØÓ ÜØ Ò
Ð ×× × ØÓ Ö Ù× Ý Ð Ò Ò Ò×Ø Ò
× ØÓ Ø Ö Ø ÖÙÒØ Ñ ¸ Â Ú ³× ×ÝÒØ Ü Ò Ò ÓÖ
ÜØ Ò ØÝÔ
Ò ÖÙР׸ Ò
Ò × Ú ÐÙ Ð ÓÖ Ù Ð Ò ×Ô
Ø× × Û ÐÐ ×
Ð ×× ×º ØÓ ÒØ Ö Ø ×Ô
Ø ÓÖ ÒØ ØÙÖ × ÑÓÖ Ø ØÐÝ ÒØÓ Ø
ÁÒ À Ò ¹ÏÖ Ô¸ Ñ Ø Ó ÛÖ ÔÔ Ö× Ö ¬Ö×ع
Ð ×× Ú Ð٠׺
ÓÑÔÓÒ ÒØ Ð Ò Ù Ø Ò ÔÖ Ú ÓÙ× ×Ý×Ø Ñ׺
ÏÖ ÔÔ Ö×
Ò ÜÔÐ
ØÐÝ
ÓÒ×ØÖÙ
Ø Û Ø new¸ Ò Ð ÁÒ ×ÙÑÑ Öݸ À Ò ¹ÏÖ Ô Ñ × × Ú Ö Ð
ÓÒØÖ ÙØ ÓÒ× ØÓ
×Ô
عÓÖ ÒØ Ð Ò Ù × Ò
¯ ÏÖ ÔÔ Ö
Ó Ñ Ý Ö Ù× Ø ÖÓÙ ÓØ Ò Ö Ø Ò
Permission to make digital or hard copies of all or part of this work for Ò Ó
Ø
ÓÑÔÓ× Ø ÓÒº
personal or classroom use is granted without fee provided that copies are
not made or distributed for profit or commercial advantage and that copies ¯ ÏÖ ÔÔ Ö×
Ò Ø ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ Ô Ö Ñ Ø Ö׸
bear this notice and the full citation on the first page. To copy otherwise, to Ò ÒÒ Ö ÛÖ ÔÔ Ö×
Ò Ø ÑÔÐ
Ø Ô Ö Ñ Ø Ö× ÖÓÑ
republish, to post on servers or to redistribute to lists, requires prior specific Ø Ö Ð Ü
Ð ÒÚ ÖÓÒÑ Òغ
permission and/or a fee.
AOSD 2002, Enschede, The Netherlands
Copyright 2002 ACM 1-58113-469-X/02/0004 ...°5.00. ¯ Å Ø Ó × Ò ÒÓÒÝÑÓÙ×
Ð ×× ×
Ò ÛÖ ÔÔ º
2. ¯ ×Ô
Ø Ò
ÓÑÔÓÒ ÒØ
Ó ÑÝ
ÓÑÔ Ð ×Ô ¹ Ñ Ø Ó Ñ Ý
¸ ÙØ
Ò × ÒÓØ ÐÛ Ý× Ò ¬
к
Ö Ø Ðݺ Ú
Ò Ù× ØÓ ¬Ò ÓÙØ Û Ö
× Ö Ò ¸
Ò ØÓ ÑÔÐ Ñ ÒØ
Ò º Ë Ô Ö Ø Ò Ø Ñ ÑÓ Þ Ø ÓÒ Ó
Ì Ö ×Ø Ó Ø × Ô Ô Ö × ÓÖ Ò Þ × ÓÐÐÓÛ׺ Ë
Ø ÓÒ ¾ Ò¹ Ú ÐÙ ÖÓÑ Ø×
ÓÑÔÙØ Ø ÓÒ Ý Ð ×
ÓÒ
Ö Ø Ò ¬Ø׺ ÓÖ
ØÖÓ Ù
× À Ò ¹ÏÖ Ô ØÙÖ × Ø ÖÓÙ × Ö × Ó Ü ÑÔР׺ Ò×Ø Ò
¸
× Ñ Ý ÛÓÚ Ò ÒØÓ ÓØ ¹Ð Ú Ð Ñ Ø Ó
Ë
Ø ÓÒ ¿ ÔÖÓÚ × Ò ÓÚ ÖÚ Û Ó À Ò ¹ÏÖ Ô³×
ÙÖÖ ÒØ Ñ¹ Ò Ñ Ø Ó Ø
ÐÐ׺ ×Ô
عÓÖ ÒØ ÔÖÓ Ö ÑÑ Ò ÐÐÓÛ×
ÔÐ Ñ ÒØ Ø ÓÒº Ë
Ø ÓÒ Ú ÐÙ Ø × Ø
Ó×Ø Ó À Ò ¹ÏÖ Ô³× ÓÒ ØÓ × ÐÝ Ö Ú ÐÙ Ø Ø ÙØ Ð ØÝ Ó ¹Ð Ú Ð
ØÖ
Ü Ð Øݺ Ë
Ø ÓÒ ×
Ö × Ö Ð Ø ÛÓÖ º Ò ÐÐݸ Ë
¹ ÐÓÛ Ö¹Ð Ú Ð
× Ò º
Ø ÓÒ ×ÙÑÑ Ö × ÓÙÖ
ÓÒ
ÐÙ× ÓÒ׺ ÇÒ × ÑÔÐ
Ò Ñ ØÖ
× ØÓ
ÓÙÒØ Ø ØÓØ Ð ÒÙÑ Ö
Ó Ñ Ø Ó ÒÚÓ
Ø ÓÒ׸ Ò Ø ÒÙÑ Ö Ó ÒÚÓ
Ø ÓÒ× Û Ø
2. DYNAMIC METHOD WRAPPING ×Ø Ò
Ø Ö ÙÑ ÒØ׺ Ì ×
ÓÙÒØ×
Ò Ó Ø Ò Ý ØÖ
Ò
Ì × ×
Ø ÓÒ ÒØÖÓ Ù
× À Ò ¹ÏÖ Ô³× ×ÝÒØ Ü Ò × Ñ ÒØ
× Ø Ñ Ø Ó ¸ Ò ¬ÐØ Ö Ò ÙÔÐ
Ø × ÖÓÑ Ø ØÖ
º
Ø ÖÓÙ × Ú Ö Ð Ü ÑÔР׺ Ì × Ü ÑÔÐ × × ÓÛ ÓÛ À Ò ¹ ËÙÔÔÓ× Û Û × ØÓ ØÖ
×Ø Ø
Ñ Ø Ó
ÐÐ Class-
ÏÖ Ô
Ò Ù× ØÓ Ù ÓÔØ Ñ Þ Ø ÓÒ× ×Ù
×
Ò ¸ Path.lookup(String) Ø Ø Ö ØÙÖÒ× ClassPath.Re-
ØÓ ÑÔÐ Ñ ÒØ
Ò ¸ ØÓ ØÖ
ÓÛÒ Ù ×¸ Ò ØÓ Û Ú sourceº Ï
Ò ¬Ò ÛÖ ÔÔ Ö ÓÖ ÐÓÓ ÙÔ × ÓÐÐÓÛ×
ÛÖ ÔÔ Ö× ÒØÓ Ñ Ø Ó × Ó ÐÓ
Ð
Ð ×× ×º Ì × Ü ÑÔÐ × Ð×Ó ClassPath.Resource wrapper
ÑÓÒ×ØÖ Ø ÓÛ Ó
Ø
ÓÑÔÓ× Ø ÓÒ¸ ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ׸ lookupTracer(String name) {
Ò × Ô Ö Ø
ÓÑÔ Ð Ø ÓÒ Ò
Ö × Ø ÜÔÖ ×× Ú ÔÓÛ Ö Ó System.out.println("lookup("+name+") called");
return wrapped.apply(name);
ÛÖ ÔÔ Ö׺ }
À Ò ¹ÏÖ Ô × ¬Ò Ò Ø ÖÑ× Ó ØÛÓ
ÓÖ
Ð ×× × Pro-
cedure Ò Wrapperº ÈÖÓ
ÙÖ Ó
Ø× Ò
Ô×ÙÐ Ø Ñ ¹ Ì ÛÖ ÔÔ Ö
Ð Ö Ø ÓÒ ÓÚ Ó × ÒÓØ Ñ ÒØ ÓÒ Class-
Ø Ó Ò
ÓÑÔÓ× Ð ÛÖ ÔÔ Ö Ó ×º Ì
Ð ×× Wrapper × Path.lookup Ò Ô Ö ÓÖÑ× ÒÓ Û Ú Ò º Ì ÛÖ ÔÔ Ö
Ò
Ò ×ØÖ
Ø
ØÓÖÝ Ø Ø
ÓÑÔÓ× × ×Ô
Ø
Ó Û Ø ÛÖ ÔÔ ÔÔÐ ØÓ ÒÝ ×Ø Ø
Ñ Ø Ó Ø Ø Ø × String Ò
ÔÖÓ
ÙÖ ×º Ì ×ØÖ
Ø Ñ Ø Ó Wrapper.generate(- Ö ØÙÖÒ× ClassPath.Resourceº Ì ÛÖ ÔÔ Ö Ó Ý × Ö
Method thisMethod, Procedure wrapped) ÔÖÓ Ù
× ØÓ Ü Ñ Ò Ø× Ö ÙÑ ÒØ׸
ÐÐ Ø ÛÖ ÔÔ Ñ Ø Ó ¸ Ò
ÛÖ ÔÔ ¬Ò Ø ÓÒ Ó thisMethod ÖÓÑ Method Ó ¹ Ö ØÙÖÒ Ú ÐÙ º Ì ÛÖ ÔÔ Ö Ó
Ø × ÓÙÒ ØÓ Ú Ö Ð
Ø Ø Ø
ÓÒØ Ò× ×ÝÑ ÓÐ
Ò ÓÖÑ Ø ÓÒ Ò
ÐÐ Ð Pro-
ÐÐ lookupTracerº
cedure ØÓ ÛÖ ÔÔ º Ì Û Ú Ö
ÐÐ× generate() ØÓ Ï Ù× Ø wrap ×Ø Ø Ñ ÒØ ØÓ Û Ú lookupTracer ÒØÓ
ÓÑÔÙØ ÛÓÚ Ò Ñ Ø Ó ¬Ò Ø ÓÒº ÁÒ ÑÓ×Ø
× ×¸ Ø ClassPath.lookup()¸
ÔÖÓ Ö ÑÑ Ö Ó × ÒÓØ Ò ØÓ ÒÓÛ Ø Ø Ð× Ó Wrap-
per.generate()¸ ÙØ Ø Ø Ñ × Ø × Ù× ÙÐ ØÓ ¬Ò gen-
wrap ClassPath.lookup(String) with lookupTracer;
erate() ÜÔÐ
ØÐݺ
Ì ¬Ö×Ø Ö ÙÑ ÒØ ØÓ wrap × Ñ Ø Ó × Ò ØÙÖ ¸ Ò Ø
Å
ÖÓ× Ø Ø ÑÔÐ Ñ ÒØ Ø ÛÖ ÔÔ Ö ÒØ Ö
Ð×Ó ÑÔÐ ¹ ×
ÓÒ × ÛÖ ÔÔ Ö ÜÔÖ ×× ÓÒº Ø Ö Ø × ×Ø Ø Ñ ÒØ × Ü¹
Ñ ÒØ × ÑÔÐ ×Ø Ø
׺ ÌÓ × ÐÝ ÛÖ Ô Ñ Ø Ó Ø Ò
ÙØ ¸
ÐÐ× ØÓ ClassPath.lookup() Ö Ö Ö
Ø ØÓ
Ò Ö ÙÑ ÒØ Ó ØÝÔ Ì¸ Ø ÛÖ ÔÔ Ö ÑÙ×Ø
ÔØ Ö ÙÑ ÒØ× lookupTracerº ÁÒ Ø ×
× ¸ Û
ÓÙÐ ÚÓ
Ð Ö Ò Ø
Ó ØÝÔ Ì ÓÖ ×ÙÔ ÖØÝÔ º ÌÓ × ÐÝ Ô ×× Ø Ö ÙÑ ÒØ ÓÒ ÛÖ ÔÔ Ö Ú Ö Ð lookupTracer¸ Ò Ù× Ò ÒÓÒÝÑÓÙ×
ØÓ Ø Ø Ö Ø Ñ Ø Ó ¸ Ø ÛÖ ÔÔ Ö ÑÙ×Ø Ø Ò Ö ÙÑ ÒØ ÛÖ ÔÔ Ö ÜÔÖ ×× ÓÒ
Ó ØÝÔ Ì ÓÖ ×Ù ØÝÔ º Ì Ö ÓÖ ¸ Ö ÙÑ ÒØ ØÝÔ × ÑÙ×Ø
ÒÚ Ö Òغ Ê ØÙÖÒ ØÝÔ × ÑÙ×Ø ÒÚ Ö ÒØ Ý × Ñ Ð Ö Ö ¹ wrap ClassPath.lookup(String)
×ÓÒ Ò º with new ClassPath.Resource wrapper(String name) {
/* body of lookupTracer */
ÈÓÐÝÑÓÖÔ
ÛÖ ÔÔ Ö× Ñ Ý ¬Ò Ù× Ò ×Ô
Ð ×ÝÒ¹ };
Ø Üº ÛÖ ÔÔ Ö Ø Ø Ø × Ô Ö Ñ Ø Ö Ó ØÝÔ Any Ñ Ý
ÛÓÚ Ò ÒØÓ Ñ Ø Ó Ø Ø Ø × ÒÝ Ö Ö Ò
ÓÖ ÔÖ Ñ Ø Ú ÁÒ Ø ÓÒ ØÓ Ø ×
Ð ×× Wrapper¸ Û
× ÙÒ ¹
ØÝÔ Ø Ø
ÓÖÖ ×ÔÓÒ Ò Ö ÙÑ ÒØ ÔÓ× Ø ÓÒº Ë Ñ Ð ÖÐݸ Ñ ÒØ Ð Ô ÖØ Ó Ø À Ò ¹ÏÖ Ô Ð Ò Ù ¸ À Ò ¹ÏÖ Ô ÔÖÓ¹
ÛÖ ÔÔ Ö Ø Ø Ö ØÙÖÒ× Any Ñ Ý ÛÓÚ Ò ÒØÓ Ñ Ø Ó × Ö ¹ Ú × Ð Ö ÖÝ Ó ÙØ Ð ØÝ ÛÖ ÔÔ Ö× Ò maya.wrap.Wrap-
ØÙÖÒ Ò ÒÝ ØÝÔ ¸ Ò ÚÓ Ñ Ø Ó ×º ÈÖ Ñ Ø Ú Ú ÐÙ × ÓÙÒ persº ÇÒ ×Ù
ÛÖ ÔÔ Ö ÑÔÐ Ñ ÒØ× Ò Ö
ÐÐ ØÖ
Ò
ØÓ Any Ú Ö Ð × Ö ÓÜ ¸ Ò ÓÖ Ø ÔÙÖÔÓ× Ó ÐÓ
Ð ØÝÔ Ù× Ò Any Ò rest Ö ÙÑ ÒØ×
Ò ¸ Any Ú Ö Ð × Ö ØÖ Ø × Objectº ÅÓÖ Ü ¹
Ð ØÝ
ÓÙÐ ÐÐÓÛ Ò Ð Ò Ù Ø Ø ×ÙÔÔÓÖØ× ÓÙÒ public static final Any wrapper
tracer(rest Object[] args) {
ÔÓÐÝÑÓÖÔ ×Ñ ×Ù
× Â ℄º Í× Ò Â¸ ÓÒ
ÓÙÐ
Ú System.err.println("entering " +
× ØÝ Ø ÖÓÙ ÔÓÐÝÑÓÖÔ
ØÝÔ Ú Ö Ð ×¸ Ò ×Ô
¬
ØÝ fmtMeth(thisMethod args));
,
Ý
Ð Ö Ò ÙÔÔ Ö ÓÙÒ ×º Any ret = wrapped.apply(args);
À Ò ¹ÏÖ Ô Ð×Ó ¬Ò × Ò Û
Ð Ö Ø ÓÒ ÑÓ ¬ Ö¸ restº System.err.println("leaving " +
ÛÖ ÔÔ Ö³× Ð ×Ø ÓÖÑ Ð Ô Ö Ñ Ø Ö Ñ Ý rest Ob- fmtMeth(thisMethod args) +
,
ject[] Ø × Ô Ö Ñ Ø Ö Û ÐÐ ÓÙÒ ØÓ Ò ÖÖ Ý Ó Ø " => " + ret);
return ret;
Ö ×Ø Ó Ø
ØÙ Ð Ö ÙÑ ÒØ׺ Ì apply ÓÔ Ö ØÓÖ ØÖ Ø× }
Ö ×Ø Ú Ö Ð × × Ð ×Ø× Ó Ö ÙÑ ÒØ׺ Ö ÙÑ ÒØ Ð ×Ø× Ñ Ý
Ð×Ó ×ØÓÖ Ò ¬ Ð × Ò ÐÓ
Ð Ú Ö Ð ×
Ð Ö Û Ø Ø Ì ÑÔÐ
Ø Ô Ö Ñ Ø Ö thisMethod × Ò Ó
Ø Ø Ø Ö Ô¹
rest ÑÓ ¬ Öº Ö × ÒØ× Ø Ñ Ø Ó Ò ÛÖ ÔÔ º Ï Ò tracer × ÛÓÚ Ò
ÒØÓ Ò Ò×Ø Ò
Ñ Ø Ó ¸ args[0]
ÓÒØ Ò× Ø Ö
Ú Ö¸
2.1 Evaluating Cacheable Methods × Ò
Ñ Ø Ó Ö
Ú Ö × ÐÛ Ý×
ÓÙÒØ × ÛÖ ÔÔ Ö Ö¹
Ò × Ò Ü ÑÔÐ Ó Ø Ò × Ó
ÓÒ
ÖÒ× Ø Ø À Ò ¹ ÙÑ Òغ Ì ×Ø Ø
Ñ Ø Ó Wrappers.fmtMeth() Ù× ×
ÏÖ Ô
Ò ÜÔÖ ××
Ð ÒÐݺ Ì Ö ×ÙÐØ Ó ÒÝ × ¹ «
ع Ö thisMethod³×
×× ÑÓ ¬ Ö× ØÓ
ÓÛ ØÓ ÓÖÑ Ø Ø
3. crashTracer ÙÑÔ× Ñ Ø Ó ÒÚÓ
Ø ÓÒ Ò ÓÖÑ Ø ÓÒ Û Ò Ò Ü
ÔØ ÓÒ × Ø ÖÓÛÒº
trapper Ú ÐÓÔÑ ÒØ ÛÖ ÔÔ Ö Ø Ø ÙÒ
ÓÒ Ø ÓÒ ÐÐÝ Ø ÖÓÛ× ÖÙÒØ Ñ Ü
ÔØ ÓÒº
stackDumper ÈÖ ÒØ× ×Ø
ØÖ
Ò
ÐÐ× Ø ÖÓÙ Ø ÛÖ ÔÔ Ñ Ø Ó º
CacheNth ÛÖ ÔÔ Ö ×Ù
Ð ×× Ø Ø Ñ ÑÓ Þ × Ø ÛÖ ÔÔ Ñ Ø Ó ³× Ö ×ÙÐØ× × Ù× Ò Ø Ò
Ø Ö ÙÑ ÒØ × Ýº CacheNth
ÛÖ ÔÔ Ö× Ö Ó Ð ØØÐ Ú ÐÙ ÐÓÒ ¸ ÙØ Ö Ù× ÙÐ Û Ò
ÓÑÔÓ× Û Ø ÓØ Ö ÛÖ ÔÔ Ö׺
cache1st ÛÖ ÔÔ Ö Ø Ø Ñ ÑÓ Þ × Ø ÛÖ ÔÔ Ñ Ø Ó ³× Ö ×ÙÐØ× Ù× Ò Ø ×ÓÐ Ö ÙÑ ÒØ × Ýº
cache2nd ÛÖ ÔÔ Ö Ø Ø Ñ ÑÓ Þ × Ø ÛÖ ÔÔ Ñ Ø Ó ³× Ö ×ÙÐØ× Ù× Ò Ø ×
ÓÒ Ó ØÛÓ Ö ÙÑ ÒØ× × Ýº
makePerInstance(Wrapper)Ì × ÛÖ ÔÔ Ö Û × Ö ÙÑ Òظ Ò Ö ØÙÖÒ× ÛÖ ÔÔ Ö Ø Ø ÔÔÐ × Û ÓÒ Ô Ö¹ Ò×Ø Ò
× ×º
makeConditionalWrapper(Procedure, Wrapper) Ì × ÔÖÓ
ÙÖ Ò ÛÖ ÔÔ Ö¸ Ò Ö ØÙÖÒ× ÛÖ ÔÔ Ö Ø Ø
ÐÐ× Ø ÖÓÙ
makeConditionalWrapper³× ×
ÓÒ Ö ÙÑ ÒØ Û Ò Ø ÔÖÓ
ÙÖ Ö ØÙÖÒ× ØÖÙ ¸ Ò
ÐÐ× Ø Ñ Ø Ó Ö
ØÐÝ ÓØ ÖÛ × º
staticLocker ÐÐ× Ø ÛÖ ÔÔ Ñ Ø Ó Û Ø Ø×
Ð Ö Ò
Ð ×× ÐÓ
º
instanceLocker ÐÐ× Ø ÛÖ ÔÔ Ñ Ø Ó Û Ø Ø× Ö
Ú Ò Ò×Ø Ò
ÐÓ
º
Ì Ð ½ ÍØ Ð ØÝ ÛÖ ÔÔ Ö׸
Ð ×× ×¸ Ò Ñ Ø Ó × ¬Ò Ý maya.wrap.Wrappersº
Ö ÙÑ ÒØ Ð ×غ ÏÖ ÔÔ Ö× ×Ù
× tracer
ÒÒÓØ ÜÔÐ
ØÐÝ ÌÓ ÚÓ Ø ×
Ó×ظ À Ò ¹ÏÖ Ô ÔÖÓÚ × ×Ô
Ð Þ ÛÖ Ô¹
Ø ÖÓÛ
Ü
ÔØ ÓÒ׸ × Ò
ÛÖ ÔÔ Ö
Ð Ö Ø ÓÒ×
Ò¹ Ô Ö× cache1st Ò cache2nd ØÓ Ò Ð ÙÒ ÖÝ ×Ø Ø
Ò
ÒÓØ
ÓÒØ Ò throws
Ð Ù× ×º ÀÓÛ Ú Ö¸ wrapped.apply() Ò×Ø Ò
Ñ Ø Ó ×¸ Ö ×Ô
Ø Ú Ðݺ
Ñ Ý Ø ÖÓÛ Ö ØÖ ÖÝ Ü
ÔØ ÓÒ× Ø Ø Ö ÑÑ Ø ÐÝ ÔÖÓÔ¹ ÁÒ Ø ÓÒ ØÓ Ø
ÓÒÚ ÒØ ÓÒ Ð Ò×Ø Ò
Ú
¬Ò
Ø ØÓ Ø ÛÖ ÔÔ Ö³×
ÐÐ Öº Ø ÖÓÙ makePerInstance()¸ À Ò ¹ÏÖ Ô ÔÖÓÚ × Ò¹
Ö Ð Ñ
Ò ×Ñ Ø ÖÓÙ conditionalWrapper
Ð Ö ¹
2.2 Composing Caches Ø ÓÒ׺ Ï
Ò ØÖ
ÐÐ× ØÓ Ñ Ø Ó n ÓÒ ×Ô
¬
Ò×Ø Ò
c × ÓÐÐÓÛ×
Wrappers ¬Ò × × Ú Ö Ð ÓØ Ö Ò Ö
ÛÖ ÔÔ Ö׸ ÛÖ ÔÔ Ö
×Ù ØÝÔ ×¸ Ò ÛÖ ÔÔ Ö¹ Ò Ö Ø Ò Ñ Ø Ó ×º Ì × Ó
Ø× wrap C.n() with new Any conditionalWrapperC()
{ thisReceiver == c } => Wrappers.tracer;
Ñ Ý
ÓÑÔÓ× ØÓ ÑÔÐ Ñ ÒØ
ÓÒ
ÖÒ× ×Ù
×
Ò
Ò Ú Ö ÓÙ× Û Ý׺ ËÓÑ ÔÖ ¬Ò ÛÖ ÔÔ Ö× Ö Ð ×Ø Ò
Ì Ð ½º Ì ÓÚ ×Ø Ø Ñ ÒØ ÛÖ Ô× C.n() Û Ø ÛÖ ÔÔ Ö Ø Ø
Ì
Ð ×× CacheNth Ò Ñ Ø Ó × ×Ù
× makeCondi- ØÖ
× Ø× Ü
ÙØ ÓÒ Û Ò c × Ø Ö
Ú Ò Ò×Ø Ò
º Ì ×
tionalWrapper() Ò makePerInstance() Ö Ó Ô Ö¹
ÛÖ ÔÔ Ö Ñ Ý ÔÔÐ ØÓ Ò×Ø Ò
Ñ Ø Ó × Ó C Ø Ø Ø
Ø
ÙÐ Ö ÒØ Ö ×غ CacheNth Ù× × ×Ø Ò Ö Â Ú ØÙÖ ×¸ Ò¹ ÒÓ Ö ÙÑ ÒØ× Ò Ö ØÙÖÒ ÒÝ ØÝÔ º Ì conditional-
Wrapper ×ÝÒØ Ü × Ñ
ÖÓ Ø Ø × ÜÔ Ò × ÓÐÐÓÛ×
Ò Ö
Ð ×× × Ò ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ׸ ØÓ ××Ó
Ø
× Û Ø
Ñ Ø Ó ×º Ì ¬Ò Ø ÓÒ× Ó CacheNth Ò makePerIn- makeConditionalWrapper(
stance() Ö × ÓÛÒ Ò ÙÖ × ½ Ò ¾¸ Ö ×Ô
Ø Ú Ðݺ new boolean procedure (final C thisReceiver {
)
Ø Ñ CacheNth ÛÖ ÔÔ Ö × ÛÓÚ Ò ÒØÓ Ñ Ø Ó ¸ },
return thisReceiver == c;
generate ×
ÐÐ º Ì × Ñ Ø Ó ÐÐÓ
Ø × Ò Û
Wrappers.tracer);
Ò Ö ØÙÖÒ× ÔÖÓ
ÙÖ Ø Ø Ù× × Ø
º CacheNth
Ù× × Ò ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ Ô Ö Ñ Ø Ö ØÓ × Ð
Ø Ø Ý Ö¹ Ì Ð ØÝ ØÓ Ú × ×Ô
¬
Ò×Ø Ò
×
Ö Ø
Ð ØÓ
¹
ÙÑ ÒØ Ù× Ò Ñ ÑÓ Þ Ø ÓÒº ÁØ Ð×Ó Ù× × Ò ÒÓÒÝÑÓÙ× Ò ÓÖ ClassPath.lookup()º ÁÒ Ø ClassPath ¬Ò ¹
ÔÖÓ
ÙÖ
Ð ×× ØÓ ××Ó
Ø
Ó Û Ø ×Ø Ø º ´ÁÒ ÑÓÖ ×Ø Ø
Ø ÓÒ Ù× Ý Ø Å Ý
ÓÑÔ Ð Ö¸ lookup() × ÒÓØ
ØÙ ÐÐÝ
×Ô
Ø Ð Ò Ù × ×Ù
× ×Ô
ظ ×Ù
Ñ
Ò ×Ñ× Ö ÙÒ¹ ×Ø Ø
Ñ Ø Ó º ClassPath × ¬Ò Ò × Ô Ö Ø Ð ¹
Ú Ð Ð ºµ ÈÖÓ
ÙÖ Ó
Ø׸ Ð Ñ Ø Ó ×¸ Ö
ÐÐ Û Ø Ö Öݸ Ò × Ú Ö Ð ClassPath Ó
Ø×
Ò ¬Ò ÓÒ
Ö ÙÑ ÒØ× Ò Ö ØÙÖÒ Ú Ð٠׺ Ì Ø Ð× Ó Ø ÔÖÓ
ÙÖ ×Ø Ò
Ø × Ö
Ô Ø ×º ClassPath Ó
Ø Ñ Ý Ù× Ò
ÐÐ Ò
ÓÒÚ ÒØ ÓÒ Ö Ò Û Ø Ò Ø apply Ñ
ÖÓº Ø
ÓÑÔ Ð Öº ÁÒ ×Ù
× ¸
Ò ÔÖÓ Ù
× × ¹
CacheNth ÛÖ ÔÔ Ö Ñ Ý
ÓÑÔÓ× Û Ø ÓØ Ö ÛÖ Ô¹ Ò ¬
ÒØ Ô Ö ÓÖÑ Ò
ÑÔÖÓÚ Ñ Òظ Ò Ø × × ØÓ ××ÙÑ
Ô Ö׺ ÓÖ Ü ÑÔÐ ¸ Ô Ö¹ Ò×Ø Ò
ÓÖ Ø Ñ Ø Ó C.m Ø Ø
Ð ×× × Ó ÒÓØ
Ò Ò Ø
ÓÑÔ Ð Ö³×
º ÀÓÛ¹
Ò
Ö Ø Ù× Ò Ú Ö¸ ÓØ Ö
Ð ÒØ× Ú « Ö ÒØ Ô Ö ÓÖÑ Ò
Ò × Ñ ÒØ
wrap C.m(Object) Ö ÕÙ Ö Ñ ÒØ׺ ClassPath Ñ Ý Ù× Ý × ÑÔÐ
Ð ××
with makePerInstance(new CacheNth(1)); ÐÓ Ö Ø Ø Ò Ú Ö ÐÓÓ × ÙÔ Ø × Ñ Ö ×ÓÙÖ
ØÛ
¸ Ò Û
×
Ò ÛÓÙÐ ÒÓØ Ù× Ùк ÐØ ÖÒ Ø Ú Ðݸ Class-
Ì ÛÖ ÔÔ Ö Ö ØÙÖÒ Ý makePerInstance() Û ÐÐ Ô¹ Path Ó
Ø Ñ Ý Ù× ØÓ ÐÓ ÔÐÙ Ò× ÓÖ × ÖÚÐ Ø׺ ÁÒ
ÔÐÝ Ø Ö ÙÑ ÒØ ØÓ Ø ÛÖ ÔÔ Ñ Ø Ó
ØÑ Ò Û ×Ù
× ×¸ Ø ×
ÓÒØ ÒØ× Ñ Ý
Ò ÝÒ Ñ
ÐÐÝ Ò
Ö
Ú Ö Ó
Ø × Ò
ÓÙÒØ Ö º Ì ÛÖ ÔÔ Ö Ö ØÙÖÒ Ý ÐÓÓ ÙÔ Ö ×ÙÐØ× × ÓÙÐ Ò Ú Ö
º
makePerInstance()
ÔØ× Ö
Ú Ö Ó ÒÝ ØÝÔ ¸ Û
ÓÑÔ Ð Ö
Ò Ò×Ø ÐÐ
ÓÒ
ÐÐ× ØÓ lookup() Ò
× ÓÙÒ ØÓ thisReceiver ÓÐÐÓÛ Ý Þ ÖÓ ÓÖ Ø ÓÒ Ð Ø× ÓÛÒ ClassPath × ÓÐÐÓÛ×
Ö ÙÑ ÒØ× ×ØÓÖ Ò argsº Ë Ò
CacheNth ÐÐÓ
Ø × final ClassPath path = new ClassPath(pathString);
Ø Ñ Ø × ÛÓÚ Ò¸ Ø Ö ×ÙÐØ Ó m Û ÐÐ
wrap ClassPath.lookupString(String) with
ÓÒ Ô Ö¹ Ò×Ø Ò
× ×º new Any conditionalWrapperClassPath(String _)
CacheNth ÔÖÓÚ × Ü Ð ØÝ Û Ø ÖÙÒØ Ñ
Ó×غ ÐÐ { thisReceiver == path } => Wrappers.cache2nd;
Ö ÙÑ ÒØ× ØÓ CacheNth Ö Ô
ÒØÓ Ò Object[] ÓÒ
ÒØÖݸ Ò ÙÒÔ
Û Ò Ø ÙÒ ÖÐÝ Ò Ñ Ø Ó ×
ÐÐ º Ì ÓÚ
Ó × ÓÛ× ÓÛ
ÓÒ
ÖÒ×
Ò ×Ô Ö Ø Ú Ö¹
4. public static class CacheNth extends Wrapper {
int offset;
public CacheNth(int offset) { this.offset = offset; }
public Procedure generate(final Method thisMethod final Procedure wrapped) {
,
final HashMap cache = new HashMap(); // Store results of thisMethod in its own cache
return new Object procedure(rest Object[] args) {
Object ret = cache.get(args[offset]);
if (ret == null && !cache.containsKey(args[offset]))
{
ret = wrapped.apply(args);
cache.put(args[offset], ret);
}
return ret;
};
}
}
ÙÖ ½
Ò Ñ Ø Ó Ö ×ÙÐØ× × ÓÒ Ò Ö ØÖ ÖÝ Ö ÙÑ Òغ
public static Wrapper Ø Ú ÐÝ Ò Ð Ù ÐÓ Ò ØÓ ¬ÐØ Ö ÓÙØ ÙÒ ÑÔÓÖØ ÒØ ÓÙع
makePerInstance(Wrapper wrapper) { ÔÙغ
final Map instanceMap = new WeakHashMap(); ÇÒ Ó Ø ØÖ
×Ø Ø× Ó
Ó Ò mayac¸ Ø
ÓÑÔ Ð Ö ÓÖ
Å Ý ¸ × Ø Ô ØØ ÖÒ Ô Ö× Öº ÁØ ×Ù
Ø× ÓØ Ø ÑÔÐ Ø × Ø Ø
// match any receiver type, any return type and Ò Ö Ø ËÌ ÒÓ × Ò Ñ
ÖÓ Ö ÙÑ ÒØ Ð ×Ø× ØÓ ×
ÓÒ
// any # of args
return new Any wrapper Any (rest Object[] args) {
Ð Ú Ð Ó Ô Ö× Ò º Ë ÕÙ Ò
× Ó ÓÖ Ò ÖÝ ×ÝÒØ Ü ØÖ ÒÓ × Ö
Procedure proc = ØÖ Ò×Ð Ø ØÓ ØÖ × Ó Ó
Ø×
ÐÐ RightSymbols
(Procedure) instanceMap.get(thisReceiver); class PatternParser {
if (proc == null) RightSymbol parse(Object lhs, Environment env)
{ { ... }
proc = wrapper.generate(thisMethod, ...
wrapped); }
instanceMap.put(thisReceiver proc);
, class TemplateParser extends PatternParser { ... }
} class ArgumentParser extends PatternParser { ... }
// thisReceiver must be explicitly passed in
return proc.apply(thisReceiver args);
, Ò ÑÔÐ Ñ ÒØ Ø ÓÒ Ó Ø Å Ý
ÓÑÔ Ð Ö Ñ Ø ¬Ò × Ú¹
}
};
Ö Ð ÓÓÐ Ò Ú Ö Ð × ØÓ
ÓÒØÖÓÐ « Ö ÒØ ØÝÔ × Ó Ù
ÐÓ Ò º ÓÖ Ò×Ø Ò
¸ Debug.traceParse ÛÓÙÐ Ò Ð
ÐÓ Ò Ó Ú ÖÝ ÑÓÚ Ø Ä ÄÊ´½µ Ô Ö× Ö Ñ ×¸ Ò De-
ÙÖ ¾ ××Ó
Ø Ò ÛÖ ÔÔ Ö Û Ø
Ö
Ú Öº bug.tracePatternParse ÛÓÙÐ Ò Ð ÐÓ Ò Ó Ú ÖÝ
ÑÓÚ Ñ Ý Ø Ô ØØ ÖÒ Ô Ö× Öº
Ø Ð ØÖ
Ó Ô Ö× Ò
Ø Ú ØÝ ×
Ö Ø
Ð ØÓ ØÖ
Ø
ÐÐÝ ØÛ Ò ×Ó ØÛ Ö Ô
׺ Ò ÔÔÐ
Ø ÓÒ
Ò
Ù×¹ ÓÛÒ Ù Ò Ô ØØ ÖÒ Ô Ö× Ò º ÓÖ Ò×Ø Ò
¸ Ø
ÓÑÔ Ð Ö
ØÓÑ Þ Ø Ú ÓÖ Ó Ð Ö ÖÝ
Ð ×× × ×Ù
× ClassPath Ý Ñ Ý Ð ÓÒ Ô ÖØ
ÙÐ Ö Ø ÑÔÐ Ø ÜÔÖ ×× ÓÒ Ø Ø Ò Ö Ø ×
¬Ò Ò ×Ô
Ø× ÓÒ Ø× ÔÙ Ð
ÒØ Ö
º Ë Ò
À Ò ¹ÏÖ Ô Statement ÒÓ º ÌÓ ØÖ
ÓÛÒ Ø × Ù ¸ Û ÑÙ×Ø Ó ¹
Ò Û Ú Ò Ö ×¸ Ð Ö ÖÝ³× Ú ÓÖ
Ò
Ò Û Ø ¹ Ø Ò ØÖ
Ó Ø Ø ÑÔÐ Ø ÜÔÖ ×× ÓÒ³× Ô Ö× ¸ ÙØ × Ø Ò
ÓÙØ
×× ØÓ ×ÓÙÖ
Ó º Ø ÖÓÙ ØÖ
Ó Ø ÒØ Ö
ÓÑÔ Ð Ø ÓÒ ÙÒ Ø × Ô Ò Ùк
À Ò ¹ÏÖ Ô³× ×ÙÔÔÓÖØ ÓÖ
Ò ÜÔÐÓ Ø× Ñ ÒÝ ÝÒ Ñ
Ò Ö
ÛÖ ÔÔ Ö
Ò Ù× ØÓ Ð Ñ Ø Ù ÓÙØÔÙØ ØÓ
ÂÚ ØÙÖ ×º Ö×ظ
× Ö ××Ó
Ø Û Ø Ñ Ø Ó × Ø ÝÒ Ñ
ÜØ ÒØ Ó Ô ÖØ
ÙÐ Ö Ñ Ø Ó × ÓÐÐÓÛ×
Ø ÖÓÙ ÒÒ Ö
Ð ××
ÐÓ×ÙÖ ×º Ë
ÓÒ ¸ ÛÖ ÔÔ Ö Ú ÓÖ × Any wrapper traceParsing(rest Object[] args) {
ÓÒØÖÓÐÐ Ø ÖÓÙ ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ Ô Ö Ñ Ø Ö׺ Ò ÐÐݸ Debug.traceParse = true;
ÛÖ ÔÔ Ö Ó
Ø× Ö
ÓÑÔÓ× ØÓ ¬Ò Ú Ö ØÝ Ó
¹ Debug.tracePatternParse = true;
Ò ÔÓÐ
× ÓÒ
Ô Ö Ñ Ø Ó ¸ ÓÒ
Ô Ö Ò×Ø Ò
¸ Any ret = wrapped.apply(args);
Ò ÓÒ Ò×Ø Ò
Ò
º ÐØ ÓÙ Ø × ×Ô
¬
ÔÓÐ ¹ Debug.tracePatternParse = false;
×
Ò ÑÔÐ Ñ ÒØ Ò ×Ø Ø
×Ô
Ø Ð Ò Ù ¸ À Ò ¹ Debug.traceParse = false;
ÏÖ Ô³×
Ó ¹Ö Ù× Ñ
Ò ×Ñ× ÔÖÓÚ Ü Ð Øݺ ÓÖ }
return ret;
Ü ÑÔÐ ¸ Ô Ö¹ Ò×Ø Ò
Ú
× ÑÔÐ Ñ ÒØ ×
ÓÑÔÓ×¹
Ð ÛÖ ÔÔ Ö Ö Ø Ö Ø Ò Ò Û Ð Ò Ù ØÙÖ º Ì traceParsing ÛÖ ÔÔ Ö
ÓÙÐ ¬Ò ÑÓÖ
Ö ¹
ÙÐÐÝ ØÓ Ò Ð Ö
ÙÖ× ÓÒ Ò Ü
ÔØ ÓÒ׸ ÙØ Ø ÓÚ ¹
2.3 Controlling Debug Output Ò Ø ÓÒ ×ÙÆ
× ÓÖ Ø Ù Ò ÔÖÓ Ð Ñ Ø Ò º
ÐØ ÓÙ ØÖ
Ò Ñ Ø Ó ÒÚÓ
Ø ÓÒ× × Ò ÑÔÓÖØ ÒØ ¹ Ï Ú Ò Ø × ÛÖ ÔÔ Ö ÒØÓ PatternParser.parse()
Ù Ò ØÓÓи ×ÓÑ Ø Ñ × Ø × ×Ø ÐÐ Ò
×× ÖÝ ØÓ Ö ×ÓÖØ ØÓ Ö Ù
× Ø ÑÓÙÒØ Ó ÜØÖ Ò ÓÙ× Ù ÓÙØÔÙظ ÙØ Ó ×
printlnº ÝÒ Ñ
×Ô
Ø Û Ú Ò
Ò Ù× ØÓ × Ð
¹ ÒÓØ Ð Ñ Ò Ø Ø ÒØ Ö Ðݺ ÓÖ ØØ Ö Ö ×ÙÐØ׸ Û
Ò Ù× tra-
5. class C { static public Runnable m() {
static private boolean once = false; return new Runnable() {
static public Runnable m() { public wrapped(Wrappers.tracer) void run()
class R implements Runnable { { ... }
public void run() { ... } };
} }
if (Debug.traceRuns && !once) {
// Wrapping R effects all instantiations of
// R, just as instanceof matches any
À Ö ¸ Ø Ñ Ø Ó ÑÓ ¬ Ö wrapped(Wrappers.tracer)
// instantiation of R. Only trace it once. × Ò Ð× Ø Ø Ø Ñ Ø Ó run() × ÓÙÐ ÛÖ ÔÔ Ò
wrap R.run() with Wrappers.tracer; ØÖ
Öº Ì ÜÔÖ ×× ÓÒ Wrappers.tracer × Ú ÐÙ Ø Ò
once = true; ÛÖ ÔÔ Ò × Ô Ö ÓÖÑ Ò Ø ØÓÔ¹Ð Ú Ð
Ð ×× C³× ×Ø Ø
Ò ¹
} Ø Ð Þ Ö׺
return new R();
}
}
ÙÖ ¿ Ò Ü ÑÔÐ Ó ÛÖ ÔÔ Ò Ñ Ø Ó × Ó ÐÓ
Ð 3. IMPLEMENTING HANDI-WRAP
Ð ×× ×º À Ò ¹ÏÖ Ô Ò Ö Ø × ×Ø Ò Ö Â Ú ÝØ
Ó º Á ÂÎÅ
ÓÑÔ Ø Ð ØÝ Û Ö ÒÓØ Ò ××Ù ¸ Ò ÑÔÐ Ñ ÒØ Ø ÓÒ Ñ Ø
ÒÚÓÐÚ ÝÒ Ñ
ÐÐÝ ÙÔ Ø Ò ÚØ Ð ×º Ú Ò Ø
ÓÒ×ØÖ ÒØ×
ceParsing ØÓ ÙÐ ÛÖ ÔÔ Ö Ø Ø Ò Ð × ÐÓ Ò Ü
ØÐÝ Ó Ø ÂΟ À Ò ¹ÏÖ Ô
Ú × ÓÓ Ô Ö ÓÖÑ Ò
Ø ÖÓÙ
Û Ö Ø ×Ò Ø Ù× Ó
Ö ÙÐÐÝ
Ó× Ò Ø ×ØÖÙ
ØÙÖ ×¸ Ò Ý ÓÔ Ò¹
wrap PatternParser.parse(Object,Environment)
Ó Ò Ñ Ø Ó ³× ÓÖ Ò Ð ¬Ò Ø ÓÒ Ò Ø × Ñ ÂÎÅ Ñ ¹
with new RightSymbol conditionalWrapper Ø Ó Ø Ø ×Ô Ø
× ÛÖ ÔÔ Ö׺ À Ò ¹ÏÖ Ô³× ÑÔÐ Ñ ÒØ ¹
PatternParser(Object lhs, Environment env) Ø ÓÒ
× ÓÒ× Ö × ÓÒ Ø ××ÙÑÔØ ÓÒ Ø Ø Ø Ú ×Ø
{ thisReceiver instanceof TemplateParser
&& lhs instanceof Type Ñ ÓÖ ØÝ Ó Ñ Ø Ó × Û ÐÐ ÒÓØ ÛÖ ÔÔ º
&& (((Type) lhs).getReflectClass() À Ò ¹ÏÖ Ô × ÑÔÐ Ñ ÒØ × ÖÓÙÔ Ó
ÓÓÔ Ö Ø Ò
== Statement.class) } Ñ
ÖÓ× ÛÖ ØØ Ò Ò Å Ý º Å Ý × Ò ÜØ Ò× ÓÒ Ó Â Ú Ø Ø
=> traceParsing; ÐÐÓÛ× Ù× Ö× ØÓ ÛÖ Ø Ø Ö ÓÛÒ ×ÝÒØ Ü ÜØ Ò× ÓÒ׸ Û
Ö
ÐÐ Å Ý Ò׺ Å Ý Ò×
Ò Ö ÒØ ÖÔÖ Ø ÓÖ ÜØ Ò Å Ý ×ÝÒ¹
ÏÖ ÔÔ Ö× Ö ÛÓÚ Ò ÒØÓ Ñ Ø Ó ¬Ò Ø ÓÒ׸ Ö Ø Ö Ø Ò Ø Ü Ý ÜÔ Ò Ò Ø ØÓ ÓØ Ö Å Ý ×ÝÒØ Ü Ø Ý ÓÔ Ö Ø
Ö ØÖ ÖÝ Ö
Ú Ö¸ × Ò ØÙÖ Ô Ö׺ Ì Ö ÓÖ ¸ Ø ÓÚ ÓÒ ×ØÖ
Ø ×ÝÒØ Ü ØÖ ×¸ Ò Ø Ö ÜÔ Ò× ÓÒ × ØÖ Ö
ÛÖ ÔÔ Ö ÑÙ×Ø ÛÓÚ Ò ÒØÓ parse Ò Ø×
Ð Ö Ò
Ð ×׸ ÙÖ Ò Ô Ö× Ò × × Ñ ÒØ
Ø ÓÒ׺ Å Ý ³× ÜÔÖ ×× Ú Ò ××
PatternParser¸ Ò Ø ÑÙ×Ø ÜÔÐ
ØÐÝ
ÓÖ Ø Ö ¹
ÓÑ × ÖÓÑ ØÖ Ø Ò Ö ÑÑ Ö ÔÖÓ Ù
Ø ÓÒ× × Ò Ö
ÙÒ
¹
Ú Ö
Ð ×× TemplateParserº Ï Ð À Ò ¹ÏÖ Ô³× Û Ú¹ Ø ÓÒ׸ Ò Å Ý Ò× × ÑÙÐØ ¹Ñ Ø Ó × ÓÒ Ø Ó× Ò Ö
ÙÒ
¹
Ò Ñ
Ò ×Ñ × ÜØÖ Ñ ÐÝ × ÑÔÐ ¸ Ü Ð ÔÓÐ
×
ÓÙÐ Ø ÓÒ׺ Å Ý Ò× Ñ Ý ÓÚ ÖÖ Ø ØÖ Ò×Ð Ø ÓÒ Ó Ù ÐØ Ò ÔÖÓ¹
Ù ÐØ ÓÒ ØÓÔ Ó Øº ÓÖ Ò×Ø Ò
¸ Û Ð
Ö Ñ Ø
Ò
ÓÙÐ Ù
Ø ÓÒ׸ Ò Ñ Ý Ò Û ÔÖÓ Ù
Ø ÓÒ× ØÓ Å Ý ³× Ä ÄÊ´½µ
Û Ú ÛÖ ÔÔ Ö ÒØÓ Ñ Ø Ó ¬Ò Ø ÓÒ Ò ÐÐ ÓÚ ÖÖ Ò Ö ÑÑ Öº
¬Ò Ø ÓÒ׺ À Ò ¹ÏÖ Ô³× ÑÔÐ Ñ ÒØ Ø ÓÒ Ô Ö ÓÖÑ× Ú Ö ØÝ Ó Ø × ×
Ä ÓØ Ö ×Ô
Ø ×Ý×Ø Ñ׸ À Ò ¹ÏÖ Ô
Ò Ö Ù
¹ ÓÖ Û
Å Ý × Ô ÖØ
ÙÐ ÖÐÝ Û ÐÐ ×Ù Ø º Ö×ظ
Ó ØÓ
Ú ÐÓÔÑ ÒØ Ø Ñ Ý Ù Ñ ÒØ Ò println Ò ÒØ Ö
Ø Ú Ò Ð ÛÖ ÔÔ Ò × ÛÓÚ Ò ÒØÓ
Ð ××
Ð Ö Ø ÓÒ Ò Ø
Ù Ö× Û Ø ØÖ
Ò ¸
ÓÒØÖ
Ø Ò ÓÖ
Ñ Òظ Ò ×Ó ÓÒº
ÓÑÔÓÒ ÒØ ÔÖÓ Ö Ñº Ì ÔÖÓÐÓ Ù ÛÓÚ Ò ÒØÓ
Ñ Ø Ó
À Ò ¹ÏÖ Ô × Ò Ú ÒØ ÓÚ Ö ×Ø Ø
×Ô
Ø Û Ú Ò × Ò Ö Ø ÔÖÓ Ö ÑÑ Ø
ÐÐݸ × ÓÒ Ø Ñ Ø Ó ³× × ¹
×Ý×Ø Ñ× Ò Ø Ø ×Ô
Ø×
Ò ÛÓÚ Ò Û Ø ÓÙØ Ö
ÓÑÔ Ð Ò Ò ØÙÖ º Ë
ÓÒ ¸ Ñ
ÖÓ× Ò
Ô×ÙÐ Ø Ò Æ
ÒØ ÔÖÓ
ÙÖ ¹
Ø Û Ú Ò Ø Ö Øº
ÐÐ Ò
ÓÒÚ ÒØ ÓÒ ÓÖÖÓÛ ÖÓÑ Ø Ã Û ℄ Ë
Ñ ØÓ
Â Ú ÝØ
Ó
ÓÑÔ Ð Öº Ì Ö ¸ À Ò ¹ÏÖ Ô × Ú Ö¹
2.4 Wrapping Unmentionable Methods ØÝ Ó ×ÝÒØ
Ø
ÓÖÑ× ØÓ Â Ú º Ì × × ÔÓ×× Ð × Ò
Å Ý
À Ò ¹ÏÖ Ô³× Ø Ø ÒØ Ö Ø ÓÒ Û Ø Â Ú Ô ÖÑ Ø× ×ØÖ
ØÐÝ ÐÐÓÛ× Ø× Ö ÑÑ Ö ØÓ ÜØ Ò Ò Ö ØÖ ÖÝ Û Ý׺
ÑÓÖ Û Ú Ò Ø Ò ×Ø Ø
×Ô
Ø Ð Ò Ù × ÐÐÓÛº À Ò ¹ Ï Ð ÑÙ
Ó À Ò ¹ÏÖ Ô × ÑÔÐ Ñ ÒØ Ø ÖÓÙ ×ÝÒ¹
ÏÖ Ô ÜØ Ò × Ø Ð Ò Ù Ó ×Ø Ø Ñ ÒØ× Ò ÜÔÖ ×× ÓÒ׺ Ø Ü ÜØ Ò× ÓÒ׸ ØÛÓ ÑÔÓÖØ ÒØ ØÙÖ × Ö ÒÓØ À Ò ¹ÏÖ Ô
ÁÒ
ÓÑÔ Ö ×ÓÒ¸ ×Ô
ØÂ ÓÒÐÝ ÜØ Ò × Ø Ð Ò Ù Ó ØÓÔ¹ Ò Ö Ø ×
Ó ØÓ
ÐÐ ÛÖ ÔÔ Ñ Ø Ó ³× ÓÖ Ò Ð ¬Ò Ø ÓÒ
Ð Ú Ð
Ð Ö Ø ÓÒ׺ × Ö ×ÙÐØ Ó À Ò ¹ÏÖ Ô³× ÜÔÖ ×× Ú ¹ ÖÓÑ ÛÖ ÔÔ Ö× ÝÒ Ñ
ÐÐݸ Ò
Ó ØÓ Ò Ð ÛÖ ÔÔ Ò Ó
Ò ×׸ ÛÖ ÔÔ Ö×
Ò ÛÓÚ Ò ÒØÓ Ñ Ø Ó × Ø Ø
ÒÒÓØ ÔÖ
ÓÑÔ Ð Ð Ö Ö × × ÑÔÐ Ñ ÒØ Ù× Ò Ò ÖÝ Ö ÛÖ Ø Ö
Ò Ñ Ø Ø ØÓÔ Ð Ú Ðº ÁÒ Ô ÖØ
ÙÐ Ö¸ Ñ Ø Ó × Ò ÐÓ
Ð Ò × ÓÒ Ø ÝØ
Ó Ò Ò Ö Ò Ä Ö ÖÝ ½¿℄º Ï Ø ÓÙØ
ÒÓÒÝÑÓÙ×
Ð ×× ×
Ò ÛÖ ÔÔ º ÙÖ ¿ × ÓÛ× wrap Ø ÝØ
Ó Ö ÛÖ Ø Ö¸ ÛÖ ÔÔ Ö×
ÓÙÐ ÓÒÐÝ ÝÒ Ñ
ÐÐÝ
×Ø Ø Ñ ÒØ Ø Ø
Ò ÓÒÐÝ ÔÔ Ö Ò× ÑÔÐ Ñ ÒØ Ø ÓÒ
Ó º ÛÓÚ Ò ÒØÓ Ñ Ø Ó ×
ÓÑÔ Ð Ý À Ò ¹ÏÖ Ôº
À Ö Ø ÐÓ
Ð
Ð ×× R
Ò ÓÒÐÝ Ò Ñ Û Ø Ò C.m()º Þ ÖÒ
Ò × Ò
Ö ½¾℄ ×
Ö ØÛÓ ×
Û Ý× ØÓ
ÆÓØ
Ø Ø wrap R.run() ÔÔÐ × ØÓ ÐÐ Ò×Ø Ò
× Ó R¸ ÑÔÐ Ñ ÒØ ×Ô
Ø׺ Ö×ظ ×ÓÙÖ
Ó ØÖ Ò× ÓÖÑ Ø ÓÒ
Ò
Ö Ö Ð ×× Ó Û Ø Ö Ø Ý Ö ÐÐÓ
Ø Ý Ø
ÙÖÖ ÒØ Ò¹ Ù× ØÓ ×Ø Ø
ÐÐÝ Û Ú ×Ô
Ø× ÒØÓ Ø × ÔÖÓ Ö Ñ¸
ÚÓ
Ø ÓÒ Ó mº ÁÒ Ø × Ö ×Ô
ظ wrap Ñ Ø
× Ø Ú ÓÖ × Ò ×Ô
غ Ë
ÓÒ ¸ ÝÒ Ñ
Ö
Ø ÓÒ Ñ
Ò ×Ñ×
Ò
Ó instanceof Ò
×Ø׸
Ù× ÐÓ
Ð
Ð ×× × Ö Ñ Ö ÐÝ Ù× ØÓ Û Ú
Ó Ø ÖÙÒØ Ñ º À Ò ¹ÏÖ Ô Ø ×
×ÝÒØ
Ø
×Ù Öº Ñ Ð ÔÔÖÓ
ÓÑÔ Ð ¹Ø Ñ Ö
Ø ÓÒ ´ Ò Ò ×ÓÑ
× ×
À Ò ¹ÏÖ Ô Ð×Ó ÐÐÓÛ× Ñ Ø Ó × Ò ÒÓÒÝÑÓÙ×
Ð ×× × ØÓ ÝØ
Ó Ö ÛÖ Ø Ò µ × Ù× ØÓ Ò× ÖØ Ñ Ò Ñ Ð ÓÓ × Ø Ø
ÛÖ ÔÔ ÐÐÓÛ ÝÒ Ñ
ÛÖ ÔÔ Ò º
6. 3.1 Wrapping Ö ×ØÖ
Ø ÓÒ ÔÖ Ú ÒØ× ÛÖ ÔÔ Ö× ÖÓÑ Ø ÖÓÛ Ò
Ü
Ô¹
À Ò ¹ÏÖ Ô Ù Ð × ÛÖ ÔÔ Ñ Ø Ó ¬Ò Ø ÓÒ× ÖÓÑ ÛÖ Ô¹ Ø ÓÒ× ÜÔÐ
ØÐݸ ÙØ Ó × ÒÓØ Ð Ñ Ø Ø × Ø Ó Ñ Ø Ó × Ø Ø
Ô ÔÖÓ
ÙÖ × Ø ÖÓÙ Ø Ñ Ø Ó Wrapper.generate()º ÑÝ ÛÖ ÔÔ º Ë Ò
ÓØØÓÑ ÔÖÓ
ÙÖ × Ö ÒÖ Ø
Ì ØÛÓ
ÐÐ Ò × Ò ÑÔÐ Ñ ÒØ Ò ÛÖ ÔÔ Ö× Ö Ö ÔÐ
Ò ÝÒ Ñ
ÐÐÝ Ø Ø ÝØ
Ó Ð Ú Ð¸ Ø Ý Ö ×Ù
Ø ØÓ Â Ú
Ò ÓÖ Ò Ð Ñ Ø Ó ¬Ò Ø ÓÒ Û Ø ÛÖ ÔÔ Ö ÔÖÓ
ÙÖ Ò Î ÖØÙ Ð Å
Ò ØÝÔ ¹
Ò ÖÙР׸ Ö Ø Ö Ø Ò Ø ×Ð ØÐÝ
Ò Ö Ø Ò ÛÖ ÔÔ ÔÖÓ
ÙÖ
ÓÖÖ ×ÔÓÒ Ò ØÓ Ò ÓÖ ¹ ÑÓÖ Ö ×ØÖ
Ø Ú Â Ú Ð Ò Ù ÖÙР׺ ËÔ
¬
ÐÐݸ ÓØØÓÑ
Ò ÐÑ Ø Ó ¬Ò Ø ÓÒº Ì ¬Ö×Ø
ÐÐ Ò × Ñ Ø Ý Û Ú Ò ÔÖÓ
ÙÖ ×
Ò Ò Ó Ø
Ð Ö Ü
ÔØ ÓÒ× Ø ÖÓÛÒ
ÓÓ × ÒØÓ
ÓÑÔÓÒ ÒØ
Ó ¸ Ò Ø ×
ÓÒ
ÐÐ Ò × Ñ Ø Ý ÔÖÓ
ÙÖ × Ø Ý
Ðи × Ò
Ø ÂÎÅ Ó × ÒÓØ
ÓÒ×ØÖ Ò
Ù× Ò ÝÒ Ñ
Ó Ò Ö Ø ÓÒº Ø Ü
ÔØ ÓÒ× Ø Ø Ñ Ø Ó Ñ Ý Ø ÖÓÛº
ÌÓ ×ÙÔÔÓÖØ ÛÖ ÔÔ Ò ¸ À Ò ¹ÏÖ Ô × ×Ø Ø
¬ Ð ØÓ ËØ Ø
Ò
ÓÙÐ ÑÔÖÓÚ Ý ÒØÖÓ Ù
Ò ÛÖ Ô¹
Ð ×× Ò ÔÖÓÐÓ Ù ØÓ
Ñ Ø Ó Ó Ýº Ì ¬ Ð Ô Ö Ò ÔÖÓ
ÙÖ × Ò ØÙÖ × ØÓ Ø Ð Ò Ù º ÓÖ Ò×Ø Ò
¸
proc$ ÓÐ × Ò ÖÖ Ý Ó ÛÖ ÔÔ Ö ÔÖÓ
ÙÖ ×º Ì × Ö¹ Ø ØÝÔ Ó ÛÖ ÔÔ Ö× ÔÔÐ
Ð ØÓ Object.hashCode()
ÖÝ ×Ð ÚØ Ð Ü
ÔØ Ø Ø Ø Ò
ÐÙ × ×Ø Ø
Ñ Ø Ó × Ò System.identityHashCode()
ÓÙÐ ÛÖ ØØ Ò ×
Ò Ü
ÐÙ × Ò Ö Ø Ñ Ø Ó ×º ÐÐ proc$ ÒØÖ × Ö Ò ¹ wrapper<Object -> int>º ÀÓÛ Ú Ö¸ ÔÓÐÝÑÓÖÔ
ØÝÔ
Ø ÐÐÝ ÒÙÐк À Ò ¹ÏÖ Ô Ò× ÖØ× ÔÖÓÐÓ Ù ÖÓÙÒ
ѹ ×Ý×Ø Ñ ÛÓÙÐ Ò ØÓ
ÔØÙÖ Ø Ú ÓÖ Ó Ñ Ø ¹
Ø Ó Ñ Ø × ÔÖÓÐÓ Ù
× Û Ø Ö Ø Ñ Ø Ó × Ò Ó × ×Ù
× makePerInstance() Ò makeCondition-
ÛÖ ÔÔ Ý
ÓÑÔ Ö Ò proc$[i] Û Ø ÒÙÐк Á ÛÖ ÔÔ Ö alWrapper()º
× ¬Ò ¸ Ñ
ÐÐ× Ø ÖÓÙ proc$[i]¸ ÓÜ Ò Ö ÙÑ ÒØ×
Ò ÙÒ ÓÜ Ò Ø Ö ØÙÖÒ Ú ÐÙ × Ò º ÇØ ÖÛ × ¸ Ø 4. PERFORMANCE
ÓÖ Ò Ð Ñ Ø Ó ¬Ò Ø ÓÒ × Ü
ÙØ º ÁÒ Ø × ×
Ø ÓÒ¸ Û
ÓÑÔ Ö À Ò ¹ÏÖ Ô ØÓ ×Ø Ø
×Ô
Ø
À Ò ¹ÏÖ Ô Ù× × Ø Ã Û Ë
Ñ ×Ý×Ø Ñ³×
ÐÐ Ò
ÓÒ¹ Ð Ò Ù ¸ ×Ô
ظ Ò Ú ÐÙ Ø Ø ÓÚ Ö Ó À Ò ¹
Ú ÒØ ÓÒ¸ Û
× ÑÓÖ Æ
ÒØ Ø Ò ×Ø Ò Ö Â Ú ÒØ Ö¹ ÏÖ Ô³×
ÓÑÔ Ð ¹Ø Ñ ØÖ Ò× ÓÖÑ Ø ÓÒ׺ Ì ×Ø× Û Ö ÖÙÒ ÓÒ
× ×Ù
× Method.invoke()º ÐØ ÓÙ À Ò ¹ÏÖ Ô Ù Ð ¿ ¼Å Þ È ÒØ ÙÑ ÁÁ Ñ
Ò Û Ø ¾ Å Ó Ñ Ñ¹
×ÙÔÔÓÖØ× ÔÖÓ
ÙÖ × Ø Ø Ø Ú Ö Ð ÒÙÑ Ö Ó Ö Ù¹ ÓÖݺ Ì ×Ø× Û Ö ÖÙÒ Ù× Ò Â Ã¹½º¿º½ Ù× Ò Ò Ø Ú Ø Ö ×
Ñ ÒØ׸ Ø ÐÐÓ
Ø ÓÒ Ó Ö ÙÑ ÒØ ÖÖ Ý×
Ò ÚÓ Ò Ø ÀÓØ×ÔÓØ
Ð ÒØ
ÓÑÔ Ð Ö ÙÒ Ö Ò Ä ÒÙÜ Û Ø
Ò Ñ ÒÝ
× ×º Ð×Ó¸ À Ò ¹ÏÖ Ô ÚÓ × ÝÒ Ñ
ÐÐÝ ÐÐÓ¹ Ú Ö× ÓÒ ¾º¾º½¾ ÖÒ Ðº ÁÒ ÓØ Ø À Ò ¹ÏÖ Ô Ò ×¹
Ø Ò ÓÜ Ö ÔÖ × ÒØ Ø ÓÒ× Ó ×Ñ ÐÐ ÒØ Ö× Ø ÖÓÙ Ø Ô
ØÂ Ø ×Ø׸ Ø Ð ××È Ø Ð Ö ÖÝ Û ×
ÓÑÔ Ð Û Ø Â Ã¹
ÝÛ Ø Ô ØØ ÖÒº ½º¿º½³× javacº ÓÖ À Ò ¹ÏÖ Ô Ø ×Ø׸ Ø
ÓÑÔ Ð Ð Ö ÖÝ
ÌÓ ÛÖ Ô Ñ Ø Ó Ñ ¸ Û × Ø proc$[i] ØÓ Ø ÔÖÓ
ÙÖ Û × Ö ØÖÓ¬ØØ Û Ø Ø Ö ÕÙ Ö ÓÓ ×¸ Ò Ø Ø ×Ø Ö Ñ ¹
Ö ØÙÖÒ Ý generate()º Á ÓØ Ö ÛÖ ÔÔ Ö× Ú ÐÖ Ý ÛÓÖ Û ×
ÓÑÔ Ð Û Ø mayacº ÓÖ ×Ô
ØÂ Ø ×Ø׸ Ø Ø ×Ø
Ò ÛÓÚ Ò ÒØÓ Ñ ¸ Ø ×
ÓÒ Ö ÙÑ ÒØ ØÓ generate() × Ö Ñ ÛÓÖ Û ×
ÓÑÔ Ð Û Ø javacº
Ø ÔÖ Ú ÓÙ× Ú ÐÙ Ó proc$[i]º ÇØ ÖÛ × ¸ ÓØØÓÑ ÔÖÓ¹ Ï Ñ ×ÙÖ Ø Û ÐÐ¹Ø Ñ Ø Ò ØÓ Ô Ö ÓÖÑ × Ö × Ó
ÙÖ Ó
Ø ÑÙ×Ø
ÓÒ×ØÖÙ
Ø ÓÖ Ø Ñ Ø Ó ³× ÓÖ Ò Ð
ÐÐ× ØÓ ClassPath.lookup() Ó Ø Ò Ý ØÖ
Ò
¬Ò Ø ÓÒº mayac ÖÙÒº Ç Ø ×
ÐÐ׸ ½¼ ×Ø Ò
Ø Ö ÙÑ ÒØ× Ò
À Ò ¹ÏÖ Ô Ñ × Ñ Ø Ó ³× ÓÖ Ò Ð ¬Ò Ø ÓÒ Ú Ð¹ ½¼ Ö ØÙÖÒ ÒÓÒ¹ÒÙÐк
Ó Ø ½¼ ×Ù
×× ÙÐ
ÐÐ× Û ×
Ð Ý
ÓÔÝ Ò Ø ÒØÓ Ò Û Ñ Ø Ó Ø Ø
Ò
ÐÐ Ñ ÛØ ×Ø Ò
Ø Ö ÙÑ Òظ × Ò
×Ù
×× ÙÐ
ÐÐ×
ÖÓÑ ÓØØÓÑ ÔÖÓ
ÙÖ º À Ò ¹ÏÖ Ô Ò Ö Ø × ÓØØÓÑ ØÝÔ × ØÓ Ò Ñ ×Ô
º
ÔÖÓ
ÙÖ ¬Ò Ø ÓÒ ÝÒ Ñ
ÐÐÝ Ø ¬Ö×Ø Ø Ñ Ñ Ø Ó × Ì Ð ¾ × ÓÛ× Ø ÒÙÑ Ö Ó ×
ÓÒ × ×Ô ÒØ Ü
ÙØ Ò Ø
ÛÖ ÔÔ º Ì Ò Ö Ø
Ó ÚÓ × Ø ÓÚ Ö Ó Ò¹ ClassPath Ò
Ñ Ö Ò × Ú Ö Ð
ÓÒ¬ ÙÖ Ø ÓÒ׺ Ì ¬Ö×Ø
ÚÓ Ò Ñ Ø Ó × Ø ÖÓÙ Ø Â Ú Ö
Ø ÓÒ ÈÁº ÇÒ
ÓÙÐ Ð Ò × ÓÛ× × Ñ ×ÙÖ Ñ ÒØ× Û Ø ÒÓ ÛÖ ÔÔ Ò º ËÙ × ¹
Ò×Ø ×Ø Ø
ÐÐÝ Ò Ö Ø Procedure ×Ù
Ð ×× ÓÖ
ÕÙ ÒØ Ð Ò × Ú Ø Ö ×ÙÐØ Ó Ò Ú Ö ÓÙ×
× ÖÓÙÒ
Ñ Ø Ó Ò Ø
ÓÑÔÓÒ ÒØ
Ó ¸ ÙØ Ø × ÛÓÙÐ Ñ ×¹ ClassPath.lookup() ÓÒ
× Ö ØÛ Ò ÐÐ Ò¹
ØÖ ÙØ Ò Ö × ÒÓÖ Ò Ø ÐÝ Ð Ö º ×Ø Ò
×
ÓÖ
Ò×Ø Ò
¬Ò Ù× Ò ×Ô
س×
pertarget ××Ó
Ø ÓÒ¸ Ò ¹
Ó ÛÖ ÔÔ Ö¸ Ò À Ò ¹
3.2 Type Checking ÏÖ Ô³× makePerInstance() Ò
ÓÒ ÓÒ Ô ÖØ
Ù¹
À Ò ¹ÏÖ Ô ÑÔÐ Ñ ÒØ× ×Ø Ø
ØÝÔ
Ò × Ø Ò Ú ¹ Ð Ö Ò×Ø Ò
¬Ò Ù× Ò ×Ô
ØÂ³× if Ó Ò ÔÓ ÒØ × Ò ¹
Ò Ö ÓÚ Ö ÝÒ Ñ
ÐÐÝ ØÝÔ × Òº ÁÒ ÔÖ
Ø
¸ Ø wrap ØÓÖ¸ Ò ¹
Ó ÛÖ ÔÔ Ö¸ Ò À Ò ¹ÏÖ Ô³× makeCon-
×Ø Ø Ñ ÒØ ÔÖÓÚ × ÑÓ×Ø Ó Ø Ò ¬Ø× Ó ×Ø Ø
ØÝÔ
¹ ditionalWrapper()º Ò ÓÔØ Ñ Þ ÛÖ ÔÔ Ö Ø Ø ÚÓ ×
Ò º Ï Ø ÓÙØ wrap¸ Û Ú Ò ÛÓÙÐ ÒÚÓÐÚ × Ö × Ó Ø ¹ ×ØÓÖ Ò ÒÙÐÐ Ú ÐÙ × ÒØÓ × Ø Ð × Û × Ð×Ó Ø ×Ø º Ì
ÓÙ× Ò ÖÖÓÖ¹ÔÖÓÒ
ÐÐ× ØÓ Ø Â Ú Ö
Ø ÓÒ ÈÁ Ò
ÓÐÙÑÒ× Ô
Ø × Ú Ö Ð ÑÔÐ Ñ ÒØ Ø ÓÒ ×ØÖ Ø × ×Ø Ø
Û
Ñ Ø Ó × Ò ØÝÔ × Ö Ò
Ó × ×ØÖ Ò ×º ÑÔÐ Ñ ÒØ Ø ÓÒ Ò ×Ô
ظ Ò ¹
Ó ÛÖ ÔÔ Ö¸ ÛÖ Ô¹
Ì wrap ×Ø Ø Ñ ÒØ ×Ø Ø
ÐÐÝ Ò×ÙÖ × Ø Ø Ø Ö × Ñ ¹ Ô Ö× Ö Ú ÖÓÑ cache2nd¸ Ò ÛÖ ÔÔ Ö× Ö Ú ÖÓÑ
Ø Ó ØÓ ÛÖ Ôº Ì wrap ×Ø Ø Ñ ÒØ Ð×Ó
× Ø Ø ÛÖ Ô¹ CacheNthº
Ô Ö× Ö ÛÓÚ Ò ÒØÓ Ñ Ø Ó × Û Ø
ÓÑÔ Ø Ð × Ò ØÙÖ ×º ÁÒ Ø × Ü ÑÔÐ ¸ À Ò ¹ÏÖ Ô ÑÔÓ× × Ò
ÔØ Ð ÓÚ Ö¹
Ç Ø Ò¸ Ø ×
× Ö Ô Ö ÓÖÑ ×Ø Ø
ÐÐݸ × ÓÒ Ø Ï Ú Ò cache2nd ÖÓÙÒ × Ò Ð ClassPath Ò¹
ÓÒ
Ö Ø ØÝÔ Ó Ø ÛÖ ÔÔ Ö¸ ÙØ Ò ×ÓÑ
× × Ø ×
× ×Ø Ò
× ÖÓÙ ÐÝ ½ ± ×ÐÓÛ Ö Ø Ò Û Ú Ò ×Ô
ØÂ Ú
º
ÑÙ×Ø ÖÖ ØÓ ÖÙÒØ Ñ º ÓÖ Ò×Ø Ò
¸ ×Ø Ø
Ò ÓÖÑ ¹ ×Ô
ØÂ³× ×Ø Ø
Ò ØÙÖ ÔÖÓÚ × ÂÎÅ× Û Ø ÑÓÖ
Ò
×
Ø ÓÒ × ÒÓØ Ú Ð Ð Û Ò Ñ Ø Ó Ö ØÙÖÒ× Ò ÒÓÒÝÑÓÙ× ÓÖ ÓÔØ Ñ Þ Ø ÓÒº ÓÖ Ò×Ø Ò
¸ ×Ô
ØÂ Û Ú ×
ÐÐ× ØÓ ÔÖ ¹
ÛÖ ÔÔ Ö Ò×Ø Ò
º ÏÖ ÔÔ Ö×
Ò Ð×Ó ¬Ò Ý ×Ù ¹ Ú Ø Ñ Ø Ó × ÒØÓ
Ó Û Ö À Ò ¹ÏÖ Ô Û Ú × Ú ÖØÙ Ð
Ð ×× Ò Wrapper¸ Ò Û
× À Ò ¹ÏÖ Ô Ó × ÒÓØ × ÙÒ
Ø ÓÒ
ÐÐ׺ ÀÓÛ Ú Ö¸ ËÙÒ³× ÝÒ Ñ
ÓÑÔ Ð Ö Ó × ÒÓØ
Ø Ö × Ò ØÙÖ ×º ÁÒ ×Ù
× ×¸ Ø ÂÎÅ Ò ÓÖ
× ÝÒ Ñ
Ò ¬Ø ÖÓÑ Ø × ÒÐ Ò Ò ÒØ× × Ö cache2nd ÛÖ Ô¹
ØÝÔ × Øݺ Ô Ö × ÒÓ Ð ×× Æ
ÒØ Ø Ò ÙÒ
ÓÒ Ø ÓÒ Ð Ú
Ò ×Ô
غ
ÏÖ ÔÔ Ö
Ð Ö Ø ÓÒ× Ñ Ý ÒÓØ
ÓÒØ Ò Ø ÖÓÛ
Ð Ù× ×º Ì × À Ò ¹ÏÖ Ô³× ×ÙÔÔÓÖØ ÓÖ Ú Ö Ð ÒÙÑ Ö Ó Ö ÙÑ ÒØ×
7. ÈÓÐ
Ý ×Ô
Ø À Ò ¹ÏÖ Ô
Ù×ØÓÑ
¾Ò
ÆØ ´½µ
ÆÓ Ú
º¾ ¿ º¿¼ º¿¼ º¿¼
Ë Ö
¼º ¼º ¼ ¼º ¼ ¼º ½
È Ö¹Ø Ö Ø
¼º ½¾ ¼º ¾ ¼º ¼º
ËÔ
¬
Ø Ö Ø
¼º ½ ¼º ¼ ¼º ½ ¼º
ÇÔØ Ñ Þ ÒÙÐÐ× ¼º
Ì Ð ¾ Ë
ÓÒ × ×Ô ÒØ Ü
ÙØ Ò Ø
Ò
Ñ Ö Û Ø ÓÙØ Ö
ØÓÖÝ Ü ×Ø Ò
º
ÈÓÐ
Ý ×Ô
Ø À Ò ¹ÏÖ Ô
Ù×ØÓÑ
¾Ò
ÆØ ´½µ
ÆÓ Ú
¼º ¼º ¼º ¼º
Ë Ö
¼º¾ ¾ ¼º¾ ¿ ¼º¾ ¿ ¼º¿½
È Ö¹Ø Ö Ø
¼º¿¼ ¼º¾ ¼º¿ ¼º ¼½
ËÔ
¬
Ø Ö Ø
¼º¾ ¼º¾ ½ ¼º¿ ¼º¿ ¾
ÇÔØ Ñ Þ ÒÙÐÐ× ¼º¾¿
Ì Ð ¿ Ë
ÓÒ × ×Ô ÒØ Ü
ÙØ Ò Ø
Ò
Ñ Ö Û Ø Ö
ØÓÖÝ Ü ×Ø Ò
º
ÑÔÓ× ×
ÓÒ× Ö Ð
Ó×غ × Ö CacheNth ÛÖ ÔÔ Ö Ò
Ñ Ö ÇÖ Ò Ð Ê ØÖÓ¬ØØ ±
Ó×Ø
ÖÙÒ× ÖÓÙ ÐÝ ¼Ñ× ×ÐÓÛ Ö Ø Ò cache2nd ÛÖ ÔÔ Ö¸ ÓÖ ¾¼¼
¼º¿ ¼º¿ ½º¼½¿±
ÓÙØ º × Ô Ö
Ðк ÅÙ
Ó Ø × Ø Ñ × ×Ô ÒØ Ô
Ò ¾¾ ÑØÖØ ½ º ¿ ½ º ½ ½ º¾ ±
CacheNth³× Ö ÙÑ ÒØ× ÒØÓ Ò ÖÖ Ý¸
ÐÓÒ Ò Ø ÖÖ Ý ÓÖ ¾¼¾ ×× ½ º ¾ ½ º ¼½ ½ º½¼±
ÐÐ× ØÓ Ø ÛÖ ÔÔ Ñ Ø Ó ¸ Ò ÙÒÔ
Ò Ö ÙÑ ÒØ× ÖÓÑ ¾¼½
ÓÑÔÖ ×× ¼º ½º½¿½ ¾¼º ±
Ø
ÐÓÒ ÖÖ Ýº ¾¼ º¾½¿ º ½ ¹½º ¼ ±
×Ô
ØÂ
× Ø ¼Ñ× Ô Ö ÓÖÑ Ò
Ø ÑÓÚ Ò ÖÓÑ ¾¾¾ ÑÔ Ù Ó ¿¾º¾ ¿ º½ ¾ º ¿±
× Ö
ØÓ Ô Ö¹Ø Ö Ø
׺ Ì × Ñ × × Ò× ¸ × Ò
¾¾
½ º ¼ ½ º ¿ º ¾¾±
Ô Ö¹Ø Ö Ø
Ò ÒÚÓÐÚ × ÓÔ Ö Ø ÓÒ× ÓÒ ×
ÓÒ × Ø ¹ ¾½¿ Ú
¿ º ½º¿ ½¾º¾ ±
Ð º Ë Ñ Ð ÖÐÝ cache2nd Ø × ½½ Ñ× Øº Ì ×
Ò
ØØÖ ÙØ ØÓ ÓØ Ø ÓÒ Ð × Ò Ò ÓÔ Ö Ø ÓÒ× ÓÒ Ö¹ Ì Ð Ë
ÓÒ × ×Ô ÒØ Ò ËÔ
ÂÎÅ Ò
Ñ Ö ×¸
ÙÑ ÒØ ÖÖ Ý׺ Û Ø Ò Û Ø ÓÙØ À Ò ¹ÏÖ Ô ÔÖÓÐÓ Ù ×º
Ï Ò Ò ×Ô
ØÂ
× ÛÓÚ Ò ÒØÓ ×Ô
¬
Ø Ö Ø¸ Ø
×
ÓÒ × Ø Ð × ÔÔ Ö׸ ÐÓÒ Û Ø Ø ÓÚ Ö Ø Ñ¹
ÔÓ× ×º ÀÓÛ Ú Ö¸ cache2nd Ó × ÒÓØ Ø ÔÔÖ
ÐÝ ×Ø Öº
Ì × « Ö Ò
× Ù ØÓ Ø ÑÔÐ Ñ ÒØ Ø ÓÒ Ó makeCon- ØÓÑ
ÓÐÙÑÒº ÙÖØ Ö ÑÔÖÓÚ Ñ ÒØ × ÔÓ×× Ð ÓÒ ÚÓ ×
ditionalWrapper()º Ì Ù Ö ÖÓÙÒ ×Ô
ØÂ³× Ú
×ØÓÖ Ò ÒÙÐÐ Ú ÐÙ × Ò HashMapsº
ÓÔ × this ÒØÓ ÐÓ
Ð Ú Ö Ð Ò
ÓÑÔ Ö × Ø Ò×Ø ÅÓ×Ø Ó À Ò ¹ÏÖ Ô³× ÓÚ Ö ÔÔ Ö× ØÓ ÒØÖÓ Ù
¬Ð ¸Û Ð Ø Ù Ö ÖÓÙÒ cache2nd ÔÔÐ × ÓÓÐ Ò Ý Ö ÙÑ ÒØ ÖÖ Ý׺ ËÓÑ ÖÐÝ × ÑÔÐ ÓÔØ Ñ Þ Ø ÓÒ×
Ò
ÔÖÓ
ÙÖ ØÓ Ø× Ö ÙÑ ÒØ ÖÖ Ý Ø Ø Ô Ö ÓÖÑ× Ø × Ñ Ö Ù
Ø ×
Ó×غ ÓÖ Ò×Ø Ò
¸ Ø ÛÖ ÔÔ Ö ÔÖÓ
ÙÖ × ¹
ÓÑÔ Ö ×ÓÒº ÓÖ Û
ÓÑÔ Ö Ø lookup() Ö
Ú Ö ¬Ò Ý makeConditionalWrapper() Ò makePerIn-
stance() ÓÒÐÝ Ù× Ö ×Ø Ö ÙÑ ÒØ× ØÓ
ÐÐ ÓØ Ö ÔÖÓ
ÙÖ ×º
Ò×Ø Ø
Ð Ò×Ø Ò
¸ Ø ×
ÓÔ ÒØÓ Ò ÖÖ Ý¸
Ø ÖÖ Ý ×
ÐÓÒ ¸ Ò Ø Ö
Ú Ö ×
ÓÔ ÓÙØ Ó Ø Ï
ÓÙÐ ÚÓ Ö ÙÑ ÒØ ÖÖ Ý× ÒØ Ö ÐÝ Ý ×Ô
Ð Þ Ò
ÐÓÒ º Ì × ×ÓÖØ Ó
Ó ÔÖ × ÒØ×
ÐÐ Ò ØÓ ÒÝ ÓÔØ Ñ Þ¹ Ø × ÔÖÓ
ÙÖ × ÓÒ Ö Ø × ÙÔ ØÓ º
Ò
ÓÑÔ Ð Öº ÁÒ ×ÙÑÑ Öݸ À Ò ¹ÏÖ Ô³× Ò Ö
ÛÖ ÔÔ Ö× ÒØÖÓ Ù
À Ò ¹ÏÖ Ô³× ÓÚ Ö
Ò Ð×Ó Ñ ×ÙÖ Ò Ø ÔÖ ×¹ ÓÚ Ö ÒØÓ Ö ÙÑ ÒعР×Ø ÔÖÓ
×× Ò º Ì × ÓÚ Ö ÑÝ
Ò
Ó ÓØ Ö ÓÔØ Ñ Þ Ø ÓÒ׺ ÓÖ Ü ÑÔÐ ¸ ClassPath ÔÖÓ¹
ÔØ Ð ÓÖ ÙÒÓÔØ Ñ Þ ÔÖÓ Ö Ñ׸ ÙØ Ò ¹ ÒÐ Ò Ò
Ú × Ø× ÓÛÒ
Ò Ñ
Ò ×Ѻ ClassPath Ó
Ø
Ò Ù× Û Ò Ø ÓÚ Ö ÖÓÛ× ØÓÓ Ö Øº
Ò ¬Ò ×Ó Ø Ø
Ö
ØÓÖÝ ÓÒ Ø Ô Ø Ñ ÑÓ¹ Ï Ð×Ó Ñ ×ÙÖ Ø
Ó×Ø ÒØÖÓ Ù
Ý À Ò ¹ÏÖ Ô³×
Þ × ÒÓÒ Ü ×Ø ÒØ ×Ù Ö
ØÓÖ ×º Ì ×
ÔØÙÖ × Ö ÙÒ¹ Ñ Ø Ó ÔÖÓÐÓ Ù ×º Ï Ö Ò Ø ËÔ
ÂÎÅ Ò
Ñ Ö ×
Ò
Ý ØÛ Ò ×Ø Ò
Ø ÐÓÓ ÙÔ Ö ÙÑ ÒØ׺ ÓÖ Ü ÑÔÐ ¸ ÙÒØ Ð Ñ Ò ÑÙÑ Ü
ÙØ ÓÒ Ø Ñ Û × Ö
º Ï Ø Ò
Û
ÓÙÐ ÚÓ ×Ý×Ø Ñ
ÐÐ ØÓ ÐÓÓ ÙÔ ./java/lang/ Ö ØÖÓ¬ØØ Ø Ò
Ñ Ö
Ð ×× × Û Ø À Ò ¹ÏÖ Ô Ñ Ø Ó
String.class Û Ð ÖÒ Ø Ø ./java/lang Ó × ÒÓØ
ÔÖÓÐÓ Ù × Ò Ö Ô Ø Ø Ø ×غ Ì Ö ×ÙÐØ× Ö × ÓÛÒ Ò
Ü ×Ø Û Ò ÐÓÓ Ò ÙÔ Objectº Ì Ð º ÇÒ Ú Ö ¸ À Ò ¹ÏÖ Ô ÑÔÓ× × º ± ÓÚ Ö ¸
Ì Ö ×ÙÐØ Ó Ø
Ò Ò
Ñ Ö Û Ø Ö
ØÓÖÝ
¹ ÙØ Ø ÓÚ Ö Ú Ö × Û ÐÝ Û Ø Ø Ö ÕÙ Ò
Ý Ó Ñ Ø Ó
Ò Ò Ð × × ÓÛÒ Ò Ì Ð ¿º À Ò ¹ÏÖ Ô³× ×ÓÐÙØ
ÐÐ׺ Ì ÑÙÐØ ¹Ø Ö Ö ÝØÖ
Ö Ô Ö ÓÖÑ× ÔÓÓÖÐÝ × Ò
Ø
ÓÚ Ö Ö Ñ Ò× Ø × Ñ cache2nd ÓÒ ×Ô
¬
Ò¹ Ù× × ÔÖ Ú Ø ¬ Ð × Ü
ÐÙ× Ú ÐÝ Ò Ò
ÐÙ × Ö ÕÙ ÒØ
ÐÐ× ØÓ
×Ø Ò
× ÖÓÙ ÐÝ ½½¼Ñ× ×ÐÓÛ Ö Ø Ò Ø ÕÙ Ú Ð ÒØ Ú
º ¬ Ð ØØ Ö׺  ×× Ð×Ó Ô Ö ÓÖÑ× ÔÓÓÖÐݸ
Ù× Ù ÐØ Ò ÙÒ
¹
ÀÓÛ Ú Ö¸ Ø Ö Ð Ø Ú
Ó×Ø × Ò
Ö × À Ò ¹ÏÖ Ô × ÒÓÛ Ø ÓÒ× Ó Ø ÜÔ ÖØ × ÐÐ Ð Ò Ù Ö ÑÔÐ Ñ ÒØ × Ú
± ×ÐÓÛ Ö Ø Ò ×Ô
ظ Ò Ø × ÓÚ Ö Ö ÔÖ × ÒØ× ¿½± Ñ Ø Ó ×¸ Ò Ø × Ñ Ø Ó × Ö ØÝÔ
ÐÐÝ ÕÙ Ø ×Ñ Ðк Óѹ
Ó Ø Ø Ñ ×Ô ÒØ × Ö
Ò Ø
Ð ×× Ô Ø º Ì × ÓÚ Ö
Ò ÔÖ ×× ×Ù« Ö×
Ù× Ó Û ×Ñ ÐÐ Ñ Ø Ó ×
ÐÐ Û Ø Ò
Ð Ñ Ò Ø Ø ÖÓÙ Ò ¹ ÒÐ Ò Ò ¸ × × ÓÛÒ Ò Ø
Ù×¹ Ø× ÒÒ Ö ÐÓÓÔº
Í× Ö ÒØ ÖÚ ÒØ ÓÒ Ñ Ý Ò ØÓ
Ú
ÔØ Ð
8. Ô Ö ÓÖÑ Ò
ÓÖ
ÖØ Ò
Ó º Ò ÑÔÓÖØ ÒØ ¬Ö×Ø ×Ø Ô × ÒÓØ Ò ÒØ× Ú ×
ÔÓ ÒØ
ÙØ ØÝÔ × ÓÒ × Ò ×
ÔÔÐÝ Ò À Ò ¹ÏÖ Ô ØÓ
Ó ×Ù
× Ò Ä Ï
ÓÑÔÖ ××ÓÖ Ö Ð Ø ÓÒ× Ô׺
Ø Ø ÑÔÐ Ñ ÒØ× × Ò Ð Û Ðй ¬Ò
ÓÒ
ÖÒº È Ö ÓÖÑ Ò
ÇØ Ö ×Ô
Ø ×Ý×Ø Ñ× Ú Ò ÑÔÐ Ñ ÒØ Ø ÖÓÙ
Ò Ð×Ó ÑÔÖÓÚ Ý Ñ Ò Ô ÖØ
ÙÐ Ö Ñ Ø Ó × ÙÒÛÖ Ô¹ Ñ Ø ÔÖÓ Ö ÑÑ Ò º ÇÈ»ËÌ ℄ × ÑÔÐ Ñ ÒØ Ò Î ×٠й
Ô Ð º ÓÖ Ò×Ø Ò
¸ Ø
Ó×Ø Ó Ù× Ò À Ò ¹ÏÖ Ô Û Ø ÑØÖØ ÏÓÖ × ËÑ ÐÐØ Ð º ÇÈ»ËÌ ÝÒ Ñ
ÐÐÝ Ò Ö Ø × Ö Ò
×
ÖÓÔ× ØÓ ¼º ± Û Ò ÔÖÓÐÓ Ù × Ö ÒÓØ ØÓ ØØ Ö Ñ Ø ¹ Ò Ø Ò Ö Ø Ò
Ö Ö
Ý Ò ÐØ Ö× Ø
Ð ×× × Ó Ó ¹
Ó ×º ÙÖÖ ÒØÐݸ ÓÛ Ú Ö¸ À Ò ¹ÏÖ Ô Ó × ÒÓØ ÔÖÓÚ
Ø׺ ÁÒ ÇÈ»Ë̸ Ú
× ÛÓÚ Ò ÒØÓ ÐÐ Ö
Ø Ò×Ø Ò
×
Ñ
Ò ×Ñ ÓÖ ×Ù
¬Ò ¹ Ö Ò
ÓÒØÖÓÐ ÓÚ Ö ÛÖ ÔÔ Ð Øݺ Ó Ô ÖØ
ÙÐ Ö
Ð ×׸ Û Ö × Ò À Ò ¹ÏÖ Ô Ú
× ÛÓÚ Ò
ÒØÓ
ÓÒ
Ö Ø Ñ Ø Ó ¬Ò Ø ÓÒ× Ö
ØÐݺ
5. RELATED WORK ÇÇÄ ½½℄ ÑÔÐ Ñ ÒØ× ×Ô
Ø ¼º½³× ×ÝÒ
ÖÓÒ Þ Ø ÓÒ
À Ò ¹ÏÖ Ô ÓÛ × ÑÙ
ØÓ ×Ô
ØÂ ¾ ℄º Å Ø Ó ÛÖ ÔÔ Ö× Ð Ò Ù Ò Î ×Ù ÐÏÓÖ × ËÑ ÐÐØ Ð ¸ Û Ð ÄÙÒ Ù ¾¼℄ ¬Ò ×
Ú Ø × Ñ «
Ø × ×Ô
ØÂ Ú
º ÀÓÛ Ú Ö¸ ×Ô
ØÂ Ñ Ø ¹Ó
Ø ÔÖÓØÓ
ÓÐ ÓÖ Ç
Ø Ú ¹ Ø Ø ×ÙÔÔÓÖØ× Ñ ¹
Ú
Ò ÛÓÚ Ò ÒØÓ Ö
× Ø Ó Ó Ò ÔÓ ÒØ× Ö Ø Ö Ø Ò Ø Ó ÛÖ ÔÔ Ò º ÁÒØ Ö ×Ø Ò Ðݸ ÓØ Ø × ×Ý×Ø Ñ× Û Ú ¹
Ñ Ö ÐÝ Ñ Ø Ó Ó ×º ×Ô
Ø Ð×Ó ÔÖÓÚ × Ò ×ØÖ
Ø ÓÒ Ú
ÓÒ Ô Ö¹ Ò×Ø Ò
× ×¸ Ö Ø Ö Ø Ò Ø Ô Ö¹
Ð ×× × ×
ÐÐ ÔÓ ÒØ
ÙØ ÒÓØ ÔÖ × ÒØ Ò À Ò ¹ÏÖ Ôº ×Ô
ØÂ³× Ó Ò ÓÔØ Ý ÑÓÖ Ö
ÒØ Ú Ö× ÓÒ× Ó ×Ô
ØÂ Ò Ý À Ò ¹
ÔÓ ÒØ × Ò ØÓÖ× Ò ÔÓ ÒØ
ÙØ× ÔÖÓÚ Û Ú Ö ØÝ Ó ÏÖ Ôº ÓØ ÇÇÄ Ò ÄÙÒ Ù³× ×Ý×Ø Ñ ÙØ Ð Þ ÝÒ Ñ
ÙÒ
Ø ÓÒ Ð Øݸ ÑÙ
Ó Û
× Ð×Ó Ú Ð Ð Ò À Ò ¹ÏÖ Ôº Ö
Ø ÓÒ¸ Û Ö À Ò ¹ÏÖ Ô Ù× ×
ÓÑÔ Ð ¹Ø Ñ Ö
Ø ÓÒ
Ö×ظ × Ò ØÓÖ× ×Ø Ð × Ò Ò × ØÓ Ú
Ö ÙÑ ÒØ׸ ØÓ Ò× ÖØ Ü
ØÐÝ Ø Ó× ÓÓ × Ò ÓÖ ÝÒ Ñ
Û Ú Ò º
ÖÓÐ ¬ÐÐ Ý À Ò ¹ÏÖ Ô³× Ô Ö Ñ Ø Ö Ð ×Ø׺ Ë
ÓÒ ¸ × ¹ À Ò ¹ÏÖ Ô × × Ñ Ð Ö ØÓ ÄÙÒ Ù³× ×Ý×Ø Ñ Ò Ø Ø ÓØ Ñ¹
Ò ØÓÖ× Ø ÖÑ Ò Û Ò Ú
ÔÔР׺ ÁÒ À Ò ¹ÏÖ Ô¸ Ø × Ô × Þ Ø ÑÔÓÖØ Ò
Ó
ÓÑÔÓ× Ø ÓÒ Ò ×Ô
Ø
Ó º
× ÓÒ × Ñ Ý Ø ÛÖ Ô ×Ø Ø Ñ Òظ Ö Ø Ö Ø Ò Ø Ì Ö × Ò Ö
ÒØ ×ÙÖ Ó ÒØ Ö ×Ø Ò Ö Ò Ø
ÛÖ ÔÔ Ö ¬Ò Ø ÓÒº ÛÖ Ô ×Ø Ø Ñ ÒØ ÔÔÐ × ÛÖ ÔÔ Ö ØÓ Ô ØÛ Ò
Ð ××¹ Ò ÔÖÓØÓØÝÔ ¹ × Ò Ö Ø Ò
ÑÓ ¹
Ô ÖØ
ÙÐ Ö Ñ Ø Ó ¸ Ò
Ò
Ú ¬Ò Ö¹ Ö Ò
ÓÒØÖÓÐ Ð× ¸ ¾¾℄º Ä Ø ÝÒ Ñ
×Ô
Ø ×Ý×Ø Ñ× ×
Ö ÓÚ ¸
Ø ÖÓÙ Ø Ù× Ó
ÓÒ Ø ÓÒ Ð ÛÖ ÔÔ Ö׺ Ò ÐÐݸ Ó Ò ÔÓ ÒØ Ø × Ñ
Ò ×Ñ× ÐÐÓÛ Ñ Ø Ó × ØÓ ÓÚ ÖÖ Ò ÓÒ Ô Ö¹
× Ò ØÓÖ× Ñ Ý Ò
ÐÙ Û Ð
Ö ×º Ø
ÙÐ Ö Ò×Ø Ò
º À Ò ¹ÏÖ Ô × × Ñ Ð Ö ØÓ Ø
ÓÑÔÓÙÒ
À Ò ¹ÏÖ Ô Ó × ÒÓØ ÐÐÓÛ Ó Ò¹ÔÓ ÒØ× ØÓ ×Ô
¬ Ö Ö Ò
ÑÓ Ð ¾¾℄ Ò Ø Ø ÓØ ÐÐÓÛ Â Ú Ñ Ø Ó ³× ¹
Ø ÖÓÙ Û Ð
Ö ×º ÁØ × ÙÒ
Ð Ö ÓÛ Û Ð
Ö × × ÓÙÐ ÛÓÖ Ú ÓÖ ØÓ
Ò Ø Ø ×Ø Ø Ñ ÒØ Ð Ú Ð¸ Ö Ø Ö Ø Ò
Ò À Ò ¹ÏÖ Ôº Ë ÓÙÐ Û Ð
Ö Ñ Ø
Ò Ô Ö ÓÖÑ Ø ÖÓÙ ÜØ ÖÒ Ð ×Ô
Ø
Ð Ö Ø ÓÒ׺
×Ø Ø
ÐÐÝ ÓÖ ÝÒ Ñ
ÐÐÝ Ë ÓÙÐ Û Ð
Ö × ÔÐ
Ö ×ØÖ
¹ Ú Ø Ðº ½ ℄ ÑÔÐ Ñ ÒØ ÝÒ Ñ
Ú
Ò Ò Ò ×¹
Ø ÓÒ× ÓÒ Ù× Ö¹ ¬Ò
Ð ××ÐÓ Ö× Ë ÓÙÐ Û Ð
Ö × ÐÓ Ô
غ À Ò ¹ÏÖ Ô ÓÐÐÓÛ× × Ñ Ð Ö Ö
Ø
ØÙÖ ¸ Ò Û
Ð ×× × ÖÐݸ × Ø
ÙÖÖ ÒØ wrap ×Ø Ø Ñ ÒØ Ó ×¸ ÓÖ Ð Þ ÐÝ ÓÓ × Ö ØÓ Ñ Ø Ó Ø
ÓÑÔ Ð Ø Ñ ¸ Ò ÛÖ ÔÔ Ö×
À Ò ¹ÏÖ Ô³× ÔÔÖÓ
ØÓ Ú
Ö Ù× × ÑÓÖ Ü Ð Ö ¬Ò ÓÒ Ø × ÓÓ × Ø ÖÙÒØ Ñ º ÀÓÛ Ú Ö¸ À Ò ¹
Ø Ò ×Ô
ØÂ³× ×ØÖ
Ø ÔÓ ÒØ
ÙØ× Ò × Ú Ö Ð Û Ý׺ Ö×ظ ÐÐ ÏÖ Ô « Ö× Ò Ø Ø ÓÓ × Ö ÔÔÐ ØÓ ÐÐ Ñ Ø Ó ×¸ Ö Ø Ö
ÛÖ ÔÔ Ö× Ö Ö Ù× Ð ¸ Ö Ø Ö Ø Ò ÓÒÐÝ Ø Ó×
Ó Ò Ø Ò ×Ô
¬
× Ø Ó Ñ Ø Ó × ¬Ò Ý ÔÓ ÒØ
Ùغ À Ò ¹
Ô ÖØ
ÙÐ Ö ×ØÝÐ º À Ò Ò Ö Ò ÍÒÐ Ò ½ ℄ ×
Ö ×Ý×¹ ÏÖ Ô Ð×Ó Ù× × ÑÓÖ Æ
ÒØ ÑÔÐ Ñ ÒØ Ø ÓÒ¸ × Ò
Ø Ö
Ø Ñ Ø
ÙØ
ÙÑ Ö×ÓÑ Ø
Ò ÕÙ ÓÖ
Ú Ò Ö Ù× Ò ×¹ Ö ÒÓ Â Ú Ö
Ø ÓÒ
ÐÐ× ÓÒ Ø
Ö Ø
Ð Ô Ø ¸ Ò Ñ Ø Ó
Ô
غ Ë
ÓÒ ¸ Ö¹ÓÖ Ö ÛÖ ÔÔ Ö× ×Ù
× makePerIn- Ö ÙÑ ÒØ× Ö ÒÓØ ÐÛ Ý× Ô ×× Ò ÖÖ Ý׺
stance() Ò makeConditionalWrapper()
Ò ¹  ¾¿℄ ÐÐÓÛ× Â Ú Ñ Ø Ó × ØÓ ÝÒ Ñ
ÐÐÝ ÛÖ ÔÔ
¬Ò Ò Ø À Ò ¹ÏÖ Ô Ð Ò Ù ¸ Ö Ø Ö Ø Ò ÔÖÓÚ × Ò ÙÒÛÖ ÔÔ Ø ÖÓÙ
Ð ××ÐÓ Ö Ø Ø Ô Ö ÓÖÑ× ÝØ ¹
ÔÖ Ñ Ø Ú ×º Í× Ö¹ ¬Ò ÛÖ ÔÔ Ö×
Ò ÑÔÐ Ñ ÒØ ØÙÖ ×
Ó Ö ÛÖ Ø Ò º Â Ò
ÐÙ × ÒÙÑ Ö Ó ØÙÖ × Ø Ø
Ó Ó Ò ÔÓ ÒØ × Ò ØÓÖ׺ ÓÖ Ò×Ø Ò
¸ cflow³× ÙÒ
Ø ÓÒ Ð¹ À Ò ¹ÏÖ Ô Ð
׸ ×Ù
× Ø Ð ØÝ ØÓ Ö ÑÓÚ ÛÖ ÔÔ Ö×
ØÝ
ÓÙÐ ÑÔÐ Ñ ÒØ × ÐÝ Ò Æ
ÒØÐݸ Ò within Ò Ø Ð ØÝ ØÓ
ÓÓ× Ø ÓÖ Ö Ò Û
ÛÖ ÔÔ Ö× Ü¹
×
ÖØ ÒÐÝ ÑÔÐ Ñ ÒØ Ð º Ì × ÓÔ Ö Ø ÓÒ× ÔÖÓÚ Ø
ÙØ ÓÒ Ô ÖØ
ÙÐ Ö Ñ Ø Ó
Ðк ÀÓÛ Ú Ö¸ Ð Ú ³×
Ù Ð Ò ÐÓ
× ÓÖ ÓØ Ö× ×Ù
× this Ò withincodeº ×Ý×Ø Ñ¸  ³× ÑÔÐ Ñ ÒØ Ø ÓÒ Ö Ð × Ú ÐÝ ÓÒ Â Ú ³× Ö ¹
Ò ÐÐݸ Ö¹ÓÖ Ö ÛÖ ÔÔ Ö× ¬ÐÐ Ø ÖÓÐ × Ó ÓØ ÔÓ ÒØ
ÙØ
Ø ÓÒ ÈÁ Ò ÔÔ Ö× Ð ×× Æ
ÒØ Ø Ò À Ò ¹ÏÖ Ôº
× Ò ØÓÖ× Ò Ø ×Ô
Ø Ò×Ø ÒØ Ø ÓÒ
Ð Ù× pertargetº ÍÒÐ Â ¸ À Ò ¹ÏÖ Ô ÜØ Ò × Ø Â Ú Ð Ò Ù ÛØ
ÄÇË ¾ ℄³× :around Ñ Ø Ó ÕÙ Ð ¬ Ö ÐÐÓÛ×
Ó ØÓ Ò Û ÜÔÖ ×× ÓÒ¸ ×Ø Ø Ñ Òظ Ò
Ð Ö Ø ÓÒ ÓÖÑ׺ Ì × Ü¹
ÛÖ ÔÔ ÖÓÙÒ ÐÐ ÒÚÓ
Ø ÓÒ× Ó Ò Ö
ÙÒ
Ø ÓÒº Ø Ò× ÓÒ× Ñ À Ò ¹ÏÖ Ô × Ö ØÓ Ù× Ò ØÛÓ Û Ý׺ Ö×ظ
Ô
ØÂ³× around Ú
Ò À Ò ¹ÏÖ Ô³× ÛÖ ÔÔ Ö× × ÖÚ À Ò ¹ÏÖ Ô Ô Ö ÓÖÑ× Ð Ñ Ø ×Ø Ø
ØÝÔ
Ò ¸ Û Ö ×
× Ñ Ð Ö ÖÓÐ º ÏÖ ÔÔ Ö× « Ö ÖÓÑ ÖÓÙÒ Ñ Ø Ó × Ò ØÛÓ Â
ÒÒÓØ ×Ø Ø
ÐÐÝ Ú Ö Ý Ø Ø
Ð ×× Ò Ñ Ø Ó Ò Ñ ×
Ý Û Ý׺ Ö×ظ ÛÖ ÔÔ Ö ÔÔÐ × ØÓ Ò Ò Ú Ù Ð Ñ Ø Ó Ö Ú Ð º Ë
ÓÒ ¸ À Ò ¹ÏÖ Ô³× ¬Ö×Ø
Ð ×× ÒÓØ ÓÒ Ó ÔÖÓ
¹
¬Ò Ø ÓÒ Ö Ø Ö Ø Ò Ò Ö
ÙÒ
Ø ÓÒº Ë
ÓÒ ¸ Ø ÓÖ¹ ÙÖ × Ò ÛÖ ÔÔ Ö׸ ÐÓÒ Û Ø Ø apply ÓÔ Ö ØÓÖ¸ ÔÖÓÚ
Ö Ò Û
ÛÖ ÔÔ Ö× Ü
ÙØ × Ø ÖÑ Ò Ý Ø ÓÖ Ö Ò × × ÓÖ ÛÖ Ø Ò
ÓÑÔÓ× Ð ÛÖ ÔÔ Ö׺
Û
Ø Ý Ö ÔÔÐ ØÓ Ñ Ø Ó ¸ Ö Ø Ö Ø Ò Ø ØÝÔ × Ó
Ø Ðº ½ ℄ ÔÖÓÔÓ× ×Ý×Ø Ñ Ò Û
ÛÖ ÔÔ Ò
Ó
ØÙ Ð Ö ÙÑ ÒØ׺ × Ô ÖÚ × Ú º
ÓÑÔÓÒ ÒØ ÜÔÓÖØ× × Ø Ó Ì Ä Ò Ò ×
ÇØ Ö ×Ô
Ø ×Ý×Ø Ñ× ×Ù
× ËÇ » ÍÈ ½ ℄ Ò ×¹ Ø Ø Ö Ò ØÙÖ Ð ØÓ Ø× ÑÔÐ Ñ ÒØ Ø ÓÒ¸ Ò Ø
Ð ÒØ ÛÖ Ô×
Ô
ØÙ Ð ÓÑÔÓÒ ÒØ× ½ ℄ Ö ×× Ø Ò ÓÖ × Ô Ö Ø
Óѹ Ø ×
ÓÑÑ Ò × Ò ÇÌ Ä
Ð ×× × Ø Ø ÔÖÓÚ Ò ÒØ Ö¹
Ô Ð Ø ÓÒ Ò
ÓÑÔÓÒ ÒØ
ÓÒØ Üغ ÐØ ÓÙ Ø × ×Ý×Ø Ñ×
Ò ØÙÖ Ð ØÓ Ø
Ð Òغ ÇÌ Ä³× Ñ Ø Ó
Ø ÔÖÓØÓ
ÓÐ
×ÙÔÔÓÖØ ÝÒ Ñ
×Ô
Ø Û Ú Ò ¸ Ø Ý Ó ÒÓØ ØÖ Ø ×Ô
Ø× ÐÐÓÛ× ÛÖ ÔÔ Ö
Ð ×× × ØÓ × ÐÝ ÜÔÖ ×× Ö ×ØÖ
Ø ÓÒ× Ò
ÓÒ¹
Ø ¬Ö×ع
Ð ×× Â Ú ÒØ Ø × Ò
¸ Ø Ý Ó ÒÓØ ÔÖÓÚ Ø Ú ÒØ ÓÒ× Ò
ÓÑÔÓÒ ÒØ³× ÜÔÓÖØ ÒØ Ö
º ÇÌ Ä Ð×Ó
Ø ÓÒ Ð Ö Ù× Ñ
Ò ×Ñ× ÓÙÒ Ò À Ò ¹ÏÖ Ôº ÓØ ×ÙÔÔÓÖØ× ØÖ Ò×Ô Ö ÒØ Ñ Ø Ó ÛÖ ÔÔ Ò Ø ÖÓÙ Ñ
¹
×Ý×Ø Ñ× Ó ×ÙÔÔÓÖØ Û Ð
Ö ×¸ Ò ÔÓ ÒØ
ÙØ× Ö Ø ÔÖ ¹ Ò ×Ñ
ÐÐ Ô Ö¹Ó
Ø Ñ Ü Ò׺ Ì × Ñ
Ò ×Ñ ÐÐÓÛ× Ò
Ñ ÖÝ Ø ÖÙ×Ø Ó ×Ô
ØÙ Ð ÓÑÔÓÒ ÒØ׺ ×Ô
ØÙ Ð ÓÑÔÓ¹ ÑÔÓÖØ
ÓÑÔÓÒ ÒØ³× Ú ÓÖ ØÓ ÙÖØ Ö
Ù×ØÓÑ Þ º
9. Ï Ð ÒÙÑ Ö Ó ÔÓÛ Ö ÙÐ Ñ
ÖÓ ×Ý×Ø Ñ׸
ÓÑÔ Ð ¹Ø Ñ ℄ º ØÓÖݸ º ÄÓ ×Ó¸ Ò º ËÑ Ö ×º ÂÌË ÌÓÓÐ×
Ñ Ø ÔÖÓ Ö ÑÑ Ò ÜØ Ò× ÓÒ׸ Ò ÔÖ ÔÖÓ
××ÓÖ ØÓÓÐ Ø× ½¸ ÓÖ ÑÔÐ Ñ ÒØ Ò ÓÑ Ò¹×Ô
¬
Ð Ò Ù ×º ÁÒ Ø
¸ ¸ ¾ ℄ Ö Ú Ð Ð ÓÖ Â Ú ¸ Û Ð Ú Ø Ø Å Ý × ×Ø ÁÒØ ÖÒ Ø ÓÒ Ð ÓÒ Ö Ò
ÓÒ ËÓ ØÛ Ö Ê Ù× ¸ ½ º
×Ù Ø ÓÖ ÑÔÐ Ñ ÒØ Ò Ð Ò Ù ÜØ Ò× ÓÒ ×Ù
× À Ò ¹ ℄ ú ÓÐÐ Öغ ÇÒ Û Ú Ò ×Ô
Ø׺ ÁÒ ÇÇÈ ÏÓÖ × ÓÔ
ÏÖ Ôº Ö×ظ À Ò ¹ÏÖ Ô ÜØ Ò × Â Ú ³×
ÓÒ
Ö Ø ×ÝÒØ Ü Ò ÓÒ ×Ô
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ¸ ½ º
Û Ý× Ø Ø
Ò³Ø ÜÔÖ ×× Ý × ÑÔÐ Ñ
ÖÓ ×Ý×Ø Ñ× ×Ù
℄ Ⱥ ÓØ Ò Öº à Û
ÓÑÔ Ð Ò ÝÒ Ñ
Ð Ò Ù × ØÓ
× ÂË ½℄ Ò
ÓÑÔ Ð ¹Ø Ñ ÅÇÈ× ×Ù
× ÇÔ ÒÂ Ú ¾ ℄ Ø Â Ú Îź ÁÒ ÈÖÓ
Ò × Ó Ø ÍË ÆÁ Ì
Ò
Ð
Ò ÄÁ ℄º Ë
ÓÒ ¸ À Ò ¹ÏÖ Ô Ù× × ×Ø Ø
ØÝÔ Ò ÓÖ¹ ÓÒ Ö Ò
¸ Ê ÆÁ ÌÖ
¸ Æ Û ÇÖÐ Ò׸ Ä ¸ ÂÙÒº
Ñ Ø ÓÒ Ø Ø × ÒÓØ Ú Ð Ð Ò ÔÙÖ ÐÝ ×ÝÒØ
Ø
×Ý×Ø Ñ× ×Ù
½ º ÍË ÆÁ ××Ó
Ø ÓÒº
× ÂË Ò ÂÌË ℄º Ò ÐÐݸ Å Ý ÐÐÓÛ× ÓÚ ÖÐÓ Ò Ó ×ÝÒ¹ ℄ º Ö
¸ ź Ç Ö× Ý¸ º ËØÓÙØ Ñ Ö ¸ Ò
Ø Ü × ÓÒ Ö ØÖ ÖÝ ×Ø Ø
ØÝÔ × Ò Ó × ÒÓØ Ö ÕÙ Ö Ø Èº Ï Ð Öº Å Ò Ø ÙØÙÖ × ÓÖ Ø Ô ×Ø
× ¹Ð Ú Ð ÔÖÓ Ö Ñ ØÓ ÜÔÐ
ØÐÝ Ö Ö ØÓ Ñ Ø ÔÖÓ Ö Ñ׺ ÁÒ Ò Ò Ö
ØÝ ØÓ Ø Â Ú ÔÖÓ Ö ÑÑ Ò Ð Ò Ù º
ÓÒØÖ ×ظ ÇÔ ÒÂ Ú ÓÒÐÝ ÐÐÓÛ× ×ÝÒØ Ü ÓÚ ÖÐÓ Ò × ÓÒ ÁÒ ÈÖÓ
Ò × Ó Ø ÓÒ Ö Ò
ÓÒ Ç
عÇÖ ÒØ
Ð ×× × Ø Ø ÜÔÐ
ØÐÝ Ò×Ø ÒØ Ø Ñ Ø
Ð ×׺ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ Ä Ò Ù ×¸ Ò ÔÔÐ
Ø ÓÒ׸
Î Ò
ÓÙÚ Ö¸ Ç
ØÓ Ö ½ º ź
6. CONCLUSIONS ℄ º ÖÝ Òظ º ØØÓÒ¸ ú º ÎÓÐ Ö¸ Ò º º
À Ò ¹ÏÖ Ô × Ò ÜØ Ò× ÓÒ ØÓ Â Ú Ø Ø ×ÙÔÔÓÖØ× ÝÒ Ñ
ÅÙÖÔ Ýº ÜÔÐ
Ø ÔÖÓ Ö ÑÑ Ò º ÁÒ ÈÖÓ
Ò × Ó Ø
×Ô
Ø Û Ú Ò º À Ò ¹ÏÖ Ô³× ÝÒ Ñ
Ò ØÙÖ ÐÐÓÛ× ÛÖ Ô¹ Ö×Ø ÁÒØ ÖÒ Ø ÓÒ Ð ÓÒ Ö Ò
ÓÒ ×Ô
عÇÖ ÒØ
Ô Ö× ØÓ ¬Ò
ÓÑÔÓ× Ø ÓÒ ÐÐݺ ÁÒ Ø ÓÒ¸ ÛÖ ÔÔ Ö× ËÓ ØÛ Ö Ú ÐÓÔÑ Òظ ÔÖº ¾¼¼¾º
Ö Ö Ù× Ð
Ù× Ø Ý
Ò ¬Ò ÐÓ
ÐÐݸ Ò
Ò ℄ ź Ù
Ò Ïº Ï
º Ò Ö
ÛÖ ÔÔ Ö׺ ÁÒ
¬Ò Û Ø ÜÔÐ
Ø
ÓÒ×ØÖÙ
ØÓÖ Ô Ö Ñ Ø Ö׺ Ò ÐÐݸ ÈÖÓ
Ò × Ó Ø ÙÖÓÔ Ò ÓÒ Ö Ò
ÓÒ
À Ò ¹ÏÖ Ô Ò
ÐÙ × Ò ÜÔÖ ×× Ú Ð Ö ÖÝ Ó Ò Ö
ÛÖ Ô¹ Ç
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ¸ Ô × ¾¼½ß¾¾ ¸ ¾¼¼¼º
Ô Ö׺ Ò ÑÔÐ Ñ ÒØ Ø ÓÒ Ó À Ò ¹ÏÖ Ô × Ú Ð Ð Ø ½¼℄ º Ð ØÓÒ¸ º Ä Ú Ò׸ º Ñ Ö׸ Ò
http://www.cs.utah.edu/˜jbaker/mayaº À Ò ¹ÏÖ Ô Ìº Å ÐÐ×Ø Òº ÅÙÐØ Â Ú ÅÓ ÙÐ Ö ÓÔ Ò
Ð ×× × Ò
Ú × Æ
Ò
Ý ÓÒ ×Ø Ò Ö ÂÎÅ× Ø ÖÓÙ Ø Ù× Ó ×ÝÑÑ ØÖ
ÑÙÐØ ÔÐ ×Ô Ø
ÓÖ Â Ú º ÁÒ ÈÖÓ
Ò ×
Ö ÙÐÐÝ
Ó× Ò Ø ×ØÖÙ
ØÙÖ × Ò Ð Ñ Ø Ù× Ó Ø Â Ú Ó Ø ÓÒ Ö Ò
ÓÒ Ç
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò
Ö
Ø ÓÒ ÈÁº ËÝ×Ø Ñ׸ Ä Ò Ù ×¸ Ò ÔÔÐ
Ø ÓÒ× ³¼¼¸ Ô ×
Ì × Ô Ô Ö Ó
Ù× ÓÒ Ñ Ø Ó ÛÖ ÔÔ Ò Ò À Ò ¹ÏÖ Ôº ½¿¼ß½ ¸ Å ÒÒ ÔÓР׸ ÅƸ Ç
غ ¾¼¼¼º
ËÓÑ Ó À Ò ¹Ï Ö³× Ð Ö ÖÝ ÛÖ ÔÔ Ö× ¬ÐÐ Ø ÖÓÐ Ó Ð Ò¹ ½½℄ ú Þ ÖÒ
º ÝÒ Ñ
ÓÓк http://www.prakinf.
Ù
ÓÒ×ØÖÙ
Ø× ×Ù
× ×Ô
ØÂ Ó Ò ÔÓ ÒØ × Ò ØÓÖ׺ tu-ilmenau.de/˜czarn/aop/sources.tar.gzº
ÇØ Ö ØÙÖ × Ó ×Ô
عÓÖ ÒØ Ð Ò Ù ×¸ ×Ù
× ÒØÖÓ¹ ½¾℄ ú Þ ÖÒ
Ò Íº × Ò
Öº Ò Ö Ø Ú
Ù
Ø ÓÒ× Ò Û Ð
Ö ×¸ Ö ÒÓØ ×ÙÔÔÓÖØ Ý À Ò ¹ÏÖ Ôº ÈÖÓ Ö ÑÑ Ò Å Ø Ó ×¸ Ì
Ò Õ٠׸ Ò ÔÔÐ
Ø ÓÒ׸
Ï ÒÓØ Ø Ø Å Ý ¸ Ø Ð Ò Ù ÓÒ ØÓÔ Ó Û
À Ò ¹
ÔØ Ö º ×ÓÒ¹Ï ×Рݸ ½ º
ÏÖ Ô × Ù Ðظ
Ò ×ÙÔÔÓÖØ Ñ Ø Ó ÒØÖÓ Ù
Ø ÓÒ× Ø ÖÓÙ ½¿℄ ź Ѻ Ì ÝØ
Ó Ò Ò Ö Ò Ð Ö Öݺ
Ò ÑÔÐ Ñ ÒØ Ø ÓÒ ¾¸ ¿℄ Ó Ø ÅÙÐØ Â Ú Ð Ò Ù ÜØ Ò¹ http://bcel.sourceforge.netº
× ÓÒ ½¼℄¸ Û
ÐÐÓÛ× ÜØ ÖÒ ÐÐÝ ¬Ò Ñ Ø Ó × ØÓ Ò¹ ½ ℄ Ⱥ¹ º Ú ¸ ̺ Ä ÓÙܸ Ò Æº ƺ ź
ØÖÓ Ù
ÒØÓ
Ð ×× ×º ÓÙÖ Õ ¹Ë Ò º ÌÛÓ¹×Ø Ô Û Ú Ò Û Ø Ö
Ø ÓÒ
Ù× Ò ×Ô
غ ÁÒ ÇÇÈËÄ ÏÓÖ × ÓÔ ÓÒ Ú Ò
7. ACKNOWLEDGEMENTS Ë Ô Ö Ø ÓÒ Ó ÓÒ
ÖÒ× Ò Ç
عÇÖ ÒØ ËÝ×Ø Ñ׸
Ç
غ ¾¼¼½º
Ï Ø Ò Ö
¸ Ð ×Ø Ö Ê ¸ ÂÓ Ò Ê Ö¸ Ë Ò Å
¹
ÖÑ ¸ Ò Ø ÒÓÒÝÑÓÙ× Ö Ú Û Ö× ÓÖ Ø Ö
ÓÑÑ ÒØ× ½ ℄ ź Ð Øظ ˺ ÃÖ × Ò ÑÙÖØ ¸ Ò Åº ÐÐ × Òº Ð ×× ×
Ò ×Ù ×Ø ÓÒ׺ Ì × Ö × Ö
Û × ×ÙÔÔÓÖØ ÝØ ¹ Ò Ñ Ü Ò׺ ÁÒ ÈÖÓ
Ò × Ó Ø ¾ Ø Å
Ò× Ú Ò
Ê × Ö
ÈÖÓ
Ø× Ò
Ý Ò Ø Ö ÓÖ
ËÁ ÈÄ Æ¹ËÁ Ì ×ÝÑÔÓ× ÙÑ ÓÒ ÈÖ Ò
ÔÐ × Ó
Ê × Ö
Ä ÓÖ ØÓÖÝ ÙÒ Ö Ö Ñ ÒØ ÒÙÑ Ö ¿¿ ½ ß¼¼ß ÈÖÓ Ö ÑÑ Ò Ä Ò Ù ×¸ Ô × ½ ½ß½ ¿¸ ½ º
ß½ Ò Æ Ø ÓÒ Ð Ë
Ò
ÓÙÒ Ø ÓÒ Ê Ê Û Ö ¸ ½ ℄ ź Ó
¸ º Æ ÙÑ ÒÒ¸ Ò Íº ÙÒº × Ò Ò
Êß ½½ º Ì ÍºËº ÓÚ ÖÒÑ ÒØ × ÙØ ÓÖ Þ ØÓ Ö ¹ ÑÔÐ Ñ Ò Ø ÓÒ
ÓÒ×ØÖÙ
Ø× ÓÖ Ø Ú ÐÓÔÑ ÒØ Ó
ÔÖÓ Ù
Ò ×ØÖ ÙØ Ö ÔÖ ÒØ× ÓÖ ÓÚ ÖÒÑ ÒØ Ð ÔÙÖÔÓ× × Ü Ð ¸
ÓÑÔÓÒ ÒعÓÖ ÒØ ×Ó ØÛ Ö Ö
Ø
ØÙÖ ×º ÁÒ
ÒÓØÛ Ø ×Ø Ò Ò ÒÝ
ÓÔÝÖ Ø ÒÒÓØ Ø ÓÒ Ö ÓÒº ÈÖÓ
Ò × Ó Ø Ë
ÓÒ ÁÒØ ÖÒ Ø ÓÒ Ð ËÝÑÔÓ× ÙÑ ÓÒ
Ò Ö Ø Ú Ò ÓÑÔÓÒ Òع × ËÓ ØÛ Ö
Ò Ò Ö Ò ¸ Ô × ½½ ß½¾ ¸ ¾¼¼¼º
8. REFERENCES ½ ℄ ˺ À Ò Ò Ö Ò Êº ÍÒÐ Ò º Í× Ò Ò Ö Ù× Ò
½℄ º
Ö
Ò Ãº ÈÐ Ý ÓÖ º Ì Â Ú ×ÝÒØ
Ø
×Ô
Ø× Ò ×Ô
غ ÁÒ ÇÇÈËÄ ÏÓÖ × ÓÔ ÓÒ
ÜØ Ò Ö ´ÂË µº ÁÒ ÈÖÓ
Ò × Ó Ø ÓÒ Ö Ò
ÓÒ Ú Ò
Ë Ô Ö Ø ÓÒ Ó ÓÒ
ÖÒ× Ò Ç
عÇÖ ÒØ
Ç
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ Ä Ò Ù ×¸ ËÝ×Ø Ñ׸ Ç
غ ¾¼¼½º
Ò ÔÔÐ
Ø ÓÒ׸ Ç
غ ¾¼¼½º ½ ℄ ƺ º ÀÓ º ÝÒ Ñ
×Ô
Ø× Ò ËÇ » ÍȺ
¾℄ º Öº Å
ÖÓ× Ø Ø ÔÐ Ý Å Ö Ø Ò ÖÓÑ Â Ú ØÓ Ì
Ò
Ð Ê ÔÓÖØ »¼ ¸ ÖÐ × ÍÒ Ú Ö× Øݸ ÈÖ Ù ¸
Å Ý º Å ×Ø Ö³× Ø × ×¸ ÍÒ Ú Ö× ØÝ Ó ÍØ ¸
Ñ Ö ÂÙÒº ½ º
¾¼¼½º ½ ℄ ú Ä Ö ÖÖ¸ º ÄÓÖ ÒÞ¸ Ò Åº Å Þ Ò º
¿℄ º Ö Ò Ïº À× º Å Ý ÅÙÐØ ÔÐ ¹ ×Ô Ø
ÈÖÓ Ö ÑÑ Ò Û Ø ×Ô
ØÙ Ð
ÓÑÔÓÒ ÒØ׺ Ì
Ò
Ð
×ÝÒØ Ü ÜØ Ò× ÓÒ Ò Â Ú º ÌÓ ÔÔ Ö Ò ÈÖÓ
Ò × Ó Ê ÔÓÖØ Æ͹ ˹ ¹¼½¸ ÆÓÖØ ×Ø ÖÒ ÍÒ Ú Ö× Øݸ ÔÖº
Ø ÓÒ Ö Ò
ÓÒ ÈÖÓ Ö ÑÑ Ò Ä Ò Ù × Ò Ò ½ º
ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ ÂÙÒº
10. ¾¼℄ º Ⱥ ÄÙÒ Ùº Ö
Ø Ú Ö
Ø
ØÙÖ ÓÖ ÔÖÓ
×× ¾ ℄ º ËØ Ð ÂÖº ÓÑÑÓÒ Ä ×Ô¸ Ø Ä Ò Ù º Ø Ð
ÓÒØÖÓÐ ÔÔÐ
Ø ÓÒ׺ ÁÒ ÈÖÓ
Ò × Ó Ø ÙÖÓÔ Ò ÈÖ ×׸ ×
ÓÒ Ø ÓÒ¸ ½ ¼º
ÓÒ Ö Ò
ÓÒ Ç
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ¸ ½ º ¾ ℄ ź Ì Ø×Ù ÓÖ ¸ ˺ ¸ ź à ÐÐ Ò¸ Ò Ãº ÁØ ÒÓº
¾½℄ Ⱥ Æ Ñ Ý Öº Ò× ÐÐ Ð ØÛ Ø ×
Ö ÔØ Ò ÓÖ Ê
Ø ÓÒ Ò ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ÚÓÐÙÑ ½ ¾ Ó
Â Ú º http://www.beanshell.org/º Ä
ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë
Ò
¸
ÔØ Ö
¾¾℄ ú Ç×Ø ÖÑ ÒÒ Ò Åº Å Þ Ò º Ç
عÓÖ ÒØ ÇÔ Ò Ú
Ð ××¹ × Ñ
ÖÓ ×Ý×Ø Ñ ÓÖ Â Ú º
ÓÑÔÓ× Ø ÓÒ ÙÒØ Ò Ð º ÁÒ ÈÖÓ
Ò × Ó Ø ËÔÖ Ò Ö Î ÖÐ ¸ ¾¼¼¼º
ÓÒ Ö Ò
ÓÒ Ç
عÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ ¾ ℄ ÖÓܺ Ì ×Ô
ØÂ ÔÖÓ Ö ÑÑ Ò Ù º http:
Ä Ò Ù ×¸ Ò ÔÔÐ
Ø ÓÒ׸ Ç
غ ¾¼¼½º //www.aspectj.org/doc/dist/progguide/º
¾¿℄ ʺ È ÛÐ ¸ ĺ Ë ÒØÙÖ Ö¸ ĺ Ù
Ò¸ Ò º ÐÓÖ Òº
Â Ü Ð ×ÓÐÙØ ÓÒ ÓÖ ×Ô
عÓÖ ÒØ
ÔÖÓ Ö ÑÑ Ò Ò Â Ú º ÁÒ Ê
Ø ÓÒ ¾¼¼½¸ Ô × ½ß¾ ¸
¾¼¼½º ÄÆ Ë ¾½ ¾º