2004/5/22, 6/9, 8/15
ɡɽͤγ
(##24) 2004/5-6
(##21) 2003/6
(##14) 2002/6
(##11) 2002/1

ͽι (##11)

󲽥ѥ̥ե饹ȥ饯θסά
COINS(Compiler Infrastructure)ץȡˤǳȯ륳ѥζ
ɽλͤϡνʤ󥿥եͤˤäƵҤƤ
롣
ͳ
ɽͤγסܻͽIrOutline.txt
ɽγ (HirOutline.txt)
ɽηỌ̇̄ (HirType.txt)
ɽγ
COINSץLIRͽ
ɽγ
եγ
󥿥ե͡JavainterfaceȤƵҡ
ܸǲƽͽϤʤ
HIR.javaɽΥ󥿥ե
Sym.javaɽΥ󥿥ե
Type.javaΥ󥿥ե
Flow.javaեΥ󥿥ե
BBlock.java   եϤ˻Ȥܥ֥åΥ󥿥ե
MachineParam.javaоݵ¸Υ饹
SourceLanguage.javaϸ¸Υ饹
ȽȤƤϡΤ褦ɤ߿ʤ줿
ʣܻͽ
ʣˤ줾ιܤλͳ
ʣ˾嵭Υ󥿥եͤ򵭺ܤJava interface
ʣ˾嵭Java interfaceβ̥饹ȤƤJava interface
ͳפˤϤɤΤ褦ʹͤˤä߷פϽ񤤤Ƥ뤬ġΥ᥽
åɤλͤϽ񤤤ƤʤˤĤƤϥ󥿥եͤ򻲾Ȥ

ܥѥ߷פˤäƤϡѼԤϥ󥿥եͤ򸫤
Ǥμ¸ƤޤǤϸʤƤ褤褦ˤ뤳Ȥտޤ
եͤϡޤ嵭ξ̥饹Υ᥽åɻͤ򸫤ơ˵ܤ
ƤΤɽǤʤȤˤĤƤϤβ̥饹Υ󥿥ե
ͤ򸫤褦ˤ롣̥饹Υ󥿥եͤ򸫤뤳Ȥˤä
ƱǤʤ櫓ǤϤʤ«褯Ǥʤ
ȡäȤ򤹤붲줬Τǡɬ̥饹Υ󥿥ե
Ƥ˽񤫤Ƥ᥽åɤˤäƤǤ뤳ȤϤˤäƼ¸
줿󥿥եͤ˽񤫤줿դ᥽åɤȤʤHIR
LIRɽΥ󥹥󥹤ѹꤹ뤳Ȥϡ¾Υ᥽
ɤޤǽʤʤ뤳ȤΤǡԤ٤Ǥʤ(##21)
ͳפˤƤϡϸ(source language)оݵ(target
machine)˰¸ʤҤ濴Ȥ뤬졢굡
ˤĤ뤳Ȥ⤢롣Τ褦졢굡ˤĤƤ
ϡ[[ ]]ǰϤǡ¾ȶ̤롣
ɽ˸¤櫓ǤϤʤѥΤ˴ط륯饹Ȥ
ƤϡΤΤꡢɽλͤǻȤ뤳Ȥ롣
Driver      ѥΥѥ
IoRoot      ϴϢؤΥ
SymRoot     ɽϢؤΥ
HirRoot     HIRؤΥ
LirRoot     LIRؤΥ
FlowRoot    եؤΥ
Message     å
Debug       ǥХå

ɽ߷

Ū

ʣ˽̲ǽˤɽ
ѥˤ¿θ졢¿εФƶ
ǤСζ̲줿ΤפȤơΥѥ
פ˺뤳ȤǤ褦ˤʤ롣ǽˤˤϡѥι
Ǵ֤Υ󥿥եȤʤɽ(IR, intermediate representation)
̲ɬפ롣ǤϡɤΤ褦ˤФ̲Ǥ뤫
ͻɽζβˤ󼨤롣̲ȤäƤ⡢
ʶ̲̣ΤǤϤʤ֥ѥν⥸塼֡
֤ǤǤ¤궦ʬ¿褦ˤ¸ʬϾ³
䥯饹Ĥ뤳ȤǤ褦ˤפȤ̣Ǥζ̲Ǥ롣
Ǹɽϡɽιʸ(syntax)ʤ̣
(semantics)򤤤Ĥϸ졢Ĥоݵδ֤Ƕ̤ʷ
ƤȤȤǤꡢɽ줿ɽ󥹥󥹤֡
֤Ǵ˶̤Ȥ櫓ǤϤʤ̤ʹʸȤߤǡ
ϸ졢оݵ˹碌ɽޤޤ뤳ȤϤ롣Ū
ѥȤϡϸоݵΤΤƺ뤳Ȥ¿
ΤǡΤ褦ˤƤ⡢ʸ̤ʤΤǡѥν¿
ʬ̲뤳ȤǤ롣(##11)
ʤܥѥ饤ե饹ȥ饯εҸJavaȤ¸
ʬ򾮤ŪˤޤȤΤˡ饹ǽʤɡJava
롣ѥ˻Ȥ׻ʥۥȷ׻ˤϡJavaѤǤ100
ХȰʾμ絭ȥե륷ƥͭ׻Ȥ롣

ʣɽФ׵
ѥˤɽФƤϡ̤ˡΤ褦ʤȤ
롣
ץι¤̣Ƥۣ椵ʤɽǤ롣
ץβϤѴŬɽ֤Ǥ롣
Ŭ󲽡쥸դʤɤɬפʾ򤦤ޤɽǤ롣
ĥ٤ࡣ
֤̤ʤ
ܥץȤǤϡƼθ䵡Ф󲽥ѥζ̤δ
פ뤳ȤܻؤƤ롣ѼԤϡѥץ೫ȯԤǤ뤳
Ȥ⤢뤬Ȥƥѥ鳫ȯԤǤ뤳ȤꤷƤ롣
ơĥ٤ळȤ˽פǤꡢΤȤ롣
¾졢¾ؤŸưפǤ롣
Ĺǯˤ錄뵡ǽɲáưפнǤ롣
ܻͤϡΤ褦׵˱褦߷פ

ɽΥ٥

ץβϤѴǤϡ³(procedure)ñ̤롼ñ̤
ǧȤ롼Ѵ䥤饤Ÿʤɡ礭ޤñ
Ȥư礬롣ޤ󲽤ʤɤѴ򤷤̤ޤץ
ηǽϤ⤢롣Τ褦ʾˤϡϥץι
¤ȿǤǤɽ롣ѥǤϡ쥸
̿᥹塼󥰤ʤɡ٤٥Ǥν׵ᤵ졢Τ褦
ϵ̿˶ᤤɽ롣ܥѥѼԤȤƤϡ
Ф륳ѥγȯԤ䡢¸Фƿоݵ
ѤΥѥ볫ȯԤʤɡޤޤʾ礬ͤ졢ѷ
ϡ嵭Τɤ餫η֤Ǥ뤳Ȥ¿Ȼפ롣ǡɽ
ȤƤϡϥץι¤ȿǤǤɽȡ׻
ȿǤǤɽΣĤꤹΤ褤
ɽζŪѷ֤ȤƤϡΤ褦ʤΤꤵ롣

ɽ
༡¹Էץफ¹ԷΥץؤ
ϸƱ٥ǤѴSMPŪ󲽡¾
ϥץ¹ԸΨɤʤ褦Ѵ
ϸƱ٥ǤκŬ
롼ײϡǤΰ¸ط¹С
饤Ÿ
롼Ѵʥ롼Ÿ󥰡¾
³롼礭ñ̤ǤѴ
Ƽץߥ󥰥ġγȯ
ʥեȥŪʲϡѴ¾
̾(alias analysis)
¾
ɽ
쥸
ܺ٥٥ΡʥǡΥѥθ˺Ŭ
̿᥹塼
ʥѡѴȥ졼塼󥰡¾
̿٥󲽡ʥޥǥ󲽡VLIW󲽡¾
׻񸻡ʥ쥸黻ˤ˹碌Ŭ
ԡץۡŬ

ʳˤȡѥ֤ȤեϤɬפˤ
ʤɤ⤢뤬Ŭ󲽤βǤϡˤƤɽ
ʣʤФʤ餺ץ๽¤ѤХեϤ
ʤʤФʤʤΤǡ֤̤Ū
ʳȥեϤʤɤνץबŤɬפˤʤȤλ
Ŧ⤢Ǥν¿϶̲뤳ȤǤ롣ץ
βϤѴϡ礭ޤǤȤ館ȡġ̿Τ褦
ñ̤ǹԤʤȤǡۤʤͤʤФʤʤȤ¿
ʳ뤳Ȥˤץߥ󥰤ô⡢ʳˤ뤳Ȥˤ
Τ䤹θѤ礭

ɽ䡡(##11)

ץˤϡѿץʤɤε椬롣ʸ
ΤޤޤǤϰˤΤǡɽ(symbol table)ϿɽǤϵ
ɽεܹʥȥˤȤư˴ؤ°ϵɽε
ܹͿǵϿ롣°ˤϡʸץ๽¤
ɤˤäƷޤΤ䡢ʸϡ̣ϤΤȤꤵΤ¿
ɽɽϽ濴ȤɽΤǤꡢ
ʸݹʸ(abstract syntax tree)ɽʤǵξ
ϵɽ˵ܤ롣
ɽˤϡѿץ˸¤餺䷿̾ѥ
쥸ѿʤɡѥǻȤ뵭򤹤٤
ܤ롣ϵɽ˵ܤɬפϤʤȤΰո⤢Ǥ
ɬ⣱ɽ蘆Ȥϸ¤餺ѥĶоݵˤ
ɽ٤ɽϰϤۤʤ롢뤤ˤ쥸վ
ղäʤɤλȤͤΤǡ⵭ɽ˵ܤ롣ˤϡ
ϸ˰¸оݵ˰¸ޤޤ뤬ɬ
פˤʤäȤ˻ȤФ褤ΤǤäơѥβǤϡϸ
оݵ˸ͭξޤǻȤʤƤǤ󤢤롣
ɽȤȤˤäơѥν¿̲Ǥ롣
ץࡡᡡɽܡɽ
ʼ¹ʸơˡʸξ

ɽ

ŪФݹʸ

ץߥ󥰸ʸˡϡ³˸¤äƤ⡢줴Ȥ礭
ۤʤ뤬߹ȤƤΤ򸫤ȡǰŪ˶̤ʬ¿
ζʬФơ˴ĤŪ쵡ǽäȡ
ĤξŪǤ롣㤨С¿θˤϡŪǡ
ȤƤưʸݥ󥿤ʤɤꡢ˴Ť
ơ󡢹¤ΡΤʤɤʣ礵줿ǡ¤롣
ФȤơѱ黻黻ӱ黻ʤɤα黻ꡢ
ʸʸȿʸgotoʸʤɤʸ롣ΤޤȤȤƤϡ
ץ䥯饹ʤɤγǰ롣Τ褦ʳǰ򤢤ܤΥ٥
ǤޤȤȡĤθ뤳ȤǤ롣Ǥϡ쵡ǽ
Ūʸ쵡ǽɽǤȤСʬ򤷤ɽ롣
η׻äƤܵǽʲˤޤʬ򤹤뤳ȤϤʤ
Τ褦Ūͤץ൭Ҥ˻ȤȤ뤳Ȥϡ
Ȥθδ֤ΰ㤤礭ΤǤऺɽȤƤ
ǽǤ롣ɽϡΤ褦ʹͤ˴Ťꤷ
ɽΰĤη֤Ȥơݹʸ(abstract syntax tree)롣
Ϲʸ(syntax tree)Τ黻ܼŪɬפʬФ
ʸΤˤ뤿ζڤ국άڹ¤ɽǤ롣
ϤޤϸιʸȿǤƤ뤬˽Ҥ٤褦ˡԤμ³
˶ŪʳǰФꤷŪꤷФ
ݹʸڤͤʤСθ˰¸ʤǡɽ
뤳ȤǤ롣ɽƤƤ⡢ˤäựƤΰۤ
Τ롣ɽǤϡˤĤơζɽˤȤ
줺ɬפȤФŪʸ쵡ǽʬ򤷤ɽ롣ץ
๽¤䥯饹סƤӽФ黻ʤɤΰ㤤ϡΤ褦
ˡˤäƸ줴Ȥΰ̣ǵۼǤϸ̤Ūɽ
ѴǤ롣ǤϤΤ褦ݹʸڤбɽ HIR (High
level Intermediate Representation) ȸƤ֡HIRˤʸȤƤɽ
ʥƥɽˤ⤢뤬ڹ¤(tree)ȤƤɽ⤢ꡢξԤ
롣ڹ¤Ȥɽ硢ϻҶnonleafˤȻҶ
ʤաleafˤ鹽롣դΡɤΤ롣ϱ黻
¤ʤɤꤹ黻Ҥդѿ̾ץ̾ʤɤ
ɽ
ϸǤŪɽƤʤ줿⡢ɽǤŪ
ɽ㤨Сͤΰ䡢֥Ȥ黻
ϤȼѴνʤɤФƤϡɽ뼰ʸ
롣
HIRݹʸڤι¤BNFǵҤƤꡢΰ̣ϡֹ
ɽηỌ̇̄פλͽ˵ҤƤ롣HIRդʤɤϵɽ
Ȥ롣HIRȵɽ碌ΤϣĤθȤߤʤȤǤ롣
ɽФƤ⡢ȤǽҤ٤褦ˡƥɽƤ롣
ΥץHIRȵɽ碌ƥƥɽΤϡ
ɽƥɽץȸʤȤǤ롣

ɽˤ뷿(##14)

ץϡ׻оݤФƲνꤹΤ
ߤʤȤǤ롣оݤϡƱΤǤΡƱŬѤ
ΡƱɽ§˽ΡˤȤǥ롼ײǤ롣ϡ
Τ褦ˤƹ롼פȤߤʤȤǤ롣Ȥɽ
黻Ȥ濴ȤƱǤ륰롼פȤ
ưȤɽư黻Ȥ濴ȤƱ
Ǥ륰롼פưȤʤɤȤȤʤƤäơơ
Υץߥ󥰸ˤ뷿ƥब롣
ɽHIRǤϡ¿Υץߥ󥰸˶̤뷿Ф
HIRηȤ롣ηˤĤƤϡֹɽˤ뷿Ȱ
̣פǾܤ뤳ȤˤǤ߷פˤҤ٤롣
ܷȤƤϡưʸbool, voidߤ롣
ΤˤϤ˺ʬΤ⤢롣ܷ˴Ťƹ뷿
Ȥơݥ󥿡(array)¤(structure)(union)
(enumeration)ߤ롣ץȤϤơץ
ƤӽФפȤоݤȤʤ뤳Ȥ⤢Τǡΰ̣Ʊ
ΤǤȤǥ롼ײ뤳Ȥˤꡢץη
롣¤Υץߥ󥰸ˤϤ¾¿ηо줹Ǥ
HIRˤʤϡ§ȤơHIRηʬ򤷤ɽ롣
ѥˤ󲽤䥳ɺŬǤϡϽפоݤǤ롣
ΤᡢHIR߷פǤϡξ󻲾Ȥ䡢ǤǧŬɽ
Ȥ褦ˤƤ롣

Ū쵡ǽؤʬ

嵭Τ褦ʹͤΤȤˡϸεǽŪεǽʬ򤷡
¸ξʤɽѤ롣ζŪ᡼İƤ餦
ˡCȤƤȤꤢʤ롣
ʣ ѿȥ֥Ȥɽ
ѿϰ̤ˤϤͤɽȡͤǤ륪֥Ȥɽ
礬롣黻(assign)κդˡ裱ҤȤơˤѿϥ
Ȥɽ뺸(l-value)ȤưǤϡ󽤾黻
subsź礷ɽ魯(##14)¤ηΥ֥
ȤȤ̾Ϲ¤ν黻qualǷ礷ݥ󥿷μȥݥ
Ǥϥݥ󥿽黻arrowǷ礹롣
黻ҤκդǤʤѿؤλȤɽͤ񤯤Ȥϡ
ѿϡʥ֥Ȥΰ֡ˤaddr黻ҤȤäƺͤ
뤳ȤŪ˼󡢹¤ΡΤϺͤȤưݥ
ͤ⺸ͤǤ롣ݥ󥿤λؤΥ֥ȤƤФ
contents黻ҤȤ򤽤ƬǤؤΥݥ󥿤Ѵˤ
decay黻ҤȤݥ󥿤ˤɽѤȤundecay黻
ҤȤ(##11)
ʣ(##11)
ȤƤϡưʸʸbool
ʤɤ롣ζŪҷϸ˰¸뤬HIRǤϤ
ɽΰ㤤ˤȤ줺˽Ǥ褦⵭ɽȥȤ
ɽ롣
ʣ˼ʸ(##11)
ϡѱ黻ҡӱ黻ҡ黻Ҥʤɤѿ˺Ѥ
ɽȤɽѿΤ⣱ĤμǤ롣
ʸȤƤϡʸifʸȿʸswitchʸjumpʸreturnʸʤ
ӤʣʸޤȤˤblockʸ롣򣱤ĤʸǤ뤫Τ褦
˰expStmtʸ⤢롣
ϸˤƾ嵭ǤľܤɽǤʤʣŪʰ̣ɽ魯ʸ
ϡδŪʼʸʬ򤷤ɽ롣
[[
(a) ʣ黻
CˤȻѱ黻ʣ礷ʣ黻ҤϡǱ黻ʬ򤷤ɽ
㤨 i++  i=i+1; Ʊɽˤ롣ϥեϤSSAѴ
ñˤ뤿Ǥ⤢롣ʣѿФʣ黻ҤʬˤƤϡ
ѿƳ뤳Ȥ⤢롣
(b) ûＰ?: 黻
C黻ҤɾϡȽǸɾΤǡ
ΤȤifʸŸŪ˼?: 黻Ҥɽ줿ifʸ
Ÿ뤬ȽǸɾ褦ɬפ˱
ҹ¤ˤɽκݡѴɬפʤ顢ΤȤѴ黻
ˤäŪ˼
(c) ޱ黻ҡ¿
ޱ黻Ҥ¿⡢줿ɾ˽äơʬ򤷤
ɽ롣ȼĤʸ估ʣʸŸ뤳Ȥ롣
(d) ȼΥꥹ
ʬ򤷤ɽȤ黻򥽡ץǤλ˹碌
뤿ᡢΰҤʬʸ񤤤ʸȤˤ
ȤƻȤʸˤͤϡʸκդˤ뺸黻
ͤǤȤ롣ΥꥹȤȤΥꥹȤͤ
ǤȤƤμͤǤ롣
]]
ʣ и
ץץΡɤɽиreturnʸ
ɽ롣иƤϡǤ뤳
ȤˤඦɽʳǤϤʾʬ򤷤ʤץ
ΡɤreturnʸϡиΤˤʤ
ʬɽΤʤΤǡŪɽץϸͭ
׵᤹ˤϡƤץνΰȤơ
HIRǵҤ롣Τ褦ˤơ¸䵡¸ޤɽ̲
ʤ褦ˤ롣(##11)

ɽ

HIR ˤɽ򼨤Ǥϡint4B礭ǤȤ롣
// HIRγƥΡɤФλϤޤɽ(##11)

/* tpif1.c:  if-statement (simple one) */
int a, b, c;
int main()
{

   a = 1;
   b = 2;
   if (a == 0)
     c = a;
   else
     c = a + 2;
   return c;
}
   (a) Source program

(prog     1
   <null 0 void>
   <nullNode 0>
   (subpDef  2 void
    <subp     3 <SUBP <> true int> main>
   <null 0 void>
    (labeldSt 4 void
     (list 5
      <labelDef _lab1>)
     (block    7 void file tpif1.c line 3
      (assign   8 int file tpif1.c line 7
       <var      9 int a>
       <const    10 int 1>)
      (assign   11 int file tpif1.c line 8
       <var      12 int b>
       <const    13 int 2>)
      (if       14 void file tpif1.c line 9
       (cmpEq    15 bool
        <var      16 int a>
        <const    17 int 0>)
       (labeldSt 18 int
        (list 19
         <labelDef _lab3>)
        (block    21 void
         (assign   22 int file tpif1.c line 10
          <var      23 int c>
          <var      24 int a>)))
       (labeldSt 25 int
        (list 26
         <labelDef _lab4>)
        (block    28 void
         (assign   29 int file tpif1.c line 12
          <var      30 int c>
          (add      31 int
           <var      32 int a>
           <const    33 int 2>))))
       (labeldSt 34 void
        (list 35
         <labelDef _lab5>)
       <null 0 void>))
      (expStmt  37 int file tpif1.c line 13
       (call     38 int
        (addr     39 <PTR <SUBP <> true int>>
         <subp     40 <SUBP <> true int> printf>)
        (list 41
         (decay    42 <PTR char>
          <const    43 <VECT 6 0 char> "c=%dn">)
         <var      44 int c>)))
      (return   45 int file tpif1.c line 14
       <var      46 int c>)))))

   (b) HIR representation   (##14)

ޣHIR ˤץɽ

ݲˤ¸α

ϥץ(source program)ˤƤϡ̿ˤޤʬ
ϸ˰¸ʤΤȤʤ뤬ޤʬ򤷤ʤƤ⡢
³˶̤ŪʳǹͤʤСϸˤ
ɽȤƵҤǤ롣ʤɤξ⡢ܷ䡢شطط
٥ʬ򤷤Ƥޤȡ˰¸ʤǰΤ¿
¸ʻͤΤƤȿǤΤϡŪˤ
̿Ȥɽ롣Τ褦ˤơ쳵ǰŪʤΤʬ򤷡
ݲƤ椯ȡμ³˶̤ɽ٥ã뤳ȤǤ
롣Ǥ˸ڤ褦ˡǺ뵭ɽˤϸ¸
ʬ⤫ʤꤢ롣
ѥΥ̤̤礭ŤĺŬ󲽤νǤϡ
Ǥ뤫黻Ǥ뤫ʤɤˤĴ٤뤬Ǥ뤫ޤ
ˤˤĴ٤ʤˤɬפȤΤϡǸоݥޥ˹
碌ƥǤ뤬ܷ򸫤д֤˹礦Ȥ¿
ԥ塼Ǽ¹ԤƤHIRɽ졢HIRϵɽؤ
󥯤뤬ΥեǤϡƤβϡѴ
濴ȤʤΤǡɽθ¸ޤǤɤɬפΤϾʤ
ʬν˰¸ʤǹԤʤȤǤ롣
ץŪƤϡ¸㤤ɽHIRȡ
¸ޤ൭ɽʬΥǤ롣Ǥ¤Τ褦˥ѥ᡼
ǤΤ⤢롣
ץŪɽᡡHIRܡɽ
¸
¸ۤȤɤʤ鷺
ζ̲ɽζ̲Ūؤʬ
ܡ¸εɽؤα
ܡѥ᡼
Ǥϡ嵭Τ褦ʡ쳵ǰδǤؤʬݲˤäơ
¸äǤνʬ˰¸ʤ
Ǽ¸Ǥ롣¿ν˸˰¸ʤǼ¸
ȤΤǤϤʤ¸ʽ򾮤饹³˱ä뤳
Ȥˤäơ֤ǤζäǤȤȤǤ롣쳵ǰδ
ǤФˤäƤϡԤΤ٤ƤθоݤȤȤޤȤˤ
Τǡ
CC++JavaFortranPascal
ʤɤμ³ȡоݤȤ롣ǽ˼¸
CΥѥǤ롣
HIRоݵˤϰ¸ʤΤǤ뤬HIRǤդ
ˤΤޤްܤȤȤǤϤʤHIRɽΤϵ˰¸
ʤǻȤ뵭ɽˤϵ˰¸⤢ꡢHIRϵ
ɽȹ碌ʤȴʥץɽȤʤʤΤǡJavaΥХȥ
ɤΤ褦줿HIRη׻˻äƤäƼ¹ԤǤȤ
櫓ǤϤʤ

եȥŪġǽ

ץߥ󥰴Ķʤɤ̤ϡɽϥץȤ
ϤäꤷƤ뤳Ȥ˾ޤ롣ȤС֤ǤȤ
ɽФϥץΰ֤ޤ뤳Ȥʤɤ˾롣
ץߥ󥰴ĶФǤʤ󲽷̤ϸƱǽϤ
Ȥ⡢Ȥϥץб褯ȤƤ뤳Ȥ˾ޤ롣
ܥץȤκǽΥСǤϡɽϥץδ֤
бطʬˤȤ褦ˤȤȤ䡢󲽷̤ϥץ
Ȥ褯бȤƤȤȤޤǤϼ¸ʤ֤ѿ
ǽԤϤɤפȤʸƬեβܤ
褦ʡŪưפ˼¸Ǥ뵡ǽˤĤƤϤټ¸롣
ץߥ󥰴Ķ鸫ơɽϥץ򤦤ޤбŤ
뵡ǽ⥸塼ϡѥ¦Ǽ¸⡢षץߥ
ĶȯΰĤȤƼ¸ġȤ̤Ǥ褤Ȼפ롣
ѥ¦ǤϡΤ褦ʵǽγĥɲäưפʥѥ鹽¤ˤ
뤳ȤȡɥפǤȹͤ롣

ѥοʹԤHIRѴ

ɽϡѥοʹԤ˹碌ơѴƤ
Cξ硢ʸľϡ++=+ʤɤʣ黻ޤޤ
ɽ HIR-C ͳ뤬θ塢Cͭɽ
Ū쵡ǽŸֶ̤ɽǤHIRѴ롣
HIR-Cȶ̤ɬפȤHIR-base ȸƤ֡
(a) HIR-C	Cιʸ̣ϤԤäľHIRǡ
Cʣ黻ޤࡣ
(b) HIR-base	Cʣ黻Ÿ¸ۤȤ
ʤΡñHIRȤȤHIR-baseɽ
ɽǤΥեϤŬ󲽤ʤɡʽHIR-base
˴ŤƹԤΥ᡼ºŤեȥŪ
ġʤɤǤϡHIR-CȤȤ⤢롣ѥǤνοŸȼ
ơHIR˼ξղä줿ꡢѴ줿ꤹ롣HIR-CHIR-base
⡢뤤HIR-baseǤμʳɽ⡢٤ƱHIRιʸ
§˽ä򤷤Ƥ롣Υ٥ΰ㤤ϡΥΡɤޤޤ
뤫ݤ󤬻ФƤ뤫ݤʤɤǶ̤롣
Υ٥֤ˤϽطꡢեϤäƤʤ󲽤˿
ʤʤɤ󤬤롣

ɽ

ѿ̾ץ̾饹̾ʤɡϥץ˸뤹٤Ƥ
Фξ򵭹ɽ˵ܤ롣ξ󤬲Ǥ뤫ϡʸ
ץ๽¤ʤɤˤäƷޤΤ¿ʸϡ̣ϤΤȤ
ꤵ뤳Ȥ¿䥳ѥ쥸
ʤɤ⡢٤Ƶɽ˵ܤ롣ϤԤʤäȡŬ䥳
ɬפȤʤʾϥǡǤ롣⤦ĤνפʻǤ
׾ϡǽΤǤꡢʤǤˤˤϻ
ʤɽϥפȤ˺졢¦Υפεɽϳ¦
פεɽλҶȤƺ롣äơפγشطϡ
ġεɽΡɤȤڹ¤Ȥɽ(##11)
ʾʬ򤷤ɽ뤳Ȥ򤷤ʤܷ(basic type)ȤƤ
     short int, int, long int, long long int, float, double,
     long double,  bool, char, (##14)
     unsigned short int, unsigned int, unsigned long int,
     unsigned long long int, unsigned char,
     offset, void
ߤΤۤ˷뷿(type constructor)Ȥ
     enumeration, pointer, vector, structure, union,
     subprogram, typedef
ߤ롣typedef ʤɡ쵡ǽǻꤵ桼
defined typeˤξ⡢ȤƵɽ롣ϸˤ
γǰϸ줴Ȥ˰ۤʤ뤬Ƿʬ򤷤Ƥޤȸˤ뺹
ޤʤʤꡢΥեǤϡˤޤ¸
ǰȤǤ롣¸ʬϾĤΤǡ
Фѥ᡼ϡSourceLanguageȤ饹˶ɽ경롣
¤ΤȤǡ饹ȥե̾᥽å̾ʤɤϡ֤γ
شطȤߤ뤳ȤǤƱ¤Τ˴ޤޤǤδ֤δطƱ饹
˴ޤޤ᥽åɤδ֤δطʤɤϡƱεδ֤طȤߤ뤳
Ǥ롣δطǧϡϤΤȤˤ٤ΤǤꡢ
ΥեǤϡŪȤ褦ʸ¸δطǤϤ
شططʤɡ¿θ˶̤ʳǰɽƤȤ
ưȤǤ롣
黻ϥǡˤäưۤʤ뤬ʬƤ줾ۤʤ
ɽȡɽѻˤʤ롣ѥǤνˤϡʬ
ʤƤǽʽ¿롣ǡָγƥΡɤ鵭ɽ
򻲾Ȳǽˤ뤳Ȥˤơѱ黻ʤɤα黻Ҥ򷿤Ǻʬ뤳
ȤϹԤʤ
ˤץФ뵭ɽμƤ򼡤˼

SymTable Root
   subp    main <SUBP <> false int>
   type    <SUBP <> true int> size 4
SymTable _main1 parent SymTable Root
   var     a 1 int in _main1
   var     b 2 int in _main1
   var     c 3 int in _main1

ɽϥǡ¤ȤɽΤǤ뤬ƥɽ
Ƥ롣Ǥ˽Ҥ٤褦ˡĤΥץHIRȵɽ碌
ƥɽΤϡɽƥɽɽץ
ȸʤȤǤ롣

ɽ

׻ݲˤ뵡¸α

ɽȤƤϡJavabytecodePascalP-codeʤɡ
Ūåޥ̿᤬Ȥ뤳Ȥ롣ϥץफ
ѴưפǡоݵѹΤưפʤȤħȤ롣
쥸ɽ̤˽ФƤʤΤǡ쥸ͭѤŬˤ
ԸǤ롣ޤåФץåݥåפ̿Ȥ
ǡ̿ν촹Ŭ䥹塼󥰤ˤԸǤ롣
äơåޥ֤̿ϡŬ󲽽Ż뤹
ѥˤŬʤ
ǡɽȤƤϡ쥸ɽ̤˽Фݥ쥸
ޥιԤȤ롣η׻¿Υ쥸ˤ
ǡͭѤѥβȤʤ롣ޤץå®
ȥ®٤ȤΥåפ礭ʤ뷹ˤΤǡ뤿
ˡ̿䥹ȥ̿Ф̤нɬפȤ褦ˤʤ롣
Τ褦ʤȤθơλȡʥɡˤʥȥˡ쥸
λȤɽ̲ͤƤ뤬ʣŪʱ黻ɽ䡢
ͼ¿ޥ¿ȥΥѥȹưפθ
ơڹ¤ηȤ롣ɽ LIRLow level
Intermediate RepresentationˤȸƤ֡(##24)
LIRˤʬڤȤƤޤȤϡͤꤹsetꡢ
ήꤹjumpcallΤ줫⡹ĴޤΤ˸ꤹ롣
äơʣʸʤɤϴĤʬڤʬ򤹤롣setˤϥ
ޤϥ쥸Ǥꡢ黻оݤϡ쥸ʬ
ڤα黻̤Τ줫Ǥ롣LIRˤơĤץϴܥ
åԡ³ط³եդȤɽ졢ܥ
åʬڤʥꥹȡˤɽ롣ƴܥ֥åˤϡjump
ޤޤȤƤˤޤޤʤ(##24)
֥ǤϡƤФǤʤץǻȤäƤ뵭
λȤλʤɤꤹ롣LIRǤ⡢LIRΥץ
ǻȤäƤ뵭⥸塼ȸƤʬ롣(##24)
LIRǤϵ老ȤȿǤǤ褦ˤ뤬ѥ᡼䥢
᥽åɶ̲ΤΥޥ󵭽ҤʤɤˤꡢŬ
ν¿򵡼֤Ƕ̲Ǥ褦ˤ롣
ƤɽᡡLIRܡޥ󵭽ҡܡɽ
¸ʤ
¸桡硡鷺
ζ̲ɽζ̲ʺΰ㤤򸫤ʤƤǽ
ܡ᥽åɤζ̲
ܡѥ᡼
ܡޥ󵭽

LIRؤѴ (##11)

LIRϡ̾HIRѴ뤳Ȥˤäƹ롣LIRϥƥɽ
ģĤθǤ⤢ΤǡLIRƥɽޤϥեȤ
Ϥ뤳ȤǽǤ롣LIRƥȤȤƥե˽ϤС
LIRʳǷ׻֤ã뤳Ȥǽˤʤ롣LIR
ʸˡϵ¸Ǥ뤬ɽ줿ΥץˤϸҤΤ
˵¸Τǡ嵭ãϰ۵֤ǤϲǽǤʤ
HIRLIRѴΤϡHIR򸫤LIRΤ򿷤ΤǤꡢ
HIRΰ񤭴LIRѴΤǤϤʤHIRΥΡɤɽ
ȤLIRΥΡɤɽ֥Ȥϰۤʤ륯饹°ΤǤ
뤬˴ޤޤѿ̾ʤɡξԤ˶̤ʾ¿롣HIRLIR
IR (Internal Representation) Ȥ饹Υ֥饹ǤꡢIR
Υ᥽åɤϡHIRФƤLIRФƤƱƽзỌ̇̄ǻȤ
ȤǤ롣äơIR饹Υ᥽åɤΤߤȤäϡHIRˤ
LIRˤŬѤǤ롣
HIRоݵ˰¸ʤɽǤ뤬LIRǤоݵɽ
ǽȤƤ롣äơHIRLIRؤѴϡɽ
ޥ󵭽Ҥ򻲾ȤʤԤʤLIRιʸȤΰ̣ϸоݵ
ˤʤΤǤ뤬ɽLIRΥ󥹥󥹤оݵ
¸ΤǤ롣
HIRܡޥ󵭽ҡLIR
¸¸Ѵ¸

LIRη(##11)

LIRǰǡηư̤롣ϡI
θ˥ӥåȿĤơ
I1, I8, I16, I32, I64, I128
ɽ魯ưϡFθ˥ӥåȿĤ
F32, F64
ɽ魯
ŪʥѥǤϡϸоݵȤ߹碌ޤȡ
Τ褦ʷǥǡη뤳ȤǤ롣ФĤ
ʤΤΰ򤹤뤫ϡ黻ҤǶ̤롣ʸbool͡ݥ
ʤɤȤɽ롣

쥸ε¸á

¤γƼε٤ȡ礭ۤʤΤΣĤȤơ쥸
ιĿΰ㤤롣쥸ʪŪ¦̤鸫ȵ
ä礭ۤʤ뤬ѥˤ뵡ǽŪ¦̤鸫ȡ
ѿͤŪݻ³νѲǽˤ黻쥸
μϤ˻Ȥ쥸
ؿֵͤѤ˻Ȥֵͥ쥸
Ū˻Ȥåݥ󥿤ե졼ݥ󥿤ʤɤΥ쥸
ʤɤʬǤ롣󡢰쥸ֵͥ쥸黻쥸
ȤήѤǤ롣ޤѥνǤϡ˸ƤФ¦
callee save˥쥸Ƥ¦caller save˥쥸Ȥ̤
ɬפˤʤ롣Ŭ󲽤δϡΤ褦ʬǽ̲
롣
쥸οϵ老Ȥ˰ۤʤ뤬LIRǤϤޤθĿꤷʤ
ۥ쥸ƳơˤäƽƤɽ롣ѥν
Ǥϡ¥쥸դνˤꡢۥ쥸¥쥸бդ
椯Ĥβۥ쥸Ʊ¥쥸бȤϸ¤餺̤
ϡˤäưۤʤ¥쥸б롣¥쥸դϵ¸
ζʬǤ뤬쥸¸ֲϤȤ쥸Ͼʤ
ʤɡ¿ʬ򵡼˰¸ʤǺ뤳ȤǤ롣

ۤʤ̿ηϴ֤Ǥνζ̲

׻̿ηϤϵ˰ۤʤꡢŪ̿䡢굡ͭ̿
ͭѤʤɤΤˤϡ老ȤνɬפǤ롣
ɽФ󲽤ŬνˤƤϡ
̿ᤫ
ȥ̿ᤫ
Ĥ֤̿Ǳ黻ҤоݥǡƱǤ뤫
̤쥸Ϥϲ
ѤȤꤵΤϲʾ拾
򸫤ǤǤ뤳Ȥ¿ξؤΥ᥽åɤȷ
ɽƱˤƤȡ¿ν򵡼֤Ƕ̲Ǥ롣
оݵޥ󵭽ҤȤƷŪɽLIRʬѥ󤬤
Τ褦ʵ̿б뤫ͿƤʤ뤤ϤΤ褦ʬѥ
ưǤ褦ˤˤʤСѥȹεѤˤäơ
LIRоݵε̿ŸǤ롣Υѥȹνϵ֤Ƕ
̲Ǥ롣
ޥ󵭽ҡʵˡLIRΥѥȵ̿бط

LIRˤץɽѥȹ

оݵ̿
ץθƤӽФϡ老ȡABI (Abstract Binary
Interface) Ȥ礭ۤʤꡢݥޥꤹȶ̲ˤ
롣ǡץ prologи epilog Ȥ
̿᤬ΤȤLIRǤϵꤻͭ롼
ǽ뤳ȤȤ롣

ѥοʹԤLIRѴ

ɽ⡢ѥοʹԤ˹碌ơѴƤ
ʤHIRѴ줿ľΤΤȡۥ쥸դԤä
Ρоݵε̿ɽΡ¥쥸դԤʤä
ʤɡĤʳƧǵѴ롣
HIRѴľ
ۥ쥸Ƴ

оݵ̿бŸ
¥쥸
֥ؤѴ
HIRξƱͤˡϤ٤ƱLIRιʸ§˽ä򤷤
롣Υ٥ΰ㤤ϡɤޤǺ٤ʬ򤵤Ƥ뤫ΥΡ
ɤޤޤƤ뤫ݤ󤬻ФƤ뤫ݤʤɤǶ
롣
ˡΥץФơHIRѴľLIR㼨롣
(##11)

Module "tpif1.c":
Global Symbol table:
   ("memcpy" STATIC UNKNOWN 4 "text" XREF)
   ("string.6" STATIC A48 1 ".text" LDEF)
   ("printf" STATIC UNKNOWN 4 ".text" XREF)
   ("main" STATIC UNKNOWN 4 ".text" XDEF)
(DATA "string.6"
  (I8 99 61 37 100 10 0))
Function "main":
  Local Symbol table:
   ("functionvalue.5" FRAME I32 4 0)
   ("returnvalue.4" FRAME I32 4 0)
   ("c.3" FRAME I32 4 0)
   ("b.2" FRAME I32 4 0)
   ("a.1" FRAME I32 4 0)
Control Flow Graph:
   #1 Basic Block (.L1): DFN=(1,1), <-() ->(#2)
     (PROLOGUE (0 0))
     (JUMP (LABEL I32 ".L2"))
   #2 Basic Block (.L2): DFN=(2,2), parent=#1, <-(#1) ->(#3,#4)
     (SET I32 (MEM I32 (FRAME I32 "a.1")) (INTCONST I32 1))
     (SET I32 (MEM I32 (FRAME I32 "b.2")) (INTCONST I32 2))
     (JUMPC (TSTEQ I32 (MEM I32 (FRAME I32 "a.1")) (INTCONST I32 0))
(LABEL I32 ".L3") (LABEL I32 ".L4"))
   #3 Basic Block (.L3): DFN=(3,4), parent=#2, <-(#2) ->(#5)
     (SET I32 (MEM I32 (FRAME I32 "c.3")) (MEM I32 (FRAME I32 "a.1")))
     (JUMP (LABEL I32 ".L5"))
   #4 Basic Block (.L4): DFN=(6,3), parent=#2, <-(#2) ->(#5)
     (SET I32 (MEM I32 (FRAME I32 "c.3")) (ADD I32 (MEM I32 (FRAME I32
"a.1")) (INTCONST I32 2)))
     (JUMP (LABEL I32 ".L5"))
   #5 Basic Block (.L5): DFN=(4,5), parent=#3, <-(#3,#4) ->(#6)
     (CALL (STATIC I32 "printf") ((STATIC I32 "string.6") (MEM I32
(FRAME I32 "c.3"))) ((MEM I32 (FRAME I32 "functionvalue.5"))))
     (SET I32 (MEM I32 (FRAME I32 "returnvalue.4")) (MEM I32 (FRAME I32
"c.3")))
     (JUMP (LABEL I32 ".L6"))
   #6 Basic Block (.L6): DFN=(5,6), parent=#5, <-(#5) ->()
     (EPILOGUE (0 0) (MEM I32 (FRAME I32 "returnvalue.4")))

եϾγ

եϾμ

եϤץऴȤ˹ԤʤˤեϤȥǡ
եϤ롣եϤˤꡢץܥ֥åʬ
䤷ԡ³طĴ٤ơեաCFG, Control Flow
Graphˤ롣եդ顢ܥ֥å֤λ۴طʤɤ
롣ޤ롼׾̤˵뤳Ȥ⤢롣ǡեϡ
֥åñ̤ȤƻФãǽѲǽѿʤɤξ
ȥꥹȤʤɤ롣ǡեϼȤƳơδܥ֥
ФȤɽ롣
ե
եաʴܥ֥åԡ³ط
۴ط¾
ǡե
ãǽѲǽѿѲǽ쥸
ѿ쥸˾֡ȥꥹȡ¾
롼׾
롼פҴط롼פܥ֥åΥꥹȡ¾

ɽȥեȤбդ

եϤɽФƹԤʤHIRHIRΥեϾ
졢LIRLIRΥեϾ롣եϾϡ
ɽФŬ󲽤κݤѤ롣ȤƤϡե
ϤԤʤäȡǡեϤԤʤHIRLIRΥեϤΤ
줫Τߡ뤤ξԤʤȡեϤܤŪ
˼¹Ԥ뤳ȤʤɤǽǤ롣ιܤδ֤ˤϡAι
¹ԤƤʤBιܤ¹ԤǤʤʤɤΰ¸ط롣ե
ץऴȤ˻Ф롣(##11)

ʣHIRȥեбդ
Ĥץեϴܥ֥åΥդȤɽ
եդϡץ൭椫⻲ȤǤ롣ե
ǡեϡܥ֥åΥդ黲ȤǤ뤬ץ
ɽ򸫤ʤɤδܥ֥å˴ޤޤ뤫Τ뤳Ȥ䡢
ܥ֥åɽΤɤб뤫Τ뤳ȤǤ褦ˡɽ
եդδ֤ߤ˥󥯤ĥ롣ϥץǥ٥
դʸϴܥ֥åγȤߤʤʸȿʸʤɡĤδ
ܥ֥åʬ򤵤ʸ估Ǥϡܥ֥åƬɬפʤ
ߤܥ֥åγǤ뤳Ȥ롣ܥ֥
γϥץǥ٥뤬դƤС٥
ʤΥ٥ܥ֥åξؤΥ󥯤ĥ롣
դˡܥ֥åϤƬ˰֤٥ؤΥ󥯤ĥ
롣
ץѴβǡϰǡդΥ᥽åɤȤ
ƴܥ֥åΥդƤѹȡHIRƤϢư
ѹ롣äơϰǤϡե򸫤ʤ飱
ĤѴԤäȤ⡢ƤHIR١ˤ¾βϤѴԤ
Ǥ롣դˡHIRѹХե̵ˤʤäƤޤΤǡ
˥եɬפȤϺƷ׻##21ˡ

ʣLIRȥեбդ(##21)
LIRʬڤΥꥹȤȤɽ졢줬ܥ֥åȤˤޤȤ
졢ԡ³طǷ礵Ƥ롣ʤLIRʬڤΥꥹȤȤ
ɽ줿ܥ֥åեդȤɽƤ롣
äơLIRǤϥեϤΤȤ˴ܥ֥åʬ䤹פǤ롣
jumpʬLIR̿ȤɽƤꡢܥ֥å³
ˤäưŪɽƤΤǤϤʤ
LIRǤϡHIRΤ褦ˣĤʸĤδܥ֥åʬ򤵤뤳
ȤϤʤΤǡΤ褦˴ܥ֥åñ̤ȤեդΤΤ
LIRɽȤ뤳ȤǽǤ롣

ʣ˥ե㡡(##11)
ΥץФHIR˴ŤեϾ򼡤˼
(a) ե
Control flow analysis of main
[Basic Block]
BB =1 (ENTRY BLOCK) Succ(2,3) Pred()
    Stmt( assign  4  assign  7  cmpEq  11)
BB =2 Succ(4) Pred(1)
    Stmt( assign   17)
BB =3 Succ(4) Pred(1)
    Stmt( assign   23)
BB =4 (EXIT BLOCK)
    Succ() Pred(2,3)
    Stmt( labeldSt 28  BBlock 4 return   30)
[ImmediateDominator]
BB =1 ImmediateDominator=NULL
BB =2 ImmediateDominator=1
BB =3 ImmediateDominator=1
BB =4 ImmediateDominator=1
[ImmediatePostDominator]
BB =1 ImmediatePostDominator=4
BB =2 ImmediatePostDominator=4
BB =3 ImmediatePostDominator=4
BB =4 ImmediatePostDominator=NULL

(b) ǡեʰ
BBlock 3 _lab4
  def       assign 23
  kill      assign 17
  reach     assign 4 assign 7
  defined   _xId7(c)
  used      a
  exposed   _xId4(a) _xId8
  eGen      _xId4(a) _xId8
  eKill     _xId7(c)
  availin   _xId4(a) _xId6
  availOut  _xId4(a) _xId6 _xId8
  liveIn    _xId4(a) _xId8
  liveOut   _xId7(c)
  defIn     _xId4(a) _xId5(b)
  defOut    _xId4(a) _xId5(b) _xId7(c)
  defNodes  var 24 c
  useNodes  var 26 a
defUseLists of main
  b
  _xId4(a)
   defined at var 5 a used at
  _xId5(b)
   defined at var 8 b used at
  a
  _xId7(c)
   defined at var 18 c used at
   defined at var 24 c used at
  c

եϤζ̲

ʣ˥եϾλ
ǡեϤκݡơѿʬ˼ѤֹͿHIR
LIRˤΥΡɤˤ⼱ѤֹͿ
ֹˤäƥǡե򻲾Ȥ롣HIRLIRǤϡե
Ƥϰۤʤ뤬ֹɽ뤳ȤˤäơHIRLIRǤΥեϥ
ϡʬ̲Ǥ롣
ե󡢥ǡեϡեϥ⥸塼ˤäHIR
ޤLIR黻Ф롣եϥ⥸塼ϡHIRޤLIRξ
ȥǡե򤯲ʤꡢHIRLIR
Ƕ̲롣
եϥ⥸塼롡ᡡܡ
HIRѡLIRѡ

ʣ˥եϤȥץѴ
եϤϡHIRLIRѴȤ䡢󲽤ŬΤ礭
ץѴԤʤäȤǤϺƷ׻롣ץѴβǥ
칹뤳Ȥ׵ᤷʤĤѴ⥸塼
ǤѴ˻Ȥե򹹿ɬפСϤѴ⥸
塼ǹ롣
HIRʥեȡ
HIRե
HIR󲽡ŬѴ
HIRե
HIR󲽡ŬѴ

HIRLIRؤѴ
 LIRե
LIR󲽡ŬѴ
 LIRե
LIR󲽡ŬѴ

 LIRե

󲽤ŬλؼʤɡΥեϤ٤ϡե
ϤʤƤ⡢ǵ᤿ãǤ褦ˤ롣

ʣ˥ץѴ
(a) HIRФѴ
HIRФơ󲽤ŬΤ˹ԤʤѴϡʬڤ꡼դ
ñ̤ȤΤǤꡢ
꡼դ̤Υ꡼դ֤ʥѿ̾ΰѿؤѹ
ʬڤ̤ʬڤ֤ʴάŸ
ʬڤ꡼դ֤ʼΰѿʥ쥸
꡼դʬڤ֤ѿɤη׻ؤѴ
ʬڤΥԡʥ꡼դ
ʸ
ĤΥΡɤؤλޤɲá
Ρɤʥ٥
ʤɤǤ롣ԤʤΥ᥽åɤѰդΤǡ
ȤäƵѴԤʤΡñ̤뤳ȤǤ뤬κ
ϡHIRڹ¤ι褯ƹԤɬפ롣湽¤ѹ
ԤʤäϡեϤȥǡեϤʤ

(b) LIRФѴ
LIRʬڤʤΤǡ
ʬñ̤ɲá
ʬڤñ̤Ȥɲá
ĤʬڤʬؤŸ
ʤӤ
ʬڤФHIRƱͤѴ
ԤʤȤǤ롣LIRΤǤ˴ܥ֥åñ̤Ȥե
դȤɽƤΤǡܥ֥å֤³طѹʤ
ѴФƤϡ۴طեϤƼ¹ԤɬפϤʤ
LIRѹ硢ǡեϤϺƼ¹Ԥɬפ##21ˡ
