৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportΤΠϦΞεղੳΛ༻͍ͨϝιουͷೖྗσʔλͷར༻๏ՄࢹԽπʔϧࣛౡ ༔1,a)ੴඌ ོ1,b)Ҫ্ ࠀ࿠1,c)֓ཁɿϓϩάϥϜཧղʹ͓͍ͯɼ։ൃऀ͸ϝιουͷ࣮ߦதʹߦΘΕΔσʔλͷೖग़ྗͷௐࠪʹଟ͘ͷ࣌ؒΛඅ΍͍ͯ͠ΔɽJava ϓϩάϥϜͰ͸ɼϝιουΛ࣮ߦ͢ΔͨΊʹඞཁͳೖྗσʔλ͸ɼҾ਺΍ϑΟʔϧυɼΫϥεม਺Λհͯ͠༩͑ΒΕΔɽ͜ΕΒͷม਺΍ɼͦΕΛհͯ͠ࢀর͞ΕΔϑΟʔϧυͷ͏ͪɼ࣮ࡍʹϝιουͷ࣮ߦதʹ࢖༻͞ΕΔ΋ͷΛ೺Ѳ͢Δʹ͸ɼ஫໨͢Δϝιου͔Β‫ͼݺ‬ग़͞ΕΔ͢΂ͯͷϝιουΛௐࠪ͢Δඞཁ͕͋Δɽͦ͜Ͱຊ‫Ͱڀݚ‬͸ɼࢦఆ͞Εͨϝιουͱ͔ͦ͜Β‫ͼݺ‬ग़͞ΕΔϝιου
Λࣗಈతʹྻ‫͠ڍ‬ɼϝιου࣮ߦதʹ࢖༻͞Ε͏ΔҾ਺΍Ϋϥεม਺ͱͦΕΒͷϑΟʔϧυΛநग़͠Մࢹ
Խ͢Δख๏ΛఏҊ͢ΔɽҾ਺ͱͯ͠౉͞ΕͨΦϒδΣΫτ͸ผͷม਺ʹ୅ೖ͞Εͯ࢖༻͞ΕΔ৔߹΋͋Δ
͕ɼຊ‫Ͱڀݚ‬͸ΤΠϦΞεղੳΛߦ͍ɼ։ൃऀ͕஫໨͢ΔϝιουͰͷม਺໊Λ༻͍ͨՄࢹԽΛߦ͏ɽఏҊख๏Λ࣮૷ͨ͠πʔϧΛ༻͍ͯରর࣮‫ݧ‬Λߦͬͨ݁ՌɼπʔϧΛ༻͍ͨඃ‫ऀݧ‬ͷํ͕ɼϓϩάϥϜཧղͷ՝୊ͷղ౴ͷͨΊͷ࡞‫ݮ͕ؒ࣌ۀ‬গͨ͜͠ͱΛ֬ೝͨ͠ɽ

A tool for visualizing the usage of the
input data for a method using alias analysis
Yu Kashima1,a)Takashi Ishio1,b)Katsuro Inoue1,c)Abstract: In program comprehension, developers often spend a lot of time for the investigation of input/output during an execution of a method. In Java program, input for a method includes arguments,
ﬁelds and class variables. To identify ﬁelds and class variables used by a method, developers must invetigate
all methods which may be called from the method. In this paper, we propose a tool for visualizing input ofa method including ﬁelds and class variables by investigating the method and methods which may be calledfrom it. Using alias analysis, this tool shows ﬁeld access using their access paths from variables of the speciﬁed method. We performed a controlled experiment in which participants perform program comprehension
tasks. The result shows the time spent for an investigation with our tool is less than the time without thetool.

1. ͸͡Ίʹ
։ൃऀ͸ϓϩάϥϜͷอक࡞‫ʹۀ‬ଟ͘ͷ࣌ؒΛඅ΍ͯ͠λͷೖग़ྗΛௐࠪ͢Δͱ͍͏࡞‫͕͋ۀ‬ΔɽLaToza Β [4] ͸͜ͷ࡞‫ʹۀ‬։ൃऀ͕͠͹͠͹࣌ؒΛ͔͚͍ͯΔͱࢦఠͯ͠
͍Δɽ͓ΓɼͦͷதͰ΋ɼଟ͘ͷ࣌ؒΛϓϩάϥϜཧղʹඅ΍͠‫͍༻͘޿ࡏݱ‬ΒΕ͍ͯΔΦϒδΣΫτࢦ޲ϓϩάϥϛϯ

͍ͯΔͱ‫ݴ‬ΘΕ͍ͯΔ [1], [2], [3]ɽϓϩάϥϜཧղͷࡍʹά‫͋Ͱޠݴ‬Δ Java ʹ͓͍ͯɼ͋ΔϝιουΛ࣮ߦ͢Δͨߦ͏࡞‫ۀ‬ͷ 1 ͭͱͯ͠ɼϝιουͷ࣮ߦதʹߦΘΕΔσʔΊʹඞཁͳೖྗσʔλ͸ɼϝιουͷҾ਺΍Ϋϥεม਺Λհͯ͠༩͑ΒΕΔɽ͜ΕΒͷม਺ʹ͸ଟ਺ͷϑΟʔϧυΛ

1

a)
b)
c)

େࡕେֶ େֶӃ৘ใՊֶ‫ڀݚ‬ՊGraduate School of Information Science and Technology, Osaka University
y-kasima@ist.osaka-u.ac.jp
ishio@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

c 1959 Information Processing Society of Japan࣋ͭΦϒδΣΫτ͕୅ೖ͞Ε͍ͯΔ৔߹΋͋Γɼ஫໨͢Δ
ϝιουͷ࣮ߦதʹ࣮ࡍʹ࢖༻͞ΕΔσʔλ߲໨Λಛఆ͢Δʹ͸ɼͦͷϝιου͔Β‫ͼݺ‬ग़͞ΕΔ͢΂ͯͷϝιου
Λௐࠪ͠ͳ͚Ε͹ͳΒͳ͍ɽ·ͨɼΫϥεม਺͸೚ҙͷϝ

1৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Reportιου͔ΒΞΫηεՄೳͰ͋ΔͨΊɼಉ༷ͷௐ͕ࠪඞཁͰ
͋Δɽ‫ݧ‬Λߦ͍ޮՌΛ֬ೝͨ͠ɽ
Ҏ߱ɼ2 ষͰ͸‫ڀݚ‬ͷಈ‫ػ‬Λఏࣔ͠ɼ3 ষͰ͸ఏҊख๏ͦ͜Ͱຊ‫Ͱڀݚ‬͸ɼ։ൃऀʹࢦఆ͞ΕͨϝιουͷσʔΛड़΂ɼ4 ষͰ͸ఏҊख๏ͷ࣮૷Λड़΂ɼ5 ষͰ͸ධՁ࣮λϑϩʔΛࣗಈతʹ୳ࡧ͠ɼϝιουͷೖྗσʔλͱͯ͠‫͍ͯͭʹݧ‬ड़΂Δɽ6 ষͰ͸ؔ࿈‫͍ͯͭʹڀݚ‬ड़΂ɼ࠷‫ޙ‬ར༻͞ΕΔҾ਺΍Ϋϥεม਺ͱͦͷϑΟʔϧυΛநग़͠ɼʹ 7 ষͰ͸·ͱΊͱࠓ‫ޙ‬ͷ՝୊Λड़΂Δɽ໦ߏ଄ͰՄࢹԽ͢Δख๏ΛఏҊ͢Δɽ͞ΒʹɼͦΕΒͷσʔλΛ௚઀ར༻͢Δ໋ྩͷ͋Διʔείʔυ্ͷҐஔͱ໋ྩͷछྨ΋ซͤͯՄࢹԽ͠ɼ։ൃऀʹఏࣔͯ͠ϓϩάϥϜཧղࢧԉΛߦ͏ɽ

2. ‫ڀݚ‬ͷಈ‫ػ‬
LaToza Β [4] ͸ɼϓϩάϥϜཧղͷ࡞‫Ͱۀ‬ɼϝιουͷ
࣮ߦதʹߦΘΕΔσʔλͷೖग़ྗΛ։ൃऀ͸͠͹͠͹࣌ఏҊख๏Ͱ͸ɼࢦఆ͞Εͨϝιου͔Β‫ͼݺ‬ग़ؔ͠܎ΛؒΛ͔͚ͯௐࠪ͠ͳ͚Ε͹ͳΒͳ͍͜ͱΛࢦఠ͍ͯ͠Δɽ

௨ͯ͡౸ୡՄೳͳ͢΂ͯͷϝιουΛର৅ͱͯ͠ΤΠϦΞ͜ͷ͏ͪɼϝιουʹσʔλ͕ೖྗ͞ΕΔ৔߹͸‫ج‬ຊతʹεղੳΛ࣮ߦ͠ɼϝιουͷ࣮ߦதʹΞΫηε͞ΕΔ͢΂Ҿ਺Λհͯ͠σʔλ͕༩͑ΒΕΔɽͦͷͨΊɼೖྗ͞ΕΔ

ͯͷϑΟʔϧυ͕ɼࢦఆ͞ΕͨϝιουͰར༻Մೳͳม਺

σʔλΛ೺Ѳ͢Δʹ͸Ҿ਺Λ‫ݟ‬Ε͹Α͘ɼҰ‫ݟ‬؆୯ͳ࡞‫ۀ‬Λ‫ͨ͠ͱ఺ج‬৔߹ʹɼͲͷσʔλʹ֘౰͢Δͷ͔Λಛఆ͢ʹࢥΘΕΔɽ

Δɽͨͱ͑͹ɼ։ൃऀ͕஫໨͍ͯ͠ΔϝιουͰม਺ x ͱ͔͠͠ɼҾ਺ʹ͸ɼ୯७ͳ਺஋σʔλ͚ͩͰ͸ͳ͘ɼଟͯ͠ࢀর͞Ε͍ͯΔΦϒδΣΫτ͕ɼ‫ͼݺ‬ग़͠ઌϝιου਺ͷϑΟʔϧυΛ࣋ͭΦϒδΣΫτ͕༩͑ΒΕΔ৔߹͕Ͱม਺ y ͱͯ͠ࢀর͞ΕɼͦͷϑΟʔϧυ f ͕࢖༻͞Εͨ

͋Δɽ͜ͷͱ͖ϝιουͷ࣮ߦதʹΦϒδΣΫτ͕࣋ͭͱ͖ɼຊख๏Ͱ͸஫໨͍ͯ͠ΔϝιουͰͷม਺໊Λ࢖༻͢΂ͯͷϑΟʔϧυΛར༻͢ΔΘ͚Ͱ͸ͳ͍ɽྫͱͯ͠ɼ

͠ɼx.f ͕࢖༻͞ΕΔͱදࣔ͢Δɽ

ਤ 1 ʹ‫ڭ‬ҭϓϩάϥϜ ITSpiral[5] Ͱఏ‫͞ڙ‬Ε͍ͯΔ࿨Վຊ‫Ͱڀݚ‬͸ɼϓϩάϥϜղੳ෦ͱղੳ݁Ռදࣔ෦Λผʑࢁେֶ‫ڭ‬຿γεςϜͷҰ෦Ͱ͋ΔιʔείʔυยΛࣔ͢ɽʹ࣮૷͠ɼղੳ݁Ռදࣔ෦͸ Eclipse ϓϥάΠϯͱ࣮ͯ͜͠ͷϝιου validateForm ͸ɼ΢Σϒϒϥ΢β͔Βೖྗ૷ͨ͠ɽ͜ͷϓϥάΠϯ͸ɼ‫ى‬ಈ࣌ʹղੳ݁ՌΛಡΈࠐΈɼ͞Εͨσʔλ form Λ‫͢ূݕ‬ΔϝιουͰ͋Δɽ͔͠͠ɼ

Java ΤσΟλ্ͰΫϦοΫ͞Εͨϝιουʹରͯ͠ղੳ݁

͜ͷϝιουͰ͸ form ͷ࣋ͭ 16 ‫ݸ‬ͷϑΟʔϧυͷ͏ͪɼՌΛදࣔ͢Δɽ

form.Idɼform.usedIdɼͦͯ͠ form.userKubun ͷ 3 ͔ͭ͠πʔϧʹΑΔϓϩάϥϜཧղ࡞‫΁ۀ‬ͷӨ‫ڹ‬ΛධՁ͢Δͨ

ར༻͍ͯ͠ͳ͍ʢͦΕͧΕɼ4 ߦ໨ͷ form.getId()ɼ7 ߦ໨Ίʹɼ8 ໊ͷඃ‫ ʹऀݧ‬2 ͭͷϓϩάϥϜΛཧղ͢Δ࡞‫ۀ‬Λͷ form.getUsedID()ɼ8 ߦ໨ͷ form.getUserKubun() ͷ‫ݺ‬ߦͳͬͯ΋Β͏ରর࣮‫ݧ‬Λ࣮ࢪͨ͠ɽ͜ͷ࣮‫Ͱݧ‬͸ඃ‫ऀݧ‬ͼग़͠ઌͰಡΈࠐΈΛߦ͍ͬͯΔʣɽར༻͞ΕΔσʔλΛʹࢦఆ͞Εͨ‫ػ‬ೳ͕࣮૷͞Ε͍ͯΔιʔείʔυͷ৔ॴΛਖ਼֬ʹ೺Ѳ͢Δʹ͸ɼҾ਺΍Ϋϥεม਺ͷσʔλϑϩʔΛൃ‫͢ݟ‬Δͱ͍͏՝୊Λղ͍ͯ΋Β͍ɼղ౴࣌ؒ΍ਖ਼౴཰Λ

୳ࡧ͢Δඞཁ͕͋Δ͕ɼ͜Ε͸ίετͷେ͖͍࡞‫͋Ͱۀ‬Δɽ

ଌఆͨ͠ɽ࣮‫ݧ‬ͷ݁Ռɼπʔϧ༗Γͷඃ‫ऀݧ‬ͷํ͕ɼπʔ·ͨɼϝιουʹ͸Ҿ਺͚ͩͰ͸ͳ͘ɼΫϥεม਺Λհϧແ͠ͷඃ‫ऀݧ‬ΑΓ΋ɼ՝୊Λղ౴͢Δ·Ͱͷ࡞‫͕ؒ࣌ۀ‬ͯ͠σʔλ͕౉͞ΕΔ৔߹΋͋ΔɽΫϥεม਺ʹରͯ͠͸‫ݮ‬গ͢Δ܏޲͕‫ݟ‬ΒΕͨɽ·ͨɼπʔϧ͸ɼϝιου಺Ͱιʔείʔυதͷ೚ҙͷҐஔ͔ΒΞΫηεͰ͖ΔͨΊɼ஫࢖༻͞ΕΔม਺ͷ֬ೝ΍ɼϝιουͷॲཧͱؔ࿈͢Δม

໨͍ͯ͠ΔϝιουͰ͸Ϋϥεม਺ʹ௚઀ΞΫηεͯ͠਺ͷ‫࢖ʹͲͳࡧݕ‬ΘΕ͍ͯͨɽͨͩ͠ɼਖ਼౴཰ʹ͍ͭͯ͸͍ͳͯ͘΋ɼͦͷϝιου͔Β‫ͼݺ‬ग़͞ΕΔϝιου͕ॏπʔϧʹΑΔվળ͸ಘΒΕͳ͔ͬͨɽ

ཁͳΫϥεม਺ʹΞΫηε͍ͯ͠Δ৔߹͕͋Δɽͨͱ͑ຊ࿦จͷओཁͳߩ‫ݙ‬͸ҎԼͷ 3 ͭͰ͋Δɽ͹ɼਤ 1 ͷ validateForm Ͱ͸ɼ7 ߦ໨ͷ ﬁndByUserID ͱ• ϝιουͷೖྗσʔλΛྻ‫͢ڍ‬Δํ๏ΛఏҊͨ͠ɽ‫ط‬͍͏ϝιου͕ɼ͍͔ͭ͘ͷϝιου‫ͼݺ‬ग़͠Λհͯ͠ଘख๏͕ೖྗσʔλͷιʔείʔυ্ͷҐஔΛՄࢹԽ

HibernateUtil.SESSION ͱ͍͏σʔλϕʔεͷηογϣϯ

͢Δख๏Ͱ͋Δͷʹର͠ɼຊख๏͸ೖྗσʔλͷҰཡΛ؅ཧ͢ΔΫϥεม਺ʹΞΫηε͍ͯ͠Δɽ͋Δϝιου

ΛՄࢹԽ͍ͯ͠Δɽͷ࣮ߦதʹΞΫηε͞ΕΔΫϥεม਺Λ೺Ѳ͢Δʹ͸ɼ஫• ໦ߏ଄Λ༻͍ͨσʔλߏ଄ͷՄࢹԽํ๏ΛఏҊͨ͠ɽ͜ͷͱ͖ɼϑΟʔϧυ໊ʹ͍ͭͯ͸஫໨͍ͯ͠Δϝιου͔ΒΈͨࢀরؔ܎Ͱ͍ࣔͯ͠Δɽͨͱ͑͹ɼ஫໨͢Δϝιου͔Β‫ͼݺ‬ग़͞ΕΔϝιου͢΂ͯΛಡղ͠ͳ͚Ε͹ͳΒͣɼେ͖ͳίετ͕͔͔ΔɽҎ্ͷ໰୊ʹର͠ɼϓϩάϥϜεϥΠγϯά [6], [7], [8],໨͍ͯ͠ΔϝιουͰม਺ x ͱͯ͠ࢀর͞Ε͍ͯΔΦ

[9], [10], [11], [12] ΍σʔλϑϩʔͷՄࢹԽ [13] ʹΑΓɼϒδΣΫτ͕ɼଞͷϝιουͷม਺ y ʹ୅ೖ͞ΕͯιʔείʔυͷಡΈख͕ϝιουͷೖྗΛௐࠪ͢ΔίετϑΟʔϧυ f Λ࢖༻͞Εͨͱ͖ɼx.f ͕࢖༻͞ΕͨͱදΛ࡟‫͢ݮ‬Δํ๏͕ఏҊ͞Ε͍ͯΔɽ͔͠͠ɼ͜ΕΒͷख๏ࣔ͢Δɽ͸ಡΉ΂͖ιʔείʔυΛಛఆ͢Δख๏Ͱ͋Γɼ஫໨͢Δ• Eclipse ϓϥάΠϯͱͯ͠ఏҊख๏Λ࣮૷͠ɼରর࣮
c 1959 Information Processing Society of Japanϝιουͷೖྗσʔλ͸ಡΈख͕ख࡞‫Ͱۀ‬ಛఆ͠ͳ͚Ε͹

2৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Report

1: protected boolean validateForm(
2:

final HttpServletRequest request,

3:

final UserForm form) throws ServiceException {4:

if (form.getId() == 0) {5:

User user = ServiceFacotry

3.1 ϝιουͷೖྗม਺ͷར༻৘ใͷநग़ࢦఆ͞Εͨϝιου m ʹର͢Δม਺ͷར༻৘ใͷू߹I(m) ͷऔಘΞϧΰϦζϜΛਤ 2 ʹࣔ͢ɽ͜ͷΞϧΰϦζϜ
͸ɼϝιουͷೖྗʹର͢ΔΞΫηε৘ใΛநग़͠ɼI(m)6:.getService(IUserService.class)ʹ௥Ճ͢Δɽਤ 2 ͷ ← ͸ม਺ʹର͢Δ୅ೖΛද͢ɽ ͸

7:.findByUserID(form.getUserId(),ࠨลͷม਺͕ू߹Λཁૉʹ࣋ͭͱ͖ɼू߹΁ͷཁૉͷ௥Ճ8:

UserKubun.valueOf(form.getUserKubun()));

9:

if (user != null) {10:

addError(request, "errors.ucm02.exist.user");11:

return false;

12:

}

Λද͢ɽ
ਤ 2 ͷؔ਺ reachables() ͱ isAlias()ɼͦͯ͠ isContin-

ueSearch() ͸ɼΞϧΰϦζϜͷύϥϝʔλͱͳΔؔ਺Ͱ͋
Δɽreachables() ͸Ҿ਺ʹϝιουΛऔΓɼ༩͑ΒΕͨϝ13:}ιου͔ΒਪҠతͳ΋ͷ΋‫ؚ‬Ί‫ͼݺ‬ग़͞Ε͏Δϝιουͷ

14:

return true;ू߹Λฦ͢ɽisAlias() ͸Ҿ਺ʹม਺ 2 ͭΛऔΓɼ༩͑ΒΕ
ͨม਺ 2 ͕ͭಉ͡ϙΠϯλΛࢦ͠͏ΔΤΠϦΞεؔ܎Ͱ͋

15: }
ਤ 1

ϝιου validateFormʢ࿨Վࢁେֶ‫ڭ‬຿γεςϜதͷιʔεΕ͹ਅΛฦ͢ɽisContinueSearch() ͸୳ࡧΛ‫ܧ‬ଓ͢Δ͔ΛίʔυʣܾΊΔؔ਺Ͱ͋ΓɼϑΟʔϧυͷ֊૚ߏ଄Λ‫ʹج‬൑அ͢Δɽ
ਤ 2 ͷΞϧΰϦζϜ͸ҎԼͷ 4 ͭͷεςοϓͰߏ੒͞ΕͳΒͳ͍ͷ͕‫ݱ‬ঢ়Ͱ͋Δɽ

3. ఏҊख๏

͍ͯΔɽ

Step1ʢ1-5 ߦ໨ʣ ·ͣɼI(m) Λۭू߹ʹॳ‫ظ‬Խ͠ɼmͷҾ਺ͷར༻৘ใΛ I(m) ʹ௥Ճ͢Δɽ͜ͷͱ͖ɼҾຊ‫Ͱڀݚ‬͸ɼJava ϓϩάϥϜʹରͯࣗ͠ಈతʹ୳ࡧΛߦ਺ͷར༻৘ใͷ͏ͪϝιουɼߦ൪߸ɼRW ͸ۭͱ͍͢ɼࢦఆ͞Εͨϝιουͷೖྗͱͯ͠࢖ΘΕͨม਺ͷར༻Δ (ΞϧΰϦζϜͷ‫ه‬ड़্͸‫ۭͰ ”*“ ߸ه‬Λ͍ࣔͯ͠৘ใΛநग़͠ɼҰཡදࣔ͢Δ͜ͱͰɼϓϩάϥϜཧղࢧԉΔʣ
ɽ·ͨɼm ͱ m ͔ΒͷਪҠతͳ‫ͼݺ‬ग़ؔ͠܎Ͱ౸

Λߦ͏ɽม਺ͷར༻৘ใͱ͸ɼར༻͞Εͨม਺ɼม਺ΛརୡͰ͖Δϝιουͷू߹ R(m) Λ‫ٻ‬Ί͓ͯ͘ɽ༻͢Δϝιουɼม਺Λར༻໋ͨ͠ྩ͕͋ΔҐஔͷιʔε

Step2ʢ6-8 ߦ໨ʣ R(m) ͔ΒΫϥεม਺Λར༻͍ͯ͠

ίʔυ্ͷߦ൪߸ɼ໋ྩͷಡΈॻ͖ͷछผɼͷ 4 ཁૉͷ૊Δ໋ྩΛ୳͠ɼΫϥεม਺ͷར༻৘ใΛ I(m) ʹ௥ՃͰ͋ΓɼҎ߱ɼ(v:ม਺, m:ϝιου, l:ߦ൪߸, RW:ಡΈॻ͖ͷछผ) ͱ‫ه‬ड़͢Δɽ

͢Δɽ

Step3ʢ9-11 ߦ໨ʣ ελοΫ worklist ʹɼStep2 ·ͰͰຊ࿦จʹ͓͍ͯม਺ͱ͸ɼϝιουͷϩʔΧϧม਺ͱΫI(m) ʹ௥Ճͨ͠Ҿ਺ͱΫϥεม਺Λ௥Ճ͢Δɽ

ϥεม਺ɼͦͯ͠ϨγʔόʔΦϒδΣΫτΛද͢ this ͱɼ

Step4ʢ12-22 ߦ໨ʣ worklist ͔Βม਺Λ 1 ͭऔΓग़͢ɽͦΕΒ͔Β୧Δ͜ͱͷͰ͖ΔϑΟʔϧυΛࢦ͢ɽͨͱ͑͹ɼ

R(m) ʹ‫·ؚ‬ΕΔϑΟʔϧυΛར༻͢Δ໋ྩͷ͏ͪɼϩʔΧϧม਺ v ͱɼv ʹ֨ೲ͞ΕͨΦϒδΣΫτͷϑΟʔϨγʔόʔΦϒδΣΫτͱ worklist ͔ΒऔΓग़ͨ͠มϧυ f1ɼf1 ʹ֨ೲ͞ΕͨΦϒδΣΫτͷϑΟʔϧυ f2 ͕਺͕ΤΠϦΞεͰ͋Δ΋ͷ (m ͷ࣮ߦΑΓ΋લʹ࡞Βଘࡏ͢Δͱ͖ɼv, v.f1, v.f1.f2 ͕ม਺ͱͳΔɽΕͨΦϒδΣΫτΛ࢖༻͍ͯ͠ΔՄೳੑͷ͋Δ΋ͷʣຊ‫͍͓ͯʹڀݚ‬ɼϝιουͷೖྗม਺ͱ͸ɼϝιουͷ

Λྻ‫͢ڍ‬Δɽͦͯ͠ɼI(m) ʹϑΟʔϧυͷར༻৘ใΛ࣮ߦલʹॳ‫ظ‬ԽࡁΈͷม਺ͷ͏ͪɼϝιουͷ࣮ߦதʹΞ

௥Ճ͢Δɽ࠷‫ʹޙ‬ɼ୳ࡧΛଓ͚ΔͳΒ͹ v.f Λ worklist

Ϋηε͢Δม਺Λࢦ͢ɽϝιου m ͷೖྗม਺͸۩ମతʹ௥Ճ͢Δɽ

ʹ͸ҎԼͷ 3 ͕ͭ‫·ؚ‬ΕΔɽ• m ͷҾ਺ɽm ͕ΫϥεϝιουҎ֎ͷ৔߹ɼm ͷϨγʔόʔΦϒδΣΫτ΋‫ؚ‬Ήɽ• m ͷ࣮ߦதʹΞΫηε͢ΔՄೳੑͷ͋Δ͢΂ͯͷΫϥεม਺ɽ• m ͷ࣮ߦதʹΞΫηε͞ΕΔϑΟʔϧυͷ͏ͪɼm ͷ࣮ߦલʹॳ‫ظ‬Խ͞Ε͍ͯΔ΋ͷɽ

3.2 ϝιουͷೖྗม਺ͷར༻৘ใͷՄࢹԽຊεςοϓͰ͸ɼ3.1 ߲ͰಘΒΕͨϝιουͷೖྗม਺ͷར༻৘ใΛ੔ཧ͠ɼม਺ͱϑΟʔϧυͷ֊૚ߏ଄ʹ߹Θͤͨ໦ߏ଄Ͱදࣔ͢Δɽ͜ͷ໛ࣜਤΛਤ 3(a) ʹࣔ͢ɽࠜͱͯ͠ m ͷϝιου໊Λදࣔ͠ɼࠜͷࢠཁૉͱͯ͠Ҿ਺ɼͦͯ͠ I(m) ʹ‫·ؚ‬ΕΔΫϥεม਺͕ग़ྗ͞ΕΔɽ·ͨɼຊख๏͸ɼࢦఆ͞Εͨϝιου m ʹରͯ͠ɼm ͷೖྗϝιου͕ΠϯελϯεϝιουͰ͋ΔʢϨγʔόʔΦϒม਺ͷར༻৘ใͷू߹ I(m) Λநग़͠ɼ։ൃऀʹՄࢹԽ͢δΣΫτ͕Ҿ਺ʹ‫·ؚ‬Ε͍ͯΔʣͱ͖ɼthis Λࢠཁૉͱ͠

ʢ2ʣ
Δɽຊख๏͸ɼ
ʢ1ʣϝιου m ʹର͢Δ I(m) ͷऔಘɼͯՃ͑ΔɽI(m) ͷՄࢹԽɼͱ͍͏ 2 ͭͷεςοϓʹ෼͔Ε͓ͯΓɼҎ߱ͦΕͧΕʹ͍ͭͯৄղ͢Δɽ

c 1959 Information Processing Society of JapanҾ਺ʹ͍ͭͯ͸ɼI(m) ʹҾ਺Λ਌ͱ͢ΔϑΟʔϧυ͕‫ؚ‬·Ε͍ͯΕ͹ͦΕΛදࣔ͠ɼͦͷϑΟʔϧυʹରͯ͠ߦΘ

3৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Reportm

Input:
Output:

䝯䝋䝑䝗ྡ

ƚŚŝƐ

I(m)

䝣䜱䞊䝹䝗 ͗Z

1: I(m) ← ∅䝣䜱䞊䝹䝗 ͗tᘬᩘϭI(m)  (p, ∗, ∗, ∗)͙䜽䝷䝇ኚᩘϭ䠖 Zt

5: R(m) ← {m} ∪ reachables(m)͙䝯䝋䝑䝗䠖Zt΀⾜␒ྕ͕͙΁䝣䜱䞊䝹䝗 ͗Zt͙(a) I(m) ͷදࣔͷ໛ࣜਤ

do
7:

͙

䝣䜱䞊䝹䝗 ͗Zt

4: end for
6: for all (v, m , l, RW ) ∈ searchClassV ariableU sage(R(m))

䝯䝋䝑䝗䠖t͙͙

2: for p ∈ parameters(m) do
3:䝯䝋䝑䝗䠖Z΀⾜␒ྕ΁I(m)  (v, m , l, RW )8: end for
9: for all {v|(v, m , l, RW ) ∈ I(m)} do10:

worklist  v

11: end for
12: while not isEmpty(worklist) do
13:v ← pop(worklist)

14:

for all (x.f, m , l, RW ) ∈ f ieldU sage(R(m)) do

15:

if isAlias(v, x) then16:

I(m)  (v.f, m , l, RW )17:

if isContinueSearch(v.f ) thenworklist  (v.f )

18:
19:
20:
21:

end if(b) I(m) ՄࢹԽϏϡʔ

end if
ਤ 3

end forI(m) ͷ໛ࣜਤͱ࣮૷

22: end while
23: return I(m)
ਤ 2 I(m) ͷऔಘΞϧΰϦζϜ

͸ɼਤ 1 ͷ validateForm ͷ I(m) ΛՄࢹԽͨ݁͠ՌͷҰ
෦Ͱ͋Δɽਤதʹ͸ɼҾ਺ form ͷࢠཁૉʹ idɼuserIdɼ

userKubun ͷ 3 ͚͕ͭͩදࣔ͞Ε͓ͯΓɼϝιουͷ࣮ΕͨಡΈॻ͖ʹ͍ͭͯ΋දࣔ͢ΔʢਤதͰ͸ಡΈࠐΈΛ Rɼߦதʹ͜ΕΒ 3 ͭͷϑΟʔϧυ͔͠ΞΫηε͠ͳ͍͜ͱ͕

ɽ·ͨɼϑΟʔϧυʹ෇ਵॻ͖ࠐΈΛ W ͱද‫͍ͯ͠ݱ‬ΔʣҰ໨ͰΘ͔Δɽ·ͨɼHibernateUtil.SESSION ΋දࣔ͞Ε

͢Δ৘ใͱͯ͠ɼϑΟʔϧυΛಡΈॻ͖͢Δ໋ྩ͕͋Δϝ͓ͯΓɼσʔλϕʔεʹΞΫηε͢Δ͜ͱ͕Ұ໨Ͱ൑அͰ

ιουͷ໊લͱɼ໋ྩͷ͋Δߦ൪߸ͷू߹Λදࣔ͢Δɽ͖͞ΔɽΒʹɼϑΟʔϧυʹΦϒδΣΫτ͕֨ೲ͞ΕΔ৔߹͸ɼͦఏҊख๏ͷதͰ࣮૷ͷύϥϝʔλͱͨ͠ 3 ͭͷؔ਺ʹͭͷΦϒδΣΫτͷϑΟʔϧυ΁ͷΞΫηε͕ I(m) ʹ‫·ؚ‬͍ͯ͸ҎԼͷ௨ΓʹఆΊͨɽ·ͣɼreachables() Ͱ‫ͼݺ‬ग़Ε͍ͯΕ͹ɼϑΟʔϧυͷࢠཁૉͱͯ͠ɼಉ༷ʹϑΟʔϧ͞ΕΔϝιουΛऔಘ͢Δͱ͖ͷಈతଋറͷղܾʹ͸ɼ‫ݺ‬υͷ৘ใΛ௥Ճ͍ͯ͘͠ɽ

ͼग़͢Մೳੑͷ͋ΔϝιουΛ࿙Εແ͘औಘͰ͖ΔΫϥεΫϥεม਺ʹ͍ͭͯ͸ɼΫϥεม਺ࣗ਎ʹର͢ΔಡΈॻ֊૚ղੳ [14] Λ༻͍ͨɽisAlias() Ͱ༻͍ΔΤΠϦΞεղੳ͖ɼΫϥεม਺ʹର͢ΔಡΈॻ͖ͷ໋ྩͷ͋Δϝιου

ʹ͸ɼJava Λର৅ͱ࣮ͯ͠ߦͰ͖ɼߴ଎ʹಈ࡞͢Δ Yan Βͷ৘ใΛදࣔ͢Δɽ·ͨɼΫϥεม਺ͷ࣋ͭϑΟʔϧυ͕ͷख๏ [15] Λ༻͍ͨɽ࠷‫ʹޙ‬ɼisContinueSearch() Ͱߦ͏I(m) ʹ‫·ؚ‬Ε͍ͯΕ͹ɼಉ༷ʹදࣔΛߦ͏ɽ୳ࡧͷଧͪ੾Γʹ͍ͭͯ͸ɼҾ਺͓ΑͼΫϥεม਺͔Β 2

4. ࣮૷
࣮૷Ͱ͸ɼϝιου͔Β I(m) Λ‫ٻ‬ΊΔղੳ෦ͱɼI(m)ͷදࣔ෦ΛɼผʑͷϓϩάϥϜͱ࣮ͯ͠૷ͨ͠ɽI(m) ͷදࣔ෦͸ Eclipse ϓϥάΠϯͰ͋Γɼ‫ى‬ಈ࣌ʹղੳ݁ՌΛ͢

ஈ֊·ͰͷϑΟʔϧυࢀরͰΞΫηεͰ͖Δม਺·ͰΛղੳ͠ɼͦΕΑΓઌͷϑΟʔϧυ͸୳ࡧ͠ͳ͍ͱ͍͏࣮૷ʹͨ͠ɽ

5. ධՁ࣮‫ݧ‬΂ͯಡΈࠐΈɼEclipse ͷ Java ιʔείʔυΤσΟλ্ͰຊπʔϧʹΑΓϝιουͷཧղ͕ଅਐ͞ΕΔ͜ͱͰɼϓΫϦοΫ͞Εͨϝιου m ʹର͠ɼI(m) ΛπϦʔϏϡʔϩάϥϜཧղͷ࡞‫ۀ‬ͷ଎౓ͱਖ਼͕֬͞޲্͢Δ͔֬ೝ͢‫Ͱࣜܗ‬ΛՄࢹԽ͢Δɽࠜʹ͸ɼΫϦοΫͨ͠ϝιουͷ໭ΔͨΊධՁ࣮‫ݧ‬Λߦͬͨɽຊ࣮‫Ͱݧ‬͸ɼ2 ͭͷΞϓϦέʔΓ஋ͱγάωνϟΛද͍ࣔͯ͠Δɽ͞Βʹɼม਺Λར༻͢γϣϯΛର৅ʹϓϩάϥϜཧղͷ՝୊Λඃ‫ʹऀݧ‬ղ౴ͯ͠Δ໋ྩͷ͋Δϝιουͷϝιου໊ΛμϒϧΫϦοΫ͢Ε΋Β͍ɼπʔϧͷ༗ແʹΑΔ՝୊ͷਖ਼౴཰ͱղ౴࣌ؒͷ༗͹ɼͦͷϝιου͕͋ΔΫϥεʹδϟϯϓͰ͖Δɽਤ 3(b)ҙͳ͕ࠩ͋Δ͔ௐࠪ͢Δɽ

c 1959 Information Processing Society of Japan

4৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Report

5.1 ࣮‫ํݧ‬๏

ද 1 ՝୊ͷׂΓ౰ͯ

1 ճ໨

2 ճ໨

ඃ‫ ऀݧ‬A,B

ArgoUMLʢ༗ʣ

GanttProject(ແʣඃ‫ ऀݧ‬C,D

GanttProject(ແʣArgoUMLʢ༗ʣඃ‫ ऀݧ‬E,F

ArgoUMLʢແʣ

GanttProject(༗ʣඃ‫ ऀݧ‬G,H

GanttProject(༗ʣArgoUMLʢແʣඃ‫ऀݧ‬͸ɼେࡕେֶ‫ֶ޻ૅج‬෦৘ใՊֶՊͷ 4 ೥ੜ 3 ਓͱɼେࡕେֶେֶӃ৘ใՊֶ‫ڀݚ‬Պത࢜લ‫ظ‬՝ఔ 1 ೥ͷֶੜ 5 ਓͰ͋Δɽશඃ‫ऀݧ‬͸ɼ‫׆ڀݚ‬ಈΛ௨ͯ͡ɼJava ͱJava ͷ౷߹։ൃ‫͋Ͱڥ؀‬Δ Eclipse ʹशख़͍ͯ͠Δɽඃ‫ݧ‬ऀͷϓϩάϥϛϯά‫ݧܦ‬͸ 4 ೥͔Β 7 ೥Ͱ͋ΓɼJava ϓϩάϥϛϯάͷ‫ݧܦ‬͸ 1 ೥͔Β 6 ೥Ͱ͋Δɽද 2࣮‫Ͱݧ‬͸ɼඃ‫ऀݧ‬͸ 2 ͭͷΞϓϦέʔγϣϯʹରͯ͠՝୊ͷਖ਼౴཰

ArgoUML

GanttProjectϓϩάϥϜཧղͷ࡞‫ۀ‬ΛߦͳͬͨɽͦͷࡍɼҰํͷΞϓϦπʔϧ༗Γ

0.5ʢ4 ਓத 2 ໊ʣ

0.25ʢ4 ਓத 1 ໊ʣέʔγϣϯ͸πʔϧ༗ΓͰ࡞‫͠ۀ‬ɼ΋͏ҰํͷΞϓϦέʔπʔϧແ͠

0.25ʢ4 ਓத 1 ໊ʣ

0.25ʢ4 ਓத 1 ໊ʣγϣϯͰ͸πʔϧແ͠Ͱ࡞‫ͨ͠ۀ‬ɽͦͯ͠ɼ՝୊ͷਖ਼౴཰ͱղ౴࣌ؒΛଌఆͨ͠ɽ

ͭ࡞Γɼ৽‫ن‬λεΫͷ 1 ͭΛ΋͏ҰํͷλεΫͷઌߦ࣮‫Ͱݧ‬ඃ‫ʹऀݧ‬ϓϩάϥϜཧղΛߦͬͯ΋Β͏ΞϓϦλεΫʹઃఆ͢Δɽͦͯ͠ɼઌߦλεΫͷऴྃ೔Λ‫ݩ‬έʔγϣϯʹ͸ɼJava ‫هͰޠݴ‬ड़͞ΕɼΦʔϓϯιʔεͷऴྃ೔ΑΓ‫ޙ‬ΖʹͣΒ͢ͱɼઌߦλεΫʹґଘͯ͠ιϑτ΢ΣΞͱͯ͠഑෍͞Ε͍ͯΔɼUML ਤ࡞੒πʔϧ͍ΔλεΫͷ։࢝೔΋ࣗಈతʹ‫ޙ‬ΖʹͣΕΔ͜ͱΛ֬

ArgoUML 0.34[16] ͱΨϯτνϟʔτ࡞੒πʔϧ GanttPro-ೝ͢Δɽ

ject 2.0.9[17] Λબ୒ͨ͠ɽArgoUML ͸.java ϑΝΠϧ͕਺

1 ΞϓϦέʔγϣϯͷ՝୊ͷ੍‫ؒ࣌ݶ‬͸ 45 ෼Ͱ͋Δɽ੍

2289 Ͱɼ໿ 190KLOC Ͱ͋ΔɽGanttProject ͸.java ϑΝ‫ʹؒ࣌ݶ‬ୡͨ࣌͠఺Ͱ࡞‫ۀ‬͸ऴྃͱ͢Δ͕ɼඃ‫ऀݧ‬͸՝୊Πϧ͕ 478 ϑΝΠϧͰɼ໿ 44KLOC Ͱ͋Δɽ͕ղ౴Ͱ͖ΔͳΒ͹ղ౴͢Δɽ͜ͷͱ͖ɼ՝୊ͷղ౴ʹ͔֤ΞϓϦέʔγϣϯͷ՝୊͸ҎԼͷ௨ΓͰ͋Δɽ

͔ͬͨ࣌ؒ͸੍‫ؒ࣌ݶ‬ͷ 45 ෼ͱ͢Δɽ

ArgoUML ΋͠ɼArgoUML ͷελʔτΞοϓ࣌ʹۭͷ՝୊ʹର͢ΔֶशޮՌͳͲΛߟྀ͠ɼඃ‫ʹऀݧ‬ର͢ΔΞ

ΫϥεਤͰ͸ͳ͘ɼۭͷγʔέϯεਤΛग़͢Α͏վ଄ϓϦέʔγϣϯͷׂΓ౰ͯ͸ද 1 ͷΑ͏ʹߦͬͨɽදதͷ

͢Δͱͨ͠ΒɼͲͷΫϥεΛมߋ͢Δඞཁ͕͋Δ͔ɼ

ʢ༗ʣͱʢແʣ͸πʔϧͷ༗ແΛ͍ࣔͯ͠Δɽ·ͨɼ࣮‫ݧ‬͸Ϋϥε໊Λ౴͑Αɽඃ‫ ऀݧ‬1 ਓͣͭ‫ݸ‬ผʹߦ͏ɽ

GanttProject GanttProject ͸ઌߦλεΫͷ‫ػ‬ೳΛαͳ͓ɼϓϩάϥϜશମΛҰ੾ͷख͕͔Γແ͠Ͱ୳ࡧ͢Δϙʔτ͍ͯ͠ΔɽઌߦλεΫͷλεΫ‫͕ؒظ‬มԽͨ͠ʹ͸࡞‫͕ؒ࣌ۀ‬଍Γͳ͍ͱߟ͑ɼ՝୊ʹؔ࿈ͷ͋ΔΫϥεͱ͖ɼઌߦλεΫʹґଘ͍ͯ͠ΔλεΫͷλεΫ‫ؒظ‬ͱͯ͠ɼҎԼʹࣔ͢ΫϥεΛఏࣔͨ͠ɽΛߋ৽͢Δͷ͸ɼͲͷίʔυ͔ɼϝιου໊ͱߦ൪߸

ArgoUML org.argouml.uml.diagramΛ౴͑Αɽ࡞‫ۀ‬ͷ࣮ࢪखॱ͸ҎԼͷ௨ΓͰ͋Δɽ

.static structure.ClassDiagramGraphModel
GanttProject net.sourceforge.ganttproject.GanttTask( 1 ) ඃ‫ऀݧ‬ͷ Eclipse ʹؔ͢Δ஌ࣝΛฏ‫ۉ‬Խ͢ΔͨΊɼ࡞‫ʹڥ؀ۀ‬͸ɼ27 ΠϯνͷσΟεϓϨΠʢղ૾౓ 1920

Eclipse ͷ୅දతͳ 5 ͭͷ‫ػ‬ೳʹ͍ͭͯͷϨΫνϟʔΛ× 1200ʣ1 ຕͱ Eclipse 3.7 Λ࢖༻ͨ͠ɽͦͯ͠ղ౴ͷࡍʹߦ͏ɽຊ࣮‫ Ͱݧ‬Eclipse ͷ୅දతͳ 5 ͭͷ‫ػ‬ೳͱͨ͠͸ɼղ౴༻ࢴʹϘʔϧϖϯͰ‫ه‬ड़ͯ͠΋Βͬͨɽଞʹ࢖༻

ͷ͸ɼFile SearchɼJava SearchɼOpen Call HierarchyɼՄೳͳͷ͸ɼWindows ඪ४ͷϝϞாʢnotepad.exeʣͱϝOpen Type HierarchyɼOpen Declaration Ͱ͋ΔɽϞ༻ࢴ͚ͩͰ͋Δɽ

( 2 ) ຊπʔϧʹ͍ͭͯͷϨΫνϟʔΛߦ͏ɽ( 3 ) 1 ͭ໨ͷΞϓϦέʔγϣϯͷϢʔεέʔεΛඃ‫ʹऀݧ‬‫ͤݟ‬Δɽ

( 4 ) 1 ͭ໨ͷΞϓϦέʔγϣϯʹର͢Δ࣮‫ݧ‬Λߦ͏ɽ( 5 ) 2 ͭ໨ͷΞϓϦέʔγϣϯͷϢʔεέʔεΛඃ‫ʹऀݧ‬‫ͤݟ‬Δɽ

( 6 ) 2 ͭ໨ͷΞϓϦέʔγϣϯʹର͢Δ࣮‫ݧ‬Λߦ͏ɽඃ‫ ͨࣔ͠ʹऀݧ‬ArgoUML ͱ GanttProject ͷϢʔεέʔε͸ҎԼͷ௨ΓͰ͋Δɽ

5.2 ࣮‫݁ݧ‬Ռ֤՝୊ͷղ౴࣌ؒͷ෼෍ʹ͍ͭͯɼπʔϧͷ༗ແʹΑΒͣ՝୊ͷΞϓϦέʔγϣϯͰάϧʔϓԽͨ͠ղ౴࣌ؒͷ෼෍Λਤ 4(b) ʹɼπʔϧͷ༗ແͷΈͰάϧʔϓԽͨ͠ղ౴
࣌ؒͷ෼෍Λਤ 4(a) ʹࣔ͢ɽͨͩ͠ɼArgoUML ͷ՝୊Λπʔϧແ͠Ͱղ͍ͨඃ‫ ऀݧ‬1 ੍໊͕‫ʹؒ࣌ݶ‬౸ୡͨ͠ࡍ
ʹղ౴Ͱ͖ͳ͔ͬͨͨΊɼͦͷ஋͸ܽଛ஋ͱͨ͠ɽ
ਤ 4(a) ΑΓɼπʔϧ༗Γͷඃ‫ऀݧ‬ͷํ͕ɼπʔϧແ͠ͷ

ArgoUML ArgoUML Λ‫ى‬ಈ͠ɼۭͷΫϥεਤ͕‫ݱ‬ΕΔඃ‫ऀݧ‬ΑΓ΋ɼ୳ࡧΛऴ͑ͨͱࢥ͏·Ͱͷ͕࣌ؒૣ͔ͬͨ

͜ͱΛ֬ೝ͠ɼΫϥεਤதʹۭͷΫϥεΛ 2 ͭ഑ஔ͜ͱ͕෼͔Δɽ·ͨɼਤ 4(b) ͕ࣔ྆͢ΞϓϦέʔγϣϯ͢Δɽͷඃ‫ऀݧ‬ͷղ౴࣌ؒΑΓɼ2 ͭͷ՝୊ͷղ౴࣌ؒʹେ͖ͳ

GanttProject GanttProject Λ‫ى‬ಈ͠ɼ৽‫ن‬λεΫΛ 2

c 1959 Information Processing Society of Japanࠩ͸ແ͔ͬͨ͜ͱ͕෼͔ΔɽΑͬͯɼຊπʔϧʹ͸ɼ࡞‫ۀ‬

5৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportͦͷͨΊɼຊπʔϧʹΑΓϓϩάϥϜཧղࢧԉͰਖ਼͍͠ղ
2500

ΛಘΔͨΊͷࢧԉ͸Ͱ͖ͳ͔ͬͨͱߟ͑ΒΕΔɽ͜ͷཧ༝ͱͯ͠͸ɼ՝୊͕೉͗ͨ͢͠ɼϓϩάϥϜʹؔ͢Δ༧උ஌

2000

͕ࣝແ͔ͬͨͨΊม਺໊͔Βͦͷม਺ͷ໾ׂΛਪଌ͢Δͷ

1500͕ࠔ೉Ͱ͋ͬͨͱ͍͏͜ͱ͕ߟ͑ΒΕΔɽ
՝୊ͷ࣮ߦதɼຊπʔϧ͸ɼม਺ͷ࢖ΘΕํͷ֬ೝɼॲ

1000ཧͱؔ࿈͕͋Δ໊લͷม਺ͷ‫ࡧݕ‬ɼΞΫηε͞ΕΔϑΟʔ

500ϧυͷ‫ࡧݕ‬ɼॲཧͱؔ࿈͕͋ΔϝιουͷӾཡʹ࢖ΘΕ͍ͯͨɽ·ͨɼҰ෦ͷඃ‫ऀݧ‬͸ɼϑΟʔϧυʹΞΫηεͯ͠tool

w/o tool(a) πʔϧ༗ແͰάϧʔϓԽ͍Δϝιου͕͋ΔΫϥε΁δϟϯϓ͢Δ‫ػ‬ೳΛ޷ΜͰ͍ͨɽ‫ʹٯ‬δϟϯϓ‫ػ‬ೳͰɼ௚઀ΞΫηεՕॴʹඈ΂ͳ͍͜ͱΛෆຬͱ͍ͯͨ͠ඃ‫ऀݧ‬΋͍ͨɽຊπʔϧͰϝιουͷೖྗҰཡΛग़ͨ͠ࡍɼπʔϧ্ʹ2500දࣔ͞ΕΔཁૉͷ਺͕‫ʹ୺ۃ‬ଟ͍͜ͱ͕Կ౓͔͋ͬͨͨ

2000Ίɼ͜Εʹ͍ͭͯ௥ՃͷௐࠪΛߦͬͨɽਤ 5(a) ͱਤ 5(b)1500͸ɼͦΕͧΕ ArgoUML ͱ GanttProject ʹର͢Δදࣔ݁Ռͷ͏ͪɼ1 ϝιουຖͷɼಡࠐͷΈʢπʔϧ্Ͱ͸ Rʣͱ

1000

දࣔ͞ΕͨϑΟʔϧυ·ͨ͸Ϋϥεม਺ͷ਺ʹ͍ͭͯͷώ500ετάϥϜͰ͋ΔɽώετάϥϜͷԣ࣠͸ R ͱදࣔ͞Εͨཁૉͷ਺Ͱɼॎ࣠͸ϝιου਺Ͱ͋ΔɽਤΑΓɼຆͲͷϝ
ArgoUML

GanttProject(b) ΞϓϦέʔγϣϯͰάϧʔϓԽਤ 4՝୊ͷղ౴࣌ؒ

ιουͰ͸‫ͳ͔ۇ‬ϑΟʔϧυͱΫϥεม਺͔͠දࣔ͞Ε͍ͯͳ͍͕ɼҰ෦ͷϝιουͰ͸ɼ50 ‫ݸ‬΍ 100 ‫ݸ‬Ҏ্ͷཁૉ͕දࣔ͞Εͯ͠·͏͜ͱ͕෼͔Δɽ͜ͷ܏޲͸ɼॻࠐͷΈʢπʔϧ্Ͱ͸ Wʣͱදࣔ͞Εͨཁૉ΍ಡΈॻ͖྆ํʢπʔϧ্Ͱ͸ RWʣͱදࣔ͞ΕͨཁૉͰ΋มΘΒͳ͔ͬͨɽද

ऀͷ୳ࡧ࣌ؒΛ‫ݮ‬Β͢ޮՌ͕͋ͬͨͱߟ͑ΒΕΔɽ

ࣔ͞ΕΔཁૉ਺͕͜ͷΑ͏ʹଟ͍৔߹ɼඃ‫͕ऀݧ‬πʔϧग़࡞‫ؒ࣌ۀ‬ͷ͕ࠩ༗ҙͰ͋Δ͔Ͳ͏͔‫͢ূݕ‬ΔͨΊɼπʔྗΛӾཡ͠ɼ༗༻ͳ৘ใΛಘΔͷ͸ࠔ೉ͩͬͨͱߟ͑ΒΕϧ༗Γͷඃ‫ऀݧ‬ͷ࡞‫ͱؒ࣌ۀ‬πʔϧແ͠ͷඃ‫ऀݧ‬ͷ࡞‫࣌ۀ‬Δɽ࣮‫Ͱݧ‬΋ɼඃ‫͕ऀݧ‬πʔϧͷग़ྗͷಡղΛఘΊΔ༷ࢠؒΛ΢ΟϧίΫιϯͷූ߸ॱҐ࿨‫ݕ‬ఆʹΑΓɼยଆ‫ݕ‬ఆΛ͕‫؍‬ଌ͞Εͨɽߦͬͨɽ‫ؼ‬ແԾઆ͸ʮπʔϧ༗Γͷඃ‫ऀݧ‬ͷ࡞‫ؒ࣌ۀ‬ͷ฼୅ද஋͸ɼπʔϧແ͠ͷඃ‫ऀݧ‬ͷ࡞‫ؒ࣌ۀ‬ͷ฼୅ද஋ͱࠩ

࣮‫݁ݧ‬ՌͱஶऀΒͷ‫ʹݧܦ‬ΑΓɼຊπʔϧ͸࣍ͷΑ͏ͳ৔߹ʹ༗ޮͰ͋Δͱߟ͑ΒΕΔɽ͸ͳ͍ʯɼରཱԾઆ͸ʮπʔϧ༗Γͷඃ‫ऀݧ‬ͷ࡞‫ؒ࣌ۀ‬ͷ฼• ॏཁͳάϩʔόϧม਺͕ࣄલʹ෼͔͍ͬͯΔ৔߹ɽ୅ද஋͸ɼπʔϧແ͠ͷඃ‫ऀݧ‬ͷ࡞‫ؒ࣌ۀ‬ͷ฼୅ද஋ΑΓ

ਤ 1 ͷྫͰ͸ɼਤ 3(b) ΑΓɼHibernateUtil.SESSION

΋খ͍͞ʯͰ͋Δɽ‫ݕ‬ఆͷ݁Ռɼp ஋=0.07752 ͕ಘΒΕɼΛར༻͍ͯ͠Δ͜ͱ͕Θ͔ΓɼσʔλϕʔεʹΞΫη༗ҙਫ४ 5%Ͱ͸‫ؼ‬ແԾઆ͕࠾୒͞Εɼ༗ҙਫ४ 10%Ͱ͸ε͍ͯ͠Δͱ൑அͰ͖Δɽ

ରཱԾઆ͕࠾୒͞Εͨɽ• ར༻͞ΕΔม਺Λ೺Ѳ͢Δ͜ͱ͕ॏཁͳ৔߹ɽਤ 1 ͷσʔλϑϩʔάϥϑΛՄࢹԽ͢ΔӻాΒ [13] ͷख๏ͱൺྫͰ͸ɼਤ 3(b) ΑΓɼҾ਺ form ͷ࣋ͭϑΟʔϧυͷֱͨ͠৔߹ɼ൴Βͷରর࣮‫Ͱݧ‬͸༗ҙਫ४ 5%Ͱ༗ҙࠩΛ֬͏ͪɼϝιουͷ࣮ߦதʹར༻͞ΕΔϑΟʔϧυ͕ 3ೝ͓ͯ͠Γɼൺֱ‫ج‬४ͷҧ͍͸͋Δ͕ɼӻాΒͷख๏ͷํ͚ͭͩͩͱ෼͔Ε͹ɼͦΕҎ֎ͷϑΟʔϧυ͸‫͠ূݕ‬͕ޮՌ͕໌֬ʹදΕ͍ͯΔɽͦͷཧ༝ͷ 1 ͭͱͯ͠ɼ՝୊

͍ͯͳ͍ͱ൑அͰ͖Δɽ

ͷੑ࣭͕ߟ͑ΒΕΔɽຊ࣮‫ݧ‬ͷ՝୊Ͱ͸ɼར༻͞ΕͨσʔҰํͰɼม਺ͷ࢖ΘΕํ͕ॏཁͳ৔߹΍ɼଟ਺ͷม਺͕λ߲໨Λྻ‫͢ڍ‬Δ͚ͩͰ͸ͳ͘ɼͦΕΒͷσʔλ߲໨ͷ࢖ར༻͞ΕΔ৔߹ʹ͸ຊπʔϧ͸͋·Γ༗ޮͰͳ͍ͱߟ͑

ΘΕํ΋֬ೝ͢Δඞཁ͕͋ͬͨɽӻాΒͷπʔϧ͸ɼσʔΒΕΔɽม਺ͷ࢖ΘΕํ͕ॏཁͳ৔߹ͷରࡦͱͯ͠͸ɼຊλ߲໨ͷྻ‫ڍ‬͸ख࡞‫͋Ͱۀ‬Δ͕ɼσʔλ߲໨ͷ࢖ΘΕํͷπʔϧͷδϟϯϓ‫ػ‬ೳΛ֦ॆ͢Δ͜ͱɼϝιουͷίʔϧௐࠪʹ͸ຊπʔϧΑΓ΋༗ޮʹಇ͍ͨͱߟ͑ΒΕΔɽ

άϥϑͱ߹Θͤͯදࣔ͢Δ͜ͱͰɼσʔλϑϩʔͷ୳ࡧͷ

·ͨɼਖ਼౴཰ʹ͍ͭͯɼ՝୊ͱπʔϧͷ༗ແͰάϧʔϓࢧԉ΋ߦ͏͜ͱ͕ߟ͑ΒΕΔɽଟ਺ͷม਺͕ར༻͞ΕΔ৔

Խͨ݁͠ՌΛද 2 ʹࣔ͢ɽද 2 ͷ௨Γɼπʔϧͷ༗ແʹؔ߹ʹ͸ɼม਺ͷάϧʔϓԽͯ͠දࣔ͢Δͱ͍͏͜ͱ͕ߟ͑

ΘΒͣਖ਼౴཰͸௿͘ɼଟ͘ͷඃ‫ऀݧ‬͸ਖ਼౴Ͱ͖ͳ͔ͬͨɽ

ΒΕΔɽͨͱ͑͹ɼσʔλϕʔεʹؔ͢Δάϩʔόϧม਺c 1959 Information Processing Society of Japan

6৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical Report࣮‫ݧ‬ର৅ͷϓϩάϥϜʹର͢Δ஌ࣝ ඃ‫ऀݧ‬͸Έͳ࣮‫ݧ‬ର
15000

৅ͷϓϩάϥϜͰ͋Δ ArgoUML ͱ GanttProject ʹର͢ΔอकΛߦͬͨ͜ͱ͕ແ͘ɼਂ͍஌ࣝ͸͍࣋ͬͯ

10000ͳ͔ͬͨɽ࣮ࡍʹ͸ಡղͷର৅ͱͳΔιϑτ΢ΣΞʹ
#methodର͢Δ஌ࣝΛ࣋ͬͨঢ়ଶͰϓϩάϥϜཧղΛߦ͏৔߹΋͋Γɼͦͷ৔߹ຊ࣮‫ݧ‬ͷ݁Ռ͕‫׬‬શʹ౰ͯ͸·Δͱ

5000͸‫͍ͳ͑ݴ‬ɽ0

6. ؔ࿈‫ڀݚ‬
0

100

200

300

400

500

6.1 ϓϩάϥϜཧղʹؔ͢Δؔ࿈‫ڀݚ‬ຊ‫ڀݚ‬ͷϓϩάϥϜཧղͷଆ໘Ͱؔ࿈͢Δ‫ͯ͠ͱڀݚ‬ɼ

#RϓϩάϥϜεϥΠγϯά͕‫͛ڍ‬ΒΕΔɽϓϩάϥϜεϥΠ(a) ArgoUMLγϯά͸ɼ͋Δม਺΍จΛର৅ʹɼͦͷม਺ʹґଘ͢Δจ
4000

Λநग़͢Δख๏Ͱ͋Δ [6], [7], [8], [9], [10], [11], [12]ɽϓϩάϥϜεϥΠγϯάΛ༻͍Δ͜ͱͰɼͨͱ͑͹ɼ͋ΔҾ਺਺͕ಡΈࠐ·ΕΔՕॴɼॻ͖͜·ΕΔՕॴͷಛఆʹ༗༻Ͱ

2000

͋Δͱߟ͑ΒΕΔɽ
·ͨɼσʔλϑϩʔΛՄࢹԽ͠ɼϓϩάϥϜཧղΛࢧԉख๏͢Δख๏ʹ͍ͭͯɼӻాΒ [13] ͸ɼσʔλϑϩʔάϥ

1000#method3000΍ϑΟʔϧυʹؔ܎͢Δจ͚ͩΛநग़͢Δ͜ͱ͕Ͱ͖ɼม

ϑͷՄࢹԽʹΑΔίʔυφϏήʔγϣϯπʔϧΛఏҊ͠
0ͨɽ͜ͷπʔϧ͸σʔλϑϩʔΛάϥϑͱͯ͠ΈΔ͜ͱʹ
0

50

100

150

200

250

300

#R

(b) GanttProjectਤ 5ಡࠐͷΈͱදࣔ͞ΕͨϑΟʔϧυͱΫϥεม਺ͷ਺ͷ෼෍ΑΓɼෳ਺ͷίʔυยΛର৅ʹԣஅతʹσʔλϑϩʔΛௐࠪ͢Δࡍ༗ޮʹಇ͘ɽ͜Ε͸ϝιουͷҾ਺͕࣋ͭϑΟʔϧυͷ͏ͪɼ࢖༻͞ΕΔϑΟʔϧυͷௐࠪΛߦ͏ࡍ΍ɼϝιουʹೖྗ͞ΕΔσʔλͷ࢖༻๏Λௐࠪ͢Δࡍʹ໾ཱͭͱߟ͑ΒΕΔɽͷҰ‫܈‬Λ·ͱΊͯɼʮσʔλϕʔεʯͱ͍͏߲໨Ͱදࣔ͢Δ
ͱ͍͏͜ͱΛߟ͍͑ͯΔɽ྆‫ʹڀݚ‬ରͯ͠ຊ‫Ͱڀݚ‬͸ɼ࠷ऴతͳग़ྗ͕σʔλͷҰཡͱͳ͍ͬͯΔɽͦͷͨΊɼϓϩάϥϜεϥΠγϯάͷग़
ྗͰ͋Δจͷू߹ΑΓ΋ग़ྗͷαΠζ͸খ͍͞ɽ·ͨɼӻ

5.3 ଥ౰ੑ΁ͷ‫ڴ‬ҖాΒͷख๏ʹΑΔσʔλϑϩʔΛՄࢹԽͨ͠৔߹ͱҟͳ՝୊ͷҰൠੑ ಡղͷର৅ͱͨ͠ͷ͸ɼ࣮ࡍʹ഑෍͞ΕͯΓɼϝιουͷೖྗΛ೺Ѳ͢ΔࡍʹσʔλϑϩʔΛπʔϧ͍ΔΦʔϓϯιʔειϑτ΢ΣΞͰ͋Γɼ໰୊͸‫ػ‬ೳͷ࢖༻ऀ͕ࣗΒ୳ࡧ͢Δඞཁ͸ແ͍ɽͷ࣮૷ՕॴΛ୳͢ɼ͍ΘΏΔϑΟʔνϟʔϩέʔγϣ
ϯ·ͨ͸ίϯηϓτϩέʔγϣϯ [18], [19], [20] Ͱ͋Δɽ͜Ε͸‫࣮ݱ‬ͷϓϩάϥϜཧղͰ΋ߦΘΕΔ࡞‫Ͱۀ‬͋ΓɼҰൠతͳ࡞‫͋Ͱۀ‬Δͱߟ͍͑ͯΔɽ

6.2 ղੳख๏ʹؔ͢Δؔ࿈‫ڀݚ‬ಈతଋറͷղܾʹ͸ɼ࣮૷Ͱ༻͍ͨΫϥε֊૚ղੳ [14]ͷଞʹɼVariable Type Analysis[21]ɼRapid Type Analy-ඃ‫ʹऀݧ‬ର͢Δઆ໌ͷࠩ ຊ࣮‫ݧ‬͸ɼඃ‫ݸʹͱ͝ऀݧ‬ผʹ

sis[22] ౳͕ఏҊ͞Ε͍ͯΔɽΑΓਖ਼֬ͳಈతଋറͷղܾํ࣮‫ݧ‬Λߦͳ͓ͬͯΓɼEclipse ΍ຊπʔϧͷઆ໌ʹର๏Λ༻͍Ε͹ɼ࣮ࡍʹ͸ΞΫηε͠ಘͳ͍Ϋϥεม਺΍͕ͯࠩ͠ੜ·ΕΔՄೳੑ͕͋Δɽ͔͠͠ɼઆ໌ͷࡍʹϑΟʔϧυΛɼI(m) ͔ΒऔΓআ͘͜ͱ͕Ͱ͖Δͱߟ͑Β͸ɼಉ͡‫ߘݪ‬ΛಡΈ্͛ɼಉ͡ςΩετΛ༻͍ͯઆ໌

ΕΔɽ

ΛߦͬͨͷͰɼ͜ͷཁૉ͸࣮‫݁ݧ‬ՌʹӨ‫ڹ‬Λ༩͍͑ͯͳ͍ͱߟ͑ΒΕΔɽ

͔͠͠ɼΫϥε֊૚ղੳ͸ɼϦϑϨΫγϣϯΛߟྀ͠ͳ͍‫ݶ‬Γ͸ɼಈతଋറʹΑΓ‫ͼݺ‬ग़͠ಘΔϝιουશͯΛ໢ඃ‫ऀݧ‬ͷٕྔ ࢀՃऀ͸ֶੜͰ͋Γɼ՝୊ɾ‫ͰͲͳڀݚ‬ཏ͢Δ͜ͱ͕Ͱ͖Δͱ͍͏ར఺͕͋Δɽ͜ΕʹΑΓɼΞΫ

Java ϓϩάϥϛϯάͱ Eclipse ͷ࢖༻ํ๏ʹशख़ͯ͠ηε͢ΔՄೳੑͷ͋Δม਺͕ I(m) ͔Β࿙ΕΔ͜ͱ͸ແ͘

͍Δ͕ɼ‫ۀا‬ͷख़࿅࿑ಇऀͱൺ΂Δͱະख़Ͱ͋ΔɽͦͳΔͨΊɼ࣮૷Ͱ͸ຊख๏Λ༻͍ͨɽͨͩ͠ɼI(m) ʹ࣮ࡍͷͨΊɼ‫ۀا‬ͷख़࿅࿑ಇऀΛඃ‫ͨ͠ʹऀݧ‬৔߹͸ҟͳʹ͸ΞΫηε͠ಘͳ͍ม਺͕‫·ؚ‬ΕΔՄೳੑ͸ଘࡏ͢Δɽ

Δ࣮‫݁ݧ‬ՌͱͳΓ͏Δɽ

c 1959 Information Processing Society of Japanຊ‫Ͱڀݚ‬ղੳͷࡍʹ༻͍ͨΤΠϦΞεղੳɼ·ͨΤΠϦ

7৘ใॲཧֶձ‫ڀݚ‬ใࠂ
IPSJ SIG Technical ReportΞεղੳͷҰछͰ͋ΔϙΠϯλղੳʹ͸ɼ༷ʑͳख๏͕ఏ

[9]Ҋ͞Ε͍ͯΔ [15], [23], [24], [25]ɽ ͪ͜Β΋ΑΓਖ਼֬ͳख๏Λ༻͍Ε͹ɼਖ਼֬ʹΤΠϦΞεΛಛఆ͢Δ͜ͱ͕Ͱ͖ɼ
࣮ࡍʹ͸ϝιουͷೖྗͰͳ͍σʔλΛ I(m) ͷղੳ݁Ռ[10]͔Βআ‫͖Ͱڈ‬Δɽ͔͠͠ɼਖ਼֬ͳख๏Λ༻͍Ε͹ɼ࣌ؒతɾۭؒతίετ͸૿େ࣮͠༻తͳΞϓϦέʔγϣϯͷα
ΠζͰ͸ɼΤΠϦΞεղੳΛߦ͏ͷ͕೉͘͠ͳΔɽͦͷͨ

[11]Ίɼ࣮૷Ͱ͸ߴ଎ͳղੳ͕Մೳͳ Yan Βͷख๏ [15] Λ༻͍ͨɽ΋͠ɼΑΓਖ਼֬ͳղੳΛ༻͍ΔͷͰ͋Ε͹ɼ୳ࡧ͢ΔϝιουͷίʔϧπϦʔͷਂ͞Λ‫ݶ‬ఆ͢ΔͳͲɼ୳ࡧۭ

[12]ؒΛ‫ڱ‬ΊΔ޻෉͕ඞཁʹͳΔͱߟ͑ΒΕΔɽ

7. ·ͱΊͱࠓ‫ޙ‬ͷ՝୊ຊ‫Ͱڀݚ‬͸ Java ϓϩάϥϜͱࢦఆ͞ΕͨϝιουΛର

[13]

[14]

৅ʹࣗಈతʹ୳ࡧΛߦ͍ɼϝιουͷ࣮ߦதʹ࢖༻͞ΕΔ
Ҿ਺΍Ϋϥεม਺ͱͦͷϑΟʔϧυΛநग़͠ɼ໦ߏ଄ͰՄࢹԽ͢ΔπʔϧΛ࡞੒ͨ͠ɽ
ࠓ‫ޙ‬ͷ՝୊ͱͯ͠͸ɼଟ͗͢Δग़ྗͷཁ໿͕‫͛ڍ‬ΒΕΔɽ

[15]·ͨɼΞΫηεՕॴΛ୯७ʹදࣔ͢ΔͷͰ͸ͳ͘ɼίʔϧάϥϑͷදࣔ‫ػ‬ೳͱҰ෦౷߹ͤͯ͞ɼϝιουͷ‫ͼݺ‬ग़ؔ͠܎ͱϝιουͷೖྗม਺ͷར༻৘ใΛಉ࣌ʹӾཡͰ͖Δ
Α͏ʹ͢Δ͜ͱ΋ߟ͑ΒΕΔɽ
ँࣙ

[16]
[17]
[18]

ຊ‫ڀݚ‬͸Ұ෦ɼ೔ຊֶज़ৼ‫ڵ‬ձՊֶ‫ڀݚ‬අิॿۚʢ՝୊൪߸:21240002ʣ ͱ೔ຊֶज़ৼ‫ڵ‬ձՊ‫ج‬൫‫ڀݚ‬ʢAʣ

[19]ֶ‫ڀݚ‬අิॿۚएख‫( ڀݚ‬A)ʢ՝୊൪߸:23680001ʣ ͷॿ੒Λड͚ͨɽ
[20]ࢀߟจ‫ݙ‬
[1]

[2]

[3]

[4]

[5]
[6]

[7]

[8]

Corbi, T. A.: Program understanding: challenge for the
1990’s, IBM Systems. Journal., Vol. 28, pp. 294–306(1989).
Fjeldstad, R. K. and Hamlen, W. T.: Application program maintenance study: report to our respondents,
Proceedings of GUIDE 48 (1979).
LaToza, T. D., Venolia, G. and DeLine, R.: Maintaining
mental models: a study of developer work habits, Proceedings of the 28th International Conference on Software Engineering, pp. 492–501 (2006).
LaToza, T. D. and Myers, B. A.: Developers ask reachability questions, Proceedings of the 32nd ACM/IEEEInternational Conference on Software Engineering,Vol. 1, pp. 185–194 (2010).
ITSpiral: http://it-spiral.ist.osaka-u.ac.jp/.
Chen, Z. and Xu, B.: Slicing Object-Oriented Java Programs, ACM SIGPLAN Notices, Vol. 36, No. 4, pp. 33–
40 (2001).
Harman, M. and Danicic, S.: Amorphous Program Slicing, In proceedings of the 5th International Workshop
on Program Comprehension, pp. 70–79 (1997).
Horwitz, S., Reps, T. and Binkley, D.: Interprocedural slicing using dependence graphs, Proceedings of
the ACM SIGPLAN 1988 Conference on Programming Language Design and Implementation, pp. 35–46(1988).

c 1959 Information Processing Society of Japan


[21]

[22]

[23]

[24]

[25]

Liang, D. and Harrold, M. J.: Slicing Objects Using System Dependence Graphs, Proceedings of the International Conference on Software Maintenance, pp. 358–
367 (1998).
Reps, T., Horwitz, S., Sagiv, M. and Rosay, G.: Speeding up slicing, Proceedings of the 2nd ACM SIGSOFT
Symposium on Foundations of Software Engineering,pp. 11–20 (1994).
Sridharan, M., Fink, S. J. and Bodik, R.: Thin slicing, Proceedings of the ACM SIGPLAN 2007 Conference on Programming Language Design and Implementation, pp. 112–122 (2007).
Weiser, M.: Program slicing, Proceedings of the 5th International Conference on Software Engineering, pp.
439–449 (1981).
ӻాᠳ‫ޛ‬ɼੴඌɹོɼҪ্ࠀ࿠ɿม਺ؒσʔλϑϩʔάϥϑΛ༻͍ͨιʔείʔυؒͷҠಈࢧԉɼ৘ใॲཧֶձ
‫ڀݚ‬ใࠂ, Vol.2011-SE-171, No.12ɼpp. 1–8 (2011).
Dean, J., Grove, D. and Chambers, C.: Optimizationof Object-Oriented Programs Using Static Class Hierarchy Analysis, Proceedings of the 9th European Conference on Object-Oriented Programming, London, UK,
UK, Springer-Verlag, pp. 77–101 (1995).
Yan, D., Xu, G. and Rountev, A.: Demand-driven
context-sensitive alias analysis for Java, Proceedings ofthe 2011 International Symposium on Software Testingand Analysis, pp. 155–165 (2011).
ArgoUML: http://argouml.tigris.org/.
GanttProject: http://www.ganttproject.biz/.
Eisenbarth, T., Koschke, R. and Simon, D.: Locating
features in source code, Software Engineering, IEEE
Transactions on, Vol. 29, No. 3, pp. 210 – 224 (2003).
Koschke, R. and Quante, J.: On dynamic feature location, Proceedings of the 20th IEEE/ACM International Conference on Automated Software Engineering,pp. 86–95 (2005).
Rajlich, V. and Wilde, N.: The role of concepts in program comprehension, Proceedings of 10th International
Workshop on Program Comprehension, pp. 271 – 278(2002).
Sundaresan, V., Hendren, L., Razaﬁmahefa, C., ValléeRai, R., Lam, P., Gagnon, E. and Godin, C.: Practical virtual method call resolution for Java, Proceedings of the 15th ACM SIGPLAN Conference on ObjectOriented Programming, Systems, Languages, and Applications, pp. 264–280 (2000).
Bacon, D. F. and Sweeney, P. F.: Fast static analysis of C++ virtual function calls, Proceedings of the
11th ACM SIGPLAN Conference on Object-Oriented
Programming Systems Languages and Applications, pp.
324–341 (1996).
Milanova, A.: Light context-sensitive points-to analysis for Java, Proceedings of the 7th ACM SIGPLANSIGSOFT Workshop on Program Analysis for Software
Tools and Engineering, pp. 25–30 (2007).
Shapiro, M. and Horwitz, S.: Fast and accurate ﬂowinsensitive points-to analysis, Proceedings of the 24th
annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, pp. 1–14 (1997).
Sridharan, M. and Bodı́k, R.: Reﬁnement-based contextsensitive points-to analysis for Java, Proceedings of
the ACM SIGPLAN 2006 Conference on Programming Language Design and Implementation, pp. 387–
400 (2006).

8