
éå»
ç©èªã¯1962幎ã«ã±ã³ããªããžå€§åŠã§CPL ïŒãã±ã³ããªããžããã°ã©ãã³ã°èšèªãïŒ-ALGOL-60ã®ãæ¹è¯çãã§äœæ¥ãéå§ããããšãã«éå§ã§ããŸãã 倧åŠé¢çã®ããŒãã£ã³ã»ãªãã£ãŒãºããã®èšèªã®ç 究ã«åå ããŸããã æ°ããYPãå®è£ ããéã®äž»ãªå°é£ã¯ãããŸããŸãªã³ã³ãã¥ãŒã¿ãŒãã©ãããã©ãŒã çšã«ã³ã³ãã€ã©ãŒãæåã§ç§»æ€ããå¿ èŠãããããã«æãããŸããã ç¹ã«ãCambridge EDSAC-2ã Atlas -2ã«çœ®ãæãããããšããCPLéçºè ã¯ã³ã³ãã€ã©ãæ°ãããã©ãããã©ãŒã ã«ç§»æ€ããã®ã«å€ãã®æéãè²»ãããŸããã
Martinã®è«æã¯ãèªå·±ã³ã³ãã€ã«ãCPLå°çšã§ãããMartinã«ãã£ãŠéçºãããã³ã³ãã€ã©ã¯ãCPLã®éåžžã«åçŽåãããããŒãžã§ã³ã§èšè¿°ããããã®ã³ã³ãã€ã©ã¯åœæã®ãã¯ãã¢ã»ã³ãã©ã§ç°¡åã«èšè¿°ã§ããŸããã CPLãæ°ãããã©ãããã©ãŒã ã«ç§»æ€ããã«ã¯ã次ã®2ã€ã®æé ãå®è¡ã§ããŸãã
- ãç°¡æCPLãã³ã³ãã€ã©ãæåã§èšè¿°ããŸãã
- ããã«CPLãã®ã³ã³ãã€ã©ãã³ã³ãã€ã«ããŸãã
Martinã¯ããã§æ¢ãŸãããããŒã¿ãã«ã³ã³ãã€ã©ãéçºããããã®ã·ã¹ãã ã§ããBCPLãéçºããŸããã BCPLã³ã³ãã€ã©ã¯ãMartin "OCODE"ãšåŒã°ããæ¬äŒŒã³ãŒããçæããŸããã
OCODEã¯æ¬¡ã®ããã«ãªããŸããã
ïŒã¹ããŒã¹ãç¯çŽããããã«ãã³ãã³ãã·ãŒã±ã³ã¹ã¯1è¡ã§èšè¿°ãããŠããŸããMartinã¯BCPLããã¥ã¢ã«ã§ããŸã£ããåãããšãè¡ã£ãŠããŸããïŒ
ãœãŒã¹ããã±ãŒãžBCPLãããŠã³ããŒãããŸãã
ãªãã³ãŒãã
ã
-代ããã«ã
ãã¢
çæãããŸãã
ããŠãããŒãµã«ãã·ã³èšèªãã®äžã§ãOCODEã¯ããã®ã©ãã«ãç¹å¥ãªæ瀺ã«ãã£ãŠæ±ºå®ããããšããç¹ã§ãŠããŒã¯ã§ãã ããã°ã©ã ã解éããã«ã¯ããŸããã¹ãŠãã¡ã¢ãªã«ããŒããããã®äžã®ã©ãã«ãèŠã€ããå¿ èŠããããŸãã
-ãããŠãå¥ã®ããã°ã©ã ã§ããã³ãŒããžã§ãã¬ãŒã¿ãŒã ããã®ãããªæ¬äŒŒã³ãŒããå«ããã¡ã€ã«ãæçµããã»ããµçšã®å®è¡å¯èœããã°ã©ã ã«å€æããŸããã OCODEã¯ãã¹ããŒã¹ãšæ¹è¡ã§åºåããã10é²æ°ã®ããã¹ããã¡ã€ã«ãšããŠä¿åãããŸãããOCODEã®éçºäžããã¡ã€ã«åœ¢åŒãç¹å®ã®ãã€ããµã€ãºã«ãªã³ã¯ãããšããã®ãããªãã¡ã€ã«ã®ç§»æ€æ§ãå¶éãããŸããã
OCODE | ããã³ãŒããïŒãããã³ãŒããïŒ | |
---|---|---|
94 5 L1 83 73 69 86 69 95 4 42 0 42 0 40 2 14 83 42 0 42 1 40 2 14 83 42 2 40 3 42 1 15 92 85 L5 90 L6 42 1 40 4 40 2 14 83 40 4 42 1 14 80 4 90 5 40 4 40 5 88 L6 91 4 42 2 40 3 42 1 15 92 85 L7 90 L8 40 4 40 2 14 8 87 L9 40 4 42 2 11 92 85 L11 90 L10 42 0 40 6 40 2 14 83 40 4 40 6 14 80 6 90 L11 40 6 40 3 22 86 L10 91 6 90 L9 40 4 42 1 14 80 4 90 L7 40 4 40 5 88 L8 91 4 97 103 0 | ãšã³ããª5 L1 'S' 'I' 'E' 'V' 'E' ã»ãŒã4 LN 0 LN 0 LP 2 PLUS ã¹ãã£ã³ã LN 0 LN 1 LP 2 PLUS STIND Ln 2 LP 3 LN 1ãã€ãã¹ åºè ãžã£ã³ãL5 LAB L6 LN 1 LP 4 LP 2 PLUS STIND LP 4 LN 1 PLUS SP 4 LAB L5 LP 4 LP 5 ENDFOR L6 ã¹ã¿ãã¯4 LN 2 LP 3 LN 1ãã€ãã¹ã¹ã㢠ãžã£ã³ãL7 LAB L8 LP 4 LP 2 PLUS RV JF L9 LP 4 LN 2ãã«ãã¹ã㢠ãžã£ã³ãL11 LAB L10 LN 0 LP 6 LP 2 PLUS STIND LP 4 LP 6 PLUS SP 6 LAB L11 LP 6 LP 3 LS JT L10 ã¹ã¿ãã¯6ã©ãL9 LP 4 LN 1 PLUS SP 4 LAB L7 LP 4 LP 5 ENDFOR L8 ã¹ã¿ãã¯4 RTRNãšã³ããããã¯0 | |
ãœãŒã¹ããã±ãŒãžBCPLãããŠã³ããŒãããŸãã
OCODEã®æ°ããããŒãžã§ã³ã§ã¯ãæµ®åå°æ°ç¹æ°ã®ãµããŒããè¿œå ããïŒããããããµããŒãããããªãã³ãŒãã®ã»ãããã»ãŒ2åã«ãªããŸããïŒãLETãµããïŒworkvecãvecsizeïŒBE { workvecïŒ0ïŒ= 0 workvecïŒ1ïŒ= 0 FOR i = 2 to vecsize-1 DO workvecïŒIïŒ= 1 FOR i = 2 TO vecsize-1 DO IF workvecïŒããŸã {LET j = 2 * i j <vecsize DOã®å Žå {workvecïŒjïŒ= 0 jïŒ= j + i } } }
ENDFOR
ãªãã³ãŒãã
ENDFOR
ã
ENDFOR
-代ããã«ã
LE JT
ãã¢
LE JT
çæãããŸãã
ããŠãããŒãµã«ãã·ã³èšèªãã®äžã§ãOCODEã¯ããã®ã©ãã«ãç¹å¥ãªæ瀺ã«ãã£ãŠæ±ºå®ããããšããç¹ã§ãŠããŒã¯ã§ãã ããã°ã©ã ã解éããã«ã¯ããŸããã¹ãŠãã¡ã¢ãªã«ããŒããããã®äžã®ã©ãã«ãèŠã€ããå¿ èŠããããŸãã

- æ¬äŒŒã³ãŒãã€ã³ã¿ãŒããªã¿ãŒãæåã§èšè¿°ããŸãïŒ2ïŒ ïŒä»»æã®èšèªãBASICã§ãïŒã
- ïŒ3ïŒ BCPLã§èšè¿°ãããã³ãŒããžã§ãã¬ãŒã¿ãŒããã©ãããã©ãŒã ã«é©åãããŸãã
- ã€ã³ã¿ãŒããªã¿ãŒïŒ2ïŒã®äžã§BCPLã³ã³ãã€ã©ãŒïŒ1ïŒãå®è¡ããã³ãŒããžã§ãã¬ãŒã¿ãŒïŒ3ïŒã«ãã£ãŒãããã³ãŒããžã§ãã¬ãŒã¿ãŒã®å®è¡å¯èœãã¡ã€ã«ïŒ4ïŒãååŸããŸãã
- éèš³è ïŒ2ïŒã¯ãä»åŸå¿ èŠãããŸããã
- ã³ã³ãã€ã©ãŒæ¬äŒŒã³ãŒãïŒ1ïŒãã³ãŒããžã§ãã¬ãŒã¿ãŒïŒ4ïŒããè¿œãåºããåºåã§ã³ã³ãã€ã©ãŒå®è¡å¯èœãã¡ã€ã«ãååŸããŸãã
ãã®ã¢ãããŒãã¯ãã³ã³ãã€ã©ãæ°ãããã©ãããã©ãŒã ã«ç§»æ€ããããã«æäœéã®äœã¬ãã«ã®ããã°ã©ãã³ã°ã®ã¿ãå¿ èŠã§ããããšãæå³ããŠããŸããã å®éãBCPLã®å®è£ ã¯1967幎ãŸã§ã«å®äºããŸãããæ°å¹Žåã«å§ãŸã£ãCPLã®å®è£ ãå®äºããåã§ãïŒ
ã·ã¹ãã ããã°ã©ãã³ã°ã«å¯ŸããBCPLã®ã¡ãªããã¯ãã±ã³ãã³ããœã³ã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããŠBeèšèªãäœæããã±ã³ã®ååã§ããããã¹ãªãããŒã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããŠCãäœæããŸããã BCPLããäŒçµ±ã
{
äžæ¬åŒ§
}
ããã°ã©ã ãããã¯ãæå®ããããã«ãªããBCPL ã§æåã®ããã°ã©ã ãHelloãWorldïŒã ã äœæãããŸãã ã
BCPLãæŽå²äžããŠã³ããçç±ã¯ç§ãã¡ã«ãšã£ãŠããéèŠã§ãïŒOCODEã¯æåã®æ®éçãªãåœä»€ã»ããã¢ãŒããã¯ãã£ã ïŒISAïŒã§ãã ãä»®æ³ãã·ã³ãããã®æ©èœã«ããç¹å®ã®ããŒããŠã§ã¢ãã©ãããã©ãŒã ã«é¢é£ä»ããããŠããŸããã ãããã£ãŠãBCPLã¯ã ãäžåºŠæžã蟌ã¿ãã©ãã§ãå®è¡ã ïŒ WORA ïŒ ãã©ãã€ã ã«æºæ ããæåã®ããã°ã©ãã³ã°èšèªã§ããBCPLããã°ã©ã ã¯ãã³ã³ãã€ã«ããã圢åŒã§é åžã§ããOCODEã³ãŒããžã§ãã¬ãŒã¿ãŒãååšãããã©ãããã©ãŒã ã§å®è¡ã§ããŸãããlibhdrããååŸ LETéå§ïŒïŒ= VALOF {writefïŒ "Hello * n"ïŒ çµæ0 }
BCPLèªäœãšãã®OCODEã¯ãè±åœä»¥å€ã§ã¯äººæ°ãåããŠããŸãããã WORAã®èãæ¹ã¯å®çããŠããŸãã 1974幎ããã§ã«å€§éžã§ã ETHãã¥ãŒãªãã㧠ããã¯ã©ãŠã¹ãŽã£ã«ãã®æå°ã®äžã§ããPascal-PããéçºãããŸãã-äžéãpã³ãŒãããžã®ã³ã³ãã€ã«ãšããã®ãpã³ãŒããã®ç¹å®ã®ããŒããŠã§ã¢ãã©ãããã©ãŒã çšã®å®è¡å¯èœã³ãŒããžã®ã³ã³ãã€ã«ã æµ·æŽã®å察åŽã§ããUCSDã® Pascal-Pã«åºã¥ããŠã p-System ïŒ1978ïŒOSãäœæãããŸãããã³ãŒããžã§ãã¬ãŒã¿ãŒã¯ãŸã£ãããããŸããã§ãã ããã¢ã¡ã¿ã«ã§ã®äœæ¥ã ãã¹ãŠã®p-Systemã·ã¹ãã ãŠãŒãã£ãªãã£ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã®p-codeã®åœ¢åŒã§æäŸãããp-Systemãæ°ããããŒããŠã§ã¢ãã©ãããã©ãŒã ã«é©åãããã«ã¯ãp-codeã€ã³ã¿ãŒããªã¿ãŒãèšè¿°ããã ãã§ååã§ããã
Pã³ãŒãã®äŸ
ãœãŒã¹ããã±ãŒãžpascalãããŠã³ããŒãããŸãã
ã³ã³ãã¯ããªpã³ãŒãã®å Žåãå€ãã®åœä»€ã«ã¯ãå°ããé »ç¹ã«äœ¿çšãããåŒæ°å€ã®ãççž®ãªãã³ãŒããããããŸãã
0000ïŒD8 p2_0ïŒSLDL 1 0001ïŒ00 SLDC 0 0002ïŒ9A STO 0003ïŒ02 SLDC 2 0004ïŒCC 03 STL 3 0006ïŒDA p2_2ïŒSLDL 3 0007ïŒ31 SLDC 49 0008ïŒC8 LEQI 0009ïŒA1 12 FJP p2_5 000BïŒD8 SLDL 1 000CïŒDA SLDL 3 000DïŒ01 SLDC 1 000EïŒ32 SLDC 50 000FïŒ88 CHK 0010ïŒ01 SLDC 1 0011ïŒ95 SBI 0012ïŒA4 01 IXA 1 0014ïŒ01 SLDC 1 0015ïŒ9A STO 0016ïŒDA SLDL 3 0017ïŒ01 SLDC 1 0018ïŒ82 ADI 0019ïŒCC 03 STL 3 001BïŒB9 F6 UJP p2_2 001DïŒ02 p2_5ïŒSLDC 2 001EïŒCC 03 STL 3 0020ïŒDA p2_4ïŒSLDL 3 0021ïŒ31 SLDC 49 0022ïŒC8 LEQI 0023ïŒA1 2F FJP p2_1 0025ïŒD8 SLDL 1 0026ïŒDA SLDL 3 0027ïŒ01 SLDC 1 0028ïŒ32 SLDC 50 0029ïŒ88 CHK 002AïŒ01 SLDC 1 002BïŒ95 SBI 002CïŒA4 01 IXA 1 002EïŒF8 SIND 0 002FïŒA1 1C FJP P2_6 0031ïŒ02 SLDC 2 0032ïŒDA SLDL 3 0033ïŒ8F MPI 0034ïŒCC 02 STL 2 0036ïŒD9 p2_3ïŒSLDL 2 0037ïŒ32 SLDC 50 0038ïŒC9 LESI 0039ïŒA1 12 FJP p2_6 003BïŒD8 SLDL 1 003CïŒD9 SLDL 2 003DïŒ0ââ1 SLDC 1 003EïŒ32 SLDC 50 003FïŒ88 CHK 0040ïŒ01 SLDC 1 0041ïŒ95 SBI 0042ïŒA4 01 IXA 1 0044ïŒ00 SLDC 0 0045ïŒ9A STO 0046ïŒD9 SLDL 2 0047ïŒDA SLDL 3 0048ïŒ82 ADI 0049ïŒCC 02 STL 2 004BïŒB9 F4 UJP P2_3 004DïŒDA P2_6ïŒSLDL 3 004EïŒ01 SLDC 1 004FïŒ82 ADI 0050ïŒCC 03 STL 3 0052ïŒB9 F2 UJP p2_4 0054ïŒAD 00 P2_1ïŒRNP 0 | |
ãœãŒã¹ããã±ãŒãžpascalãããŠã³ããŒãããŸãã
æ©æ¢°èªæŽæ°ãšæµ®åå°æ°ç¹æ°ã®ã¿ããµããŒãããOCODEãšæ¯èŒããŠãPascalã®pã³ãŒãã¯ãæååãé åããããã¯é åãïŒèŠçŽ ãµã€ãºã1ã¯ãŒãæªæºïŒãªã©ãã¯ããã«å€æ§ãªããŒã¿åããµããŒãããŸããèšé²ãã»ãããªã©ã åçã¡ã¢ãªå²ãåœãŠãåæ§ã§ãã ãã1ã€ã®éèŠãªéãã¯ãããã·ãŒãžã£ã®ãäœæ¥ã¹ã¿ãã¯ããšããã©ã¡ãŒã¿ãšããŒã«ã«å€æ°ãå«ããã¹ã¿ãã¯ãã¬ãŒã ããåé¢ãããããšã§ããconst data_size = 50; ã¿ã€ãdata_array =ããŒã«å€ã®é å[1..data_size]; æç¶ããµããïŒvar workvecïŒdata_arrayïŒ; var iãjïŒæŽæ°; å§ãã workvec [1]ïŒ= false; for iïŒ= 2 to data_size-1 do workvec [i]ïŒ= true; for iïŒ= 2 to data_size-1 do workvec [i]ã®å Žåãéå§ jïŒ= 2 * i; äžæ¹ãj <data_sizeã¯éå§ããŸã workvec [j]ïŒ= false; jïŒ= j + i; çµãã çµãã çµãã;
ã³ã³ãã¯ããªpã³ãŒãã®å Žåãå€ãã®åœä»€ã«ã¯ãå°ããé »ç¹ã«äœ¿çšãããåŒæ°å€ã®ãççž®ãªãã³ãŒããããããŸãã
p-Systemã¯éåžžã«äººæ°ããããŸãããããã€ãã®Apple IIã¢ãã«ãšãå ã®IBM PCïŒ1981ïŒãå«ãããã€ãã®IBMã³ã³ãã¥ãŒã¿ãŒãOSãšããŠp-Systemãšãšãã«æäŸãããŸããã 1979幎ãããWestern Digitalã¯p-codeå®è¡ãããŒããŠã§ã¢ã«å®è£ ãããPascal MicroEngineããã³ã³ãã¥ãŒã¿ãŒããªãªãŒã¹ããŸããã ãããã£ãŠãæœè±¡çãªããŠãããŒãµã«ãã·ã³èšèªãããã®pã³ãŒãã¯ãå®éã®ã³ã³ãã¥ãŒã¿ãŒã®å®éã®ãã·ã³èšèªã«å€ãããŸããã
p-Systemã¯90幎代ã«ã¯ãã§ã«åžå Žãã姿ãæ¶ããŠãããã1996幎ã«James Goslingã«Javaä»®æ³ãã·ã³ã®äœæãä¿ãããšã«æåããã ãäžåºŠæžãã ãã§ãã©ãã§ãå®è¡ã§ããŸãïŒã人æ°ã®åºåã¹ããŒã¬ã³ã«å€ãããããŠãããŒãµã«ãã·ã³èšèªãïŒ ããã€ãã³ãŒãã ïŒã®å®è£ ã2ã€ã®æ¹åã«äžŠè¡ããŠéçºãããŸããã
- ãœãããŠã§ã¢å®è£ ã®é«éåïŒJDK 1.1ã§ã®JITã³ã³ãã€ã« ã1997ïŒ
- ããŒããŠã§ã¢å®è£
ã®è©Šã¿ïŒ
- Sun microJava701 ïŒ1998ïŒ
- Sun MAJC 5200 ïŒ1999ïŒ
- aJile aJ-100 ïŒ2000ïŒ
- Imsys Cjip ïŒ2000ïŒ
- ARMãžã£ãŒã« ïŒ2001ïŒ
åœç¶ã®ããšãªãããããã€ãã³ãŒãããã»ããµãã®ã©ãã-Pã³ãŒãã§ãJavaã§ã-åæ¥çã«æåããŸããã§ããã ïŒããã«ã¯ã以åã®Intel iAPX 432 ïŒ1981ïŒããã»ããµãAdaã®ãã€ãã³ãŒãã®ããŒããŠã§ã¢å®è£ ãå«ãŸããŸããïŒJavaãã€ãã³ãŒããWirthã®pã³ãŒããããã³OCODEã¯ããã¹ãŠäžéæåã§ããããããã¹ãŠã¹ã¿ãã¯æåã§ããçæãšè§£éãæãç°¡åã§ãã ãä»®æ³ãã·ã³ãã¹ã¿ãã¯ã¯å¶éãããŠããŸããã å察ã«ããéãããã»ããµã«ã¯åºå®æ°ã®ã¬ãžã¹ã¿ããããŸããã³ã³ãã€ã©ã®æãéèŠãªã¿ã¹ã¯ã®1ã€ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ãã§ããéãå®è¡ãããªãããã«ã¬ãžã¹ã¿éã§ããŒã¿ãåæ£ããããšã§ãã ãéãã®ããŒã¿éã®äŸåé¢ä¿ã远跡ãããéãã¬ãžã¹ã¿ã«åŸã£ãŠããŒã¿ãé åžãããéãã®å¶éã«é©åããããã«ããŒã¿ãžã®ã¢ã¯ã»ã¹ãåé 眮ããã«ã¯ãéåžžã«è€éãªã¡ã«ããºã ãå¿ èŠã§ãã åãã¬ãã«ã®åå°äœæè¡ã§ã¯ãåãããŒããŠã§ã¢ã§åããã€ãã³ãŒããå®è¡ããããããåçŽãªISAçšã®ããã»ããµãäœæãããã®äžã«ãã€ãã³ãŒãå€æãå®è£ ããæ¹ãå¹ççã§ãã äœåºŠãäœåºŠãã倢ã®ãããªITèµ·æ¥å®¶ã¯ãããŠãããŒãµã«ãã·ã³èšèªããå®éã®èšèªã«å€ããããšã¯ãæè¡çã«ã¯å¯èœã§ãããåæ¥çã«ã¯èŠèŸŒã¿ããªããšç¢ºä¿¡ããããã«ãªããŸããã
Javaãã€ãã³ãŒãã®äŸ
ãœãŒã¹ã³ãŒãïŒ
ãã€ãã³ãŒãã¯Wirthã®pã³ãŒããããããã«èšèšãããŠãããã³ã³ãã¯ãã«èšèšãããŠããŸããããšãã°ã
ïŒãŒããšæ¡ä»¶
æ¯èŒïŒã¯3ã€ã®åœä»€
察å¿ã
ãããã³
ã¯4ã€ã®
åœä»€ã眮ãæã
2a ãªã 3c 2a 03 03 54 2a 04 03 54 05 3d 1c 1b a2 00 0d 2a 1c 04 54 84 02 01 a7 ff f4 05 3d 1c 1b a2 00 23 2a 1c 33 99 00 17 05 1c 68 3e 1d 1b a2 00 0e 2a 1d 03 54 1d 1c 60 3e a7 ff f3 84 02 01 a7 ff de b1 | ãã©ã€ããŒãéçãã€ãã·ãŒãïŒããŒã«[]ïŒ; ã³ãŒãïŒ 0ïŒaload_0 //ã€ã³ããã¯ã¹0ã®ã¹ã¿ãã¯ãã¬ãŒã ããååŸãããªã³ã¯ãã¹ã¿ãã¯ã«é 眮ããŸãã ãã©ã¡ãŒã¿ 1ïŒarraylength //æž¡ãããé åã®é·ããã¹ã¿ãã¯ã«ããã·ã¥ããŸã 2ïŒistore_1 //ã¹ã¿ãã¯ããæŽæ°ãã€ã³ããã¯ã¹1ã®ã¹ã¿ãã¯ãã¬ãŒã ã«ä¿åããŸã 3ïŒaload_0 4ïŒiconst_0 //ã¹ã¿ãã¯ã«æŽæ°ã眮ã-å®æ°0 5ïŒã¢ã€ã³ã³ 6ïŒbastore //ã€ã³ããã¯ã¹0ã§ãã€ããŸãã¯ããŒã«é å0ã«æžã蟌ã 7ïŒaload_0 8ïŒiconst_1 9ïŒã¢ã€ã³ã³ 10ïŒbastore //åãé å0ã«ã€ã³ããã¯ã¹1ã§æžã蟌ã 11ïŒiconst_2 12ïŒistore_2 //æŽæ°å€2ãã€ã³ããã¯ã¹2ã®ã¹ã¿ãã¯ãã¬ãŒã ã«ä¿åããŸã 13ïŒiload_2 //ä¿åããå€ãã¹ã¿ãã¯ã«é 眮ããŸã 14ïŒiload_1 //ããŒã«ã«å€æ°çªå·1ãã¹ã¿ãã¯ã«é 眮ããŸã 15ïŒif_icmpge 28 // 2ã€ã®æŽæ°ãæ¯èŒããŸãã value> =å€æ°ã®å Žåãåœä»€28ã«é²ã¿ãŸã 18ïŒaload_0 19ïŒiload_2 20ïŒiconst_1 21ïŒbastore //ããŒã«ã«å€æ°ã®ã€ã³ããã¯ã¹ã«ãããŠãããããã€ããŸãã¯ããŒã«é åã«æžã蟌ã 22ïŒiinc 2ã1 //ããŒã«ã«å€æ°2ã1ã€å¢ãã 25ïŒgoto 13 //åœä»€13ã«ç§»å 28ïŒiconst_2 29ïŒistore_2 //ããŒã«ã«å€æ°2ã«æŽæ°2ãæžã蟌ã 30ïŒiload_2 31ïŒiload_1 32ïŒif_icmpge 67 //å€æ°çªå·2ãå€æ°çªå·1以äžã®å Žåãåœä»€67ã«é²ã 35ïŒaload_0 36ïŒiload_2 37ïŒbaload //ãã®å€æ°ããã€ã³ããã¯ã¹ã«ãã£ãŠãã€ããŸãã¯ããŒã«é åã®èŠçŽ ãèªã¿åããŸã 38ïŒifeq 61 //èªã¿åãé ç®ããŒãã®å Žåãåœä»€61ã«é²ã¿ãŸã 41ïŒiconst_2 42ïŒiload_2 43ïŒimul //ããŒã«ã«å€æ°No. 2ã®å€ã«2ãæãã 44ïŒistore_3 //çµæãã€ã³ããã¯ã¹3ã®ã¹ã¿ãã¯ãã¬ãŒã ã«ä¿åãã 45ïŒiload_3 46ïŒiload_1 47ïŒif_icmpge 61 //ããŒã«ã«å€æ°ïŒ3> =å€æ°ïŒ1ã®å Žåãåœä»€61ã«é²ã 50ïŒaload_0 51ïŒiload_3 52ïŒã¢ã€ã³ã³ 53ïŒbastore //å€æ°No. 3ããã®ã€ã³ããã¯ã¹ã«ãã£ãŠãã€ããŸãã¯ããŒã«é å0ã«æžã蟌ã¿ãŸã 54ïŒiload_3 55ïŒiload_2 56ïŒiadd //ããŒã«ã«å€æ°No. 3å€æ°No. 2ã®å€ã«è¿œå 57ïŒistore_3 //çµæãã¹ã¿ãã¯ãã¬ãŒã ã«æžãæ»ã 58ïŒgoto 45 //åœä»€45ã«ç§»å 61ïŒiinc 2ã1 //ããŒã«ã«å€æ°2ã1ã€å¢ãã 64ïŒgoto 30 //åœä»€30ã«ç§»å 67ïŒreturn //ããã·ãŒãžã£ããæ»ã |
ãœãŒã¹ã³ãŒãïŒ
private static void sieve(boolean[] workvec) { int vecsize = workvec.length; workvec[0] = false; workvec[1] = false; for(int i = 2; i<vecsize; i++) workvec[i] = true; for(int i = 2; i<vecsize; i++) if(workvec[i]) { int j = 2 * i; while(j < vecsize) { workvec[j] = false; j = j + i; } } }
ãã€ãã³ãŒãã¯Wirthã®pã³ãŒããããããã«èšèšãããŠãããã³ã³ãã¯ãã«èšèšãããŠããŸããããšãã°ã
iflt
ïŒãŒããšæ¡ä»¶
SLDC 0; GEQI; FJP
æ¯èŒïŒã¯3ã€ã®åœä»€
SLDC 0; GEQI; FJP
察å¿ã
SLDC 0; GEQI; FJP
SLDC 0; GEQI; FJP
SLDC 0; GEQI; FJP
ãããã³
iinc
ã¯4ã€ã®
SLDL; SLDC; ADI; STL
åœä»€ã眮ãæã
SLDL; SLDC; ADI; STL
SLDL; SLDC; ADI; STL
SLDL; SLDC; ADI; STL
ãã ããå察ã®äŸããããŸãã æ°ããISAãšãã®ã³ã³ãã€ã©ãäœæããæ°ãããã©ãããã©ãŒã ã«å¿ èŠãªæå°éã®ãœãããŠã§ã¢ãçŸããã®ãåŸ ã€ããããæ¢åã®ããã°ã©ã ãæ°ããããã»ããµã§å®è¡ã§ããããã«ã人æ°ã®ISAãå®è£ ããããšã¯ããã»ããµã¡ãŒã«ãŒã«ãšã£ãŠã¯ããã«æçã§ãã IA-32ã¯é·ãéããã®ãããªããŠãããŒãµã«ãã·ã³èšèªãã®ãŸãŸã§ãããæ¢åã®ãœãããŠã§ã¢ã®éã¯ãæ°ããISAãžã®åãæ¿ãã®å©ç¹ãäžåãã Pentium Pro ïŒ1995ïŒä»¥éãIntelããã»ããµã¯æ¬è³ªçã«å€ãISAã®ãããŒããŠã§ã¢ãšãã¥ã¬ãŒã·ã§ã³ããå®è£ ããŸããã 8ã€ã®ãã¯ã©ã·ãã¯ãã¬ãžã¹ã¿ã§åäœããIA-32åœä»€ã¯ãããã»ããµã«ãã40ã®ãéãã¬ãžã¹ã¿ã§åäœããå éšRISCãã€ã¯ãã³ãã³ãã«å€æãããŸãã ããã»ããµå ã®ãã€ãã©ã€ã³ã¯ããããã®RISCãã€ã¯ãã³ãã³ããããã€ãã®ã¹ã¬ããã«å®è¡ããŸã-ãããããŒã¿éã®äŸåé¢ä¿ãå£ããªãå Žåããã€ã¯ãã³ãã³ããä»»æã«åé 眮ããŸãã éçºããŒã ã«Linus Torvaldsãå«ãTransmeta Crusoeããã»ããµ ïŒ2000ïŒã§ã¯ãISAããŒããŠã§ã¢ãšãã¥ã¬ãŒã·ã§ã³ã®ã¢ã€ãã¢ãããã«éçºãããŸãããç®±ããåºããŠIA-32ããµããŒãããŸããããä»ã®ISAãšé£æºããããã«åããã°ã©ã ã§ããŸã-ãããå®èšŒããããã«Transmetaã«ã¯ãããŒããŠã§ã¢Javaãã€ãã³ãŒãããµããŒãããCrusoeã®ãåºåãµã³ãã«ãããããŸããã
IA-32ãã·ã³ã³ãŒãã®äŸ
, , .
æ©æ¢°ã³ãŒã | ã¢ã»ã³ãã©ãŒ |
---|---|
55 89 e5 56 66 c7 01 00 00 b8 02 00 00 00 02 00 00 00 eb 05 c6 04 31 01 46 39 d6 7c f7 eb 01 40 39 d0 7d 17 80 3c 01 00 74 f5 8d 34 00 eb 06 c6 04 31 00 01 c6 39 d6 7c f6 eb e4 5e 5d c3 | .type _ZL5sievePbiã@é¢æ° _ZL5sievePbiïŒïŒecxã«æž¡ãããé åãžã®ãã€ã³ã¿ãŒãedxãžã®é åã®é·ã ïŒïŒ ãšã³ã㪠pushlïŒ ebpïŒä»¥åã®ebpå€ãä¿æ movlïŒ espãïŒ ebpïŒebpã¯çŸåšã®ã¹ã¿ãã¯ãã¬ãŒã ãæãããã«ãªããŸãã pushlïŒ esiïŒä»¥åã®esiå€ãä¿æ movw $ 0ãïŒïŒ ecxïŒïŒecxã«ãŒãã¯ãŒããæžã蟌ã movl $ 2ãïŒ eaxïŒïŒã€ãŸããé åã®2ã€ã®èŠçŽ ã1ã€ã®åœä»€ã§ãªã»ãããããŸãïŒ movl $ 2ãïŒ esiïŒeaxãšesiã§2ã€ç¯çŽ jmp .LBB1_1ïŒã©ãã«.LBB1_1ã«ç§»å .LBB1_2ïŒïŒïŒ for.body movb $ 1ãïŒïŒ ecxãïŒ esiïŒïŒecx + esiã«ã·ã³ã°ã«ãã€ããæžã蟌ã inclïŒ esiïŒesiã1ã€å¢ãããŸã .LBB1_1ïŒïŒ.for.cond cmplïŒ edxãïŒ esiïŒesiãšedxãæ¯èŒ jl .LBB1_2ïŒedx <esiã®å Žåãã©ãã«.LBB1_2ã«ç§»å jmp .LBB1_4ïŒãã以å€ã®å Žåãã©ãã«.LBB1_4ã«ç§»å .LBB1_3ïŒïŒïŒ for.inc.11 inclïŒ eaxïŒeaxã1ã€å¢ãããŸã .LBB1_4ïŒïŒ.for.cond.4 cmplïŒ edxãïŒ eaxïŒeaxãšedxãæ¯èŒ jge .LBB1_9ïŒedx> = esiã®å Žåãã©ãã«.LBB1_9ã«ç§»å ïŒïŒ for.body.7 cmpb $ 0ãïŒïŒ ecxãïŒ eaxïŒïŒecx + esiã§ãŒããã€ããšæ¯èŒ je .LBB1_3ïŒãŒãã®å Žåã.LBB1_3ã«ç§»å ïŒïŒ if.then lealïŒïŒ eaxãïŒ eaxïŒãïŒ esiïŒeaxã®äºéå€ãesiã«æžã蟌ã jmp .LBB1_7ïŒã©ãã«.LBB1_7ã«ç§»å .LBB1_8ïŒïŒïŒ while.body movb $ 0ãïŒïŒ ecxãïŒ esiïŒïŒãŒããã€ããecx + esiã«æžã蟌ã addlïŒ eaxãïŒ esiïŒeaxãesiã«è¿œå .LBB1_7ïŒïŒïŒ while.cond cmplïŒ edxãïŒ esiïŒesiãšedxãæ¯èŒ jl .LBB1_8ïŒedx <esiã®å Žåãã©ãã«.LBB1_8ã«ç§»å jmp .LBB1_3ïŒãã以å€ã®å Žåãã©ãã«.LBB1_3ã«ç§»å .LBB1_9ïŒïŒïŒ for.cond.cleanup.6 poplïŒ esiïŒå€ãesiå€ã埩å popl %ebp # ebp retl # |
ããŠãããŒãµã«ãã·ã³èšèªãã®ããŒããŠã§ã¢å®è£ ã®ãããŸã§ã®ãšããæåããäŸã§ãå®è£ ãããISAãã¹ã¿ãã¯ãããã«ç»é²ãããããšã¯å¶ç¶ã§ã¯ãããŸããã OCODEã眮ãæããããã«ãMartin Richardsèªèº«ãINTCODEïŒ1972ïŒãšåŒã°ããæ°ããã¬ãžã¹ããªuni-ISAãéçºããŸããã INTCODEã¯éåžžã«ã·ã³ãã«ã§ãã6ã€ã®ã¬ãžã¹ã¿ã8ã€ã®æäœãããã³ããã€ãã®ã¢ãã¬ãã·ã³ã°ã¢ãŒãããµããŒããããŠããŸããåœä»€ã¯ãã¢ãã¬ã¹æå®ã¢ãŒãã«å¿ããŠã1ã¯ãŒããŸãã¯2ã¯ãŒããå æããŸãã 1980幎ã«ãMartinã¯16ããããã€ã³ã³çšã®ãã®uni-ISAã®ããŒãžã§ã³ãéçºããŸãããæ°ããuni-ISA-ãŸã 6ã€ã®ã¬ãžã¹ã¿ããããŸãããããè€éã§çŽäº€æ§ã®äœãã³ãã³ãã»ããããããŸã-ã¯CintcodeãšåŒã°ããéåžžã«ã³ã³ãã¯ãã§ãããåºåãªãŒãã¬ããã§æ¿èªãããŸããCintcodeããã°ã©ã ã¯ãéåžžã6502ãã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããããã3åå°ãªãã¡ã¢ãªã䜿çšããŸããã³ã³ãã¥ãŒã¿ãŒã®å ŽåãBBC Microããã³Amigaã¯ããã·ã³ã³ãŒããšãšãã«Cintcodeã®å®è¡ããµããŒãããäžè¬çãªOSã§ããã
Cintcodeã®äŸ
â ;
,
â .
(2014) BCPL Cintcode System BCPL. Cintcode ( A B ) ( A ).
P
â ;
P[3]
,
P[4]
â .
0: 10 L0 ; A := 0 1: DB ST0P3 ; P[3][0] := A ( ) 2: DD ST1P3 ; P[3][1] := A ( ) 3: 0F LM1 ; A := -1 4: C4 AP4 ; A := A + P[4] ( ) 5: A6 SP6 ; P[6] := A ( ) 6: 12 L2 ; B := A; A := 2 7: A5 SP5 ; P[5] := A 8: 5C0A JLS 10 ; IF B<A GOTO 19 10: 11 L1 ; A := 1 11: 83 LP3 ; B := A; A := P[3] 12: 9A STP5 ; P[5][A] := B ( P[5]) 13: B5 XCH ; A := B 14: C5 AP5 ; A := A + P[5] 15: A5 SP5 ; P[5] := A ( P[5] ) 16: 86 LP6 ; B := A; A := P[6] 17: 9CF8 JLE -8 ; IF B<=A GOTO 10 19: 0F LM1 ; A := -1 20: C4 AP4 ; A := A + P[4] 21: A6 SP6 ; P[6] := A ( ) 22: 12 L2 ; B := A; A := 2 23: A5 SP5 ; P[5] := A 24: 5C1B JLS 27 ; IF B<A GOTO 52 26: 83 LP3 ; A := P[3] 27: D8 RVP5 ; A := P[5][A] ( P[5]) 28: 1E11 JEQ0 17 ; IF A=0 GOTO 46 30: 85 LP5 ; A := P[5] 31: 12 L2 ; B := A; A := 2 32: 34 MUL ; A := A * B ( P[5]) 33: A7 SP7 ; P[7] := A 34: 84 LP4 ; B := A; A := P[4] ( A ) 35: BC0A JGE 10 ; IF B>=A GOTO 46 37: 10 L0 ; A := 0 38: 87 LP7 ; B := A; A := P[7] 39: 98 STP3 ; P[3][A] := B ( P[7]) 40: 87 LP7 ; A := P[7] 41: C5 AP5 ; A := A + P[5] 42: A7 SP7 ; P[7] := A ( P[7] P[5]) 43: 84 LP4 ; B := A; A := P[4] ( A ) 44: 5CF8 JLS -8 ; IF B<A GOTO 37 46: 11 L1 ; A := 1 47: C5 AP5 ; A := A + P[5] 48: A5 SP5 ; P[5] := A ( P[5] ) 49: 86 LP6 ; B := A; A := P[6] (A 1 ) 50: 9CE7 JLE -25 ; IF B<=A GOTO 26 52: 7B RTN
(2014) BCPL Cintcode System BCPL. Cintcode ( A B ) ( A ).
ç©ã¿éããããuni-ISAã®éçºã®é ç¹ã¯ããŸãã¯ãå察åŽããèŠããšãéçºã®è¡ãæ¢ãŸãã§ããMSILïŒ2001;æ£åŒã«CILãšåŒã°ããŠããŸãïŒã§ããMSILã¯Javaãã€ãã³ãŒãã«éåžžã«äŒŒãŠããŸãããããã€ãã®è¿œå æ©èœãè¿œå ããŸããç§ã®ç¥ãéããããŒããŠã§ã¢ã«MSILãå®è£ ããè©Šã¿ã¯è¡ãããŠããŸããããã€ã¯ããœããã¯ãã¯ãã¹ãã©ãããã©ãŒã ã§ãã«æ©èœã®Webã¢ããªã±ãŒã·ã§ã³ãäœæããããã®Javaã®ä»£æ¿æ¡ãææ¡ããããšãããŠããŸãããMSILã¯ãMicrosoftãã©ãããã©ãŒã ã®ãã·ã³èšèªãã®ãŸãŸã§ãããä»ã«ã¯ãããŸããã
MSILã®äŸ
C# Java
â
. Java- MSIL : -, , . -, (/ , , ..), MSIL,
, «», .. ; (, â int32) . , MSIL JIT-, MSIL- .
, MSIL «»,
.
.method private hidebysig static void sieve(bool[] workvec) cil managed { .maxstack 3 .locals init ([0] int32 vecsize, [1] int32 i, [2] int32 V_2, [3] int32 j) IL_0000: /* 02 | */ ldarg.0 // â0 () IL_0001: /* 8E | */ ldlen // ( ) IL_0002: /* 69 | */ conv.i4 // int32 ( ) IL_0003: /* 0A | */ stloc.0 // â0 IL_0004: /* 02 | */ ldarg.0 // IL_0005: /* 16 | */ ldc.i4.0 // 0 ( ) IL_0006: /* 16 | */ ldc.i4.0 IL_0007: /* 9C | */ stelem.i1 // IL_0008: /* 02 | */ ldarg.0 IL_0009: /* 17 | */ ldc.i4.1 // 1 ( ) IL_000a: /* 16 | */ ldc.i4.0 IL_000b: /* 9C | */ stelem.i1 // (int8) 1 IL_000c: /* 18 | */ ldc.i4.2 IL_000d: /* 0B | */ stloc.1 // â1 IL_000e: /* 2B | 08 */ br.s IL_0018 // IL_0019 IL_0010: /* 02 | */ ldarg.0 IL_0011: /* 07 | */ ldloc.1 // IL_0012: /* 17 | */ ldc.i4.1 IL_0013: /* 9C | */ stelem.i1 // IL_0014: /* 07 | */ ldloc.1 IL_0015: /* 17 | */ ldc.i4.1 IL_0016: /* 58 | */ add // IL_0017: /* 0B | */ stloc.1 // IL_0018: /* 07 | */ ldloc.1 IL_0019: /* 06 | */ ldloc.0 // â0 IL_001a: /* 32 | F4 */ blt.s IL_0010 // â1 < â0, IL_0010 IL_001c: /* 18 | */ ldc.i4.2 IL_001d: /* 0C | */ stloc.2 // â2 IL_001e: /* 2B | 1B */ br.s IL_003b // IL_003b IL_0020: /* 02 | */ ldarg.0 IL_0021: /* 08 | */ ldloc.2 IL_0022: /* 90 | */ ldelem.i1 // IL_0023: /* 2C | 12 */ brfalse.s IL_0037 // , IL_0037 IL_0025: /* 18 | */ ldc.i4.2 IL_0026: /* 08 | */ ldloc.2 IL_0027: /* 5A | */ mul // â2 IL_0028: /* 0D | */ stloc.3 // â3 IL_0029: /* 2B | 08 */ br.s IL_0033 // IL_0033 IL_002b: /* 02 | */ ldarg.0 IL_002c: /* 09 | */ ldloc.3 IL_002d: /* 16 | */ ldc.i4.0 IL_002e: /* 9C | */ stelem.i1 // 0 â3 IL_002f: /* 09 | */ ldloc.3 IL_0030: /* 08 | */ ldloc.2 IL_0031: /* 58 | */ add // â2 â2 IL_0032: /* 0D | */ stloc.3 // â2 IL_0033: /* 09 | */ ldloc.3 IL_0034: /* 06 | */ ldloc.0 IL_0035: /* 32 | F4 */ blt.s IL_002b // â3 < â0, IL_002b IL_0037: /* 08 | */ ldloc.2 IL_0038: /* 17 | */ ldc.i4.1 IL_0039: /* 58 | */ add // â2 IL_003a: /* 0C | */ stloc.2 // IL_003b: /* 08 | */ ldloc.2 IL_003c: /* 08 | */ ldloc.0 IL_003d: /* 32 | E1 */ blt.s IL_0020 // â2 < â0, IL_0020 IL_003f: /* 2A | */ ret // }
C# Java
boolean
â
bool
. Java- MSIL : -, , . -, (/ , , ..), MSIL,
add
, «», .. ; (, â int32) . , MSIL JIT-, MSIL- .
, MSIL «»,
iflt
iinc
.
ãã®å幎çŽã«ã¯ãããŠãããŒãµã«ãã·ã³èšèªãã«å¯Ÿããã¹ã¿ãã¯ã®ç«¶åã¯ãªããªããŸããã

ãã¬ãŒã³ã
2000幎ãUIUCã®å€§åŠé¢çã§ããChris Luttner ã¯åæ¥ãããžã§ã¯ããšããŠãJavaã®ã³ãŒããæ®éçãªãäžéè¡šçŸãïŒIRïŒã«å€æããå®å šã«ç¬ç«ãããããã³ããšã³ããã§æ§æãããããŠãããŒãµã«ã³ã³ãã€ã©ãLLVMã®éçºãéå§ããŸãããããã¯ãšã³ããIRãç¹å®ã®ISAã®å®è¡å¯èœã³ãŒãã«å€æããŸããäžéè¡šçŸLLVM-IRãšããŠãåäžã®å²ãåœãŠãã©ãŒã ãéžæãããŸããïŒãSSAãã©ãŒã ã
ïŒïŒåå€æ°ã«ã¯å€ã1åå²ãåœãŠãããããã°ã©ã ã®åäœäžã¯å€æŽãããŸããããã®ãã©ãŒã ã¯ãããŒã¿éã®äŸåé¢ä¿ã®è¿œè·¡ãç°¡çŽ åããåã ã®åœä»€ã®çœ®æãšçœ®æãéè€ãŸãã¯ãããããåœä»€ã®æ€åºãšåé€ãªã©ãåçŽåããŸãã
LLVM-IRã®äŸ
(BB), ( ). BB . â . BB , .. BB, .
IA-32 LLVM IR â , , , BB .
â alias analysis ;
â (
â 0 1).
, â «» MSIL.
C++:
; Function Attrs: minsize noinline nounwind optsize define internal fastcc void @_ZL5sievePbi(i8* nocapture %workvec, i32 %vecsize) #0 { ; #0 -- ( ) entry: store i8 0, i8* %workvec, align 1, !tbaa !1 ; %arrayidx1 = getelementptr inbounds i8, i8* %workvec, i32 1 ; store i8 0, i8* %arrayidx1, align 1, !tbaa !1 ; br label %for.cond ; BB for.cond: ; preds = %for.body, %entry %i.0 = phi i32 [ 2, %entry ], [ %inc, %for.body ] ; %i.0 2, BB %entry, %inc, %for.body %cmp = icmp slt i32 %i.0, %vecsize ; %i.0 %vecsize , %cmp 1 0 br i1 %cmp, label %for.body, label %for.cond.4 ; %for.body %for.cond.4 for.body: ; preds = %for.cond %arrayidx2 = getelementptr inbounds i8, i8* %workvec, i32 %i.0 ; %i.0- store i8 1, i8* %arrayidx2, align 1, !tbaa !1 ; %inc = add nuw nsw i32 %i.0, 1 ; %inc %i.0 ; nuw nsw , ( ), br label %for.cond ; BB for.cond.4: ; preds = %for.cond, %for.inc.11 %i3.0 = phi i32 [ %inc12, %for.inc.11 ], [ 2, %for.cond ] ; %i3.0 2, BB %for.body, %inc12, %for.inc.11 %cmp5 = icmp slt i32 %i3.0, %vecsize ; %i3.0 %vecsize br i1 %cmp5, label %for.body.7, label %for.cond.cleanup.6 ; , %i3.0 %vecsize for.cond.cleanup.6: ; preds = %for.cond.4 ret void ; , for.body.7: ; preds = %for.cond.4 %arrayidx8 = getelementptr inbounds i8, i8* %workvec, i32 %i3.0 %0 = load i8, i8* %arrayidx8, align 1, !tbaa !1, !range !5 ; %i3.0 %tobool = icmp eq i8 %0, 0 ; br i1 %tobool, label %for.inc.11, label %if.then if.then: ; preds = %for.body.7 %mul = shl nsw i32 %i3.0, 1 ; %mul %i3.0 br label %while.cond ; BB while.cond: ; preds = %while.body, %if.then %j.0 = phi i32 [ %mul, %if.then ], [ %add, %while.body ] %cmp9 = icmp slt i32 %j.0, %vecsize ; %j.0 %vecsize br i1 %cmp9, label %while.body, label %for.inc.11 ; %j.0 < %vecsize, %while.body while.body: ; preds = %while.cond %arrayidx10 = getelementptr inbounds i8, i8* %workvec, i32 %j.0 store i8 0, i8* %arrayidx10, align 1, !tbaa !1 ; %j.0- %add = add nsw i32 %j.0, %i3.0 ; %add %j.0 %i3.0 br label %while.cond ; BB for.inc.11: ; preds = %while.cond, %for.body.7 %inc12 = add nuw nsw i32 %i3.0, 1 ; %inc12 %i3.0 br label %for.cond.4 }
IA-32 LLVM IR â , , , BB .
!tbaa !1
â alias analysis ;
!range !5
â (
bool
â 0 1).
, â «» MSIL.
C++:
static void sieve(bool workvec[], int vecsize) { workvec[0] = false; workvec[1] = false; for(int i = 2; i<vecsize; i++) workvec[i] = true; for(int i = 2; i<vecsize; i++) if(workvec[i]) { int j = 2 * i; while(j < vecsize) { workvec[j] = false; j = j + i; } } }
LLVM-IRã¯ããŠãISAãšããŠã§ã¯ãªããäž»ã«ããã³ããšã³ãããããã¯ãšã³ãã«ã³ãŒãã転éããããã®å¹æçãªæ¹æ³ãšããŠéçºãããããããŠãISAã®åœ¹å²ã«ã¯å€ãã®æ¬ ç¹ããããŸãããŸããã¿ãŒã²ãããã©ãããã©ãŒã ã®æ©èœãLLVM-IRã®çæã«åœ±é¿ããå¯èœæ§ããããŸãã32ãããã·ã¹ãã çšã®ããã°ã©ã ã¯ã64ãããã·ã¹ãã çšã®ããã°ã©ã ãšã¯å¥ã®LLVM-IRã«ã³ã³ãã€ã«ãããŸãããŸããWindowsçšã®ããã°ã©ã ã¯ãLinuxçšã®ããã°ã©ã ãšã¯ç°ãªãLLVM-IRã§ã³ã³ãã€ã«ãããŸãã次ã«ãLLVM-IRã¯äžå®å®ã§ããLLVMéçºè ã¯ãéèŠãªãã©ãããã©ãŒã ã§éèŠãªèšèªããŒã«ãããå¹ççã«ã³ã³ãã€ã«ã§ããå Žåãæ°ããåœä»€ãè¿œå ããããæ¢åã®åœä»€ã®å€ãå€æŽãããã§ããŸããããã¯ãç¹å®ã®ããŒãžã§ã³ã®ããã³ããšã³ãã«ãã£ãŠçæãããLLVM-IRã¯ã察å¿ããããŒãžã§ã³ã®ããã¯ãšã³ãã§ã®ã¿äœ¿çšã§ããä»ã®ããŒãžã§ã³ã§ã¯äœ¿çšã§ããªãããšãæå³ããŸãã第äžã«ãLLVM-IRã§ã¯ãã³ãŒãã«ãæªå®çŸ©ã®åäœããæ瀺ã§ããŸã-åããã¯ãšã³ãã«ã¯ãããã°ã©ã ããæ倧éã®ããã©ãŒãã³ã¹ããçµãåºããããã«ã䟿å©ãªæ¹æ³ã§ãã®ãããªã³ãŒãããããŒããã£ã¹ãããæš©å©ããããŸãã CãŸãã¯C ++ã§æªå®çŸ©ã®åäœã䌎ãã³ãŒãã¯ãéåžžãLLVM-IRã§æªå®çŸ©ã®åäœã䌎ãã³ãŒãã«ã³ã³ãã€ã«ãããŸããå®éããã®ãããªã³ãŒãã®ã»ãã³ãã£ã¯ã¹ã¯ãç¹å®ã®ãã©ãããã©ãŒã ã«æé©ãªæ¹æ³ã§ãããã³ããšã³ãã§ã¯ãªãããã¯ãšã³ãã«ãã£ãŠæ±ºå®ãããŸããåœç¶ã®ããšãªãããæªå®çŸ©ã®åäœã䌎ãã³ãŒãã¯ãuni-ISAãææ Œãããã1åæžã蟌ã¿ãã©ãã§ãå®è¡ããšãããã©ãã€ã ãšççŸããŸããããã«ãããããããLLVMã®ã¢ã¯ãã£ããªéçºè ã®1人ã§ããGoogleã¯ãLLVMããµããŒãããå€ãã®PLã®ããããã§æžãããã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã®é åžã«LLVM-IRãé©åãªåœ¢åŒã§ãããšèããŸãããããŒãžã§ã³31ïŒ2013ïŒä»¥éãGoogle Chromeã«ã¯PNaClã®ãµããŒããå«ãŸããŠããŸã-LLVM-IRã®ãµãã»ããã§ãå®å®ããåœä»€ã»ãã³ãã£ã¯ã¹ãåããŠããããã©ãããã©ãŒã åºæã®æ§æãšæé©åã¯ãããŸããã
15幎åã«ãŸã£ããåãç®çã§ã¯ãã¹ãã©ãããã©ãŒã ã®ãã«æ©èœWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã«çºæãããJavaã¢ãã¬ãããããPNaClã¢ããªã±ãŒã·ã§ã³ã®æ¹ãåªããŠããã®ã¯ãªãã§ããããã ïŒãã®ãããã¯ã®åé ã®KDPVã¯ãŸãã«ãããã¯ã§ããïŒç§ã¯PNaClã®2ã€ã®å©ç¹ãç¥ã£ãŠããŸãããŸããJavaã¹ã¿ãã¯ãã€ãã³ãŒããšæ¯èŒããLLVM-IRã¯ããã©ãŠã¶ãŒãPNaClã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®ã¿ãŒã²ãããã©ãããã©ãŒã ã®ãã·ã³ã³ãŒãã«å€æãããšãã®ã³ãŒãæé©åãç°¡çŽ åããŸãã 2çªç®ã®ããããŠç§ãç解ããããã«ãäž»ãªè°è«ã¯LLVMã®ãªãŒãã³æ§ãšã©ã€ã»ã³ã¹ãããæž æœãã§ãããã®ãã¹ãïŒSunãšOracleïŒã¯JavaãµããŒãã«é¢ããŠGoogleãå«ã圌ããåºäŒã£ããã¹ãŠã®äººã蚎ããŸãããå¯Ÿç §çã«ãLLVMãšãã®IRã¯å®å šã«ãªãŒãã³ã§ãããããŠäžæ¹ã§ã¯ãGoogleã¯PNaClã³ã³ãã€ã©ã§ããããçš®é¡ã®ãã³ãšä»ã®LLVMéçºåå è ã«ãã£ãŠå®è£ ãããæ°ããæé©åã§ç¡æã§åãåããŸããäžæ¹ãä»ã®éçºè ã¯ããã©ãŠã¶ã«PNaClã¢ããªã±ãŒã·ã§ã³ã®ãµããŒããè¿œå ããæš©å©ãããã蚎èšãæããããšã¯ãããŸããã
ãããŸã§ã®ãšãããGoogleã®äŸã«åŸã£ãŠPNaClã®ãµããŒããå®è£ ããææã¯ãããŸããã§ãããããã©ããããåãç®çã®ããã®Mozilla-ã¯ãã¹ãã©ãããã©ãŒã ã§ãã«æ©èœã®Webã¢ããªã±ãŒã·ã§ã³ãäœæãã-ã¯ãasm.jsïŒ2013ïŒãšåŒã°ããç¬èªã®uni-ISAãéçºããŸãããAsm.jsçæã¯ãLLVMã®æ°ããããã¯ãšã³ããšããŠå®è£ ãããŸããã asm.jsãšPNaClã®äœæ¥ã¯ã»ãŒåæã«è¡ãããGoogle Chromeã§ã¯asm.jsã®ãµããŒãã¯PNaClã®ãµããŒããããæ©ãç»å ŽããŸãã-ããŒãžã§ã³28ïŒ2013ïŒä»¥éã
asm.jsã¯éåžžã«æŽç·Žãããã¢ã€ãã¢ãå®è£ ããŠããŸãããã®ããã°ã©ã ã¯JavaScriptã®ïŒå€§å¹ ã«åé€ãããïŒæ£ããã³ãŒãã§ãããããã£ãŠããã®ãããªããã°ã©ã ã¯JavaScriptããµããŒããããã©ãŠã¶ãŒã§åäœããã¯ãã§ããäžæ¹ãasm.jsã³ã³ã¹ãã©ã¯ããèªèããã¿ãŒã²ãããã©ãããã©ãŒã ã®ãã·ã³ã³ãŒãã«ãªã³ã¶ãã©ã€ã§ã³ã³ãã€ã«ã§ãããã©ãŠã¶ã¯ãJavaScriptããé¡ã§ãå®è¡ãããã©ãŠã¶ãããäœåãé«éã«ããã°ã©ã ãå®è¡ããŸãããããã£ãŠãäž¡æ¹ã®å€ããã©ãŠã¶ã¯asm.jsã§æ°ããã³ãŒããå®è¡ã§ããæ°ãããã©ãŠã¶ã¯ãã¯ã©ã·ãã¯ãJavaScriptã§å€ãã³ãŒããå®è¡ã§ããŸããã¹ã¯ãªãã
"use asm";
ã«ããããŒã°ããªãå Žåããå€ãæ¹æ³ã§ãå®è¡ãããŸãã
Asm.jsã®äŸ
C++, , Emscripten:
function __ZL5sievePbi($workvec,$vecsize) { $workvec = $workvec|0; // |0 $vecsize = $vecsize|0; var $0 = 0, $1 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $2 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $25 = 0, $26 = 0; var $27 = 0, $28 = 0, $29 = 0, $3 = 0, $30 = 0, $31 = 0, $32 = 0, $33 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0, $i = 0, $i1 = 0, $j = 0, label = 0, sp = 0; sp = STACKTOP; STACKTOP = STACKTOP + 32|0; if ((STACKTOP|0) >= (STACK_MAX|0)) abort(); $0 = $workvec; $1 = $vecsize; $2 = $0; HEAP8[$2>>0] = 0; // >>0 $3 = $0; $4 = ((($3)) + 1|0); // HEAP8[$4>>0] = 0; $i = 2; while(1) { $5 = $i; $6 = $1; $7 = ($5|0)<($6|0); // if (!($7)) { break; } $8 = $i; $9 = $0; $10 = (($9) + ($8)|0); HEAP8[$10>>0] = 1; $11 = $i; $12 = (($11) + 1)|0; $i = $12; } $i1 = 2; while(1) { $13 = $i1; $14 = $1; $15 = ($13|0)<($14|0); if (!($15)) { break; } $16 = $i1; $17 = $0; $18 = (($17) + ($16)|0); $19 = HEAP8[$18>>0]|0; // $20 = $19&1; L8: do { if ($20) { $21 = $i1; $22 = $21<<1; $j = $22; while(1) { $23 = $j; $24 = $1; $25 = ($23|0)<($24|0); if (!($25)) { break L8; } $26 = $j; $27 = $0; $28 = (($27) + ($26)|0); HEAP8[$28>>0] = 0; $29 = $j; $30 = $i1; $31 = (($29) + ($30))|0; $j = $31; } } } while(0); $32 = $i1; $33 = (($32) + 1)|0; $i1 = $33; } STACKTOP = sp;return; }
èå³æ·±ãããšã«ãéçºäžã®asm.jsãJavaScriptã®å¶éïŒ64ãããæ°ããã«ãã¹ã¬ãããSIMDåœä»€ãªã©ã®ãµããŒãã®æ¬ åŠïŒã«ãééãããå Žåãæ¬ èœããŠããæ§é ãJavaScriptæšæºã«è¿œå ãããŸããããããã£ãŠãasm.jsãšæšæºJavaScriptãšã®äºææ§ã¯ãasm.jséçºè ã ãã§ãªããèšèªæšæºéçºè ã®åªåã®çµæã§ãã
ãã§ã«è¿°ã¹ãçç±ã«å ããŠãJavaã¢ãã¬ããã䜿çšããŠLLVMã«åºã¥ãæ°ãããã¯ãããžãŒã䜿çšãã代ããã«ãasm.jsãµããŒã¿ãŒã¯æ¬¡ã®åŒæ°ãæäŸããŸãããJavaScriptã«ã¯ä»®æ³ãã·ã³ãçµã¿èŸŒãŸããŠããããããã1ã€è¿œå ãããšãæ¥ç¶APIã®2çªç®ã®ã»ããã衚瀺ãããDOMããããã¯ãŒã¯ãã»ã³ãµãŒãå ¥åããã€ã¹ãªã©ã«ä»®æ³ãã·ã³ãã¢ã¯ã»ã¹ã§ããããã«ãªããŸãããã®ããã«äœããç ç²ã«ããªããã°ãªããŸãããããšãã°ãä»®æ³ãã·ã³ã®ããã»ã¹ã¯ãå©çšå¯èœãªãªãœãŒã¹ãã©ã®ããã«åæ£ããŸããïŒãã®è³ªåã«çããã®ã¯æã£ãããé£ããã§ããã ïŒãªãªãžãã«ã®ã¹ãã«ïŒç¹ã«ãããã¯ãšã³ãžã³ã®æ°æ©èœãasm.jsãšãã¯ã©ã·ãã¯ãJavaScriptããåæã«å©çšã§ããããšãæå³ããŸãã2åå®è£ ããå¿ èŠã¯ãããŸããã
æªæ¥
GoogleãšAppleãäŸåããŠããçã®LLVM-IRãšæ¯èŒããŠãasm.jsã«ã¯å€ãã®å©ç¹ããããŸããããããæ¬ ç¹ããããŸãããŸããasm.jsã®ã³ãŒãã®ãµã€ãºã¯éåžžã«å€§ãããªã£ãŠããŸãã2ã€ã®æŽæ°ãè¿œå ãããš20ãã€ã以äžããããŸãã第äºã«ãasm.jsã³ãŒããå®è¡ããã«ã¯ãå解æããå¿ èŠããããŸããJavaScriptæ§æã䜿çšããŠã³ãŒãããã³ãŒããçæãããã®ã³ãŒãããASTã埩å ããã®ã§ã¯ãªããASTã®åœ¢åŒã§ã³ã³ãã€ã«ã®çµæãä¿åããæ¹ãã¯ããã«å¹ççã§ãããã®ããã2015幎ã®å€ã«ãWebAssemblyãšããæ°ããããŠãããŒãµã«ãã·ã³èšèªããç»å ŽããŸãããasm.jsã®é·æã®äžéšïŒJavaScriptãšã³ãžã³ãšã®çµ±åãªã©ïŒãä¿æãã2ã€ã®æ¬ ç¹ã解æ¶ããå€ãJavaScriptãšã³ãžã³ãšã®çŽæ¥ã®äºææ§ãæåŠããŸããïŒvsbã®ã³ã¡ã³ãããŸãã¯ããã©ãŠã¶ã§ã²ãŒã ããŸã£ããèµ·åããªãã£ãããããŸãã¯ã1 fpsã§å§ãŸããŸãã-éãã¯ãããŸããããšã«ããåçã§ããŸããããïŒä»£ããã«ãWebAssemblyéçºè ã¯ãããã -WebAssemblyã§ã³ãŒããèªã¿åãããã®å Žã§ã³ãŒããçæããJavaScriptã©ã€ãã©ãªå€å žçãªãasm.js; ãããŠåœŒã®å€ãããŒãžã§ã³ã®ãã©ãŠã¶ã¯ãã§ã«å®è¡æ¹æ³ãç¥ã£ãŠããŸãã
WebAssemblyã®äŸ
C++, , WebAssembly LLVM:
LLVM-IR IA-32, ; WebAssembly , .
, , VEG - â « WebAssembly .» â .
_Z5sievePbi: .param i32 # $0 $1 .param i32 .local i32, i32, i32, i32 # $2, $3, $4, $5 # %entry block BB0_9 # -- i32.const $2, 0 # i32.store8 $0, $2 # i32.const $3, 1 i32.add $push0, $0, $3 # -- i32.store8 $pop0, $2 # i32.const $4, 2 set_local $5, $4 BB0_1: # %for.cond loop BB0_3 i32.ge_s $push1, $5, $1 # -- br_if $pop1, BB0_3 # %for.body i32.add $push7, $0, $5 # $pushN $popN -- "" i32.store8 $pop7, $3 # ( ) i32.add $5, $5, $3 # br BB0_1 BB0_3: # %for.cond.4 loop BB0_9 block BB0_8 block BB0_4 block BB0_3 # , (? ?) i32.lt_s $push2, $4, $1 br_if $pop2, BB0_4 br BB0_9 BB0_4: # %for.body.7 i32.add $push3, $0, $4 i32.load8_u $5, $pop3 # $4 i32.eq $push4, $5, $2 # br_if $pop4, BB0_8 # %if.then i32.shl $5, $4, $3 # $4 , .. BB0_6: # %while.cond loop BB0_8 i32.ge_s $push5, $5, $1 br_if $pop5, BB0_8 # %while.body i32.add $push6, $0, $5 i32.store8 $pop6, $2 i32.add $5, $5, $4 br BB0_6 BB0_8: # %for.inc.11 i32.add $4, $4, $3 br BB0_3 BB0_9: # %for.cond.cleanup.6 return
LLVM-IR IA-32, ; WebAssembly , .
, , VEG - â « WebAssembly .» â .
Googleã¯WebAssemblyã®äž»èŠãªéçºè ã®1ã€ã«ãªããŸãã-LLVMã«åºã¥ããæ°ããããŠãããŒãµã«ãã·ã³èšèªãã§ã¯ãPNaClã®éçºäžã«åŸããããã¹ãŠã®çµéšãèæ ®ãããŸãã圌ãã¯èªåã§PNaClãéçºããã€ããã¯ãããŸããããã1ã€ã®äž»èŠãªéçºè ã§ããMozillaã¯ãasm.jsãšã¯ç°ãªããWebAssemblyãæ§æçã«ãæå³çã«ãç¹å®ã®PLã«æ¥ç¶ãããŠããªãããšã匷調ããŠããŸãã 10幎ã2幎ã§JavaScriptãå¿åŽã®å¯Ÿè±¡ã«ãªãããã©ãŠã¶ãŒã¯ãœãŒã¹ã³ãŒãã®ã¹ã¯ãªããããµããŒãããªããªããŸãã代ããã«ãWebAssemblyã¯ãã©ãŠã¶ãŒã®Webã¢ããªã±ãŒã·ã§ã³ã®ãã€ãã£ã圢åŒã«ãªããŸãããœãããŠã§ã¢éçºè ãè€æ°ããŒãžã®ãªã¹ããBASICãšPascalã«é åžããå®è¡å¯èœã³ãŒãã®é åžã«åãæ¿ãã1980幎代ã«ãPCããã°ã©ã ã¯ãã®ãé£èºçãªé²æ©ããéããŸãããå°ãªããšããããããã¹ãŠã³ã³ãã€ã«ããŠå®è¡ããã«ã¯ã©ãããã°ãããããšããã¬ãã«ã§ãåäžã®ããã°ã©ãã³ã°èšèªãç¥ããªããŠãPCã䜿çšã§ããããã«ãªããŸããã
ã»ãšãã©ã®Webã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã¯ãJavaScriptã«ã€ããŠã¯ãŸã£ããç¥ããŸãããã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ããœãŒã¹ã³ãŒããšããŠé åžããæå³ã¯äœã§ããïŒ

äžæ¹ãåäžã®æ©æ¢°èªã¯ããã»ããµã¡ãŒã«ãŒã«å³æ Œãªãã¬ãŒã ã¯ãŒã¯ã課ããŸãããã·ã³ã°ã«ISAãã«åãå ¥ããããä»ã®ã¡ãŒã«ãŒã«ãã£ãŠå®è£ ããããŸã§ãæ°ããæ©èœãæ°ããããã»ããµã«è¿œå ããããšã¯ã§ããŸãããããã«ãçµ±äžãããæ©æ¢°èªã®éçºã«ãããã¡ãŒã«ãŒã®1ã€ãèšèªã«ç¹ã«æçãªæ©èœãèšèªã«ããã·ã¥ããããšãããšãç¶æ³ã¯é¿ããããŸãããããšãã°ãIntelããã»ããµã®æŽæ°é€ç®åœä»€ã¯ããŒãã§é€ç®ãããšãã«äŸå€ãã¹ããŒããŸãã ARMããã»ããµã§-çµæãšããŠãŒããè¿ããŸããARMãšã³ãžãã¢ã¯ãé€ââæ°ãã¹ããã³ã³ãã€ã©ã«ã·ããããé€æ°ãæå³çã«ãŒãã§ãªãå Žåã«é€ç®ãé«éåããæ¹ãè¯ããšèããŸããã第äžã«ãã°ã©ãã£ãã¯ã¹ã®ãµããŒãã¯ã©ãã§ããïŒ WebAssembly ã¯è©ŠããŠããããŸããGPUã«å¯ŸããŠåäžã®ISAãæäŸããŸã-ç°ãªãã¡ãŒã«ãŒã®å¥œã¿ã®éãã¯ãIntelãšARMã®ã³ãã³ãã·ã¹ãã éãããããã«å€§ãããªããŸãã
ãã ãããããã®èæ ®äºé ã¯ãã¹ãŠãWebAssemblyãæ ¹ä»ããšããäºå®ã«åºã¥ããŠãããPNaClã®ããã«æ°å¹ŽåŸã«ã¯æŸæ£ããããJavaãMSILã®ãããªå¥ã®ãããã§éé¢ãããããšã¯ãããŸããã
èŠãŠã¿ãŸãããã