¼÷Á¦4: SM5¿ë D++ ÄÄÆÄÀÏ·¯, ³¡Àç±Í ÃÖÀûÈ­, ¸Þ¸ð¸® ÀçÈ°¿ë

ÇÁ·Î±×·¥

Á¦°øÇÏ´Â ÇÁ·Î±×·¥ ¼Ò½º´Â D++ ¾ð¾îÀÇ ¹®¹ý ºÐ¼®±â (parser) ¿Í ¼öÇà±â, SM5 ¾ð¾îÀÇ ¼öÇà±â ÀÔ´Ï´Ù. ¹Ýµå½Ã 1.n, 2.n, 3.n ¸¸ Á¦ÃâÇØ ÁÖ¼¼¿ä.

¼÷Á¦ 1¹ø¿¡ ´ëÇÏ¿©

ÇöÀç »À´ë¸¸ ÀÖ´Â 1.nÀ» ¼öÁ¤Çؼ­ D++ to SM5 compiler ¸¦ ¿Ï¼ºÇÏ¸é µË´Ï´Ù. ÀÌ °úÁ¤À» ¿ä¾àÇØ º¸¸é,
  1. nmakegen -f ¶Ç´Â nmakegen -f run.exe (MS À©µµ¿ìÁî)
  2. 1.n ¼öÁ¤
  3. make
  4. run test1.d
1Àº ÇÑ ¹ø¸¸ ÇØÁÖ°í ÀÌÈÄ¿¡´Â ÇÒ ÇÊ¿ä ¾ø½À´Ï´Ù. 4´Â Å×½ºÆ® °úÁ¤ÀÔ´Ï´Ù.

while ¹®¿¡ ´ëÇÑ ÈùÆ®: Àç±Í ÇÔ¼ö È£Ãâ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù.

  while e1 do e2 end
  = let proc f(x) = if e1 then (e2; call f(unit)) 
    in  call f(unit)
    end

¼÷Á¦ 2¹ø¿¡ ´ëÇÏ¿©

2.n¿¡¼­ Tailcall_Sm5 ¸ðµâÀ» tail recursion Áö¿ø µÇµµ·Ï ¼öÁ¤ÇÕ´Ï´Ù. (Tailcall_Sm5 ¸ðµâÀº ¼÷Á¦ 1¹øÀÇ Sm5 ¸ðµâ°ú ÇöÀç µ¿ÀÏÇÕ´Ï´Ù.) ´õºÒ¾î ¸Ç ¾Æ·¡ÀÇ trans ÇÔ¼öµµ ¼÷Á¦ 1¹ø °á°ú¸¦ Âü°íÇÏ¿© ä¿ö ÁÝ´Ï´Ù. ±×¸®°í ³ª¼­ ÄÄÆÄÀÏÇÏ¸é µË´Ï´Ù.
  1. 2.n ¼öÁ¤
  2. make
  3. run -tail test1.d
½ÇÇà½Ã -tail ¿É¼ÇÀ» ÁÖ¾î¾ß ¼öÁ¤ÇÑ Tailcall_Sm5 ¸ðµâÀ» »ç¿ëÇÕ´Ï´Ù. ½ÇÇà½Ã "== Running with your own tail call SM5 module ==" À̶ó´Â ¸Þ½ÃÁö°¡ Ãâ·ÂµË´Ï´Ù. 2.n ¿¡¼­ ¼öÁ¤ÇÒ ºÎºÐÀº
  1. ÇÊ¿äÇÏ´Ù¸é 4-18 ÁÙÀÇ SM5 Á¤ÀÇ ºÎºÐ.
  2. ÇÊ¿äÇÏ´Ù¸é 83-127 ÁÙÀÇ SM5 ÀÎÅÍÇÁ¸®ÅÍ ºÎºÐ.
  3. 146 ÁÙÀÇ trans ÇÔ¼ö´Â ¼÷Á¦ 1¹ø trans ÇÔ¼ö¸¦ ±×´ë·Î »ç¿ëÇϼŵµ µÇ°í, ÇÊ¿äÇÏ´Ù¸é ¼öÁ¤Çϼż­ ä¿ö ³ÖÀ¸¼¼¿ä.
  4. ±× ¿Ü ºÎºÐÀº D++ to SM5 º¯È¯±â¿Í SM5 ½ÇÇà±â°¡ Á¤»óÀûÀ¸·Î ÄÄÆÄÀÏµÇ°í ¼öÇàµÇ´Â ÇÑ, ¼öÁ¤ ¾ÈÇϼŵµ °¨Á¤ ´ë»óÀº ¾Æ´Õ´Ï´Ù. (¿¹¸¦ µé¾î, SM5 Ãâ·Â ºÎºÐ(print·Î ½ÃÀ۵Ǵ ÇÔ¼öµé), ¿À·ù ó¸® ºÎºÐµî)

¼÷Á¦ 3¹ø¿¡ ´ëÇÏ¿©

3.n¿¡¼­ Gc_Sm5 ¸ðµâÀ» ¼öÁ¤ÇÕ´Ï´Ù. (Gc_Sm5 ¸ðµâÀº ¼÷Á¦ 1¹øÀÇ Sm5 ¸ðµâ°ú ÇöÀç µ¿ÀÏÇϸç gc ÇÔ¼ö¸¸ Ãß°¡·Î Á¤ÀǵǾî ÀÖ½À´Ï´Ù.) ´õºÒ¾î ¸Ç ¾Æ·¡ÀÇ trans ÇÔ¼öµµ ¼÷Á¦ 1¹ø °á°ú¸¦ Âü°íÇÏ¿© ä¿ö ÁÝ´Ï´Ù. ±×¸®°í ³ª¼­ ÄÄÆÄÀÏÇÏ¸é µË´Ï´Ù.
  1. 3.n ¼öÁ¤
  2. make
  3. run -gc testmem.d
½ÇÇà½Ã -gc ¿É¼ÇÀ» ÁÖ¾î¾ß ¼öÁ¤ÇÑ Gc_Sm5 ¸ðµâÀ» »ç¿ëÇÕ´Ï´Ù. ½ÇÇà½Ã "== Running with your own gc SM5 module ==" À̶ó´Â ¸Þ½ÃÁö°¡ Ãâ·ÂµË´Ï´Ù.
3.n ¿¡¼­ ¼öÁ¤ÇÒ ºÎºÐÀº
  1. ÇÊ¿äÇÏ´Ù¸é 80-84 ÁÙÀÇ »õ ¸Þ¸ð¸® ÇÒ´ç °ü·Ã ºÎºÐ.
  2. ÇÊ¿äÇÏ´Ù¸é 101 ÁÙÀÇ SM5.MALLOC ½ÇÇà ºÎºÐ.

Âü°í»çÇ×

¿©·¯ºÐÀÇ ÆíÀǼºÀ» À§ÇØ ´ÙÀ½À» Á¦°øÇÕ´Ï´Ù.

±¸¹®±¸Á¶

  1. D++ ÇÁ·Î±×·¥ÀÇ ±¸¹®±¸Á¶´Â hw3ÀÇ C- ¾ð¾î¿¡¼­ for ¹®, °ªÀÇ ÁּҷΠȣÃâÇϱⰡ ¾ø´Â ¾ð¾î·Î ¼÷Á¦ ¹®Á¦¸¦ º¸½Ã¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù.
  2. (* *) ·Î ÁÖ¼®À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. // ´Â ¶óÀÎ ÄÚ¸àÆ®¿ëÀ¸·Î »ç¿ëÇÕ´Ï´Ù.

¿ì¼±¼øÀ§

»ç¿ëµÇ´Â ±âÈ£µéÀÇ ¿ì¼±¼øÀ§´Â ¾Æ·¡¿Í °°½À´Ï´Ù. À§¿¡ ÀÖ´Â ±âÈ£°¡ ¿ì¼± ¼øÀ§°¡ °¡Àå ³ô°í, ¾Æ·¡·Î °¥¼ö·Ï ¿ì¼± ¼øÀ§°¡ ³·¾ÆÁý´Ï´Ù.
    not    (¿À¸¥ÂÊ)
    .      (¿ÞÂÊ)
    *, /   (¿ÞÂÊ)  
    +, -   (¿ÞÂÊ) 
    =, <   (¿ÞÂÊ)
    write  (¿À¸¥ÂÊ)
    :=     (¿À¸¥ÂÊ)
    else   
    then
    ;      (¿ÞÂÊ)    
°ýÈ£ ¾ÈÀº ¹æÇ⼺ (associativity)À» ³ªÅ¸³»´Â °ÍÀ¸·Î °°Àº ¿ì¼±¼øÀ§ÀÇ ±âÈ£°¡ ¿¬ÀÌ¾î ³ª¿Ã½Ã¿¡ ¿ì¼± ¼øÀ§¸¦ °áÁ¤ÇØ ÁÝ´Ï´Ù. ¿¹¸¦ µé¾î ¹æÇ⼺ÀÌ ¿ÞÂÊÀÎ- ´Â
  x-y-z   =>   (x-y)-z
°¡ µÇ°í, ¿À¸¥ÂÊÀÎ := Àº
  x := y := 1    =>   x := (y := 1) 
ÀÌ µÇ°Ô µË´Ï´Ù.