Runtime aspect weaving through metaprogramming
Upcoming SlideShare
Loading in...5
×
 

Runtime aspect weaving through metaprogramming

on

  • 223 views

 

Statistics

Views

Total Views
223
Views on SlideShare
223
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Runtime aspect weaving through metaprogramming Runtime aspect weaving through metaprogramming Document Transcript

  • 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.eduABSTRACT Ð ×× ×¸ ÛÖ ÔÔ Ö× Ò ¬Ò Û Ø Ò Ð ×× Ð Ö Ø ÓÒ×Ï ×Ö Ò ÜØ Ò× ÓÒ ØÓ Ø Â Ú Ð Ò Ù ¸ À Ò ¹ÏÖ Ô¸ ÓÖ Ñ Ø Ó Ó ×º Ï Ú Ò × ÓÑÔÐ × Ø ÖÓÙ 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 arenot 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 NetherlandsCopyright 2002 ACM 1-58113-469-X/02/0004 ...°5.00. ¯ Å Ø Ó × Ò ÒÓÒÝÑÓÙ× Ð ×× × Ò ÛÖ ÔÔ º
  • ¯ ×Ô Ø Ò ÓÑÔÓÒ ÒØ Ó ÑÝ ÓÑÔ Ð ×Ô ¹ Ñ Ø Ó Ñ Ý ¸ ÙØ Ò × ÒÓØ ÐÛ Ý× Ò ¬ к Ö Ø Ðݺ Ú Ò Ù× ØÓ ¬Ò ÓÙØ Û Ö × Ö Ò ¸ Ò ØÓ ÑÔÐ Ñ ÒØ Ò º Ë Ô Ö Ø Ò Ø Ñ ÑÓ Þ Ø ÓÒ Ó Ì Ö ×Ø Ó Ø × Ô Ô Ö × ÓÖ Ò Þ × ÓÐÐÓÛ׺ Ë Ø ÓÒ ¾ Ò¹ Ú ÐÙ ÖÓÑ Ø× ÓÑÔÙØ Ø ÓÒ Ý Ð × ÓÒÖ Ø Ò ¬Ø׺ ÓÖØÖÓ Ù × À Ò ¹ÏÖ Ô ØÙÖ × Ø ÖÓÙ × Ö × Ó Ü ÑÔР׺ Ò×Ø Ò ¸ × Ñ Ý ÛÓÚ Ò ÒØÓ ÓØ ¹Ð Ú Ð Ñ Ø ÓË Ø ÓÒ ¿ ÔÖÓÚ × Ò ÓÚ ÖÚ Û Ó À Ò ¹ÏÖ Ô³× ÙÖÖ ÒØ Ñ¹ Ò Ñ Ø Ó Ø ÐÐ׺ ×Ô Ø¹ÓÖ ÒØ ÔÖÓ Ö ÑÑ Ò ÐÐÓÛ×ÔÐ Ñ ÒØ Ø ÓÒº Ë Ø ÓÒ Ú ÐÙ Ø × Ø Ó×Ø Ó À Ò ¹ÏÖ Ô³× ÓÒ ØÓ × ÐÝ Ö Ú ÐÙ Ø Ø ÙØ Ð ØÝ Ó ¹Ð Ú Ð ØÖ­ Ü Ð Øݺ Ë Ø ÓÒ ×Ö × Ö Ð Ø ÛÓÖ º Ò ÐÐݸ Ë ¹ ÐÓÛ Ö¹Ð Ú Ð × Ò ºØ ÓÒ ×ÙÑÑ Ö × ÓÙÖ ÓÒÐÙ× ÓÒ׺ ÇÒ × ÑÔÐ Ò Ñ ØÖ × ØÓ ÓÙÒØ Ø ØÓØ Ð ÒÙÑ Ö Ó Ñ Ø Ó ÒÚÓ Ø ÓÒ׸ Ò Ø ÒÙÑ Ö Ó ÒÚÓ Ø ÓÒ× Û Ø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³× ×× ÑÓ ¬ Ö× ØÓ ÓÛ ØÓ ÓÖÑ Ø Ø
  • 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[] ÓÒ ÒØÖݸ Ò ÙÒÔ Û Ò Ø ÙÒ ÖÐÝ Ò Ñ Ø Ó × ÐÐ º Ì ÓÚ Ó × ÓÛ× ÓÛ ÓÒ ÖÒ× Ò ×Ô Ö Ø Ú Ö¹
  • 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-
  • 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 Ò ×Ø׸ Ù× ÐÓ Ð Ð ×× × Ö Ñ Ö ÐÝ Ù× ØÓ Û Ú Ó Ø ÖÙÒØ Ñ º À Ò ¹ÏÖ Ô Ø ××ÝÒØ Ø ×Ù Öº Ñ Ð ÔÔÖÓ ÓÑÔ Ð ¹Ø Ñ Ö ­ Ø ÓÒ ´ Ò Ò ×ÓÑ × × À Ò ¹ÏÖ Ô Ð×Ó ÐÐÓÛ× Ñ Ø Ó × Ò ÒÓÒÝÑÓÙ× Ð ×× × ØÓ ÝØ Ó Ö ÛÖ Ø Ò µ × Ù× ØÓ Ò× ÖØ Ñ Ò Ñ Ð ÓÓ × Ø Ø ÛÖ ÔÔ ÐÐÓÛ ÝÒ Ñ ÛÖ ÔÔ Ò º
  • 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 ÛÖ Ô¹ØÝÔ × Øݺ Ô Ö × ÒÓ Ð ×× Æ ÒØ Ø Ò ÙÒÓÒ Ø ÓÒ Ð Ú Ò ×Ô Øº ÏÖ ÔÔ Ö Ð Ö Ø ÓÒ× Ñ Ý ÒÓØ ÓÒØ Ò Ø ÖÓÛ Ð Ù× ×º Ì × À Ò ¹ÏÖ Ô³× ×ÙÔÔÓÖØ ÓÖ Ú Ö Ð ÒÙÑ Ö Ó Ö ÙÑ ÒØ×
  • ÈÓÐ Ý ×Ô Ø À Ò ¹ÏÖ Ô Ù×ØÓÑ ¾Ò ÆØ ´½µ ÆÓ Ú º¾ ¿ º¿¼ º¿¼ º¿¼ Ë Ö ¼º ¼º ¼ ¼º ¼ ¼º ½ È Ö¹Ø Ö Ø ¼º ½¾ ¼º ¾ ¼º ¼º ËÔ ¬ Ø Ö Ø ¼º ½ ¼º ¼ ¼º ½ ¼º ÇÔØ Ñ Þ ÒÙÐÐ× ¼º Ì Ð ¾ Ë ÓÒ × ×Ô ÒØ Ü ÙØ Ò Ø Ò Ñ Ö Û Ø ÓÙØ Ö ØÓÖÝ Ü ×Ø Ò º ÈÓÐ Ý ×Ô Ø À Ò ¹ÏÖ Ô Ù×ØÓÑ ¾Ò ÆØ ´½µ ÆÓ Ú ¼º ¼º ¼º ¼º Ë Ö ¼º¾ ¾ ¼º¾ ¿ ¼º¾ ¿ ¼º¿½ È Ö¹Ø Ö Ø ¼º¿¼ ¼º¾ ¼º¿ ¼º ¼½ ËÔ ¬ Ø Ö Ø ¼º¾ ¼º¾ ½ ¼º¿ ¼º¿ ¾ ÇÔØ Ñ Þ ÒÙÐÐ× ¼º¾¿ Ì Ð ¿ Ë ÓÒ × ×Ô ÒØ Ü ÙØ Ò Ø Ò Ñ Ö Û Ø Ö ØÓÖÝ Ü ×Ø Ò º ÑÔÓ× × ÓÒ× Ö Ð Ó×غ × Ö CacheNth ÛÖ ÔÔ Ö Ò Ñ Ö ÇÖ Ò Ð Ê ØÖÓ¬ØØ ± Ó×ØÖÙÒ× ÖÓÙ ÐÝ ¼Ñ× ×ÐÓÛ Ö Ø Ò cache2nd ÛÖ ÔÔ Ö¸ ÓÖ ¾¼¼ ¼º¿ ¼º¿ ½º¼½¿± ÓÙØ º × Ô Ö Ðк ÅÙ Ó Ø × Ø Ñ × ×Ô ÒØ Ô Ò ¾¾ ÑØÖØ ½ º ¿ ½ º ½ ½ º¾ ±CacheNth³× Ö ÙÑ ÒØ× ÒØÓ Ò ÖÖ Ý¸ ÐÓÒ Ò Ø ÖÖ Ý ÓÖ ¾¼¾ ×× ½ º ¾ ½ º ¼½ ½ º½¼± ÐÐ× ØÓ Ø ÛÖ ÔÔ Ñ Ø Ó ¸ Ò ÙÒÔ Ò Ö ÙÑ ÒØ× ÖÓÑ ¾¼½ ÓÑÔÖ ×× ¼º ½º½¿½ ¾¼º ±Ø ÐÓÒ ÖÖ Ýº ¾¼ º¾½¿ º ½ ¹½º ¼ ± ×Ô ØÂ × Ø ¼Ñ× Ô Ö ÓÖÑ Ò Ø ÑÓÚ Ò ÖÓÑ ¾¾¾ ÑÔ Ù Ó ¿¾º¾ ¿ º½ ¾ º ¿± × Ö ØÓ Ô Ö¹Ø Ö Ø ×º Ì × Ñ × × Ò× ¸ × Ò ¾¾ ½ º ¼ ½ º ¿ º ¾¾±Ô Ö¹Ø Ö Ø Ò ÒÚÓÐÚ × ÓÔ Ö Ø ÓÒ× ÓÒ × ÓÒ × Ø ¹ ¾½¿ Ú ¿ º ½º¿ ½¾º¾ ± Ð º Ë Ñ Ð ÖÐÝ cache2nd Ø × ½½ Ñ× Øº Ì × Ò ØØÖ ÙØ ØÓ ÓØ Ø ÓÒ Ð × Ò Ò ÓÔ Ö Ø ÓÒ× ÓÒ Ö¹ Ì Ð Ë ÓÒ × ×Ô ÒØ Ò ËÔ ÂÎÅ Ò Ñ Ö ×¸ ÙÑ ÒØ ÖÖ Ý׺ Û Ø Ò Û Ø ÓÙØ À Ò ¹ÏÖ Ô ÔÖÓÐÓ Ù ×º Ï Ò Ò ×Ô ØÂ × ÛÓÚ Ò ÒØÓ ×Ô ¬ Ø Ö Ø¸ Ø× ÓÒ × Ø Ð × ÔÔ Ö׸ ÐÓÒ Û Ø Ø ÓÚ Ö Ø Ñ¹ÔÓ× ×º ÀÓÛ Ú Ö¸ cache2nd Ó × ÒÓØ Ø ÔÔÖ ÐÝ ×Ø ÖºÌ × « Ö Ò × Ù ØÓ Ø ÑÔÐ Ñ ÒØ Ø ÓÒ Ó makeCon- ØÓÑ ÓÐÙÑÒº ÙÖØ Ö ÑÔÖÓÚ Ñ ÒØ × ÔÓ×× Ð ÓÒ ÚÓ ×ditionalWrapper()º Ì Ù Ö ÖÓÙÒ ×Ô ØÂ³× Ú ×ØÓÖ Ò ÒÙÐÐ Ú ÐÙ × Ò HashMapsºÓÔ × this ÒØÓ ÐÓ Ð Ú Ö Ð Ò ÓÑÔ Ö × Ø Ò×Ø ÅÓ×Ø Ó À Ò ¹ÏÖ Ô³× ÓÚ Ö ÔÔ Ö× ØÓ ÒØÖÓ Ù¬Ð ¸Û Ð Ø Ù Ö ÖÓÙÒ cache2nd ÔÔÐ × ÓÓÐ Ò Ý Ö ÙÑ ÒØ ÖÖ Ý׺ ËÓÑ ÖÐÝ × ÑÔÐ ÓÔØ Ñ Þ Ø ÓÒ× ÒÔÖÓ ÙÖ ØÓ Ø× Ö ÙÑ ÒØ ÖÖ Ý Ø Ø Ô Ö ÓÖÑ× Ø × Ñ Ö Ù Ø × Ó×غ ÓÖ Ò×Ø Ò ¸ Ø ÛÖ ÔÔ Ö ÔÖÓ ÙÖ × ¹ÓÑÔ Ö ×ÓÒº ÓÖ Û ÓÑÔ Ö Ø lookup() Ö Ú Ö ¬Ò Ý makeConditionalWrapper() Ò makePerIn- stance() ÓÒÐÝ Ù× Ö ×Ø Ö ÙÑ ÒØ× ØÓ ÐÐ ÓØ Ö ÔÖÓ ÙÖ ×º Ò×Ø Ø Ð Ò×Ø Ò ¸ Ø × ÓÔ ÒØÓ Ò ÖÖ Ý¸Ø ÖÖ Ý × ÐÓÒ ¸ Ò Ø Ö Ú Ö × ÓÔ ÓÙØ Ó Ø Ï ÓÙÐ ÚÓ Ö ÙÑ ÒØ ÖÖ Ý× ÒØ Ö ÐÝ Ý ×Ô Ð Þ ÒÐÓÒ º Ì × ×ÓÖØ Ó Ó ÔÖ × ÒØ× ÐÐ Ò ØÓ ÒÝ ÓÔØ Ñ Þ¹ Ø × ÔÖÓ ÙÖ × ÓÒ Ö Ø × ÙÔ ØÓ º Ò ÓÑÔ Ð Öº ÁÒ ×ÙÑÑ Öݸ À Ò ¹ÏÖ Ô³× Ò Ö ÛÖ ÔÔ Ö× ÒØÖÓ Ù À Ò ¹ÏÖ Ô³× ÓÚ Ö Ò Ð×Ó Ñ ×ÙÖ Ò Ø ÔÖ ×¹ ÓÚ Ö ÒØÓ Ö ÙÑ ÒعР×Ø ÔÖÓ ×× Ò º Ì × ÓÚ Ö ÑÝ Ò Ó ÓØ Ö ÓÔØ Ñ Þ Ø ÓÒ׺ ÓÖ Ü ÑÔÐ ¸ ClassPath ÔÖÓ¹ ÔØ Ð ÓÖ ÙÒÓÔØ Ñ Þ ÔÖÓ Ö Ñ׸ ÙØ Ò ¹ ÒÐ Ò ÒÚ × Ø× ÓÛÒ Ò Ñ Ò ×Ѻ ClassPath Ó Ø Ò Ù× Û Ò Ø ÓÚ Ö ÖÓÛ× ØÓÓ Ö Øº Ò ¬Ò ×Ó Ø Ø Ö ØÓÖÝ ÓÒ Ø Ô Ø Ñ ÑÓ¹ Ï Ð×Ó Ñ ×ÙÖ Ø Ó×Ø ÒØÖÓ Ù Ý À Ò ¹ÏÖ Ô³× Þ × ÒÓÒ Ü ×Ø ÒØ ×Ù Ö ØÓÖ ×º Ì × ÔØÙÖ × Ö ÙÒ¹ Ñ Ø Ó ÔÖÓÐÓ Ù ×º Ï Ö Ò Ø ËÔ ÂÎÅ Ò Ñ Ö × ÒÝ ØÛ Ò ×Ø ÒØ ÐÓÓ ÙÔ Ö ÙÑ ÒØ׺ ÓÖ Ü ÑÔÐ ¸ ÙÒØ Ð Ñ Ò ÑÙÑ Ü ÙØ ÓÒ Ø Ñ Û × Ö º Ï Ø ÒÛ ÓÙÐ ÚÓ ×Ý×Ø Ñ ÐÐ ØÓ ÐÓÓ ÙÔ ./java/lang/ Ö ØÖÓ¬ØØ Ø Ò Ñ Ö Ð ×× × Û Ø À Ò ¹ÏÖ Ô Ñ Ø ÓString.class Û Ð ÖÒ Ø Ø ./java/lang Ó × ÒÓØ ÔÖÓÐÓ Ù × Ò Ö Ô Ø Ø Ø ×غ Ì Ö ×ÙÐØ× Ö × ÓÛÒ Ò Ü ×Ø Û Ò ÐÓÓ Ò ÙÔ Objectº Ì Ð º ÇÒ Ú Ö ¸ À Ò ¹ÏÖ Ô ÑÔÓ× × º ± ÓÚ Ö ¸ Ì Ö ×ÙÐØ Ó Ø Ò Ò Ñ Ö Û Ø Ö ØÓÖÝ ¹ ÙØ Ø ÓÚ Ö Ú Ö × Û ÐÝ Û Ø Ø Ö ÕÙ ÒÝ Ó Ñ Ø Ó Ò Ò Ð × × ÓÛÒ Ò Ì Ð ¿º À Ò ¹ÏÖ Ô³× ×ÓÐÙØ ÐÐ׺ Ì ÑÙÐØ ¹Ø Ö Ö ÝØÖ Ö Ô Ö ÓÖÑ× ÔÓÓÖÐÝ × Ò ØÓÚ Ö Ö Ñ Ò× Ø × Ñ cache2nd ÓÒ ×Ô ¬ Ò¹ Ù× × ÔÖ Ú Ø ¬ Ð × ÜÐÙ× Ú ÐÝ Ò ÒÐÙ × Ö ÕÙ ÒØ ÐÐ× ØÓ×Ø Ò × ÖÓÙ ÐÝ ½½¼Ñ× ×ÐÓÛ Ö Ø Ò Ø ÕÙ Ú Ð ÒØ Ú º ¬ Ð ØØ Ö׺  ×× Ð×Ó Ô Ö ÓÖÑ× ÔÓÓÖÐݸ Ù× Ù ÐØ Ò ÙÒ¹ÀÓÛ Ú Ö¸ Ø Ö Ð Ø Ú Ó×Ø × ÒÖ × À Ò ¹ÏÖ Ô × ÒÓÛ Ø ÓÒ× Ó Ø ÜÔ ÖØ × ÐÐ Ð Ò Ù Ö ÑÔÐ Ñ ÒØ ×Â Ú ± ×ÐÓÛ Ö Ø Ò ×Ô Ø¸ Ò Ø × ÓÚ Ö Ö ÔÖ × ÒØ× ¿½± Ñ Ø Ó ×¸ Ò Ø × Ñ Ø Ó × Ö ØÝÔ ÐÐÝ ÕÙ Ø ×Ñ Ðк ÓÑ¹Ó Ø Ø Ñ ×Ô ÒØ × Ö Ò Ø Ð ×× Ô Ø º Ì × ÓÚ Ö Ò ÔÖ ×× ×Ù« Ö× Ù× Ó Û ×Ñ ÐÐ Ñ Ø Ó × ÐÐ Û Ø Ò Ð Ñ Ò Ø Ø ÖÓÙ Ò ¹ ÒÐ Ò Ò ¸ × × ÓÛÒ Ò Ø Ù×¹ Ø× ÒÒ Ö ÐÓÓÔº Í× Ö ÒØ ÖÚ ÒØ ÓÒ Ñ Ý Ò ØÓ Ú ÔØ Ð
  • Ô Ö ÓÖÑ Ò ÓÖ ÖØ Ò Ó º Ò ÑÔÓÖØ ÒØ ¬Ö×Ø ×Ø Ô × ÒÓØ Ò ÒØ× Ú × ÔÓ ÒØÙØ ØÝÔ × ÓÒ × Ò × ÔÔÐÝ Ò À Ò ¹ÏÖ Ô ØÓ Ó ×Ù × Ò Ä Ï ÓÑÔÖ ××ÓÖ Ö Ð Ø ÓÒ× Ô×ºØ Ø ÑÔÐ Ñ ÒØ× × Ò Ð Û Ðй ¬Ò ÓÒ ÖÒº È Ö ÓÖÑ Ò ÇØ Ö ×Ô Ø ×Ý×Ø Ñ× Ú Ò ÑÔÐ Ñ ÒØ Ø ÖÓÙ Ò Ð×Ó ÑÔÖÓÚ Ý Ñ Ò Ô ÖØ ÙÐ Ö Ñ Ø Ó × ÙÒÛÖ Ô¹ Ñ Ø ÔÖÓ Ö ÑÑ Ò º ÇÈ»ËÌ ℄ × ÑÔÐ Ñ ÒØ Ò Î ×Ù Ð¹Ô Ð º ÓÖ Ò×Ø Ò ¸ Ø Ó×Ø Ó Ù× Ò À Ò ¹ÏÖ Ô Û Ø ÑØÖØ ÏÓÖ × ËÑ ÐÐØ Ð º ÇÈ»ËÌ ÝÒ Ñ ÐÐÝ Ò Ö Ø × Ö Ò × ÖÓÔ× ØÓ ¼º ± Û Ò ÔÖÓÐÓ Ù × Ö ÒÓØ ØÓ ØØ Ö Ñ Ø ¹ Ò Ø Ò Ö Ø Ò Ö Ö Ý Ò ÐØ Ö× Ø Ð ×× × Ó Ó ¹Ó ׺ ÙÖÖ ÒØÐݸ ÓÛ Ú Ö¸ À Ò ¹ÏÖ Ô Ó × ÒÓØ ÔÖÓÚ Ø׺ ÁÒ ÇÈ»Ë̸ Ú × ÛÓÚ Ò ÒØÓ ÐÐ Ö Ø Ò×Ø Ò ×Ñ Ò ×Ñ ÓÖ ×Ù ¬Ò ¹ Ö Ò ÓÒØÖÓÐ ÓÚ Ö ÛÖ ÔÔ Ð Øݺ Ó Ô ÖØ ÙÐ Ö Ð ×׸ Û Ö × Ò À Ò ¹ÏÖ Ô Ú × ÛÓÚ Ò ÒØÓ ÓÒÖ Ø Ñ Ø Ó ¬Ò Ø ÓÒ× Ö ØÐݺ5. RELATED WORK ÇÇÄ ½½℄ ÑÔÐ Ñ ÒØ× ×Ô Ø ¼º½³× ×ÝÒ ÖÓÒ Þ Ø ÓÒÀ Ò ¹ÏÖ Ô ÓÛ × ÑÙ ØÓ ×Ô Ø ¾ ℄º Å Ø Ó ÛÖ ÔÔ Ö× Ð Ò Ù Ò Î ×Ù ÐÏÓÖ × ËÑ ÐÐØ Ð ¸ Û Ð ÄÙÒ Ù ¾¼℄ ¬Ò × Ú Ø × Ñ « Ø × ×Ô ØÂ Ú º ÀÓÛ Ú Ö¸ ×Ô ØÂ Ñ Ø ¹Ó Ø ÔÖÓØÓÓÐ ÓÖ Ç Ø Ú ¹ Ø Ø ×ÙÔÔÓÖØ× Ñ ¹ Ú Ò ÛÓÚ Ò ÒØÓ Ö × Ø Ó Ó Ò ÔÓ ÒØ× Ö Ø Ö Ø Ò Ø Ó ÛÖ ÔÔ Ò º ÁÒØ Ö ×Ø Ò Ðݸ ÓØ Ø × ×Ý×Ø Ñ× Û Ú ¹Ñ Ö ÐÝ Ñ Ø Ó Ó ×º ×Ô Ø Ð×Ó ÔÖÓÚ × Ò ×ØÖ Ø ÓÒ Ú ÓÒ Ô Ö¹ Ò×Ø Ò × ×¸ Ö Ø Ö Ø Ò Ø Ô Ö¹Ð ×× × × ÐÐ ÔÓ ÒØÙØ ÒÓØ ÔÖ × ÒØ Ò À Ò ¹ÏÖ Ôº ×Ô ØÂ³× Ó Ò ÓÔØ Ý ÑÓÖ Ö ÒØ Ú Ö× ÓÒ× Ó ×Ô ØÂ Ò Ý À Ò ¹ÔÓ ÒØ × Ò ØÓÖ× Ò ÔÓ ÒØÙØ× ÔÖÓÚ Û Ú Ö ØÝ Ó ÏÖ Ôº ÓØ ÇÇÄ Ò ÄÙÒ Ù³× ×Ý×Ø Ñ ÙØ Ð Þ ÝÒ Ñ ÙÒØ ÓÒ Ð Øݸ ÑÙ Ó Û × Ð×Ó Ú Ð Ð Ò À Ò ¹ÏÖ Ôº Ö ­ Ø ÓÒ¸ Û Ö À Ò ¹ÏÖ Ô Ù× × ÓÑÔ Ð ¹Ø Ñ Ö ­ Ø ÓÒ Ö×ظ × Ò ØÓÖ× ×Ø Ð × Ò Ò × ØÓ Ú Ö ÙÑ ÒØ׸ ØÓ Ò× ÖØ Ü ØÐÝ Ø Ó× ÓÓ × Ò ÓÖ ÝÒ Ñ Û Ú Ò ºÖÓÐ ¬ÐÐ Ý À Ò ¹ÏÖ Ô³× Ô Ö Ñ Ø Ö Ð ×Ø׺ Ë ÓÒ ¸ × ¹ À Ò ¹ÏÖ Ô × × Ñ Ð Ö ØÓ ÄÙÒ Ù³× ×Ý×Ø Ñ Ò Ø Ø ÓØ Ñ¹Ò ØÓÖ× Ø ÖÑ Ò Û Ò Ú ÔÔР׺ ÁÒ À Ò ¹ÏÖ Ô¸ Ø × Ô × Þ Ø ÑÔÓÖØ Ò Ó ÓÑÔÓ× Ø ÓÒ Ò ×Ô Ø Ó º × ÓÒ × Ñ Ý Ø ÛÖ Ô ×Ø Ø Ñ Òظ Ö Ø Ö Ø Ò Ø Ì Ö × Ò Ö ÒØ ×ÙÖ Ó ÒØ Ö ×Ø Ò Ö Ò ØÛÖ ÔÔ Ö ¬Ò Ø ÓÒº ÛÖ Ô ×Ø Ø Ñ ÒØ ÔÔÐ × ÛÖ ÔÔ Ö ØÓ Ô ØÛ Ò Ð ××¹ Ò ÔÖÓØÓØÝÔ ¹ × Ò Ö Ø Ò ÑÓ ¹ Ô ÖØ ÙÐ Ö Ñ Ø Ó ¸ Ò Ò Ú ¬Ò Ö¹ Ö Ò ÓÒØÖÓÐ Ð× ¸ ¾¾℄º Ä Ø ÝÒ Ñ ×Ô Ø ×Ý×Ø Ñ× ×Ö ÓÚ ¸Ø ÖÓÙ Ø Ù× Ó ÓÒ Ø ÓÒ Ð ÛÖ ÔÔ Ö׺ Ò ÐÐݸ Ó Ò ÔÓ ÒØ Ø × Ñ Ò ×Ñ× ÐÐÓÛ Ñ Ø Ó × ØÓ ÓÚ ÖÖ Ò ÓÒ Ô Ö¹ × Ò ØÓÖ× Ñ Ý ÒÐÙ Û Ð Ö ×º Ø ÙÐ Ö Ò×Ø Ò º À Ò ¹ÏÖ Ô × × Ñ Ð Ö ØÓ Ø ÓÑÔÓÙÒ À Ò ¹ÏÖ Ô Ó × ÒÓØ ÐÐÓÛ Ó Ò¹ÔÓ ÒØ× ØÓ ×Ô ¬ Ö Ö Ò ÑÓ Ð ¾¾℄ Ò Ø Ø ÓØ ÐÐÓÛ Â Ú Ñ Ø Ó ³× ¹Ø ÖÓÙ Û Ð Ö ×º ÁØ × ÙÒÐ Ö ÓÛ Û Ð Ö × × ÓÙÐ ÛÓÖ Ú ÓÖ ØÓ Ò Ø Ø ×Ø Ø Ñ ÒØ Ð Ú Ð¸ Ö Ø Ö Ø Ò Ò À Ò ¹ÏÖ Ôº Ë ÓÙÐ Û Ð Ö Ñ Ø Ò Ô Ö ÓÖÑ Ø ÖÓÙ ÜØ ÖÒ Ð ×Ô Ø Ð Ö Ø ÓÒ׺×Ø Ø ÐÐÝ ÓÖ ÝÒ Ñ ÐÐÝ Ë ÓÙÐ Û Ð Ö × ÔÐ Ö ×ØÖ ¹ Ú Ø Ðº ½ ℄ ÑÔÐ Ñ ÒØ ÝÒ Ñ Ú Ò Ò Ò ×¹Ø ÓÒ× ÓÒ Ù× Ö¹ ¬Ò Ð ××ÐÓ Ö× Ë ÓÙÐ Û Ð Ö × ÐÓ Ô Øº À Ò ¹ÏÖ Ô ÓÐÐÓÛ× × Ñ Ð Ö Ö Ø ØÙÖ ¸ Ò Û Ð ×× × ÖÐݸ × Ø ÙÖÖ ÒØ wrap ×Ø Ø Ñ ÒØ Ó ×¸ ÓÖ Ð Þ ÐÝ ÓÓ × Ö ØÓ Ñ Ø Ó Ø ÓÑÔ Ð Ø Ñ ¸ Ò ÛÖ ÔÔ Ö× À Ò ¹ÏÖ Ô³× ÔÔÖÓ ØÓ Ú Ö Ù× × ÑÓÖ ­ Ü Ð Ö ¬Ò ÓÒ Ø × ÓÓ × Ø ÖÙÒØ Ñ º ÀÓÛ Ú Ö¸ À Ò ¹Ø Ò ×Ô ØÂ³× ×ØÖ Ø ÔÓ ÒØÙØ× Ò × Ú Ö Ð Û Ý׺ Ö×ظ ÐÐ ÏÖ Ô « Ö× Ò Ø Ø ÓÓ × Ö ÔÔÐ ØÓ ÐÐ Ñ Ø Ó ×¸ Ö Ø ÖÛÖ ÔÔ Ö× Ö Ö Ù× Ð ¸ Ö Ø Ö Ø Ò ÓÒÐÝ Ø Ó× Ó Ò Ø Ò ×Ô ¬ × Ø Ó Ñ Ø Ó × ¬Ò Ý ÔÓ ÒØÙغ À Ò ¹Ô ÖØ ÙÐ Ö ×ØÝÐ º À Ò Ò Ö Ò ÍÒÐ Ò ½ ℄ ×Ö ×Ý×¹ ÏÖ Ô Ð×Ó Ù× × ÑÓÖ Æ ÒØ ÑÔÐ Ñ ÒØ Ø ÓÒ¸ × Ò Ø ÖØ Ñ Ø ÙØ ÙÑ Ö×ÓÑ Ø Ò ÕÙ ÓÖ Ú Ò Ö Ù× Ò ×¹ Ö ÒÓ Â Ú Ö ­ Ø ÓÒ ÐÐ× ÓÒ Ø Ö Ø Ð Ô Ø ¸ Ò Ñ Ø ÓÔ Øº Ë ÓÒ ¸ Ö¹ÓÖ Ö ÛÖ ÔÔ Ö× ×Ù × makePerIn- Ö ÙÑ ÒØ× Ö ÒÓØ ÐÛ Ý× Ô ×× Ò ÖÖ Ý׺stance() Ò makeConditionalWrapper() Ò ¹  ¾¿℄ ÐÐÓÛ× Â Ú Ñ Ø Ó × ØÓ ÝÒ Ñ ÐÐÝ ÛÖ ÔÔ¬Ò Ò Ø À Ò ¹ÏÖ Ô Ð Ò Ù ¸ Ö Ø Ö Ø Ò ÔÖÓÚ × Ò ÙÒÛÖ ÔÔ Ø ÖÓÙ Ð ××ÐÓ Ö Ø Ø Ô Ö ÓÖÑ× ÝØ ¹ÔÖ Ñ Ø Ú ×º Í× Ö¹ ¬Ò ÛÖ ÔÔ Ö× Ò ÑÔÐ Ñ ÒØ ØÙÖ × Ó Ö ÛÖ Ø Ò º  ÒÐÙ × ÒÙÑ Ö Ó ØÙÖ × Ø ØÓ Ó Ò ÔÓ ÒØ × Ò ØÓÖ׺ ÓÖ Ò×Ø Ò ¸ cflow³× ÙÒØ ÓÒ Ð¹ À Ò ¹ÏÖ Ô Ð ×¸ ×Ù × Ø Ð ØÝ ØÓ Ö ÑÓÚ ÛÖ ÔÔ Ö× ØÝ ÓÙÐ ÑÔÐ Ñ ÒØ × ÐÝ Ò Æ ÒØÐݸ Ò within Ò Ø Ð ØÝ ØÓ ÓÓ× Ø ÓÖ Ö Ò Û ÛÖ ÔÔ Ö× Ü¹ × ÖØ ÒÐÝ ÑÔÐ Ñ ÒØ Ð º Ì × ÓÔ Ö Ø ÓÒ× ÔÖÓÚ Ø ÙØ ÓÒ Ô ÖØ ÙÐ Ö Ñ Ø Ó Ðк ÀÓÛ Ú Ö¸ Ð Ú ³× Ù Ð Ò ÐÓ × ÓÖ ÓØ Ö× ×Ù × this Ò withincodeº ×Ý×Ø Ñ¸  ³× ÑÔÐ Ñ ÒØ Ø ÓÒ Ö Ð × Ú ÐÝ ÓÒ Â Ú ³× Ö ¹ Ò ÐÐݸ Ö¹ÓÖ Ö ÛÖ ÔÔ Ö× ¬ÐÐ Ø ÖÓÐ × Ó ÓØ ÔÓ ÒØÙØ ­ Ø ÓÒ ÈÁ Ò ÔÔ Ö× Ð ×× Æ ÒØ Ø Ò À Ò ¹ÏÖ Ôº × Ò ØÓÖ× Ò Ø ×Ô Ø Ò×Ø ÒØ Ø ÓÒ Ð Ù× pertargetº ÍÒÐ Â ¸ À Ò ¹ÏÖ Ô ÜØ Ò × Ø Â Ú Ð Ò Ù ÛØ ÄÇË ¾ ℄³× :around Ñ Ø Ó ÕÙ Ð ¬ Ö ÐÐÓÛ× Ó ØÓ Ò Û ÜÔÖ ×× ÓÒ¸ ×Ø Ø Ñ Òظ Ò Ð Ö Ø ÓÒ ÓÖÑ׺ Ì × Ü¹ ÛÖ ÔÔ ÖÓÙÒ ÐÐ ÒÚÓ Ø ÓÒ× Ó Ò Ö ÙÒØ ÓÒº Ø Ò× ÓÒ× Ñ À Ò ¹ÏÖ Ô × Ö ØÓ Ù× Ò ØÛÓ Û Ý׺ Ö×ظ Ô ØÂ³× around Ú Ò À Ò ¹ÏÖ Ô³× ÛÖ ÔÔ Ö× × ÖÚ À Ò ¹ÏÖ Ô Ô Ö ÓÖÑ× Ð Ñ Ø ×Ø Ø ØÝÔ Ò ¸ Û Ö × × Ñ Ð Ö ÖÓÐ º ÏÖ ÔÔ Ö× « Ö ÖÓÑ ÖÓÙÒ Ñ Ø Ó × Ò ØÛÓ Â ÒÒÓØ ×Ø Ø ÐÐÝ Ú Ö Ý Ø Ø Ð ×× Ò Ñ Ø Ó Ò Ñ × Ý Û Ý׺ Ö×ظ ÛÖ ÔÔ Ö ÔÔÐ × ØÓ Ò Ò Ú Ù Ð Ñ Ø Ó Ö Ú Ð º Ë ÓÒ ¸ À Ò ¹ÏÖ Ô³× ¬Ö×Ø Ð ×× ÒÓØ ÓÒ Ó ÔÖÓ ¹ ¬Ò Ø ÓÒ Ö Ø Ö Ø Ò Ò Ö ÙÒØ ÓÒº Ë ÓÒ ¸ Ø ÓÖ¹ ÙÖ × Ò ÛÖ ÔÔ Ö׸ ÐÓÒ Û Ø Ø apply ÓÔ Ö ØÓÖ¸ ÔÖÓÚ Ö Ò Û ÛÖ ÔÔ Ö× Ü ÙØ × Ø ÖÑ Ò Ý Ø ÓÖ Ö Ò × × ÓÖ ÛÖ Ø Ò ÓÑÔÓ× Ð ÛÖ ÔÔ Ö×ºÛ Ø Ý Ö ÔÔÐ ØÓ Ñ Ø Ó ¸ Ö Ø Ö Ø Ò Ø ØÝÔ × Ó Ø Ðº ½ ℄ ÔÖÓÔÓ× ×Ý×Ø Ñ Ò Û ÛÖ ÔÔ ÒÓ ØÙ Ð Ö ÙÑ ÒØ׺ × Ô ÖÚ × Ú º ÓÑÔÓÒ ÒØ ÜÔÓÖØ× × Ø Ó Ì Ä Ò Ò × ÇØ Ö ×Ô Ø ×Ý×Ø Ñ× ×Ù × ËÇ » ÍÈ ½ ℄ Ò ×¹ Ø Ø Ö Ò ØÙÖ Ð ØÓ Ø× ÑÔÐ Ñ ÒØ Ø ÓÒ¸ Ò Ø Ð ÒØ ÛÖ Ô×Ô ØÙ Ð ÓÑÔÓÒ ÒØ× ½ ℄ Ö ×× Ø Ò ÓÖ × Ô Ö Ø Óѹ Ø × ÓÑÑ Ò × Ò ÇÌ Ä Ð ×× × Ø Ø ÔÖÓÚ Ò ÒØ Ö¹Ô Ð Ø ÓÒ Ò ÓÑÔÓÒ ÒØ ÓÒØ Üغ ÐØ ÓÙ Ø × ×Ý×Ø Ñ× Ò ØÙÖ Ð ØÓ Ø Ð Òغ ÇÌ Ä³× Ñ Ø Ó Ø ÔÖÓØÓÓÐ×ÙÔÔÓÖØ ÝÒ Ñ ×Ô Ø Û Ú Ò ¸ Ø Ý Ó ÒÓØ ØÖ Ø ×Ô Ø× ÐÐÓÛ× ÛÖ ÔÔ Ö Ð ×× × ØÓ × ÐÝ ÜÔÖ ×× Ö ×ØÖ Ø ÓÒ× Ò ÓÒ¹ Ø ¬Ö×عР×× Â Ú ÒØ Ø × Ò ¸ Ø Ý Ó ÒÓØ ÔÖÓÚ Ø Ú ÒØ ÓÒ× Ò ÓÑÔÓÒ ÒØ³× ÜÔÓÖØ ÒØ Ö º ÇÌ Ä Ð×Ó Ø ÓÒ Ð Ö Ù× Ñ Ò ×Ñ× ÓÙÒ Ò À Ò ¹ÏÖ Ôº ÓØ ×ÙÔÔÓÖØ× ØÖ Ò×Ô Ö ÒØ Ñ Ø Ó ÛÖ ÔÔ Ò Ø ÖÓÙ Ñ ¹×Ý×Ø Ñ× Ó ×ÙÔÔÓÖØ Û Ð Ö ×¸ Ò ÔÓ ÒØÙØ× Ö Ø ÔÖ ¹ Ò ×Ñ ÐÐ Ô Ö¹Ó Ø Ñ Ü Ò׺ Ì × Ñ Ò ×Ñ ÐÐÓÛ× ÒÑ ÖÝ Ø ÖÙ×Ø Ó ×Ô ØÙ Ð ÓÑÔÓÒ ÒØ׺ ×Ô ØÙ Ð ÓÑÔÓ¹ ÑÔÓÖØ ÓÑÔÓÒ ÒØ³× Ú ÓÖ ØÓ ÙÖØ Ö Ù×ØÓÑ Þ º
  • Ï Ð ÒÙÑ Ö Ó ÔÓÛ Ö ÙÐ Ñ ÖÓ ×Ý×Ø Ñ׸ ÓÑÔ Ð ¹Ø Ñ ℄ º ØÓÖݸ º ÄÓ ×Ó¸ Ò º ËÑ Ö ×º ÂÌË ÌÓÓÐ×Ñ Ø ÔÖÓ Ö ÑÑ Ò ÜØ Ò× ÓÒ׸ Ò ÔÖ ÔÖÓ ××ÓÖ ØÓÓÐ Ø× ½¸ ÓÖ ÑÔÐ Ñ ÒØ Ò ÓÑ Ò¹×Ô ¬ Ð Ò Ù ×º ÁÒ Ø ¸ ¸ ¾ ℄ Ö Ú Ð Ð ÓÖ Â Ú ¸ Û Ð Ú Ø Ø Å Ý × ×Ø ÁÒØ ÖÒ Ø ÓÒ Ð ÓÒ Ö Ò ÓÒ ËÓ ØÛ Ö Ê Ù× ¸ ½ º×Ù Ø ÓÖ ÑÔÐ Ñ ÒØ Ò Ð Ò Ù ÜØ Ò× ÓÒ ×Ù × À Ò ¹ ℄ ú ÓÐÐ Öغ ÇÒ Û Ú Ò ×Ô Ø׺ ÁÒ ÇÇÈ ÏÓÖ × ÓÔÏÖ Ôº Ö×ظ À Ò ¹ÏÖ Ô ÜØ Ò × Â Ú ³× ÓÒÖ Ø ×ÝÒØ Ü Ò ÓÒ ×Ô Ø¹ÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ¸ ½ ºÛ Ý× Ø Ø Ò³Ø ÜÔÖ ×× Ý × ÑÔÐ Ñ ÖÓ ×Ý×Ø Ñ× ×Ù ℄ Ⱥ ÓØ Ò Öº Ã Û ÓÑÔ Ð Ò ÝÒ Ñ Ð Ò Ù × ØÓ × ÂË ½℄ Ò ÓÑÔ Ð ¹Ø Ñ ÅÇÈ× ×Ù × ÇÔ ÒÂ Ú ¾ ℄ Ø Â Ú Îź ÁÒ ÈÖÓ Ò × Ó Ø ÍË ÆÁ Ì Ò Ð Ò ÄÁ ℄º Ë ÓÒ ¸ À Ò ¹ÏÖ Ô Ù× × ×Ø Ø ØÝÔ Ò ÓÖ¹ ÓÒ Ö Ò ¸ Ê ÆÁ ÌÖ ¸ Æ Û ÇÖÐ Ò׸ Ä ¸ ÂÙÒºÑ Ø ÓÒ Ø Ø × ÒÓØ Ú Ð Ð Ò ÔÙÖ ÐÝ ×ÝÒØ Ø ×Ý×Ø Ñ× ×Ù ½ º ÍË ÆÁ ××Ó Ø ÓÒº × ÂË Ò ÂÌË ℄º Ò ÐÐݸ Å Ý ÐÐÓÛ× ÓÚ ÖÐÓ Ò Ó ×ÝÒ¹ ℄ º Ö ¸ ź Ç Ö× Ý¸ º ËØÓÙØ Ñ Ö ¸ ÒØ Ü × ÓÒ Ö ØÖ ÖÝ ×Ø Ø ØÝÔ × Ò Ó × ÒÓØ Ö ÕÙ Ö Ø Èº Ï Ð Öº Å Ò Ø ÙØÙÖ × ÓÖ Ø Ô ×Ø × ¹Ð Ú Ð ÔÖÓ Ö Ñ ØÓ ÜÔÐ ØÐÝ Ö Ö ØÓ Ñ Ø ÔÖÓ Ö Ñ׺ ÁÒ Ò Ò Ö ØÝ ØÓ Ø Â Ú ÔÖÓ Ö ÑÑ Ò Ð Ò Ù ºÓÒØÖ ×ظ ÇÔ ÒÂ Ú ÓÒÐÝ ÐÐÓÛ× ×ÝÒØ Ü ÓÚ ÖÐÓ Ò × ÓÒ ÁÒ ÈÖÓ Ò × Ó Ø ÓÒ Ö Ò ÓÒ Ç Ø¹ÇÖ ÒØÐ ×× × Ø Ø ÜÔÐ ØÐÝ Ò×Ø ÒØ Ø Ñ Ø Ð ×׺ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ Ä Ò Ù ×¸ Ò ÔÔÐ Ø ÓÒ׸ Î ÒÓÙÚ Ö¸ ÇØÓ Ö ½ º ź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 ½ ℄ ˺ À Ò Ò Ö Ò Êº ÍÒÐ Ò º Í× Ò Ò Ö Ù× Ò ½℄ º Ö Ò Ãº ÈÐ Ý ÓÖ º Ì Â Ú ×ÝÒØ Ø ×Ô Ø× Ò ×Ô Øº ÁÒ ÇÇÈËÄ ÏÓÖ × ÓÔ ÓÒ ÜØ Ò Ö ´ÂË µº ÁÒ ÈÖÓ Ò × Ó Ø ÓÒ Ö Ò ÓÒ Ú Ò Ë Ô Ö Ø ÓÒ Ó ÓÒ ÖÒ× Ò Ç Ø¹ÇÖ ÒØ Ç Ø¹ÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ Ä Ò Ù ×¸ ËÝ×Ø Ñ׸ Çغ ¾¼¼½º Ò ÔÔÐ Ø ÓÒ׸ Çغ ¾¼¼½º ½ ℄ ƺ º ÀÓ º ÝÒ Ñ ×Ô Ø× Ò ËÇ » ÍȺ ¾℄ º Öº Å ÖÓ× Ø Ø ÔÐ Ý Å Ö Ø Ò ÖÓÑ Â Ú ØÓ Ì Ò Ð Ê ÔÓÖØ »¼ ¸ ÖÐ × ÍÒ Ú Ö× Øݸ ÈÖ Ù ¸ Å Ý º Å ×Ø Ö³× Ø × ×¸ ÍÒ Ú Ö× ØÝ Ó ÍØ ¸ Ñ Ö ÂÙÒº ½ º ¾¼¼½º ½ ℄ ú Ä Ö ÖÖ¸ º ÄÓÖ ÒÞ¸ Ò Åº Å Þ Ò º ¿℄ º Ö Ò Ïº À× º Å Ý ÅÙÐØ ÔÐ ¹ ×Ô Ø ÈÖÓ Ö ÑÑ Ò Û Ø ×Ô ØÙ Ð ÓÑÔÓÒ ÒØ׺ Ì Ò Ð ×ÝÒØ Ü ÜØ Ò× ÓÒ Ò Â Ú º ÌÓ ÔÔ Ö Ò ÈÖÓ Ò × Ó Ê ÔÓÖØ Æ͹ ˹ ¹¼½¸ ÆÓÖØ ×Ø ÖÒ ÍÒ Ú Ö× Øݸ ÔÖº Ø ÓÒ Ö Ò ÓÒ ÈÖÓ Ö ÑÑ Ò Ä Ò Ù × Ò Ò ½ º ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ ÂÙÒº
  • ¾¼℄ º Ⱥ ÄÙÒ Ùº Ö ­ Ø Ú Ö Ø ØÙÖ ÓÖ ÔÖÓ ×× ¾ ℄ º ËØ Ð ÂÖº ÓÑÑÓÒ Ä ×Ô¸ Ø Ä Ò Ù º Ø Ð ÓÒØÖÓÐ ÔÔÐ Ø ÓÒ׺ ÁÒ ÈÖÓ Ò × Ó Ø ÙÖÓÔ Ò ÈÖ ×׸ × ÓÒ Ø ÓÒ¸ ½ ¼º ÓÒ Ö Ò ÓÒ Ç Ø¹ÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ¸ ½ º ¾ ℄ ź Ì Ø×Ù ÓÖ ¸ ˺ ¸ ź à ÐÐ Ò¸ Ò Ãº ÁØ ÒÓº¾½℄ Ⱥ Æ Ñ Ý Öº Ò× ÐÐ Ð ØÛ Ø ×Ö ÔØ Ò ÓÖ Ê ­ Ø ÓÒ Ò ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ÚÓÐÙÑ ½ ¾ Ó Â Ú º http://www.beanshell.org/º Ä ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ ÔØ Ö¾¾℄ ú Ç×Ø ÖÑ ÒÒ Ò Åº Å Þ Ò º Ç Ø¹ÓÖ ÒØ ÇÔ ÒÂ Ú Ð ××¹ × Ñ ÖÓ ×Ý×Ø Ñ ÓÖ Â Ú º ÓÑÔÓ× Ø ÓÒ ÙÒØ Ò Ð º ÁÒ ÈÖÓ Ò × Ó Ø ËÔÖ Ò Ö Î ÖÐ ¸ ¾¼¼¼º ÓÒ Ö Ò ÓÒ Ç Ø¹ÇÖ ÒØ ÈÖÓ Ö ÑÑ Ò ËÝ×Ø Ñ׸ ¾ ℄ ÖÓܺ Ì ×Ô Ø ÔÖÓ Ö ÑÑ Ò Ù º http: Ä Ò Ù ×¸ Ò ÔÔÐ Ø ÓÒ׸ Çغ ¾¼¼½º //www.aspectj.org/doc/dist/progguide/º¾¿℄ ʺ È ÛÐ ¸ ĺ Ë ÒØÙÖ Ö¸ ĺ Ù Ò¸ Ò º ÐÓÖ Òº  ­ Ü Ð ×ÓÐÙØ ÓÒ ÓÖ ×Ô Ø¹ÓÖ ÒØ ÔÖÓ Ö ÑÑ Ò Ò Â Ú º ÁÒ Ê ­ Ø ÓÒ ¾¼¼½¸ Ô × ½ß¾ ¸ ¾¼¼½º ÄÆ Ë ¾½ ¾º