(original) (raw)

%!PS-Adobe-2.0 %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software %%Title: sigplan.dvi %%Pages: 6 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips sigplan.dvi -o sigplan.ps %DVIPSParameters: dpi=300, comments removed %DVIPSSource: TeX output 1996.12.24:1455 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258437 52099154 1000 300 300 (sigplan.dvi) @start /Fa 22 122 df<3078FCFC78300606778518>46 D<000300000780000780000F 80000F00001F00001E00001E00003E00003C00007C0000780000780000F80000F00001F0 0001E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E00003E00 003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I<3078FCFC 783000000000000000003078FCFC78300614779318>58 D<0FF0001FFC003FFE003C0F00 18070000038000038000FF8007FF801FFF807F0380780380E00380E00380E00380F00780 780F803FFFF81FFDF807F0F815147E9318>97 D<7E0000FE00007E00000E00000E00000E 00000E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E00380E00380E 00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C809B 18>I<01FE0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000 E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F 80003F80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F 80700780700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F 801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F0038078070038070 0380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E07C01FFF8007 FF0001F80012147D9318>I<001F80007FC000FFE000E1E001C0C001C00001C00001C000 7FFFC0FFFFC0FFFFC001C00001C00001C00001C00001C00001C00001C00001C00001C000 01C00001C00001C00001C00001C0007FFF007FFF007FFF00131C7F9B18>I<7E0000FE00 007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00 E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC7 FCFFE7FE7FC7FC171C809B18>104 D<038007C007C007C0038000000000000000007FC0 FFC07FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C0FFFFFFFF FFFF101D7C9C18>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3FF0 0E3FF00E3FF00E07800E0F000E1E000E3C000E78000EF0000FF8000FFC000F9C000F0E00 0E0F000E07000E03800E03C07FC7F8FFC7F87FC7F8151C7F9B18>107 DI<7E3E00FEFF807FFFC00FC1C00F80E00F 00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07F C7FCFFE7FE7FC7FC1714809318>110 D<01F0000FFE001FFF003E0F803803807001C070 01C0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000F FE0001F00013147E9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E0038 0E00380E00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E00 0E00000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000151E809318> I114 D<07F7003FFF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003FE00001F 00600780E00380E00380F00380F80F00FFFF00FFFC00E7F00011147D9318>I<01800003 80000380000380000380007FFFC0FFFFC0FFFFC003800003800003800003800003800003 80000380000380000380000380400380E00380E00380E001C1C001FFC000FF80003E0013 197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0 0E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714809318> I119 D<7F8FF0FF8FF87F8FF00E01C00E03800E0380070380070700070700038700038700038E 0001CE0001CE0001CC0000CC0000DC0000780000780000780000700000700000700000F0 0000E00079E0007BC0007F80003F00001E0000151E7F9318>121 D E /Fb 34 120 df<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F 000F801E000F800C000F8000000F8000000F8000000F800000FFFFFF00FFFFFF000F801F 000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F 000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F007FF0FF E07FF0FFE01B237FA21F>12 D<387CFEFEFE7C3807077C8610>46 D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F80001F80001F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 0001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>49 D<03FC000FFF003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003 F80003F00003F00007E00007C0000F80001F00003E0000380000700000E01801C0180380 180700180E00380FFFF01FFFF03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007 FFC00F07E01E03F03F03F03F81F83F81F83F81F81F03F81F03F00003F00003E00007C000 1F8001FE0001FF000007C00001F00001F80000FC0000FC3C00FE7E00FEFF00FEFF00FEFF 00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017207E9F1C>I<0000E00001E00003E0 0003E00007E0000FE0001FE0001FE00037E00077E000E7E001C7E00187E00307E00707E0 0E07E00C07E01807E03807E07007E0E007E0FFFFFFFFFFFF0007E00007E00007E00007E0 0007E00007E00007E000FFFF00FFFF18207E9F1C>I<3000203E01E03FFFC03FFF803FFF 003FFE003FF80033C00030000030000030000030000031FC0037FF003E0FC03807E03003 E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007 C03C1F800FFF0003F80015207D9F1C>I<001F8000FFE003E07007C0F00F01F81F01F83E 01F83E01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC 007EFC007EFC007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003 FFC000FF0017207E9F1C>I<000070000000007000000000F800000000F800000000F800 000001FC00000001FC00000003FE00000003FE00000003FE000000067F000000067F0000 000C7F8000000C3F8000000C3F800000181FC00000181FC00000301FE00000300FE00000 700FF000006007F000006007F00000C007F80000FFFFF80001FFFFFC00018001FC000180 01FC00030001FE00030000FE00070000FF000600007F000600007F00FFE007FFF8FFE007 FFF825227EA12A>65 D<0003FE0080001FFF818000FF01E38001F8003F8003E0001F8007 C0000F800F800007801F800007803F000003803F000003807F000001807E000001807E00 000180FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 0000FE000000007E000000007E000001807F000001803F000001803F000003801F800003 000F8000030007C000060003F0000C0001F800380000FF00F000001FFFC0000003FE0000 21227DA128>67 DI70 D73 D77 D80 D82 D<01FE0207FF861F01FE3C007E7C001E78000E78000EF80006F80006FC0006FC0000FF00 00FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FE00007F00003F0000 3FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F >I<0FFC003FFF807E07C07E03E07E01E07E01F03C01F00001F00001F0003FF003FDF01F C1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E95 1B>97 D<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC00 00FC0000FC0000FC00007C00007E00007E00003E00181F00300FC06007FFC000FF001516 7E9519>99 D<0001FE000001FE0000003E0000003E0000003E0000003E0000003E000000 3E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F00 7E003E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC00 3E00FC003E00FC003E007C003E007C003E003E007E001F00FE000F83BE0007FF3FC001FC 3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8 FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003FFC0 00FF0015167E951A>I<001FC0007FE000F1F001E3F003E3F007C3F007C1E007C00007C0 0007C00007C00007C00007C000FFFE00FFFE0007C00007C00007C00007C00007C00007C0 0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 003FFC003FFC00142380A211>I<01FE0F0007FFBF800F87C7801F03E7801E01E0003E01 F0003E01F0003E01F0003E01F0003E01F0001E01E0001F03E0000F87C0000FFF800009FE 000018000000180000001C0000001FFFE0000FFFF80007FFFE001FFFFF003C003F007800 0F80F0000780F0000780F0000780F000078078000F003C001E001F007C000FFFF80001FF C00019217F951C>I<1C003E007F007F007F003E001C0000000000000000000000000000 00FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F 001F001F00FFE0FFE00B247EA310>105 D108 DII<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC00 7EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE 0017167E951C>II114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8003FFE00 0FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00011167E 9516>I<0180000180000180000180000380000380000780000780000F80003F8000FFFF 00FFFF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80 000F81800F81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>II119 D E /Fc 23 122 df<60F0F06004047D830B>46 D70 D73 D78 D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF803FC007E000E000700 03800380038003C002C006E004D81887E0101A7E9915>83 D<7FFFFF00701C0700401C01 00401C0100C01C0180801C0080801C0080801C0080001C0000001C0000001C0000001C00 00001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C00 00001C0000001C0000001C0000001C000003FFE000191A7F991C>I89 D<1FC000387000383800101C00001C00001C0003FC001E1C00381C00701C00E01C00E01C 80E01C80E03C80705F801F8F0011107F8F13>97 DI<003F 0000070000070000070000070000070000070000070000070000070003E7000C1700180F 00300700700700E00700E00700E00700E00700E00700E00700600700700700380F001C37 0007C7E0131A7F9915>100 D<07C01C3030187018600CE00CFFFCE000E000E000E00060 00700438081C1807E00E107F8F11>I104 D<183C3C18000000000000FC1C1C1C1C1C1C1C1C1C1C1C1C1C1CFF081A80990A>I107 D110 D<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C3807E010107F 8F13>II114 D<1F2060E04020C020C020F0007F003FC01FE000F0807080 30C030C020F0408F800C107F8F0F>I<0800080008000800180018003800FFC038003800 380038003800380038003800382038203820382018201C4007800B177F960F>II119 D121 D E /Fd 1 4 df<0C000C00CCC0EDC07F800C007F80EDC0CCC00C000C000A0B7D8B10>3 D E /Fe 50 122 df<00003FE00000E01000018038000380780003807800070030000700 000007000000070000000E0000000E0000000E000000FFFFE0000E00E0001C01C0001C01 C0001C01C0001C01C0001C03800038038000380380003803800038070000380700007807 000070071000700E2000700E2000700E2000600E2000E0064000E0038000E0000000C000 0000C0000001C000003180000079800000F3000000620000003C0000001D29829F1A>12 D<00003FCE0000E0EE000181FC000381FC000300DC0007001C0007003800070038000700 38000E0038000E0070000E007000FFFFF0000E0070001C00E0001C00E0001C00E0001C00 E0001C01C0003801C0003801C0003801C000380380003803800070038000700388007007 10007007100070071000E0071000E0032000E001C000E0000000C0000001C0000001C000 003180000079800000F3000000620000003C0000001F29829F1B>I<1C3E7E7E3A020404 080810204080070E769F0E>39 D<0000C0000000C0000000C00000018000000180000001 800000018000000300000003000000030000000300000006000000060000FFFFFFE0FFFF FFE0000C0000000C0000000C0000000C0000001800000018000000180000001800000030 0000003000000030000000300000002000001B1C7A9823>43 D<7FF0FFE07FE00C037D8A 10>45 D<70F8F8F0E005057B840E>I<000200020006000E003C00DC031C001C00380038 00380038007000700070007000E000E000E000E001C001C001C001C00380038003800380 0780FFF80F1E7B9D17>49 D<001F800060E0008070010030020038044038044038042038 04407004C0700380600000E00001C000030000FE00001C00000600000700000780000780 000780300780780780780780F00F00800F00401E00401C0040380030E0000F8000151F7C 9D17>51 D<001F0000718000C0C00180C00380E00700E00F00E00F01E01E01E01E01E01E 01E01E01C01C03C01C03C01C03C01C07C01C0F800C0F8006378003C700000F00000E0000 0E00001C00601C00F03800F07000E0600080C0004380003E0000131F7B9D17>57 D<007800018600060300080100080180100180200180200300400300700700781E00F03C 0060780000F00003C0000780000F00000E00000C00001840001840000880000F00000000 000000000000000000000000001C00003E00003E00003C0000380000112178A017>63 D<0001FC0000060300001800C00060002000800020010000100201E00804061808040C08 0808180408103007041070070420E0070420E0070841C00E0841C00E0841C00E0841C00E 0841C01C1081801C1081C01C1081C03C2041C0382040C0F84040619880403E0F00200000 0010000000100001C00C000F000300F80000FF80001E207A9F23>I<0000020000000600 0000060000000E0000001E0000001E0000003F0000002F0000004F000000CF0000008F00 00010F0000010F0000020F0000020F0000040F0000080F0000080F0000100F8000100780 00200780003FFF8000400780008007800080078001000780010007800200078006000780 040007801E0007C0FF807FF81D207E9F22>I<0000FE0200078186001C004C0038003C00 60003C00C0001C01C0001803800018070000180F0000181E0000101E0000103C0000003C 00000078000000780000007800000078000000F0000000F0000000F0000000F0000000F0 0000807000008070000080700001003800010038000200180004000C0018000600200003 81C00000FE00001F217A9F21>67 D<00FFFF80001E00E0001E0070001E0038001E001C00 3C001C003C000E003C000E003C000E0078000E0078000E0078000E0078000E00F0001E00 F0001E00F0001E00F0001E01E0003C01E0003C01E0003C01E0007803C0007003C0007003 C000E003C001C0078003C00780038007800E0007801C000F007000FFFFC0001F1F7D9E22 >I<01FFFFFE001E001C001E000C001E0004001E0004003C0004003C0004003C0004003C 000400780408007804000078040000780C0000F0180000FFF80000F0180000F0180001E0 100001E0100001E0100001E0001003C0002003C0002003C0004003C00040078000800780 018007800100078007000F001F00FFFFFE001F1F7D9E1F>I<0000FC040007030C001C00 980030007800E0007801C000380380003003800030070000300E0000301E0000201E0000 203C0000003C00000078000000780000007800000078000000F0000000F000FFF0F00007 80F0000780F0000F0070000F0070000F0070000F0070001E0038001E0018003E001C002E 000E00CC000383040000FC00001E217A9F23>71 D<01FFF0001F00001E00001E00001E00 003C00003C00003C00003C0000780000780000780000780000F00000F00000F00000F000 01E00001E00001E00001E00003C00003C00003C00003C000078000078000078000078000 0F8000FFF000141F7D9E12>73 D<01FFF800001F0000001E0000001E0000001E0000003C 0000003C0000003C0000003C00000078000000780000007800000078000000F0000000F0 000000F0000000F0000001E0000001E0000001E0000001E0008003C0010003C0010003C0 030003C00200078006000780060007800C0007801C000F007800FFFFF800191F7D9E1D> 76 D<01FE00007FC0001E0000FC00001E0000F800001700017800001700017800002700 02F00000270004F00000270004F00000270008F00000470009E00000470011E000004700 21E00000470021E00000870043C00000838043C00000838083C00000838083C000010381 0780000103820780000103820780000103840780000203840F00000203880F0000020390 0F00000203900F00000401E01E00000401E01E00000401C01E00000C01801E00001C0180 3E0000FF8103FFC0002A1F7D9E29>I<00FF003FE0001F000F00001F0004000017800400 001780040000278008000023C008000023C008000023C008000041E010000041E0100000 41F010000040F010000080F0200000807820000080782000008078200001003C40000100 3C400001003C400001001E400002001E800002001E800002000F800002000F800004000F 0000040007000004000700000C000700001C00020000FF80020000231F7D9E22>I<0001 FC0000070700001C01C0003000E000E0006001C000700380007007800038070000380E00 00381E0000381C0000383C0000383C00003878000078780000787800007878000078F000 00F0F00000F0F00000E0F00001E0F00001C0F00003C0700003807000070078000F003800 1E0038003C001C0070000E00E0000783800001FC00001D217A9F23>I<01FFFF80001E00 E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C00780078007800 78007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001E000 0001E0000003C0000003C0000003C0000003C00000078000000780000007800000078000 000F800000FFF000001E1F7D9E1F>I<0007E040001C18C0003005800060038000C00380 01C00180018001000380010003800100038001000380000003C0000003C0000003F80000 01FF800001FFE000007FF000001FF0000001F80000007800000078000000380000003800 20003800200038002000300060007000600060006000E0007000C000E8038000C6060000 81F800001A217D9F1A>83 D<0FFFFFFC1E03C0381803C0181003C0082003C00820078008 600780084007800840078008800F0010000F0000000F0000000F0000001E0000001E0000 001E0000001E0000003C0000003C0000003C0000003C0000007800000078000000780000 0078000000F0000000F0000000F0000000F0000001F000007FFF80001E1F799E21>I<3F FC0FF807C003C00780010007800100078001000F0002000F0002000F0002000F0002001E 0004001E0004001E0004001E0004003C0008003C0008003C0008003C0008007800100078 0010007800100078001000F0002000F0002000F0002000F0004000F00040007000800070 01000030020000380400000C18000007E000001D20779E22>I87 D<00FFF07FE0001F801F00000F000C00000F801800000780100000 078020000007C040000003C080000003C100000003E200000001E600000001EC00000001 F800000000F000000000F000000000F800000000F8000000017C000000023C000000063C 000000043E000000081E000000101E000000201F000000400F000000800F000001000F80 00030007800006000780001F000FC000FFC03FF800231F7E9E22>I<00F1800389C00707 800E03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C 40F01C40703C40705C40308C800F070013147C9317>97 D<07803F800700070007000700 0E000E000E000E001C001C001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01E E01EE01CE03CE038607060E031C01F0010207B9F15>I<007E0001C1000300800E07801E 07801C07003C0200780000780000780000F00000F00000F00000F00000F0000070010070 020030040018380007C00011147C9315>I<0000780003F8000070000070000070000070 0000E00000E00000E00000E00001C00001C000F1C00389C00707800E03801C03803C0380 380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40 308C800F070015207C9F17>I<007C01C207010E011C013C013802780C7BF07C00F000F0 00F000F0007000700170023804183807C010147C9315>I<00007800019C00033C00033C 000718000700000700000E00000E00000E00000E00000E0000FFE0001C00001C00001C00 001C0000380000380000380000380000380000700000700000700000700000700000E000 00E00000E00000E00000E00001C00001C00001C0000180003180007B0000F30000660000 3C00001629829F0E>I<001E3000713800E0F001C0700380700780700700E00F00E00F00 E00F00E01E01C01E01C01E01C01E01C01E03801E03800E07800E0B8006170001E7000007 00000700000E00000E00300E00781C00F038006070003FC000151D7F9315>I<01E0000F E00001C00001C00001C00001C000038000038000038000038000070000070000071E0007 63000E81800F01C00E01C00E01C01C03801C03801C03801C038038070038070038070038 0E10700E20700E20701C20700C40E00C8060070014207D9F17>I<00C001E001E001C000 000000000000000000000000000E001300230043804700470087000E000E000E001C001C 001C003840388038807080310032001C000B1F7C9E0E>I<0001800003C00003C0000380 000000000000000000000000000000000000000000003C00004600008700008700010700 010700020E00000E00000E00000E00001C00001C00001C00001C00003800003800003800 00380000700000700000700000700000E00000E00030E00079C000F180006300003C0000 1228829E0E>I<01E0000FE00001C00001C00001C00001C0000380000380000380000380 000700000700000703C00704200E08E00E11E00E21E00E40C01C80001D00001E00001FC0 0038E000387000387000383840707080707080707080703100E03100601E0013207D9F15 >I<03C01FC0038003800380038007000700070007000E000E000E000E001C001C001C00 1C0038003800380038007000700070007100E200E200E200E200640038000A207C9F0C> I<1C0F80F0002630C318004740640C004780680E004700700E004700700E008E00E01C00 0E00E01C000E00E01C000E00E01C001C01C038001C01C038001C01C038001C01C0708038 038071003803807100380380E10038038062007007006400300300380021147C9325>I< 1C0F802630C04740604780604700704700708E00E00E00E00E00E00E00E01C01C01C01C0 1C01C01C03843803883803883807083803107003303001C016147C931A>I<007C0001C3 000301800E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F007 80F00700700F00700E0030180018700007C00013147C9317>I<01C1E002621804741C04 781C04701E04701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01C03803807803 80700380E003C1C0072380071E000700000700000E00000E00000E00000E00001C00001C 0000FF8000171D809317>I<1C1E002661002783804787804707804703008E00000E0000 0E00000E00001C00001C00001C00001C0000380000380000380000380000700000300000 11147C9313>114 D<00FC030206010C030C070C060C000F800FF007F803FC003E000E70 0EF00CF00CE008401020601F8010147D9313>I<018001C0038003800380038007000700 FFF007000E000E000E000E001C001C001C001C0038003800380038207040704070807080 31001E000C1C7C9B0F>I<0E00C01300E02301C04381C04701C04701C08703800E03800E 03800E03801C07001C07001C07001C07101C0E20180E20180E201C1E400C264007C38014 147C9318>I<0E00C1C01300E3C02301C3E04381C1E04701C0E04701C060870380400E03 80400E0380400E0380401C0700801C0700801C0700801C0701001C0701001C0601001C0F 02000C0F04000E13080003E1F0001B147C931E>119 D<0383800CC4401068E01071E020 71E02070C040E00000E00000E00000E00001C00001C00001C00001C040638080F38080F3 8100E5810084C60078780013147D9315>I<0E00C01300E02301C04381C04701C04701C0 8703800E03800E03800E03801C07001C07001C07001C07001C0E00180E00180E001C1E00 0C3C0007DC00001C00001C00003800F03800F07000E06000C0C0004380003E0000131D7C 9316>I E /Ff 80 128 df<001F83E000F06E3001C078780380F8780300F03007007000 070070000700700007007000070070000700700007007000FFFFFF800700700007007000 070070000700700007007000070070000700700007007000070070000700700007007000 070070000700700007007000070070000700700007007000070070003FE3FF001D20809F 1B>11 D<003F0000E0C001C0C00381E00701E00701E00700000700000700000700000700 00070000FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 E00700E00700E00700E00700E00700E00700E00700E00700E03FC3FC1620809F19>I<00 3FE000E0E001C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FF FFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007 00E00700E00700E00700E00700E00700E00700E03FE7FC1620809F19>I<001F81F80000 F04F040001C07C06000380F80F000300F00F000700F00F00070070000007007000000700 700000070070000007007000000700700000FFFFFFFF0007007007000700700700070070 070007007007000700700700070070070007007007000700700700070070070007007007 000700700700070070070007007007000700700700070070070007007007000700700700 07007007003FE3FE3FE02320809F26>I<70F8F8F8F8F8F8F87070707070707070707020 20202020000000000070F8F8F87005217CA00D>33 D<7038F87CFC7EFC7E743A04020402 04020804080410081008201040200F0E7F9F17>I<078000180018400018003020003000 301800E00060170360006008FCC000E008018000E008018000E008030000E008060000E0 08060000E0080C0000600818000060101800003010300000302060000018406000000780 C0000000018078000001818400000303020000030301000006070100000C060100000C0E 008000180E008000300E008000300E008000600E008000C00E008000C00E008001800601 000300070100030003010006000302000C00018400040000780021257EA126>37 D<70F8FCFC74040404080810102040060E7C9F0D>39 D<0040008001000300060004000C 001800180038003000300070006000600060006000E000E000E000E000E000E000E000E0 00E000E000E000E00060006000600060007000300030003800180018000C000400060003 000100008000400A2E7BA112>I<8000400020003000180008000C000600060007000300 03000380018001800180018001C001C001C001C001C001C001C001C001C001C001C001C0 01800180018001800380030003000700060006000C000800180030002000400080000A2E 7EA112>I<00030000000300000003000000030000000300000003000000030000000300 0000030000000300000003000000030000000300000003000000030000FFFFFFFCFFFFFF FC0003000000030000000300000003000000030000000300000003000000030000000300 000003000000030000000300000003000000030000000300001E207E9A23>43 D<70F0F8F878080808101010202040050E7C840D>II<70F8F8F8 7005057C840D>I<0000400000C000018000018000018000030000030000030000060000 0600000C00000C00000C0000180000180000180000300000300000600000600000600000 C00000C00000C0000180000180000180000300000300000600000600000600000C00000C 00000C0000180000180000300000300000300000600000600000600000C00000C0000012 2D7EA117>I<03F0000E1C001C0E00180600380700700380700380700380700380F003C0 F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0 7003807003807003807807803807001806001C0E000E1C0003F000121F7E9D17>I<0080 03800F80F380038003800380038003800380038003800380038003800380038003800380 03800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C1C0010 0E00200700400780800780F007C0F803C0F803C0F803C02007C00007C000078000078000 0F00000E00001C0000380000700000600000C0000180000300000600400C004018004010 00803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F80780780 780780380F80000F80000F00000F00001E00001C0000700007F000003C00000E00000F00 0007800007800007C02007C0F807C0F807C0F807C0F00780400780400F00200E00183C00 07F000121F7E9D17>I<000600000600000E00000E00001E00002E00002E00004E00008E 00008E00010E00020E00020E00040E00080E00080E00100E00200E00200E00400E00C00E 00FFFFF0000E00000E00000E00000E00000E00000E00000E0000FFE0141E7F9D17>I<18 03001FFE001FFC001FF8001FE00010000010000010000010000010000010000011F00016 1C00180E001007001007800003800003800003C00003C00003C07003C0F003C0F003C0E0 0380400380400700200600100C0008380007E000121F7E9D17>I<007C00018200070100 0E03800C0780180780380300380000780000700000700000F1F000F21C00F40600F80700 F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C0700380380380380700 1807000C0E00061C0001F000121F7E9D17>I<4000007FFFE07FFFC07FFFC04000808001 0080010080020000040000040000080000100000100000200000200000600000600000E0 0000C00001C00001C00001C00001C00003C00003C00003C00003C00003C00003C00003C0 00018000131F7E9D17>I<03F0000C0C0010060030030020018060018060018060018070 01807803003E03003F06001FC8000FF00003F80007FC000C7E00103F00300F8060078060 01C0C001C0C000C0C000C0C000C0C000806001802001001002000C0C0003F000121F7E9D 17>I<03F0000E18001C0C00380600380700700700700380F00380F00380F003C0F003C0 F003C0F003C0F003C07007C07007C03807C0180BC00E13C003E3C0000380000380000380 000700300700780600780E00700C002018001070000FC000121F7E9D17>I<70F8F8F870 0000000000000000000070F8F8F87005147C930D>I<70F8F8F870000000000000000000 0070F0F8F878080808101010202040051D7C930D>I<0001000000038000000380000003 80000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010 F00000207800002078000020780000403C0000403C0000C03E0000801E0000801E0001FF FF0001000F0001000F00020007800200078002000780040003C0040003C00C0003C01E00 03E0FF801FFE1F207F9F22>65 DI<000FE01000381C3000E0027003C00170078000F00F0000701E0000701E0000303C0000 303C0000107C00001078000010F8000000F8000000F8000000F8000000F8000000F80000 00F8000000F8000000F8000000780000007C0000103C0000103C0000101E0000201E0000 200F0000200780004003C0008000E0030000380C00000FF0001C217E9F21>IIII<000FE01000381C 3000E0027003C00170078000F00F0000701E0000701E0000303C0000303C0000107C0000 1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8003F FEF80001F0780000F07C0000F03C0000F03C0000F01E0000F01E0000F00F0000F0078000 F003C0017000E0023000380C10000FF0001F217E9F24>III<07FFC0003E00001E00001E00001E00001E00001E00001E00001E0000 1E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E0000 1E00001E00201E00F81E00F81E00F81E00F01C00403C006038001070000FC00012207F9E 17>IIII< FF000FF80F8003E00F8000800BC0008009E0008009E0008008F000800878008008780080 083C0080081E0080081E0080080F008008078080080780800803C0800801E0800801E080 0800F080080078800800788008003C8008001E8008001E8008000F800800078008000780 08000380080001803E000180FF8000801D1F7E9E22>I<001FE0000070380001C00E0003 800700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000F878000078F8 00007CF800007CF800007CF800007CF800007CF800007CF800007CF800007CF800007C78 0000787C0000F87C0000F83C0000F03E0001F01E0001E00F0003C0070003800380070001 E01E0000703800001FE0001E217E9F23>II82 D<03F0400C0CC01803C03001C06000C06000C0E000C0E00040E00040E00040F00000F800 007C00007F80003FF8001FFF0007FF8000FFC0001FE00003E00001E00000F00000708000 70800070800070800070C00060C000E0E000C0F80180C6030081FC0014217E9F19>I<7F FFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F001080 0F0010000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 0F0000000F0000001F800003FFFC001C1F7E9E21>II87 D91 D<080410082010201040204020804080408040 B85CFC7EFC7E7C3E381C0F0E7A9F17>II<1FE000 303000781800781C00300E00000E00000E00000E0000FE00078E001E0E00380E00780E00 F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>97 D<1C0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00 001C7C001D87001E01801E00C01C00E01C00701C00701C00781C00781C00781C00781C00 781C00781C00701C00F01C00E01E00C01A0180198700107C0015207E9F19>I<01FC0007 06001C0F00380F00380600780000700000F00000F00000F00000F00000F00000F0000070 00007800003800803800801C010007060001F80011147F9314>I<0001C0000FC00001C0 0001C00001C00001C00001C00001C00001C00001C00001C00001C001F1C0070DC00C03C0 1801C03801C07801C07001C0F001C0F001C0F001C0F001C0F001C0F001C07001C07001C0 3801C01803C00C03C0070DC001F1F815207F9F19>I<03F0000E1C001C0E003807003807 00700700700380F00380F00380FFFF80F00000F00000F000007000007000003800803800 801C010007060001F80011147F9314>I<007C01C6030F070F0E060E000E000E000E000E 000E000E00FFF00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E007FE01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F 00780F00780F00780F00380E001C1C001E380033E0002000002000003000003000003FFE 001FFF801FFFC03001E0600070C00030C00030C00030C000306000603000C01C038003FC 00141F7F9417>I<1C0000FC00001C00001C00001C00001C00001C00001C00001C00001C 00001C00001C00001C7C001C86001D03001E03801E03801C03801C03801C03801C03801C 03801C03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014207E9F 19>I<38007C007C007C0038000000000000000000000000001C00FC001C001C001C001C 001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80091F7F9E0C>I< 00E001F001F001F000E0000000000000000000000000007007F000F00070007000700070 007000700070007000700070007000700070007000700070007000700070007000706070 F060F0C061803F000C28829E0E>I<1C0000FC00001C00001C00001C00001C00001C0000 1C00001C00001C00001C00001C00001C1FE01C07801C06001C04001C08001C10001C2000 1C60001CE0001DF0001E70001C38001C3C001C1C001C0E001C0F001C07001C07801C07C0 FF9FF014207E9F18>I<1C00FC001C001C001C001C001C001C001C001C001C001C001C00 1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 FF8009207F9F0C>I<1C3E03E000FCC30C30001D039038001E01E01C001E01E01C001C01 C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C0 1C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF 8021147E9326>I<1C7C00FC86001D03001E03801E03801C03801C03801C03801C03801C 03801C03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014147E93 19>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0 F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<1C7C 00FD87001E01801E01C01C00E01C00F01C00701C00781C00781C00781C00781C00781C00 781C00701C00F01C00E01E01C01E03801D87001C7C001C00001C00001C00001C00001C00 001C00001C00001C0000FF8000151D7E9319>I<01F040070CC00E02C01C03C03801C078 01C07001C0F001C0F001C0F001C0F001C0F001C0F001C07001C07801C03801C01C03C00C 05C00709C001F1C00001C00001C00001C00001C00001C00001C00001C00001C0000FF815 1D7F9318>I<1CF0FD181E3C1E3C1E181C001C001C001C001C001C001C001C001C001C00 1C001C001C001C00FFC00E147E9312>I<0FC830386018C008C008C008E0007C003FE01F F007F8003C800E8006C006C006C004E00CD81887E00F147F9312>I<0200020002000600 06000E000E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E04 0E040E040E040708030801F00E1C7F9B12>I<1C0380FC1F801C03801C03801C03801C03 801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C07800C07 80061B8003E3F014147E9319>IIIII<7FFF700E600E401C40384078407000E001E001C00380078007010E011E011C 0338027006700EFFFE10147F9314>III<7038F87CF87CF87C70380E057C9E17>127 D E /Fg 33 120 df<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800003FFF0000FFFFC001F03FE0038 00FF007C007F80FE003FC0FF003FC0FF003FE0FF001FE0FF001FE07E001FE03C003FE000 003FE000003FC000003FC000007F8000007F000000FE000000FC000001F8000003F00000 03E00000078000000F0000001E0000003C00E0007000E000E000E001C001C0038001C007 0001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622 >I<007F800003FFF00007FFF8000F81FE001F00FE003F80FF003F807F803F807F803F80 7F801F807F800F007F800000FF000000FF000000FE000001FC000001F8000007F00000FF C00000FFF0000001FC000000FE0000007F0000007F8000003FC000003FC000003FE00000 3FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F01 FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E 000000FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E 0000707E0000E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E 0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE 000000FE000000FE000000FE000000FE000000FE00003FFFF8003FFFF8003FFFF81D277E A622>I<080003001F803F001FFFFE001FFFFC001FFFF8001FFFF0001FFFE0001FFF8000 1FFE00001C0000001C0000001C0000001C0000001C0000001C0000001C7FC0001DFFF800 1F80FC001E003E0008003F0000003F8000001FC000001FC000001FE000001FE018001FE0 7C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F8078003F803C007F00 1F01FE000FFFF80003FFF00000FF80001B277DA622>I<01FF000FFFE01E03F03801F878 01FCFC01FEFE01FEFE01FEFE01FE7C01FE3801FC0003F80007F00007C0000F80001F0000 1E00003C0000380000380000780000700000700000700000700000700000700000000000 000000000000000000000000000000700000F80001FC0003FE0003FE0003FE0001FC0000 F800007000172A7CA920>63 D<000003800000000007C00000000007C0000000000FE000 0000000FE0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF800 0000003FF80000000073FC0000000073FC00000000F3FE00000000E1FE00000001E1FF00 000001C0FF00000001C0FF00000003C0FF80000003807F80000007807FC0000007003FC0 000007003FC000000E001FE000000E001FE000001E001FF000001C000FF000001FFFFFF0 00003FFFFFF800003FFFFFF80000780007FC0000700003FC0000F00003FE0000E00001FE 0000E00001FE0001E00001FF0001C00000FF0003C00000FF80FFFE001FFFFEFFFE001FFF FEFFFE001FFFFE2F297EA834>65 D<00003FF001800003FFFE0380000FFFFF8780003FF0 07DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801FE000 0007801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F8000 000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000 000000FF8000000000FF8000000000FF80000000007F80000000007F80000000007FC000 0003803FC0000003803FC0000003801FE0000003801FE0000007000FF00000070007F000 000E0003FC00001E0001FE00003C0000FF8000F800003FF007E000000FFFFFC0000003FF FF000000003FF8000029297CA832>67 D<00003FF001800003FFFE0380000FFFFF878000 3FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801F E0000007801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F 8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF 8000000000FF8000000000FF8000000000FF80007FFFFC7F80007FFFFC7F80007FFFFC7F C000007F803FC000007F803FC000007F801FE000007F801FE000007F800FF000007F8007 F800007F8003FC00007F8001FE00007F8000FF8000FF80003FF003DF80000FFFFF8F8000 03FFFF078000003FF801802E297CA836>71 D73 D77 D80 D82 D87 D<03FF80000FFFF0001F01F8003F807E003F807E003F803F001F003F800E003F8000003F 8000003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F 80FE003F80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03 FC1E1B7E9A21>97 D<003FF80000FFFE0003F01F0007E03F800FC03F801F803F803F801F 007F000E007F0000007F000000FF000000FF000000FF000000FF000000FF000000FF0000 00FF0000007F0000007F0000007F8000003F8001C01F8001C00FC0038007E0070003F01E 0000FFFC00003FE0001A1B7E9A1F>99 D<00003FF80000003FF80000003FF800000003F8 00000003F800000003F800000003F800000003F800000003F800000003F800000003F800 000003F800000003F800000003F800000003F800001FE3F80000FFFBF80003F83FF80007 E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF00 03F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003 F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF80003F03FFF 8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F000F80 1F801F800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFF FFE0FF000000FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC0 01C007E0038003F81F0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F8 7F03F87F03F07F07F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFF C0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0007FFF 807FFF807FFF80182A7EA915>I<00FF81F003FFE7F80FC1FE7C1F80FC7C1F007C383F00 7E107F007F007F007F007F007F007F007F007F007F007F007F003F007E001F007C001F80 FC000FC1F8001FFFE00018FF800038000000380000003C0000003E0000003FFFF8001FFF FF001FFFFF800FFFFFC007FFFFE01FFFFFF03C0007F07C0001F8F80000F8F80000F8F800 00F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E9A22> II<07000F801FC03FE03FE03FE01FC00F8007000000000000000000000000000000FFE0 FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 0FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I<000700000F80001FC0003FE000 3FE0003FE0001FC0000F8000070000000000000000000000000000000000000000000000 FFE000FFE000FFE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 0FE0000FE0000FE0000FE0000FE0000FE0000FE07C0FE0FE0FE0FE0FC0FE1F80FE1F007C 3E003FFC000FF000133784AA15>IIIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F 0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF 0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001 FFFC00003FE0001D1B7E9A22>I114 D<03FE300FFFF01E03F03800F0700070F00070F00070F80070FE0000FFE0007FFE007FFF 803FFFE01FFFF007FFF800FFF80007FC6000FCE0007CE0003CF0003CF00038F80038FC00 70FF01E0F7FFC0C1FF00161B7E9A1B>I<00700000700000700000700000F00000F00000 F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F00007F00007F00007 F00007F00007F00007F00007F00007F00007F00007F00007F00007F03807F03807F03807 F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B>II119 D E /Fh 1 102 df<07C0041FE01830783060 1FE0800F801605809D17>101 D E /Fi 1 4 df<020002000200C218F2783AE00F800F80 3AE0F278C2180200020002000D0E7E8E12>3 D E /Fj 33 122 df<70F8FCFC74040404 04080810102040060F7C840E>44 D<70F8F8F87005057C840E>46 D<000080000180000180000300000300000300000600000600000600000C00000C00000C 0000180000180000180000300000300000300000600000600000600000C00000C00000C0 000180000180000180000180000300000300000300000600000600000600000C00000C00 000C0000180000180000180000300000300000300000600000600000600000C00000C000 00C0000011317DA418>I<70F8F8F870000000000000000000000070F8F8F87005157C94 0E>58 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E000 0009F0000008F0000008F00000107800001078000010780000203C0000203C0000203C00 00401E0000401E0000C01F0000800F0000800F0001FFFF800100078001000780020003C0 020003C0020003C0040001E0040001E0040001E0080000F01C0000F03E0001F8FF800FFF 20237EA225>65 DI<0007E0100038183000E0063001C00170038000F0070000F00E0000701E 0000701C0000303C0000303C0000307C0000107800001078000010F8000000F8000000F8 000000F8000000F8000000F8000000F8000000F800000078000000780000107C0000103C 0000103C0000101C0000201E0000200E000040070000400380008001C0010000E0020000 381C000007E0001C247DA223>III<03F0200C0C601802603001E07000E0600060E00060E00060 E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC0 0007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0 F000C0C80180C6070081FC0014247DA21B>83 D85 D<1FE000303800780C00780E00 30070000070000070000070000FF0007C7001E07003C0700780700700700F00708F00708 F00708F00F087817083C23900FC1E015157E9418>97 D<0E0000FE00001E00000E00000E 00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E1F000E61C00E 80600F00300E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E 001C0E003C0E00380F00700C80600C41C0083F0017237FA21B>I<01FE000703000C0780 1C0780380300780000700000F00000F00000F00000F00000F00000F00000F00000700000 7800403800401C00800C010007060001F80012157E9416>I<0000E0000FE00001E00000 E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E001F8E00704 E00C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000E0F000E0F000E0F000 E07000E07800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01FC000707000C 03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F0000070 00007800203800201C00400E008007030000FC0013157F9416>I<003E0000E30001C780 038780030780070000070000070000070000070000070000070000070000070000FFF800 070000070000070000070000070000070000070000070000070000070000070000070000 0700000700000700000700000700000700000780007FF000112380A20F>I<0E0000FE00 001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 000E1F800E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E00700E00 700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>104 D<1C003E003E003E001C00000000000000000000000000000000000E007E001E000E000E 000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A227F A10E>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00 000E00000E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E10000E38 000EF8000F1C000E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FFE3 FE17237FA21A>107 D<0E00FE001E000E000E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E00FFE00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C00E00F 003C00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 3800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E0038 00E00E003800E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00 700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00 700E00700E0070FFE7FF18157F941B>I<01FC000707000C01801800C03800E070007070 0070F00078F00078F00078F00078F00078F00078F000787000707800F03800E01C01C00E 038007070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E00380E003C0E003C 0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E0 0E41C00E3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000 171F7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E 000E000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008 F0007F003FE00FF001F8003C801C800C800CC00CC008E018D0308FC00E157E9413>I<02 000200020002000600060006000E001E003E00FFFC0E000E000E000E000E000E000E000E 000E000E000E000E040E040E040E040E040E040708030801F00E1F7F9E13>I<0E0070FE 07F01E00F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E 00700E00700E00700E00F00E00F006017003827800FC7F18157F941B>IIIII E /Fk 23 118 df<78FCFCFCFC780000000000000000000000000000000000000078FC FCFCFC78061F7A9E12>58 D<000003000000000003000000000003000000000007800000 00000780000000000FC0000000000FC0000000000FC00000000017E00000000013E00000 000013E00000000023F00000000021F00000000021F00000000040F80000000040F80000 000040F800000000807C00000000807C00000001007E00000001003E00000001003E0000 0002003F00000002001F00000002001F00000004000F80000004000F80000004000F8000 00080007C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F000 00200001F00000200001F00000400000F80000400000F80000400000F800008000007C00 008000007C00018000007E00010000003E00010000003E00030000003F00030000001F00 070000001F001F8000003F80FFE00001FFFCFFE00001FFFC2E327EB132>65 D<00003FE0010001FFF8030007F01E03001F800307003E000087007800004F00F000002F 01E000001F03C000000F078000000F0F800000070F000000071F000000031E000000033E 000000033C000000017C000000017C000000017C000000017800000000F800000000F800 000000F800000000F800000000F800000000F800000000F800000000F800000000F80000 0000F800000000F80000000078000000007C000000007C000000017C000000013C000000 013E000000011E000000011F000000020F000000020F80000006078000000403C0000008 01E000000800F00000100078000020003E0000C0001F8003800007F00F000001FFFC0000 003FE00028337CB130>67 D80 D<7FFFFFFFFFE07FFFFFFFFFE07E000F8007E078000F8001 E070000F8000E060000F80006040000F80002040000F800020C0000F800030C0000F8000 3080000F80001080000F80001080000F80001080000F80001080000F80001080000F8000 1000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000000F80000000000F80000000000F80000000000F80000000000F80000000000F8000 0000001FC00000000FFFFF8000000FFFFF80002C317EB030>84 D<00FE00000303C0000C 00E00010007000100038003C003C003E001C003E001E003E001E0008001E0000001E0000 001E0000001E00000FFE0000FC1E0003E01E000F801E001F001E003E001E003C001E007C 001E00F8001E04F8001E04F8001E04F8003E04F8003E0478003E047C005E043E008F080F 0307F003FC03E01E1F7D9E21>97 D<0780000000FF80000000FF800000000F8000000007 800000000780000000078000000007800000000780000000078000000007800000000780 000000078000000007800000000780000000078000000007800000000780000000078000 00000781FC00000786078000078801C000079000E00007A000700007C00038000780003C 000780001E000780001E000780001F000780000F000780000F000780000F800780000F80 0780000F800780000F800780000F800780000F800780000F800780000F000780000F0007 80001F000780001E000780001E000780003C0007C00038000720007000072000E0000618 01C00006060700000401F8000021327EB125>I<001FC00000F0300001C00C0007800200 0F0002000E000F001E001F003C001F003C001F007C00040078000000F8000000F8000000 F8000000F8000000F8000000F8000000F8000000F8000000F8000000780000007C000000 3C0000003C0000801E0000800E0001000F0001000780020001C00C0000F03000001FC000 191F7E9E1D>I<003F800000E0E0000380380007003C000E001E001E001E001C000F003C 000F007C000F0078000F8078000780F8000780F8000780FFFFFF80F8000000F8000000F8 000000F8000000F8000000F8000000780000007C0000003C0000003C0000801E0000800E 0001000F0002000700020001C00C0000F03000001FC000191F7E9E1D>101 D<0007E0001C1000383800707C00E07C01E07C01C03803C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C000FFFFC0FFFFC003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00007E0 007FFF007FFF0016327FB114>I<000000F0007F030801C1C41C0380E81C070070080F00 78001E003C001E003C003E003E003E003E003E003E003E003E003E003E003E003E001E00 3C001E003C000F007800070070000780E00009C1C000087F000018000000180000001800 000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800E000FC01800 01E0300000F070000070E0000038E0000038E0000038E0000038E0000038700000707000 0070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>I<0780000000FF80 000000FF800000000F800000000780000000078000000007800000000780000000078000 000007800000000780000000078000000007800000000780000000078000000007800000 000780000000078000000007800000000780FE00000783078000078C03C000079001E000 07A001E00007A000F00007C000F00007C000F000078000F000078000F000078000F00007 8000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 00F000078000F000078000F000078000F000078000F000078000F000078000F000078000 F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF8021327EB125>I<0F00 1F801F801F801F800F000000000000000000000000000000000000000000000007807F80 7F800F800780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800FC0FFF8FFF80D307EAF12>I<001E003F003F00 3F003F001E00000000000000000000000000000000000000000000001F01FF01FF001F00 0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00 0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F200EF80EF8 1EF81C703860701FC0103E83AF14>I<0780FF80FF800F80078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780 07800FC0FFFCFFFC0E327EB112>108 D<0780FE001FC000FF83078060F000FF8C03C180 78000F9001E2003C0007A001E4003C0007A000F4001E0007C000F8001E0007C000F8001E 00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00 078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007 8000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E000780 00F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E000FC001 F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0780FE0000FF83078000FF 8C03C0000F9001E00007A001E00007A000F00007C000F00007C000F000078000F0000780 00F000078000F000078000F000078000F000078000F000078000F000078000F000078000 F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0 00078000F000078000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF80 211F7E9E25>I<001FC00000F0780001C01C00070007000F0007801E0003C01C0001C03C 0001E03C0001E0780000F0780000F0780000F0F80000F8F80000F8F80000F8F80000F8F8 0000F8F80000F8F80000F8F80000F8780000F07C0001F03C0001E03C0001E01E0003C01E 0003C00F00078007800F0001C01C0000F07800001FC0001D1F7E9E21>I<0781FC0000FF 86078000FF8801C0000F9000E00007A000700007C00078000780003C000780003E000780 001E000780001F000780001F000780000F000780000F800780000F800780000F80078000 0F800780000F800780000F800780000F800780000F000780001F000780001F000780001E 000780003E000780003C0007C000780007A000700007A000E000079803C00007860F0000 0781F8000007800000000780000000078000000007800000000780000000078000000007 8000000007800000000780000000078000000007800000000FC0000000FFFC000000FFFC 000000212D7E9E25>I<0783E0FF8418FF887C0F907C07A07C07A03807C00007C00007C0 000780000780000780000780000780000780000780000780000780000780000780000780 000780000780000780000780000780000780000780000FC000FFFE00FFFE00161F7E9E19 >114 D<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F800 007E00003FF0001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC000 1CC0001CE0001CE00018F00038F00030CC0060C301C080FE00161F7E9E1A>I<00400000 400000400000400000400000C00000C00000C00001C00001C00003C00007C0000FC0001F FFE0FFFFE003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C00003C00003C00003C00003C01003C01003C01003C01003C01003C01003 C01003C01001C02001E02000E0400078C0001F00142C7FAB19>I<078000F000FF801FF0 00FF801FF0000F8001F000078000F000078000F000078000F000078000F000078000F000 078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 8000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 01F000078001F000078001F000038002F00003C004F00001C008F800007030FF80001FC0 FF80211F7E9E25>I E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 68 291 a Fk(Co)r(ol:)29 b(A)21 b(P)n(ortable)h(Pro)t(ject)g (for)g(T)-6 b(eac)n(hing)21 b(Compiler)g(Construction)782 418 y Fj(Alexander)15 b(Aik)o(en)1140 400 y Fi(\003)760 476 y Fj(EECS)i(Departmen)o(t)604 534 y(Univ)o(ersit)o(y)d(of)i (California,)g(Berk)o(eley)590 592 y(h)o(ttp://www.cs.b)q(erk)o(eley)l (.edu/)m Fh(e)-6 b Fj(aik)o(en)-75 782 y Fg(1)69 b(In)n(tro)r(duction) -75 883 y Ff(The)14 b(compiler)h(course)e(is)h(a)g(\014xture)f(of)g (undergraduate)h(computer)g(science)h(education.)20 b(Most)13 b(CS)g(programs)f(o\013er)h(a)-75 940 y(course)j(on)g(compilers)g(that) g(includes)i(a)d(substan)o(tial)h(pro)s(ject)f(where)h(studen)o(ts)g (write)g(a)f(compiler)i(for)e(a)h(small)g(pro-)-75 996 y(gramming)c(language.)20 b(The)12 b(pro)s(ject)g(often)h(serv)o(es)f (t)o(w)o(o)g(distinct)i(purp)q(oses:)19 b(it)13 b(teac)o(hes)f (something)h(ab)q(out)g(language)-75 1053 y(design)k(and)f(compiler)h (implemen)o(tation,)g(and)f(it)g(giv)o(es)g(studen)o(ts)f(the)h(exp)q (erience)i(of)e(building)i(a)d(substan)o(tial)i(soft-)-75 1109 y(w)o(are)d(system.)19 b(A)c(compiler)h(pro)s(ject)e(is)h(the)g (most)f(complex)i(soft)o(w)o(are)d(engineering)j(task)e(man)o(y)h (studen)o(ts)f(complete)-75 1165 y(in)i(an)f(undergraduate)g(program.) -4 1222 y(Unfortunately)l(,)e(dev)o(eloping)h(a)e(compiler)i(pro)s (ject)e(is)h(lab)q(or)g(in)o(tensiv)o(e)h(and)e(time)h(consuming,)h(as) e(it)h(incorp)q(orates)-75 1278 y(all)20 b(of)e(the)h(problems)h(of)e (designing)j(and)e(implemen)o(ting)h(a)f(programming)f(language.)31 b(Using)20 b(a)e(\\real")h(language)-75 1335 y(\(meaning)11 b(an)o(y)g(existing)h(programming)f(language)g(that)f(has)h(a)g (signi\014can)o(t)h(n)o(um)o(b)q(er)g(of)e(users\))h(do)q(es)h(not)e (signi\014can)o(tly)-75 1391 y(simplify)k(the)f(problem,)h(b)q(ecause)g (all)f(suc)o(h)g(languages)g(are)f(to)q(o)h(large)f(to)g(b)q(e)i (implemen)o(ted)g(fully)g(b)o(y)f(undergraduates)-75 1448 y(in)i(a)f(single)i(course|in)g(practice,)f(using)g(a)f(real)h (language)g(is)g(a)f(c)o(hoice)h(to)f(use)h(a)f(subset)h(of)f(a)g(real) h(language,)f(whic)o(h)-75 1504 y(p)q(oses)j(a)f(substan)o(tial)h (design)h(problem)g(in)f(itself.)25 b(Designing)18 b(the)f(language)g (to)f(b)q(e)h(implemen)o(ted)i(is)e(just)g(the)f(\014rst)-75 1561 y(problem)k(in)g(creating)f(a)f(course)h(pro)s(ject,)g(ho)o(w)o (ev)o(er.)31 b(Precise)20 b(sp)q(eci\014cations)g(for)f(the)g(pro)s (ject)f(m)o(ust)h(b)q(e)g(written,)-75 1617 y(an)o(y)h(supp)q(orting)h (soft)o(w)o(are)d(m)o(ust)i(b)q(e)g(designed,)j(implemen)o(ted,)f (tested,)f(and)g(do)q(cumen)o(ted,)h(handouts)e(m)o(ust)f(b)q(e)-75 1674 y(prepared,)g(and)f(so)g(on.)28 b(Finally)l(,)20 b(the)e(en)o(tire)h(pro)s(ject)e(should)i(b)q(e)g(implemen)o(ted)g(b)o (y)f(course)g(sta\013)f(prior)h(to)g(actual)-75 1730 y(use)j(in)h(a)e(course,)i(b)q(ecause)g(a)f(full)h(implemen)o(tation)g (is)g(the)e(only)i(reliable)h(w)o(a)o(y)d(to)g(ensure)h(that)f(the)h (pro)s(ject)f(is)-75 1786 y(self-consisten)o(t,)c(complete,)f(and)h (tractable.)-4 1843 y(Readers)h(who)f(ha)o(v)o(e)h(taugh)o(t)e(or)h (tak)o(en)h(compiler)h(courses)e(ma)o(y)g(recognize)i(that)e(this)h (idealized)i(description)f(of)-75 1899 y(a)c(compiler)i(pro)s(ject)d (sometimes)i(b)q(ears)f(little)i(resem)o(blance)f(to)f(realit)o(y)l(.) 20 b(Time)15 b(pressures)f(can)h(dictate)f(that)g(corners)-75 1956 y(are)i(cut)g(in)g(the)g(design)h(of)f(the)f(pro)s(ject,)g(or)h (ev)o(en)g(that)f(the)h(pro)s(ject)f(is)i(designed)g(in)g(\\real)f (time")g(while)h(the)f(course)-75 2012 y(is)i(underw)o(a)o(y|a)g(risky) g(strategy)e(at)h(b)q(est!)27 b(Once)19 b(an)f(instructor)f(has)h (created)f(a)h(pro)s(ject,)f(the)g(in)o(v)o(estmen)o(t)h(made)-75 2069 y(pro)o(vides)c(a)g(strong)f(incen)o(tiv)o(e)i(to)e(reuse)i(the)f (pro)s(ject)f(again)h(and)g(again,)f(ev)o(en)i(b)q(ey)o(ond)f(the)g(p)q (oin)o(t)g(when)h(the)f(pro)s(ject)-75 2125 y(b)q(ecomes)i(outdated.)-4 2182 y(Giv)o(en)h(that)g(compiler)i(courses)e(are)g(imp)q(ortan)o(t)g (and)h(that)e(compiler)j(pro)s(jects)e(are)g(exp)q(ensiv)o(e)i(to)d (create,)i(it)f(is)-75 2238 y(surprising|at)k(least)e(to)g(the)h (author|that)e(there)i(are)f(no)h(standard,)g(widely)h(used)f(compiler) h(pro)s(jects.)32 b(Man)o(y)-75 2295 y(instructors)17 b(create)g(their)h(o)o(wn)e(pro)s(jects,)h(rep)q(eating)g(m)o(uc)o(h)h (w)o(ork)e(that)g(has)h(b)q(een)i(done)e(man)o(y)g(times)g(b)q(efore.) 26 b(In-)-75 2351 y(structors)18 b(do)h(reuse)g(pro)s(jects)f(from)g (previous)i(instances)f(of)g(the)g(same)f(course,)i(but)f(pro)s(jects)f (are)g(not)h(routinely)-75 2407 y(shared)c(b)q(et)o(w)o(een)g (institutions)h(or)e(ev)o(en)h(b)q(et)o(w)o(een)g(instructors)g(at)f (the)g(same)h(institution.)21 b(In)15 b(con)o(trast,)e(other)i(areas) -75 2464 y(of)c(computer)g(science)i(do)f(ha)o(v)o(e)f(widely)i(used)f (course)f(pro)s(jects)g(\(e.g.,)f(T)l(om)i(Anderson's)f Fe(nachos)g Ff(pro)s(ject)g(for)g(teac)o(hing)-75 2520 y(op)q(erating)k(systems)g([CP)l(A93)o(]\).)p -75 2562 828 2 v -24 2589 a Fd(\003)-6 2605 y Fc(This)f(w)o(ork)f(w)o(as)g(supp) q(orted)h(b)o(y)f(an)h(NSF)f(NYI)f(a)o(w)o(ard.)949 2798 y Ff(1)p eop %%Page: 2 2 2 1 bop -4 109 a Ff(The)19 b(curren)o(t)g(situation)h(w)o(ould)f(impro) o(v)o(e)g(if)h(instructors)f(who)g(design)h(course)f(pro)s(jects)g (shared)g(the)g(fruits)g(of)-75 166 y(their)f(lab)q(or)g(more)g(widely) l(.)29 b(This)18 b(article)h(presen)o(ts)e Fe(Co)n(ol)p Ff(,)g(a)h(freely)g(a)o(v)m(ailable,)i(p)q(ortable)e(compiler)h(pro)s (ject.)27 b(Co)q(ol)-75 222 y(has)12 b(b)q(een)h(used)g(for)f(the)g (past)g(t)o(w)o(o)e(y)o(ears)i(in)h(compiler)g(courses)f(at)g(Berk)o (eley)h(and)f(the)h(pro)s(ject)e(is)i(quite)f(mature.)19 b(Co)q(ol)-75 279 y(is)e(b)q(eing)g(distributed)g(in)g(the)f(hop)q(e)h (that)e(instructors)h(at)g(other)f(institutions)j(can)e(b)q(ene\014t)h (from)e(the)h(e\013orts)f(of)h(the)-75 335 y(pro)s(ject)c(dev)o(elop)q (ers)i(and)g(the)f(man)o(y)f(studen)o(ts)h(who)g(ha)o(v)o(e)g(written)g (Co)q(ol)g(compilers.)21 b(Co)q(ol)13 b(will)h(not)f(suit)h(ev)o(ery)o (one's)-75 392 y(needs)h(or)g(tastes;)e(another)h(purp)q(ose)i(of)e (this)h(article)g(is)g(to)f(encourage)h(others)f(to)g(mak)o(e)g (compiler)i(pro)s(jects)e(publicly)-75 448 y(a)o(v)m(ailable.)28 b(This)17 b(article)i(concludes)f(with)g(a)f(few)g(commen)o(ts)g(ab)q (out)g(desirable)i(features)d(for)h(a)g(p)q(ortable)h(compiler)-75 504 y(pro)s(ject.)-75 648 y Fg(2)69 b(Co)r(ol)-75 749 y Fe(Co)n(ol)p Ff(,)14 b(the)h Fe(Classr)n(o)n(om)g(Obje)n(ct-Oriente)n (d)g(L)n(anguage)p Ff(,)f(is)h(a)g(small)h(programming)e(language)h (for)g(teac)o(hing)g(the)g(basics)-75 806 y(of)e(compiler)j (construction)e(to)f(undergraduate)h(computer)g(science)h(ma)s(jors.)j (Co)q(ol)c(is)g(designed)h(to)f(b)q(e)g(implemen)o(ted)-75 862 y(b)o(y)e(individuals)i(or)d(teams)g(of)h(t)o(w)o(o)e(using)i(C++)h ([Str91)n(])f(in)g(a)f(Unix)i(en)o(vironmen)o(t)f(in)g(a)g(single)h (semester.)18 b(A)o(t)11 b(Berk)o(eley)l(,)-75 918 y(80-90\045)16 b(of)g(the)h(studen)o(t)g(teams)g(complete)g(the)g(pro)s(ject)f(eac)o (h)h(semester.)25 b(The)18 b(pro)s(ject)e(has)h(b)q(een)h(designed)g (to)e(b)q(e)-75 975 y(relativ)o(ely)f(easy)e(to)g(mo)q(dify)l(,)h(so)f (shorter)g(or)g(longer)h(pro)s(jects)f(are)g(p)q(ossible.)21 b(In)14 b(this)g(pap)q(er,)g(Co)q(ol)g(refers)f(b)q(oth)h(to)f(the)-75 1031 y(language)i(and)h(to)e(the)i(complete)g(compiler)g(pro)s(ject)e (\(of)h(whic)o(h)h(the)f(language)h(is)f(one)h(part\).)-4 1088 y(The)22 b(Co)q(ol)g(language)g(is)h(ob)s(ject-orien)o(ted,)g (statically)g(t)o(yp)q(ed,)g(and)f(has)g(automatic)g(memory)f (managemen)o(t.)-75 1144 y(These)d(are)g(the)g(essen)o(tial)h(features) f(of)f(a)h(n)o(um)o(b)q(er)g(of)g(recen)o(t)g(languages)g(\(e.g.,)f(Ja) o(v)m(a)h([Ja)o(v96)o(]\).)28 b(These)18 b(particular)-75 1201 y(features)c(w)o(ere)g(selected)h(b)q(ecause)g(they)g(are)f(tec)o (hnically)i(in)o(teresting,)f(represen)o(tativ)o(e)f(of)g(a)f(useful)j (class)e(of)g(con)o(tem-)-75 1257 y(p)q(orary)h(languages,)g(and)g (co-exist)h(easily)g(in)g(one)f(design.)-4 1314 y(The)h(Co)q(ol)h(pro)s (ject)e(also)i(is)f(designed)i(to)e(solv)o(e)g(three)h(common)f (practical)h(problems)g(with)g(compiler)g(pro)s(jects.)-75 1370 y(First,)e(the)g(pro)s(ject)g(is)h(completely)h(mo)q(dular;)e (there)h(are)f(no)g(dep)q(endencie)q(s)j(b)q(et)o(w)o(een)e(the)f (assignmen)o(ts.)21 b(In)16 b(partic-)-75 1427 y(ular,)j(a)f(studen)o (t)g(who)g(do)q(es)g(a)g(p)q(o)q(or)g(job)g(on)g(one)g(assignmen)o(t)g (is)h(not)f(at)f(a)h(disadv)m(an)o(tage)g(on)g(later)h(assignmen)o(ts.) -75 1483 y(Second,)d(the)f(pro)s(ject)f(is)i(highly)h(p)q(ortable)e(b)q (et)o(w)o(een)h(Unix)g(platforms.)-4 1539 y(The)h(third)g(problem)h(is) f(that)f(reusing)i(pro)s(jects)e(is)i(similar)g(to)e(reusing)i(exams)e (or)h(problem)g(sets.)25 b(If)17 b(a)g(pro)s(ject)-75 1596 y(has)h(b)q(een)h(used)f(once)g(at)f(a)h(sc)o(ho)q(ol,)g(the)g(lo) q(cal)h(studen)o(t)f(p)q(opulation)h(dev)o(elops)f(a)g(\\memory")e(of)i (the)g(pro)s(ject)f(that)-75 1652 y(lasts)g(sev)o(eral)h(y)o(ears,)f (and)g(dishonest)h(studen)o(ts)g(ma)o(y)e(submit)i(the)g(w)o(ork)e(of)h (others)g(from)g(previous)h(y)o(ears)e(as)h(their)-75 1709 y(o)o(wn.)22 b(Indeed,)c(this)f(problem)f(alone)h(ma)o(y)f (explain)h(wh)o(y)f(so)g(man)o(y)g(new)g(course)h(pro)s(jects)e(are)h (in)o(v)o(en)o(ted.)23 b(Ho)o(w)o(ev)o(er,)-75 1765 y(making)16 b(relativ)o(ely)g(mo)q(dest)f(c)o(hanges)h(to)e(old)i(pro)s(jects)f (reduces)h(substan)o(tially)g(the)g(incen)o(tiv)o(e)g(to)f(c)o(heat.)20 b(The)c(Co)q(ol)-75 1822 y(pro)s(ject)h(is)i(designed)g(to)e(b)q(e)i (easy)f(to)f(mo)q(dify)i(and)f(extend,)h(and)f(in)h(fact)e(has)h(b)q (een)h(substan)o(tially)g(mo)q(di\014ed)h(once)-75 1878 y(with)c(m)o(uc)o(h)f(less)h(e\013ort)e(than)h(w)o(ould)g(b)q(e)h (needed)h(to)d(construct)h(a)g(new)g(pro)s(ject.)-4 1935 y(The)f(complete)h(Co)q(ol)f(pro)s(ject)g(consists)g(of)g(man)o(y)g (comp)q(onen)o(ts)g(b)q(ey)o(ond)h(the)f(language.)20 b(The)14 b(follo)o(wing)h(subsec-)-75 1991 y(tions)j(brie\015y)h (describ)q(e)g(asp)q(ects)f(of)f(the)h(pro)s(ject)f(organized)h(around) f(the)h(topics)g(of)f(platform)h(indep)q(endence,)j(the)-75 2048 y(reference)16 b(compiler,)g(supp)q(orting)g(soft)o(w)o(are,)d(mo) q(dular)j(assignmen)o(ts,)e(formal)h(sp)q(eci\014cation,)i(and)e(do)q (cumen)o(tation.)-75 2169 y Fb(2.1)56 b(Platform)17 b(Indep)r(enden)n (t)-75 2255 y Ff(Co)q(ol)11 b(is)g(highly)i(p)q(ortable)e(and)g(easy)g (to)f(install)i(on)f(an)o(y)f(Unix)i(mac)o(hine)g(with)f(standard)f (GNU)h(soft)o(w)o(are)e(to)q(ols)i(\()p Fe(gmake)p Ff(,)-75 2312 y Fe(bison)p Ff(,)17 b(and)i Fe(\015ex)p Ff(\).)27 b(Co)q(ol)18 b(is)h(platform)e(indep)q(enden)o(t)j(in)f(t)o(w)o(o)e (additional)i(w)o(a)o(ys.)27 b(First,)18 b(Co)q(ol)g(can)g(b)q(e)h (installed)h(to)-75 2368 y(supp)q(ort)e(m)o(ultiple)h(arc)o(hitectures) f(transparen)o(tly)f(on)h(a)f(common)h(\014le)g(system.)27 b(A)o(t)17 b(Berk)o(eley)l(,)i(Co)q(ol)f(is)g(supp)q(orted)-75 2424 y(sim)o(ultaneously)k(on)e(HP's,)h(DECstations,)f(and)g(Sun)h(w)o (orkstations.)34 b(A)20 b(separate)g(Lin)o(ux)h(distribution)h(is)f (made)-75 2481 y(a)o(v)m(ailable)15 b(for)f(studen)o(ts)f(to)g(use)h (on)g(their)g(home)g(PC's.)19 b(Second,)14 b(Co)q(ol)g(targets)e(MIPS)i (assem)o(bly)l(,)h(whic)o(h)f(can)g(run)g(on)-75 2537 y(a)g(sim)o(ulator)h(suc)o(h)g(as)f(Jim)i(Larus')e Fe(spim)h Ff([Lar)o(].)20 b(Th)o(us,)14 b(the)h(generated)f(assem)o(bly)h(co)q (de)h(is)f(also)g(relativ)o(ely)g(platform)-75 2594 y(indep)q(enden)o (t.)22 b(The)16 b(Co)q(ol)f(distribution)i(includes)g Fe(spim)p Ff(.)949 2798 y(2)p eop %%Page: 3 3 3 2 bop -75 109 a Fb(2.2)56 b(Reference)16 b(Compiler)-75 195 y Ff(The)23 b(pro)s(ject)f(comes)g(with)h Fe(c)n(o)n(olc)p Ff(,)h(a)e(Co)q(ol)h(compiler.)43 b(This)23 b(reference)h(compiler)g (pla)o(ys)e(sev)o(eral)h(roles.)43 b(First,)-75 252 y(assignmen)o(t)18 b(sk)o(eletons)h(and)g(supp)q(ort)f(soft)o(w)o(are)f(are)h(extracted)g (from)g(the)g Fe(c)n(o)n(olc)g Ff(source.)29 b(Second,)20 b(the)f(phases)f(of)-75 308 y(the)e(compiler)h(can)f(b)q(e)h(compiled)g (separately)l(,)f(whic)o(h)h(supp)q(orts)f(mo)q(dular)h(assignmen)o(ts) e(\(see)h(Section)h(2.4\).)k(Third,)-75 364 y(the)15 b(reference)h(compiler)g(serv)o(es)f(as)f(a)h(sample)g(solution,)h (whic)o(h)g(instructors)e(ma)o(y)h(use)g(to)f(guide)i(studen)o(ts.)k(F) l(ourth,)-75 421 y(studen)o(ts)14 b(appreciate)h(the)f(abilit)o(y)h(to) e(compare)h(their)h(compilers)g(with)f(a)g(\(hop)q(efully\))h(correct)f (compiler)h(on)f(sp)q(eci\014c)-75 477 y(examples.)-4 534 y(The)i(most)g(imp)q(ortan)o(t)g(function)i(of)e(the)h(reference)g (compiler)h(is)f(one)g(the)g(studen)o(ts)f(nev)o(er)h(see.)24 b(Implemen)o(ting)-75 590 y(a)e(reference)h(compiler)g(is)g(the)f(only) g(reliable)j(c)o(hec)o(k)d(that)f(a)h(compiler)h(pro)s(ject)f(is)g (tractable)g(b)o(y)g(studen)o(ts)g(in)h(a)-75 647 y(short)c(p)q(erio)q (d)h(of)f(time)h(with)f(a)g(minim)o(um)i(of)e(drudgery)l(.)32 b(In)20 b(the)g(case)f(of)g(Co)q(ol,)h(the)f(initial)j(implemen)o (tation)e(of)-75 703 y Fe(c)n(o)n(olc)g Ff(rev)o(ealed)i(sev)o(eral)f (asp)q(ects)h(of)e(the)i(language)f(design)h(that)e(could)j(b)q(e)e (simpli\014ed)j(to)d(reduce)h(the)f(required)-75 760 y(implemen)o(tation)16 b(e\013ort)f(without)g(sacri\014cing)h(an)o (ything)g(of)e(educational)j(v)m(alue.)-75 881 y Fb(2.3)56 b(Supp)r(ort)18 b(Soft)n(w)n(are)-75 967 y Ff(A)i(t)o(ypical)h (compiler)g(uses)f(man)o(y)g(standard)f(data)g(structures)h(\(e.g.,)g (lo)q(ok-up)g(tables\))g(and)g(has)g(some)g(lo)o(w-lev)o(el,)-75 1024 y(rep)q(etitiv)o(e)e(co)q(de)g(\(e.g.,)e(templates)i(for)e (emitting)i(eac)o(h)f(kind)i(of)d(assem)o(bly)i(instruction\).)26 b(Because)18 b(studen)o(ts)f(ha)o(v)o(e)-75 1080 y(presumably)j(had)g (a)f(data)g(structures)g(course)g(prior)h(to)e(the)i(compiler)h (course,)f(it)f(is)h(w)o(asteful)f(to)g(ha)o(v)o(e)g(studen)o(ts)-75 1137 y(implemen)o(t)h(these)e(comp)q(onen)o(ts.)30 b(All)19 b(suc)o(h)g(supp)q(ort)f(co)q(de)h(is)g(supplied)i(to)d(studen)o(ts)g (in)h(the)g(Co)q(ol)f(pro)s(ject.)29 b(The)-75 1193 y(co)q(de)16 b(is)g(do)q(cumen)o(ted,)g(and)g(there)g(is)g(a)f(separate)g(handout)h (describing)h(the)f(o)o(v)o(erall)g(structure)f(of)g(the)h(comp)q(onen) o(ts)-75 1249 y(and)f(their)h(in)o(terfaces.)-4 1306 y(Supplying)h(studen)o(ts)e(with)h(supp)q(ort)f(co)q(de)h(has)f (another)g(adv)m(an)o(tage)g(when)g(the)h(implemen)o(tation)g(language) g(for)-75 1362 y(a)i(pro)s(ject)f(is)i(C)f(or)g(C++.)30 b(These)18 b(languages)h(require)g(meticulous)g(atten)o(tion)f(to)g (memory)f(managemen)o(t)h(details)-75 1419 y(if)j(programs)d(are)i(to)g (w)o(ork)f(prop)q(erly)l(.)35 b(When)21 b(that)e(care)h(is)h(not)e(giv) o(en,)j(the)e(errors)f(are)h(sometimes)g(di\016cult)i(to)-75 1475 y(\014nd|studen)o(ts)17 b(can)f(sp)q(end)h(more)f(time)g(trying)g (to)f(\014nd)i(the)f(source)g(of)f(a)h(dangling)h(p)q(oin)o(ter)f(than) g(learning)h(ab)q(out)-75 1532 y(compilers.)k(Pro)o(viding)14 b(supp)q(ort)h(co)q(de)f(that)g(giv)o(es)g(a)g(mo)q(derate)f(lev)o(el)j (of)d(abstraction)h(\(in)g(particular,)h(encapsulates)-75 1588 y(memory)h(managemen)o(t\))g(remo)o(v)o(es)g(a)h(large)g(p)q (ercen)o(tage)g(of)f(the)h(p)q(ossible)i(pitfalls)f(and)f(enables)h (studen)o(ts)f(to)f(fo)q(cus)-75 1645 y(on)f(the)g(most)g(imp)q(ortan)o (t)g(asp)q(ects)g(of)g(the)g(pro)s(ject.)-75 1766 y Fb(2.4)56 b(Mo)r(dular)18 b(Assignmen)n(ts)-75 1852 y Ff(Compiler)e(pro)s(jects)e (usually)j(are)d(divided)k(in)o(to)d(four)f(assignmen)o(ts:)20 b(lexical)d(analysis,)e(parsing,)g(seman)o(tic)h(analysis,)-75 1909 y(and)e(co)q(de)g(generation.)19 b(The)14 b(strong)e(dep)q (endencie)q(s)k(b)q(et)o(w)o(een)e(these)f(phases)h(is)g(an)g(inheren)o (t)g(and)g(di\016cult)h(problem.)-75 1965 y(F)l(or)21 b(example,)i(a)f(studen)o(t)f(who)g(do)q(es)h(p)q(o)q(orly)g(on)g(the)f (lexical)j(analyzer)e(ma)o(y)e(b)q(e)j(indirectly)g(p)q(enalized)h(on)e (the)-75 2021 y(parser,)16 b(b)q(ecause)h(it)g(will)h(not)e(b)q(e)h(p)q (ossible)h(to)e(thoroughly)g(test)g(the)g(parser)g(with)h(a)f(buggy)g (lexer;)i(this)e(problem)h(is)-75 2078 y(comp)q(ounded)g(in)h(later)e (assignmen)o(ts.)23 b(Con)o(v)o(ersely)l(,)16 b(without)g(a)g(w)o (orking)g(co)q(de)h(generator,)e(a)h(studen)o(t)g(writing)h(the)-75 2134 y(seman)o(tic)d(analyzer)g(cannot)g(test)f(the)h(co)q(de)g (generation)g(in)o(terface.)20 b(Finally)l(,)15 b(if)f(grading)g(is)g (done)g(partly)g(b)o(y)g(running)-75 2191 y(test)j(cases,)g(it)g(is)h (imp)q(ossible)h(to)e(ha)o(v)o(e)f(a)h(fair)g(basis)h(for)e(grading)h (co)q(de)h(generation)f(\(for)f(example\))i(without)f(using)-75 2247 y(correct)e(implemen)o(tations)h(of)f(the)g(earlier)h(phases.)-4 2304 y(The)k(Co)q(ol)h(pro)s(ject)f(has)g(b)q(een)i(structured)e(to)g (eliminate)i(dep)q(endencies)i(b)q(et)o(w)o(een)c(assignmen)o(ts.)36 b(The)21 b Fe(c)n(o)n(olc)-75 2360 y Ff(compiler)d(is)f(mo)q(dular)g (with)f(w)o(ell-de\014ned)j(in)o(terfaces)e(b)q(et)o(w)o(een)g(eac)o(h) f(of)h(the)f(four)g(phases.)24 b(Eac)o(h)16 b Fe(c)n(o)n(olc)g Ff(phase)h(can)-75 2417 y(b)q(e)d(compiled)g(separately)f(and)g(used)h (in)g(an)o(y)e(other)h(Co)q(ol)g(compiler)h(that)e(adheres)h(to)g(the)g (in)o(terface.)19 b(Th)o(us,)13 b(studen)o(ts)-75 2473 y(ma)o(y)18 b(mix-and-matc)o(h)h(an)o(y)f(of)g(the)h(comp)q(onen)o(ts)g (of)f Fe(c)n(o)n(olc)g Ff(with)h(an)o(y)f(of)g(their)h(o)o(wn)f(comp)q (onen)o(ts.)31 b(F)l(or)17 b(example,)-75 2530 y(a)g(studen)o(t)g(can)h (construct)f(a)f(Co)q(ol)i(compiler)g(using)g(his)h(or)d(her)i(o)o(wn)f (lexical)i(and)e(seman)o(tic)h(analysis)g(and)f Fe(c)n(o)n(olc)p Ff('s)-75 2586 y(parser)e(and)g(co)q(de)h(generator.)949 2798 y(3)p eop %%Page: 4 4 4 3 bop -75 109 a Fb(2.5)56 b(F)-5 b(ormal)17 b(Sp)r(eci\014cation)-75 195 y Ff(Co)q(ol)j(comes)f(with)h(a)f(language)g(reference)h(man)o (ual,)g(the)g Fe(Co)n(olA)o(id)p Ff(.)31 b(The)20 b Fe(Co)n(olA)o(id)e Ff(has)i(t)o(w)o(o)e(parts,)h(an)g(informal)-75 252 y(o)o(v)o(erview)d (of)f(Co)q(ol)h(and)h(a)e(formal)h(sp)q(eci\014cation)i(of)d(the)h(syn) o(tactic)g(structure,)g(static)f(seman)o(tics,)h(and)g(op)q(erational) -75 308 y(seman)o(tics)k(of)g(Co)q(ol)h(programs.)34 b(The)20 b(formal)g(seman)o(tics)h(is)g(giv)o(en)g(using)g(standard)f (deductiv)o(e)h(t)o(yp)q(e)g(rules)g(and)-75 364 y(structural)15 b(op)q(erational)h(seman)o(tics.)k(A)15 b(self-con)o(tained)i (explanation)f(of)f(all)h(notation)f(is)g(included)j(in)e(the)f(man)o (ual.)-4 421 y(It)k(is)h(often)f(noted)h(that)f(a)g(di\016cult)o(y)h (in)h(teac)o(hing)f(formal)f(seman)o(tics)g(is)h(that)f(studen)o(ts)g (do)h(not)f(see)h(ho)o(w)f(to)-75 477 y(apply)c(the)e(ideas)i(to)e(ev)o (eryda)o(y)g(programming)g(problems.)20 b(Arguably)l(,)15 b(no)e(one)h(needs)h(formal)e(seman)o(tics)h(more)f(than)-75 534 y(a)j(compiler)h(writer,)e(where)h(the)g(language)g(seman)o(tics)g (serv)o(es)g(as)f(the)h(compiler)h(sp)q(eci\014cation.)24 b(Indeed,)17 b(when)g(told)-75 590 y(that)12 b(grades)h(are)g(based)g (on)g(conformance)g(of)g(their)h(compiler)g(to)f(the)g(language)g(man)o (ual,)h(man)o(y)e(studen)o(ts)h(dev)o(elop)h(a)-75 647 y(sudden)e(in)o(terest)g(in)g(formal)f(seman)o(tics.)19 b(Once)12 b(acquain)o(ted)g(with)f(ho)o(w)g(to)g(read)g(the)h(formal)e (rules,)j(studen)o(ts)e(examine)-75 703 y(and)i(question)h(ev)o(ery)g (detail)g(in)g(the)f(course)h(of)f(writing)g(the)h(compiler.)20 b(Some)14 b(studen)o(ts)f(rep)q(ort)g(that)f(the)i(exp)q(erience)-75 760 y(transformed)g(their)g(view)h(of)f(programming)g(languages)h(and)f (formal)g(sp)q(eci\014cation.)22 b(Ov)o(erall,)15 b(a)f(compiler)i (course)e(is)-75 816 y(an)h(excellen)o(t)i(v)o(ehicle)g(for)e(in)o(tro) q(ducing)h(studen)o(ts)f(to)g(formal)g(sp)q(eci\014cations.)-75 935 y Fb(2.6)56 b(Do)r(cumen)n(tation)-75 1021 y Ff(Besides)19 b(the)f(language)f(man)o(ual)h(there)g(is)g(a)f(do)q(cumen)o(t)h (describing)h(all)g(of)e(the)h(supp)q(ort)f(co)q(de)i(and)e(its)h(in)o (terfaces,)-75 1077 y(a)e(handout)f(for)h(eac)o(h)g(assignmen)o(t,)f (and)h(a)g(short)f Fe(Instructor's)h(Guide)p Ff(.)23 b(Do)q(cumen)o(tation)15 b(for)g(all)i(of)f(the)g(to)q(ols)f(used)-75 1133 y(in)k(the)g(pro)s(ject)f(\()p Fe(gmake)p Ff(,)h Fe(bison)p Ff(,)f Fe(\015ex)p Ff(,)h(and)f Fe(spim)p Ff(\))h(is)g(also)f(included.)33 b(Finally)l(,)21 b(all)e(source)g(co)q (de,)g(includin)q(g)i(b)q(oth)-75 1190 y(sk)o(eleton)15 b(co)q(de)h(giv)o(en)g(to)f(studen)o(ts)g(and)g(the)g(reference)h (compiler,)g(is)g(do)q(cumen)o(ted.)-75 1330 y Fg(3)69 b(What)23 b(Mak)n(es)h(a)f(Go)r(o)r(d)h(Pro)t(ject?)-75 1432 y Ff(There)11 b(is)f(a)g(long-running)i(and)f(useful)g(debate)f (in)h(the)g(programming)e(languages)i(comm)o(unit)o(y)f(ab)q(out)g (what)g(languages)-75 1488 y(and)k(language)g(concepts)g(are)g(most)f (imp)q(ortan)o(t)g(to)h(teac)o(h)f(in)i(undergraduate)f(courses.)19 b(In)c(the)f(con)o(text)f(of)h(compiler)-75 1544 y(courses,)20 b(the)g(sp)q(eci\014c)h(questions)f(are:)28 b Fe(What)21 b(language)f(should)h(students)e(implement?)p Ff(,)h(and)g Fe(In)f(what)i(language)-75 1601 y(should)c(students)e(write)i(their)f (c)n(ompiler?)-4 1657 y Ff(While)g(imp)q(ortan)o(t,)e(in)i(the)f (author's)f(exp)q(erience)j(these)e(t)o(w)o(o)f(questions)h(are)g(not)g (the)g(paramoun)o(t)f(issues)i(facing)-75 1714 y(someone)j(designing)h (or)f(c)o(ho)q(osing)g(a)g(course)g(pro)s(ject.)30 b(The)19 b(o)o(v)o(erriding)h(concerns)f(are:)27 b(\(1\))18 b(the)h(pro)s(ject)f (is)i(w)o(ell-)-75 1770 y(sp)q(eci\014ed)g(and)e(\(2\))f(the)h(pro)s (ject)e(is)j(tractable.)27 b(The)18 b(problems)h(that)e(ensue)h(if)g (\(1\))f(is)i(not)e(satis\014ed,)h(regardless)g(of)-75 1827 y(an)o(y)13 b(other)h(merits)g(the)g(pro)s(ject)f(ma)o(y)g(ha)o(v) o(e,)g(should)i(b)q(e)g(clear.)20 b(F)l(or)13 b(\(2\),)g(it)h(is)g(imp) q(ossible)i(for)d(most)g(studen)o(ts)h(taking)-75 1883 y(a)h(t)o(ypical)g(course)g(load)g(to)g(implemen)o(t)h(an)o(ything)f (but)g(a)g(small)g(language)g(in)h(a)f(single)h(course.)k(F)l (urthermore,)14 b(there)-75 1940 y(is)i(little)g(educational)h(v)m (alue)f(in)g(implemen)o(ting)h(the)f(b)q(ells)h(and)e(whistles)h(of)f (realistic)i(languages.)-4 1996 y(Giv)o(en)j(the)g(fact)g(that)g(the)g (language)g(to)g(b)q(e)h(implemen)o(ted)h(m)o(ust)d(b)q(e)i(small,)h (the)e(author)g(prefers)g(to)f(use)i(an)-75 2053 y(in)o(v)o(en)o(ted)h (language)f(rather)g(than)f(a)h(subset)h(of)e(an)h(existing)h(language) g(for)e(a)h(compiler)h(pro)s(ject.)37 b(An)21 b(in)o(v)o(en)o(ted)-75 2109 y(language)d(can)f(b)q(e)h(designed)h(to)e(b)q(e)h(easy)g(to)e (implemen)o(t)j(rather)e(than)g(easy)h(to)f(use,)h(whic)o(h)g(is)g(the) g(rev)o(erse)f(of)g(the)-75 2165 y(usual)j(priorities.)35 b(Also,)21 b(one)f(is)g(not)g(constrained)g(b)o(y)g(existing)g (languages)g(and)g(can)g(pic)o(k)h(and)f(c)o(ho)q(ose)f(features)-75 2222 y(from)e(a)g(wide)i(sp)q(ectrum.)28 b(F)l(or)17 b(example,)h(Co)q(ol)g(is)g(ob)s(ject-orien)o(ted)g(lik)o(e)h(C++,)f (is)h(an)e(expression)i(language)f(with)-75 2278 y(garbage)9 b(collection)j(lik)o(e)g(Lisp-family)g(languages,)f(and)g(has)f(a)g(v)o (ery)g(regular)g(syn)o(tax)f(reminiscen)o(t)j(of)e(P)o(ascal.)18 b(Another)-75 2335 y(adv)m(an)o(tage)12 b(is)h(that)f(an)g(in)o(v)o(en) o(ted)h(language)g(can)f(b)q(e)i(delib)q(erately)h(di\013eren)o(t)d (from)g(existing)h(languages.)19 b(Confron)o(ting)-75 2391 y(an)13 b(unkno)o(wn)h(language)f(forces)g(studen)o(ts)h(to)e (think)i(consciously)h(ab)q(out)e(the)h(meaning)g(of)f(language)g (phrases,)h(rather)-75 2448 y(than)h(relying)h(on)g(in)o(tuitions)g(b)q (orro)o(w)o(ed)f(from)f(kno)o(wn)h(languages.)-4 2504 y(Unfortunately)l(,)h(it)g(is)h(probably)g(not)e(p)q(ossible)j(to)e (illustrate)h(ev)o(ery)f(in)o(teresting)h(language)f(feature)g(in)h(a)f (single,)-75 2561 y(coheren)o(t)c(pro)s(ject.)17 b(F)l(or)11 b(example,)i(Co)q(ol)f(do)q(es)g(not)f(ha)o(v)o(e)g(higher-order)h (functions,)h(a)e(basic)h(feature)f(of)h(man)o(y)f(mo)q(dern)-75 2617 y(languages.)19 b(\(There)12 b(is)h(no)g(language)f(design)h (problem)g(in)h(adding)f(higher-order)g(functions;)h(the)e(problem)h (is)g(k)o(eeping)-75 2674 y(the)i(pro)s(ject)g(small.\))949 2798 y(4)p eop %%Page: 5 5 5 4 bop -4 109 a Ff(Finally)l(,)19 b(the)f(c)o(hoice)h(of)f(language)g (in)h(whic)o(h)f(studen)o(ts)g(write)g(their)h(compilers)g(is)f(not)g (ob)o(vious.)28 b(In)18 b(part,)g(the)-75 166 y(decision)24 b(dep)q(ends)g(on)f(whether)g(the)f(course)h(also)f(is)h(in)o(tended)h (to)e(teac)o(h)h(practical)g(soft)o(w)o(are)e(construction)h(or)-75 222 y(principles)16 b(of)c(language)h(design.)20 b(In)14 b(courses)f(with)g(an)g(emphasis)h(on)f(gaining)h(exp)q(erience)h(in)f (soft)o(w)o(are)d(construction)-75 279 y(as)18 b(it)h(is)g(practiced)g (in)g(industry)l(,)h(the)f(c)o(hoices)g(are)f(C)g(and)h(C++.)30 b(F)l(or)18 b(courses)g(with)h(an)f(emphasis)h(on)g(language)-75 335 y(design,)c(a)g(language)f(suc)o(h)h(as)g(ML)f([MTH90)o(])g(is)h(m) o(uc)o(h)g(b)q(etter)g(for)f(exp)q(osing)h(studen)o(ts)g(to)f(mo)q (dern)h(language)g(ideas.)-4 392 y(Co)q(ol)h(uses)h(C++)g(as)f(the)g (implemen)o(tation)i(language.)23 b(As)17 b(noted)f(ab)q(o)o(v)o(e,)g (when)h(studen)o(ts)f(use)h(C)f(or)g(C++)h(for)-75 448 y(implemen)o(tation,)e(it)g(is)g(imp)q(ortan)o(t)f(to)f(giv)o(e)i(some) f(though)o(t)f(to)h(helping)i(studen)o(ts)e(minimize)j(routine)d(co)q (ding)i(errors)-75 504 y(that)k(can)g(sap)g(their)h(time)g(and)g(en)o (th)o(usiasm)f(for)g(the)g(pro)s(ject.)35 b(The)21 b(strategy)e (adopted)h(in)h(Co)q(ol)g(is)g(to)e(pro)o(vide)-75 561 y(supp)q(ort)14 b(co)q(de)h(that)e(o\013ers)g(a)h(mo)q(derate)f(lev)o (el)j(of)d(abstraction)h(for)f(the)h(primitiv)o(e)i(data)d(t)o(yp)q(es) h(of)g(the)g(compiler,)h(and)-75 617 y(to)j(mak)o(e)g(a)h(few)g (suggestions)f(ab)q(out)h(C++)g(programming)f(st)o(yle.)31 b(\(Sp)q(eci\014cally)l(,)22 b(it)d(is)h(recommended)f(that)f(only)-75 674 y(a)e(small)i(subset)e(of)g(C++)i(b)q(e)f(used,)g(whic)o(h)g(is)g (the)g(same)f(subset)h(used)g(in)h(writing)f(the)f Fe(c)n(o)n(olc)g Ff(reference)h(compiler.\))-75 730 y(This)h(approac)o(h)f(has)h(b)q (een)h(successful;)g(a)f(substan)o(tial)g(ma)s(jorit)o(y)e(of)h(studen) o(ts)g(are)g(able)i(to)e(complete)h(the)g(pro)s(ject)-75 787 y(within)e(the)g(time)f(frame)g(of)g(the)g(course.)-4 843 y(The)k(recen)o(t)f(dev)o(elopmen)o(t)i(of)e(Ja)o(v)m(a)h(has)g (created)f(another)h(candidate)g(implemen)o(tation)h(language.)31 b(Because)-75 900 y(Ja)o(v)m(a)22 b(is)g(a)g(m)o(uc)o(h)g(safer)f (programming)g(language)h(than)g(either)g(C)g(or)f(C++)i(and)f(b)q (ecause)g(it)h(is)f(lik)o(ely)h(to)f(gain)-75 956 y(p)q(opularit)o(y)d (in)g(industry)l(,)h(Ja)o(v)m(a)e(will)i(b)q(ecome)f(more)f(attractiv)o (e)f(than)h(either)h(C)f(or)g(C++)h(as)e(an)i(implemen)o(tation)-75 1013 y(language)h(for)g(man)o(y)g(studen)o(t)g(pro)s(jects.)34 b(A)20 b(p)q(ort)g(of)g(Co)q(ol)g(to)g(Ja)o(v)m(a)g(w)o(ould)g(b)q(e)h (simple,)i(as)d(the)g Fe(c)n(o)n(olc)f Ff(reference)-75 1069 y(compiler)c(is)f(written)g(in)h(the)f(Ja)o(v)m(a)g(subset)g(of)f (C++.)20 b(The)14 b(only)g(dra)o(wbac)o(k)f(is)i(the)f(curren)o(t)f (lac)o(k)i(of)e(to)q(ols)h(to)f(supp)q(ort)-75 1125 y(Ja)o(v)m(a)i (programming,)f(particularly)j(debuggers)e(and)h(a)f(w)o(ell-tested)h (and)f(do)q(cumen)o(ted)h(Ja)o(v)m(a)f(parser)g(generator.)-75 1269 y Fg(4)69 b(Conclusions)-75 1370 y Ff(Substan)o(tial)21 b(e\013ort)e(has)h(b)q(een)i(sp)q(en)o(t)e(dev)o(eloping)i(the)f(Co)q (ol)f(compiler)i(pro)s(ject)d(o)o(v)o(er)h(a)g(t)o(w)o(o)f(y)o(ear)g(p) q(erio)q(d.)37 b(It)20 b(is)-75 1427 y(unlik)o(ely)c(that)d(this)g(exp) q(erience)j(is)e(unique,)h(and)f(other)f(educators)g(are)g(encouraged)h (to)f(sp)q(end)i(the)e(additional)i(e\013ort)-75 1483 y(to)g(mak)o(e)f(their)i(compiler)g(course)g(pro)s(jects)e(a)o(v)m (ailable)j(to)d(the)i(comm)o(unit)o(y)f(for)f(use)i(and)f(further)g (dev)o(elopmen)o(t.)-4 1539 y(The)k(Co)q(ol)g(distribution)h(is)g(a)o (v)m(ailable)h(from)d Fa(http://www.cs.berkeley.e)o(du/)p Fh(e)n Fa(aiken/cool)p Ff(.)30 b(The)19 b(WWW)-75 1596 y(site)d(con)o(tains)g(all)h(materials)f(a)f(studen)o(t)h(needs)h(to)e (write)h(a)f(compiler,)i(including)i(the)c(man)o(ual)h(and)g(all)h (assignmen)o(t)-75 1652 y(handouts,)e(source)h(for)f(all)i(supp)q(ort)f (co)q(de,)g(assignmen)o(t)f(sk)o(eletons,)h(and)g(binaries)h(for)e(the) g(phases)h(of)f(the)h(reference)-75 1709 y(compiler.)28 b(The)17 b(distribution)i(is)f(also)f(a)o(v)m(ailable)j(via)d(ftp)g (from)g Fa(ftp.cs.berkeley.edu)e Ff(in)j(directory)f Fa(pub/cool)p Ff(.)-75 1765 y(Instructors)d(ma)o(y)f(obtain)h(the)g (full)i(distribution)f(\(including)i(source)d(for)f Fe(c)n(o)n(olc)g Ff(and)i(test)e(cases\))h(b)o(y)g(sending)h(mail)g(to)-75 1822 y Fe(aiken@cs.b)n(erkeley.e)n(du)p Ff(.)-75 1965 y Fg(5)69 b(Ac)n(kno)n(wledgemen)n(ts)-75 2066 y Ff(The)16 b(precursor)g(of)f(Co)q(ol)h(is)h(Sather164,)d(a)i(compiler)h(pro)s (ject)e(dev)o(elop)q(ed)j(b)o(y)d(Susan)i(Graham)d(and)i(John)h(Bo)o (yland.)-75 2123 y(Sather164)10 b(is)i(itself)g(based)f(on)g(the)g (programming)g(language)g(Sather)g([SK95].)18 b(Lok)11 b(Sang)g(Chen,)h(Man)o(uel)g(F\177)-23 b(ahndric)o(h,)-75 2179 y(Da)o(vid)19 b(Ga)o(y)l(,)f(Douglas)h(Hauge,)g(Margret)f(Jacob)o (y)l(,)h(and)g(Carleton)g(Miy)o(amoto)e(con)o(tributed)j(substan)o (tially)g(to)e(the)-75 2236 y(design)e(and)g(implemen)o(tation)g(of)f (Co)q(ol.)-4 2292 y(Man)o(uel)h(F\177)-23 b(ahndric)o(h,)17 b(Susan)f(Graham,)f(and)h(Margret)f(Jacob)o(y)h(pro)o(vided)g(commen)o (ts)g(on)g(earlier)h(drafts)e(of)h(this)-75 2349 y(pap)q(er.)-75 2492 y Fg(References)-75 2593 y Ff([CP)l(A93])36 b(W.)15 b(Christopher,)g(S.)g(Pro)q(cter,)f(and)i(T.)f(Anderson.)20 b(The)c(Nac)o(hos)f(instructional)h(op)q(erating)g(system.)j(In)127 2650 y Fe(1993)e(Winter)g(USENIX)d(Confer)n(enc)n(e)p Ff(,)f(pages)i(479{488,)e(Jan)o(uary)i(1993.)949 2798 y(5)p eop %%Page: 6 6 6 5 bop -75 109 a Ff([Ja)o(v96])61 b(The)15 b(Ja)o(v)m(a)h(Tutorial:)k (Ob)s(ject-Orien)o(ted)c(Programming)e(for)h(the)g(In)o(ternet)q(.)127 166 y(h)o(ttp://ja)o(v)m(a.sun.com/ja)o(v)m(a.sun.com/)o(tutor)o (ial/in)o(tro.h)o(tml,)d(1996.)-75 260 y([Lar])107 b(J.)15 b(Larus.)20 b(Spim.)h(h)o(ttp://www.cs.wisc.edu/)l Fh(e)-6 b Ff(larus/spim.h)o(tml.)-75 353 y([MTH90])21 b(R.)15 b(Milner,)i(M.)d(T)l(ofte,)h(and)h(R.)f(Harp)q(er.)21 b Fe(The)16 b(De\014nition)f(of)i(Standar)n(d)f(ML)p Ff(.)k(MIT)15 b(Press,)g(Cam)o(bridge,)127 410 y(Massac)o(h)o(usetts,)e (1990.)-75 504 y([SK95])70 b(D.)14 b(Stoutamire)h(and)h(M.)e(Kennel.)21 b(Sather)15 b(revisited:)22 b(A)15 b(high-p)q(erformance)h(free)f (alternativ)o(e)g(to)g(C++.)127 560 y Fe(Computers)i(in)e(Physics)p Ff(,)f(9\(5\):519{524,)e(Septem)o(b)q(er)j(1995.)-75 654 y([Str91])69 b(B.)15 b(Stroustrup.)k Fe(The)d(C++)g(Pr)n(o)n(gr)n (amming)f(L)n(anguage)p Ff(.)k(Addison-W)l(esley)l(,)f(1991.)949 2798 y(6)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF