¹ø¿ª : 2005. 08.01  ÃÖÈï¹è ( jacking@korea.com )

 

 

C++ Rule

Visual C++ ÀÇ ÇÁ·Î±×·¡¹Ö ¸ðµ¨°ú ÄÄÆÄÀÏ·¯ ÃÖÀûÈ­¸¦ »ç¿ëÇÑ ¾îÇø®ÄÉÀ̼ÇÀÇ °­È­

Kang Su Gatlin

 

ÀÌ ±â»çÀÇ ÀϺδ , ÀÌÀü¿¡´Â "Whidbey" À̶ó°í ÇÏ´Â ÄÚµå³×ÀÌ ºÙ¾î ÀÖ´Â Microsoft Visual Studio 2005 ÀÇ ÇÁ·¹¸®¸®½º ¹öÁ¯¿¡ ±Ù°ÅÇϰí ÀÖ½À´Ï´Ù. ÀÌ º£Å¸ÆÇ¿¡ °üÇÑ ¸ðµç Á¤º¸´Â º¯°æµÉ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.


ÀÌ ±â»ç°¡ ´Ù·ç´Â È­Á¦:

  • C++ °¡ .NET ÀÇ Á᫐ ¾ð¾îÀÎ ÀÌÀ¯
  • C++ ÀÇ .NET À» »ç¿ëÇØ ÆÛÆ÷¸Õ½º ³ôÀº ÇÁ·Î±×·¡¹ÖÀ» ÇàÇÏ´Â ¹æ¹ý
  • C++ °ú JIT ¿ÉƼ¸¶ÀÌÀúÀÇ ¿ªÇÒ
  • Áö¿¬ Àбâ¿Í STL/CLI

ÀÌ ±â»ç·Î »ç¿ëÇÏ´Â ±â¼ú:
C++, Visual Studio


 

  Microsoft .NET Framework ¿¡ ÀÇÇØ °³¹ßÀÚÀÇ »ý»ê¼ºÀÌ Çâ»óÇÏ´Â °Í¿¡ Àǹ®ÀÇ ¿©Áö´Â ¾ø½À´Ï´Ù. ±×·¯³ª ±× ÇÑÆíÀ¸·Î ¸Å´ÏÁö ÄÚµåÀÇ ÆÛÆ÷¸Õ½º¿¡ ´ëÇØ ¿°·Á¸¦ ¾È°í ÀÖ´Â »ç¶÷µéÀÌ ¸¹ÀÌ ÀÖ½À´Ï´Ù. ½Å ¹öÁ¯ÀÇ Visual C++ ¿¡ ÀÇÇØ ÀÌ·¯ÇÑ ¿°·Á´Â ºÒ½Ä µË´Ï´Ù. Visual Studio 2005 ¿¡¼­´Â º¸´Ù ½Å¼ÓÇÑ ¾îÇø®ÄÉÀÌ¼Ç ÀÛ¼ºÀ» ¸ñÀûÀ¸·Î ÇÏ¿© C++ ÀÇ ±¸¹® ÀÚü°¡ Å«ÆøÀ¸·Î °³·®µÇ°í ÀÖ½À´Ï´Ù. ±×¸®°í À¯¿¬ÇÑ ¾ð¾î üÁ¦°¡ ÁغñµÇ¾î ÀÖ¾î °øÅë ¾ð¾î ·±Å¸ÀÓ (CLR) °ú Á¦ÈÞ½ÃŰ´Â °Í¿¡ ÀÇÇØ  ÆÛÆ÷¸Õ½ºÀÇ ³ôÀº ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
  C++
Àº ³×ÀÌÆ¼ºê Äڵ带 »ý¼ºÇϱ⠶§¹®¿¡ ÆÛÆ÷¸Õ½º°¡ ÁÁ´Ù°í »ý°¢ÇÏ´Â ÇÁ·Î±×·¡¸Ó°¡ ´Ù¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ¿ÏÀüÇÑ ¸Å´ÏÁö Äڵ忡¼­µµ ¶Ù¾î³­ ÆÛÆ÷¸Õ½º¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.  C++¿¡¼­´Â À¯¿¬ÇÑ ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÌ Ã¤¿ëµÇ°í Àֱ⠶§¹®¿¡ , ÀýÂ÷Çü ÇÁ·Î±×·¡¹Ö, °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö, »ý¼ºÀû ÇÁ·Î±×·¡¹Ö, ¸ÞŸ ÇÁ·Î±×·¡¹Ö µî¿¡ À¯Àú°¡ ¼Ó¹ÚµÉ °ÍÀº ¾ø½À´Ï´Ù.
  
ÇÁ·Î±×·¡¸Ó°¡ °¡Áö°í ÀÖ´Â 1°³ÀÇ °øÅëÀÇ ¿ÀÇØ´Â .NET Framework °¡ ¶Ù¾î³­ ÆÛÆ÷¸Õ½º´Â »ç¿ëÇÏ´Â ¾ð¾î¿¡ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù.  Áï ÇÁ·Î±×·¡¸Ó´Â ´Ù¾çÇÑ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ »ý¼ºµÇ´Â Microsoft Áß°£ ¾ð¾î (MSIL) °¡ º»ÁúÀûÀ¸·Î °°´Ù¶ó°í º¸°í ÀÖ½À´Ï´Ù.  Visual Studio .NET 2003 ¿¡¼­ Á¶Â÷ ÀÌ·¯ÇÑ »ý°¢Àº ¿Ã¹Ù¸£Áö´Â ¾Ê½À´Ï´Ù. ÇÑÃþ ´õ Visual Studio 2005 ¿¡ À־´Â C++ ÄÄÆÄÀÏ·¯ ÆÀÀÌ ¼ö³â¿¡ °ÉÄ¡´Â ³×ÀÌÆ¼ºê ÄÚµåÀÇ ÃÖÀûÈ­·ÎºÎÅÍ ¾òÀ» ¼ö ÀÖ´ø Áö½ÄÀ» ¸Å´ÏÁö ÄÚµåÀÇ ÃÖÀûÈ­¿¡ È®½ÇÈ÷ Àû¿ëÇÒ ¼ö ÀÖµµ·Ï ´Ù´ëÇÑ ³ë·ÂÀ» ¼ÒºñÇß½À´Ï´Ù.  C++ ¿¡¼­´Â °í ÆÛÆ÷¸Õ½º ¸¶¼£¸µµîÀÇ ¼¼¼¼ÇÑ Á¶Á¤À» ÇàÇϱâ À§ÇÑ À¯¿¬¼ºÀÌ Á¦°øµÇ°í ÀÖ½À´Ï´Ù. ´Ù¸¥ ¾ð¾î¿¡¼­´Â ÀÌ·¯ÇÑ À¯¿¬¼ºÀº ½ÇÇöµÉ ¼ö ¾ø½À´Ï´Ù. °Ô´Ù°¡Visual C++ ÄÄÆÄÀÏ·¯´Â ´Ù¸¥ .NET ¾ð¾î¿Í ºñ±³ÇØ º¸´Ù ÃÖÀûÈ­µÈ MSIL¸¦ »ý¼ºÇÕ´Ï´Ù. ±× °á°ú °¡Àå ÃÖÀûÈ­µÈ  .NET ÀÇ Äڵ带 »ý¼ºÇÏ´Â °ÍÀº Visual C++ ÄÄÆÄÀÏ·¯¶ó´Â °ÍÀÌ µË´Ï´Ù.

ÃÖÀûÈ­µÈ MSIL
  .NET
ȯ°æÀÇ ÄÄÆÄÀÏÀº 2 °³ÀÇ ºÎºÐÀ¸·Î ³ª´­ ¼ö°¡ ÀÖ½À´Ï´Ù. 1 °³´Â ÇÁ·Î±×·¡¸Ó°¡ ¾ð¾î ÄÄÆÄÀÏ·¯ (C#,Visual Basic, ¶Ç´Â Visual C++) À» »ç¿ëÇØ ÄÄÆÄÀϰú ÃÖÀûÈ­¸¦ ½Ç½ÃÇØ MSIL ¸¦ »ý¼ºÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ¶Ç Çϳª´Â Á®½ºÆ®ÀΟÀÓ(JIT) ÄÄÆÄÀÏ·¯ ¶Ç´Â NGENÀÌ MSIL¸¦ ¹Þ¾Æ ±×°ÍÀ» Àоîµé¿© ÃÖÀûÈ­µÈ ³×ÀÌÆ¼ºêÀÎ ±â°è¾î Äڵ带 »ý¼ºÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ¾ð¾î ÄÄÆÄÀÏ·¯¿Í JIT °¡ ¹ÐÁ¢ÇÏ°Ô °áÇյǰí ÀÖ´Â °ÍÀº ºÐ¸íÇÕ´Ï´Ù.  Áï ¶Ù¾î³­ Äڵ带 ÀÛ¼ºÇÏ·Á¸é ¾ç ÄÄÆÛ³ÍÆ®ÀÇ Á¦ÈÞ°¡ ÇÊ¿äÇÏ°Ô µË´Ï´Ù.
  Visual C++
Àº ¾î´À ÄÄÆÄÀÏ·¯º¸´Ù °íµµÀÇ ÃÖÀûÈ­¸¦ Ç×»ó Á¦°øÇØ ¿Ô½À´Ï´Ù. À̰ÍÀº ¸Å´ÏÁö Äڵ忡 ´ëÇØ¼­µµ °°½À´Ï´Ù. ³×ÀÌÆ¼ºê ÄÄÆÄÀÏ·¯¿¡ ÀÇÇÑ MSIL ÄÚµå »ý¼ºÀÇ ÃÖÀûÈ­´Â Visual C++ .NET 2003 ¿¡¼­ óÀ½À¸·Î µµÀԵǾú½À´Ï´Ù¸¸ ÀÌ ½ÃÁ¡¿¡¼­ ÀÌ¹Ì °íµµÀÇ ±â´ÉÀÌ ÁغñµÇ¾î ÀÖ¾ú½À´Ï´Ù.
  Visual C++ 2005
ÀÇ ÄÄÆÄÀÏ·¯¿¡¼­´Â Ç¥ÁØÀûÀÎ ³×ÀÌÆ¼ºê ÄÚµåÀÇ ÃÖÀûÈ­ÀÇ ´ëºÎºÐÀ» MSIL Äڵ忡 ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ÃÖÀûÈ­¿¡´Â µ¥ÀÌÅÍ ÇÃ·Î¿ì º£À̽ºÀÇ ÃÖÀûÈ­·ÎºÎÅÍ ·çÇÁ Àü°³ÀÇ ½ÄÀÇ ÃÖÀûÈ­±îÁö ¸ðµç Á¾·ù°¡ Æ÷ÇԵ˴ϴÙ. ´Ù¸¥ ¾î´À .NET Ç÷§Æû»óÀÇ ¾ð¾îµµ ÀÌ ·¹º§ÀÇ ÃÖÀûÈ­´Â °®Ãß°í ÀÖÁö ¾Ê½À´Ï´Ù.  Visual C++ .NET 2003 ¿¡¼­ /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇÑ ºôµå¿¡ ´ëÇÑ ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­ (WPO) ÀÇ ¼­Æ÷Æ®´Â ÇàÇØÁö°í ÀÖÁö ¾Ê¾Ò½À´Ï´Ù¸¸ Visual C++ 2005 ¿¡¼­ ÀÌ ±â´ÉÀ» ¸Å´ÏÁö Äڵ忡 Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇϸé Å©·Î½º ¸ðµâÀÇ ÃÖÀûÈ­°¡ ½ÇÇà °¡´ÉÇÏ°Ô µË´Ï´Ù. ÀÌ Á¡¿¡ ´ëÇØ¼­´Â ÀÌ ±â»çÀÇ ÈĹݿ¡ ¼³¸íÇÕ´Ï´Ù.
  Visual C++ 2005
ÀÇ ¸Å´ÏÁö Äڵ忡 Àû¿ëÇÒ ¼ö ¾ø´Â À¯ÀÏÇÑ ÃÖÀûÈ­ Ŭ·¡½º´Â Profile Guided Optimization ÀÔ´Ï´Ù. ÇÏÁö¸¸ Àå·¡ÀÇ ¹öÁ¯¿¡¼­´Â ÀÌ ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ°ÚÁö¿ä. »ó¼¼ÇÑ °Í¿¡ ´ëÇÏ¿©´Â ¡¸Write Faster Code with the Modern Language Features of Visual C++ 2005¡¹(¿µ¾î) ¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

JIT
°ú ÄÄÆÄÀÏ·¯ ÃÖÀûÈ­ÀÇ »óÈ£ÀÛ¿ë
  JIT
¶Ç´Â NGEN Àº Visual C++ ÀÌ »ý¼ºÇÏ´Â ÃÖÀûÈ­ ÄÚµå·ÎºÎÅÍ native code¸¦ »ý¼ºÇÕ´Ï´Ù. Visual C++ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ »ý¼ºµÈ Äڵ尡 MSILÀΰ¡ ¾ð ¸Å´ÏÁö ÄÚµå(ºñ°ü¸® ÄÚµå)Àΰ¡¿¡ °ü°è¾øÀÌ ÄÚµåÀÇ »ý¼º¿¡´Â 10 ³â ÀÌ»ó¿¡ °ÉÃļ­ °³¹ß ¹× Á¶Á¤À» ÇØ ¿Â ¿ÉƼ¸¶ÀÌÀú°¡ »ç¿ëµË´Ï´Ù.
  MSIL
Äڵ忡 Àû¿ëµÇ´Â ÃÖÀûÈ­´Â  ¾ð ¸Å´ÏÁö Äڵ忡 Àû¿ëµÇ´Â ÃÖÀûÈ­¿Í °ÅÀÇ °°½À´Ï´Ù. ÄÄÆÄÀÏ·¯°¡ °ËÁõ °¡´ÉÇÑ ÄÚµå (/clr:safe) ¿Í °ËÁõ ºÒ´ÉÀÎ ÄÚµåÀÇ ¾î´À ÂÊÀ» »ý¼ºÇұ ÀÇÇØ Á¤´çÇÑ ÃÖÀûÈ­ Ŭ·¡½º°¡ ´Ù¸£´Ù°í ÇÏ´Â Á¡Àº ÁöÀûÇØ µÎ´Â °¡Ä¡°¡ ÀÖ½À´Ï´Ù.  ¸ÞŸµ¥ÀÌŸ ¶Ç´Â °ËÁõ °¡´É¼º Á¦¾àÀ» À§Çؼ­ ÄÄÆÄÀÏ·¯¸¦ ½ÇÇàÇÒ ¼ö ¾ø´Â ÃÖÀûÈ­ÀÇ ¿¹·Î¼­´Â °­µµÀÇ »è°¨(°ö¼ÀÀ» Æ÷ÀÎÅÍ °¡»ê¿¡ º¯È¯)À̳ª ¾î´À Ŭ·¡½ºÀÇ private ¸â¹ö ¾×¼¼½º¸¦ ´Ù¸¥ Ŭ·¡½ºÀÇ ¸Þ¼Òµå º»Ã¼¿¡ ÀÎ ¶óÀÎÈ­ÇÏ´Â °ÍµîÀÌ ÀÖ½À´Ï´Ù.
  Visual C++
ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ »ý¼ºµÈ MSIL ÄÚµå´Â ±× ÈÄ JIT ¿¡ ÀÇÇØ ÀÌ¿ëµË´Ï´Ù.  JIT Àº MSIL À» Àоîµé¿© ÃÖÀûÈ­¸¦ ½ÇÇàÇÕ´Ï´Ù¸¸ ÀÌ ÃÖÀûÈ­´Â MSIL ÀÇ Â÷ÀÌ¿¡ ¸Å¿ì ¹Î°¨ÇÕ´Ï´Ù. Áï  MSIL °¡ ÀÖ´Â ¸í·É ¼ø¼­°¡ ÃÖÀûÈ­ÀÇ ¿µÇâÀ» ¸Å¿ì ¹Þ±â ½¬¿î ÇÑÆí ´Ù¸¥ (ÀǹÌÀûÀ¸·Î °°Àº) ¼ø¼­´Â ÃÖÀûÈ­¿¡ ÀÇÇØ °ÅÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù°í ÇÏ´Â ÀÏÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é  ·¹Áö½ºÅÍ ÇÒ´çÀ̶ó´Â ºÒ¸®´Â ÃÖÀûÈ­¿¡¼­´Â JIT ¿ÉƼ¸¶ÀÌÀú°¡ º¯¼ö¸¦ ·¹Áö½ºÅÍ¿¡ ÇÒ´çÇÕ´Ï´Ù. ½ÇÁ¦ÀÇ Çϵå¿þ¾î´Â ÀÌ ·¹Áö½ºÅ͸¦ ¿ÀÆÛ·£µå·Î¼­ »ç¿ëÇØ »ê¼ú ¿¬»êÀ̳ª ³í¸® ¿¬»êÀ» ½ÇÇàÇÕ´Ï´Ù. ÀǹÌÀûÀ¸·Î µî°¡ÀÎ Äڵ忡¼­µµ ±â¼ú ¹æ¹ýÀÌ ´Ù¸£´Ù¸é ¿ÉƼ¸¶ÀÌÀú°¡ ·¹Áö½ºÅÍ ÇÒ´çÀ̶ó´Â °ÍÀ» ÀûÀýÈ÷ ½Ç½ÃÇÒ ¼ö ¾ø´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ·çÇÁ Àü°³ µîÀÇ ÄÚµå º¯È¯Àº JIT ÀÌ ·¹Áö½ºÅÍ ÇÒ´ç¿¡ ÁöÀåÀ» ÃÊ·¡ÇÏ´Â ¿øÀÎÀ¸·Îµµ µÉ ¼ö ÀÖ½À´Ï´Ù.
  C++
ÄÄÆÄÀÏ·¯°¡ ½ÇÇàÇÏ´Â ·çÇÁ Àü°³´Â  ¸í·É ·¹º§ÀÇ º´·Ä¼ºÀ» Çâ»ó½ÃÄÑ µ¿½Ã¿¡ º¸´Ù ¸¹Àº »ýÁ¸ º¯¼ö¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ¿ÉƼ¸¶ÀÌÀú´Â ÀÌ·¯ÇÑ º¯¼ö¸¦ ·¹Áö½ºÅÍ¿¡ ÇÒ´çÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. CLR JIT ¿¡¼­´Â ÃßÀû °¡´ÉÇÑ ·¹Áö½ºÅÍ ÇÒ´çÀ» À§ÇÑ º¯¼öÀÇ ¼ö´Â °íÁ¤µÇ°í ÀÖ½À´Ï´Ù. ÀÌ Á¤¼ö¸¦ ³Ñ´Â º¯¼ö¸¦ ÃßÀûÇÒ Çʿ䰡 ÀÖ´Â °æ¿ì JIT ´Â ·¹Áö½ºÅÍÀÇ ³»¿ëÀ» ¸Þ¸ð¸®·Î ¿Å±é´Ï´Ù.
  
ÀÌ·¯ÇÑ ÀÌÀ¯À̱⠶§¹®¿¡  ÃÖÀûÀÎ ÄÚµåÀÇ »ý¼º¿¡´Â Visual C++ ÄÄÆÄÀÏ·¯¿Í JIT ¸¦ Á¦ÈÞÇØ Á¶Á¤ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. Visual C++ ÄÄÆÄÀÏ·¯°¡ ½ÇÇàÇÏ´Â °ÍÀº JIT ÀÌ ½ÇÇàÇÏ·Á¸é ½Ã°£ÀÌ ³Ê¹« °É¸®´Â ÃÖÀûÈ­³ª C++ ¼Ò½º·ÎºÎÅÍ MSIL ¿¡ ÄÄÆÄÀÏ ÇÏ´Â °úÁ¤¿¡¼­ ¸Å¿ì ¸¹Àº Á¤º¸°¡ ¾ø¾îÁö´Â ÃÖÀûÈ­ÀÔ´Ï´Ù.
  
´ÙÀ½¿¡  ¸Å´ÏÁö Äڵ忡 ´ëÇÑ Visual C++ ÀÇ ÃÖÀûÈ­¿¡ ´ëÇØ  ¸î °³Àΰ¡¸¦ ºÁ °¡±â·Î ÇսôÙ.

°øÅë ºÎºÐ½ÄÀÇ »èÁ¦¿Í ¿¬»êÀÇ °£´ÜÈ­
  °øÅë
ºÎºÐ½ÄÀÇ »èÁ¦(CSE) ¿Í ¿¬»êÀÇ °£´ÜÈ­´Â °­·ÂÇÑ ÃÖÀûÈ­ÀÔ´Ï´Ù.  ÄÄÆÄÀÏ·¯´Â ÀÌ·¯ÇÑ ¼ö¹ýÀ» »ç¿ëÇØ ½Ä ·¹º§ÀÇ ±âº»ÀûÀÎ ÃÖÀûÈ­¸¦ ½ÇÇàÇÕ´Ï´Ù. ±× °á°ú °³¹ßÀÚ´Â ¾Ë°í¸®Áò°ú ¾ÆÅ°ÅØÃÄ¿¡ ÁýÁßÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
ÀÌÇÏ´Â C# ¹× C++ À¸·Î¼­ ÄÄÆÄÀÏ µÈ ÄÚµå ½º´ÏÆêÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ¾î´ÀÂÊÀ̳ª Release ±¸¼ºÀ¸·Î ÄÄÆÄÀÏ µÇ°í ÀÖ½À´Ï´Ù. º¯¼ö a,b,c ´Â Äڵ带 Æ÷ÇÔÇÑ ÇÔ¼ö¿¡ ÆÄ¶ó¹ÌÅͷμ­ °Ç³×¹ÞÀº ¹è¿­·ÎºÎÅÍ Ä«ÇÇµÈ °ÍÀÔ´Ï´Ù.

int d = a + b * c;

int e = (c * b) * 12 + a + (a + b * c);

±×¸² 1 Àº ÃÖÀûÈ­¸¦ À¯È¿ÇÏ°Ô ÇÑ C# ÄÄÆÄÀÏ·¯¿Í C++ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ÀÌ ÄÚµå·ÎºÎÅÍ »ý¼ºµÈ MSIL¸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.  C# ¿¡¼­´Â 19 ÀÇ ¸í·ÉÀÌ ÇÊ¿äÇÕ´Ï´Ù¸¸ C++ ¿¡ ÇÊ¿äÇÑ ¸í·ÉÀº 13 »Ó ÀÔ´Ï´Ù. ±×¸®°í  ÀÌÇØ¿Í °°ÀÌ C++ Äڵ忡¼­´Â ½Ä b*C ¿¡ ´ëÇØ¼­ CSE °¡ ½ÇÇàµÇ°í ÀÖ½À´Ï´Ù. ¿ÉƼ¸¶ÀÌÀú´Â ¿¬»êÀÇ ´Ü¼øÈ­¸¦ ½ÇÇàÇØ a+a ´ë½Å¿¡ 2*a ¸¦ ¶Ç (c*b)*12 + c*b ´ë½Å¿¡ (c*b)*13 ¸¦ °¢°¢ »ý¼ºÇϰí ÀÖ½À´Ï´Ù.  ÈÄÀÚÀÇ CSE Àº Ưº°È÷ ¿ì¼öÇÏ´Ù°í »ý°¢ÇÕ´Ï´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¯ÇÑ ¿¬»êÀÇ ´Ü¼øÈ­¿¡ ½ÇÆÐÇϰí ÀÖ´Â °ÍÀ» ½ÇÁ¦·Î º» ÀûÀÌ Àֱ⠶§¹®ÀÔ´Ï´Ù. "C# ÄÄÆÄÀÏ·¯ÀÇ ÃÖÀûÈ­" ¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­
   Visual C++ .NET
¿¡¼­´Â WPO ÀÌ ¾ð ¸Å´ÏÁö Äڵ忡 ´ëÇØ¼­ Ãß°¡µÇ¾ú½À´Ï´Ù. Visual C++ 2005 ¿¡¼­ ÀÌ ±â´ÉÀÌ ¸Å´ÏÁö Äڵ忡µµ È®ÀåµÇ°í ÀÖ½À´Ï´Ù. ¼Ò½º ÆÄÀÏÀÇ ÄÄÆÄÀϰú ÃÖÀûÈ­¸¦ 1 ÆÄÀϾ¿ ½ÇÇàÇÒ ÇÊ¿ä´Â ¾ø°í  º¹¼öÀÇ ¼Ò½º ÆÄÀϰú Çì´õ ÆÄÀÏÀ» Á¤¸®ÇØ ÇÑ ¹ø¿¡ ÄÄÆÄÀÏ ¹× ÃÖÀûÈ­ÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
ÄÄÆÄÀÏ·¯´Â º¹¼öÀÇ ÆÄÀÏÀ» ´ë»óÀ¸·Î ºÐ¼®°ú ÃÖÀûÈ­¸¦ ½ÇÇàÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ¿¹¸¦ µé¸é WPO ÀÌ ¾øÀ¸¸é ÄÄÆÄÀÏ·¯´Â 1 °³ÀÇ ÄÄÆÄÀÏ °¡´É ÆÄÀÏ ³»¿¡¼­ ¹Û¿¡ ÇÔ¼ö¸¦ ÀÎ ¶óÀÎÈ­ÇÒ ¼ö ¾ø½À´Ï´Ù. WPO¸¦ »ç¿ëÇϸé ÇÁ·Î±×·¥³»ÀÇ ¾î´À ¼Ò½º ÆÄÀÏÀÇ ÇÔ¼ö¿¡¼­µµ ÀÎ ¶óÀÎÈ­ÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
ÀÌÇÏÀÇ ¿¹¿¡¼­´Â ÄÄÆÄÀÏ·¯´Â ÀÎ ¶óÀÎÈ­³ª Á¤¼ö ÀüÆÄ µîÀÇ ÃÖÀûÈ­¸¦ º¹¼öÀÇ ÄÄÆÄÀÏ °¡´É ÆÄÀÏ¿¡ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ±× ¿ÜÀÇ ÇÁ·Î½ÃÀú°£ ÃÖÀûÈ­¸¦ ½ÇÇàÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

// Main.cpp

...

MSDNClass ^MSDNObj = gcnew MSDNClass;

int x = MSDNObj->Square(42);

return x;

...

 

// MSDNClass.cpp

int MSDNClass::Square(int x)

{

        return x*x;

}

ÀÌ ¿¹¿¡¼­´Â Main.cpp °¡ ´Ù¸¥ ¼Ò½º ÆÄÀÏ¿¡ Æ÷ÇԵǴ MSDNClass ÀÇ Square ¸Þ¼Òµå¸¦ È£ÃâÇϰí ÀÖ½À´Ï´Ù.  /O2 ÃÖÀûÈ­¸¦ »ç¿ëÇØ¿© ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­¸¦ »ç¿ëÇÏÁö ¾Ê°í ÄÄÆÄÀÏ Çϸé ÀÌÇÏ¿Í °°Àº MSIL ÀÌ Main.cpp ¿¡ »ý¼ºµË´Ï´Ù.

ldc.i4.s   42

call       instance int32 MSDNClass::Square(int32)


   42
°¡ ½ºÅÿ¡ ÀÐÇô ´ÙÀ½¿¡ Square ÇÔ¼ö°¡ È£Ãâ µÇ°í  ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.  ÇÑÆí ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­¸¦ À¯È¿ÇÏ°Ô ÇØ °°Àº ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÏ¸é »ý¼ºµÇ´Â MSIL Àº ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

ldc.i4     0x6e4

42 ¸¦ ÀоîµéÀÏ °Íµµ ¾ø°í ¶Ç Square ÇÔ¼ö¸¦ È£ÃâÇÏ´Â Àϵµ ¾ø½À´Ï´Ù. ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­¸¦ »ç¿ëÇÏ´Â °ÍÀ¸·Î ÄÄÆÄÀÏ·¯´Â MSDNClass.cpp ÀÇ ÇÔ¼öÀÇ ÀÎ ¶óÀÎÈ­¿Í Á¤¼ö ÀüÆÄ¸¦ ½ÇÇàÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù. ±× °á°ú  42*42 ÀÇ ¿¬»ê °á°ú Áï 16 Áø¼öÀÇ 0x6e4 À» ÀоîµéÀÌ´Â ¸í·É¸¸ÀÌ »ý¼ºµÇ¾ú½À´Ï´Ù.
  Visual C++
ÄÄÆÄÀÏ·¯°¡ ½ÇÇàÇÏ´Â ºÐ¼®À̳ª ÃÖÀûÈ­ÀÇ ÀϺδ JIT ÄÄÆÄÀÏ·¯°¡ ½ÇÇàÇÏ´Â Àϵµ À̷лóÀº °¡´ÉÇÕ´Ï´Ù¸¸ JIT ÄÄÆÄÀÏ·¯¿¡ ºÎ°úµÇ°í ÀÖ´Â ½Ã°£ÀûÀÎ Á¦¾àÀ» À§ÇØ ¿©±â¼­ Á¢Çϰí ÀÖ´Â ÃÖÀûÈ­ÀÇ »ó´ç¼ö´Â Çö½ÃÁ¡¿¡¼­´Â ±¸Çö ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀϹݷÐÀ¸·Î ¸»Çϸé NGEN °¡ JIT º¸´Ù ¸ÕÀú ÀÌ·¯ÇÑ ÃÖÀûÈ­¸¦ ±¸Çö ÇÑ´Ù°í »ý°¢µË´Ï´Ù.  JIT °ú´Â ´Þ¸® NGEN ¿¡´Â ÀÀ´ä ½Ã°£ÀÇ Á¦¾àÀÌ ºÎ°úµÇÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.

64
ºñÆ® NGEN ÀÇ ÃÖÀûÈ­
  ±â»çÀÇ
ÇüÆí»ó Áö±Ý±îÁö´Â JIT NGEN ÀÇ ¾çÂÊ ¸ðµÎ¸¦ Á¤¸®ÇØ JIT ·Î¼­ Ãë±ÞÇØ ¿Ô½À´Ï´Ù.  32 ºñÆ®ÀÇ CLR ¿¡¼­´Â JIT ÄÄÆÄÀÏ·¯¿Í NGEN ´Â ¾î´ÀÂÊÀ̳ª °°Àº ÃÖÀûÈ­¸¦ ½ÇÇàÇÕ´Ï´Ù. ±×·¯³ª 64 ºñÆ®ÀÇ CLR ¿¡¼­´Â NGEN Àº JIT º¸´Ù ²Ï ¸¹Àº ÃÖÀûÈ­¸¦ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
  64
ºñÆ® NGEN ´Â JIT ¿Í ºñ±³ÇÏ¿© ÈξÀ ¸¹Àº ½Ã°£À» ÄÄÆÄÀÏ¿¡ ¼ÒºñÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀº JIT ÀÇ throughput°¡ ¾îÇø®ÄÉÀ̼ÇÀÇ ÀÀ´ä ¼Óµµ¿¡ Á÷Á¢ ¿µÇâÀ» Áֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ ±â»ç¿¡¼­´Â ÁÖ·Î 64 ºñÆ® NGEN ¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. ±× ÀÌÀ¯´Â 64 ºñÆ® NGEN ¿¡¼­´Â C++ ½ºÅ¸ÀÏÀÇ Äڵ忡 ¸ÂÃá Á¶Á¤À» Çϰí ÀÖ¾î ¶Ç Double Thunk Elimination µî ´Ù¸¥ JIT À̳ª NGEN ¿¡´Â ¾ø´Ù C++ ¿¡ ÀÖ¾î ¸Å¿ì À¯È¿ÇÑ ÃÖÀûÈ­°¡ ÁغñµÇ¾î Àֱ⠶§¹®ÀÔ´Ï´Ù. 32 ºñÆ® JIT ¹× 64 ºñÆ® JIT ´Â  °¢°¢ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®°¡ ´Ù¸¥ ÆÀ¿¡ ÀÇÇØ ´Ù¸¥ ÄÚµå º£À̽º¸¦ ÀÌ¿ëÇØ ±¸Çö µÇ¾ú½À´Ï´Ù.  32 ºñÆ® JIT ÀÇ °³¹ßÀº CLR ÆÀÀÌ ´ã´çÇß½À´Ï´Ù¸¸ 64 ºñÆ® JIT ´Â Visual C++ ÆÀÀÌ Visual C++ ÄÚµå º£À̽º¸¦ ±âÃʷμ­ °³¹ßÇß½À´Ï´Ù. 64 ºñÆ® JIT ´Â Visual C++ ÆÀ¿¡ ÀÇÇØ °³¹ßµÇ¾ú±â ¶§¹®¿¡ C++ ¿Í °ü°èµÇ´Â ¹®Á¦¸¦ º¸´Ù ÀǽÄÇÑ °ÍÀÌ µÇ°í ÀÖ½À´Ï´Ù.

Double Thunk Elimination
  64
ºñÆ® NGEN ÀÇ °¡Àå Áß¿äÇÑ ÃÖÀûÈ­ÀÇ 1 °³´Â Double Thunk Elimination À¸·Î ºÒ¸®´Â °ÍÀÔ´Ï´Ù.  /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇØ ÄÄÆÄÀÏ µÈ C++ ÄÚµåÀÇ °æ¿ì  ¸Å´ÏÁö Äڵ尡 ÇÔ¼ö Æ÷ÀÎÅÍ ¶Ç´Â °¡»ó È£ÃâÀ» °³ÀÔ½ÃÄÑ ¸Å´ÏÁö ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ È£ÃâÇϸé õÀÌ(
ôÃì¹)°¡ ¹ß»ýÇÕ´Ï´Ù¸¸ (/clr:pure ¶Ç´Â /clr:safe À» »ç¿ëÇØ ÄÄÆÄÀÏ µÈ Äڵ忡¼­´Â ÀÌ ÃµÀÌ´Â ¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù) Double Thunk Elimination ´Â ÀÌ ÃµÀ̸¦ ó¸®ÇÕ´Ï´Ù. ÀÌ ÃµÀ̰¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿Í °¡»ó È£ÃâÀÌ ÄÝ »çÀÌÆ®ÀÇ ÃæºÐÇÑ Á¤º¸¸¦ °®ÃßÁö ¾Ê±â ¶§¹®¿¡ È£Ãâó°¡ ¸Å´ÏÁö ¿£Æ®¸® Æ÷ÀÎÆ® (MEP) Àΰ¡ ¾ð ¸Å´ÏÁö ¿£Æ®¸® Æ÷ÀÎÆ® (UEP) Àΰ¡ ¸¦ ÆÇ´ÜÇÒ ¼ö ¾ø´Â °Í¿¡ ÀÖ½À´Ï´Ù.
  
ÇÏÀ§ ȣȯ¼ºÀ» À¯ÁöÇϱâ À§ÇØ UEP °¡ Ç×»ó ¼±Åõ˴ϴÙ. ±×·¯³ª  ¸Å´ÏÁö ÄÝ »çÀÌÆ®°¡ ½ÇÁ¦·Î ¸Å´ÏÁö ¸Þ¼Òµå¸¦ È£ÃâÇßÀ» °æ¿ì´Â ¾î¶»°Ô µÇ´Â °ÍÀϱî¿ä. ÀÌ °æ¿ì ¸Å´ÏÁö ÄÝ »çÀÌÆ®·ÎºÎÅÍ UEP¿¡ÀÇ ÃÖÃÊÀÇ ½éÅ©¿¡ ´õÇØÁ® UEP ·ÎºÎÅÍ ¸ñÀûÀÇ ¸Å´ÏÁö ¸Þ¼Òµå¿¡ÀÇ ¼ÍÅ©°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ ¸Å´ÏÁö ÄÚµå·ÎºÎÅÍ ¸Å´ÏÁö Äڵ忡ÀÇ ¼ÍÅ© ÇÁ·Î¼¼½º´Â ÀϹÝÀûÀ¸·Î ´õºí ¼ÍÅ©·Î ºÒ¸®°í ÀÖ½À´Ï´Ù.
  64
ºñÆ® NGEN ´Â "¾ð ¸Å´ÏÁö ÄÚµå·ÎºÎÅÍ ¸Å´ÏÁö ÄÚµå" ¿¡ÀÇ È£ÃâÀ» ¸Å´ÏÁö Äڵ忡 ¼ÍÅ© ¹é Çϴ ȣÃâÀ̶ó°í ÀνÄÇÏ´Â °Í¿¡ ÀÇÇØ ÀÌ ´õºí ¼ÍÅ©¸¦ ÃÖÀûÈ­ÇÕ´Ï´Ù. 64 ºñÆ® NGEN ´Â ¼ÍÅ© ¹éÀÌ ¹ß»ýÇϰí ÀÖ´ÂÁö ¾î¶²Áö¸¦ È®ÀÎÇØ ¹ß»ýÇϰí ÀÖ´Â °æ¿ì´Â ±×¸² 2 ¿¡ ³ªÅ¸³ªµíÀÌ ¾çÂÊ ¸ðµÎÀÇ ¼ÍÅ©¸¦ ½ºÅµ ÇØ ¸Å´ÏÁö Äڵ忡 Á÷Á¢ Á¡ÇÁ ÇÕ´Ï´Ù. ÀÌ ±â´É¿¡ ÀÇÇØ ´Ù¼öÀÇ ¸í·ÉÀ» »ý·« ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ½ÇÁ¦·Î »ç¿ëµÇ°í ÀÖ´Â Äڵ带 ¸ðµ¨·Î ÇÑ º¥Ä¡¸¶Å©¿¡¼­´Â  ÆÛÆ÷¸Õ½º°¡ 5 ~ 10% Çâ»óÇßÀ½ (ÀΰøÀûÀÎ Å×½ºÆ®¿¡¼­´Â 100% À» ³ÑÀº Àûµµ ÀÖ½À´Ï´Ù).

µµ 2 Double Thunk Elimination
±×¸² 2.  Double Thunk Elimination

  ´Ù¸¸
 ÁÖÀǰ¡ ÇÊ¿äÇÑ °ÍÀº ÀÌ ÃÖÀûÈ­´Â ±âÁ¤(
ïÒ)ÀÇ ¾îÇø®ÄÉÀÌ¼Ç µµ¸ÞÀÎ ³»¿¡¼­¸¸ ½ÇÇà °¡´ÉÀ̶ó°í ÇÏ´Â °ÍÀÔ´Ï´Ù. ±âÁ¤ÀÇ AppDomain À» ÀÌ¿ëÇÏ¸é ÆÛÆ÷¸Õ½º°¡ Çâ»óÇÑ´Ù°í ÇÏ´Â ¿øÄ¢À» ±â¾ïÇØ µÖ ÁÖ¼¼¿ä.

C++
»óÈ£ ¿î¿ë ±â´É
  C++
»óÈ£ ¿î¿ë ±â´ÉÀº  ¸Å´ÏÁö ÄÚµå¿Í ³×ÀÌÆ¼ºê ÄÚµåÀÇ »óÈ£ ¿î¿ëÀ» °ü¸®ÇÏ´Â Å×Å©³î·¯ÁöÀÔ´Ï´Ù. ÀÌ Å×Å©³î·¯Áö¿¡ ÀÇÇØ  /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇØ ÄÄÆÄÀÏ µÈ Ç¥ÁØÀÇ C++ ÄÚµå·ÎºÎÅÍ ³×ÀÌÆ¼ºê ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÒ ¼ö°¡ ÀÖ°Ô µË´Ï´Ù. ±× ¶§¿¡ ÇÁ·Î±×·¡¸Ó°¡ Äڵ带 Ãß°¡ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.  /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇØ »ý¼ºµÈ ÄÚµå´Â MSIL µË´Ï´Ù (ÀϺΠ¿¹¿Üµµ ÀÖ½À´Ï´Ù).  µ¥ÀÌÅÍ´Â ¸Å´ÏÁö µ¥ÀÌÅÍ¿¡µµ ¾ð ¸Å´ÏÁö µ¥ÀÌÅͷεµ µÉ ¼ö ÀÖ´Â (À¯Àú°¡ ÁöÁ¤ÇÕ´Ï´Ù).  C++ »óÈ£ ¿î¿ë ±â´ÉÀº °¡Àå Áß¿äÇÑ .NET ±â´ÉÀÔ´Ï´Ù¸¸  ¿ÏÀüÈ÷¶ó°í ¸»Çصµ ÁÁÀ» Á¤µµ ¾Ë·ÁÁ® ÀÖÁö ¾Ê½À´Ï´Ù.  C++ »óÈ£ ¿î¿ë ±â´ÉÀº Çõ½ÅÀûÀ̶ó°í ÇÒ ¼ö ÀÖÀ» Á¤µµÀÇ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù¸¸ ±×°ÍÀÌ ¿Ã¹Ù¸£°Ô ÀÎ½Ä µÉ ¶§±îÁö´Â ´çºÐ°£ ½Ã°£ÀÌ ÇÊ¿äÇÑ °Í °°½À´Ï´Ù.
  .NET
¿¡ ÁذÅÇÑ ´Ù¸¥ ¾ð¾î·Î ³×ÀÌÆ¼ºê ÄÚµå¿ÍÀÇ »óÈ£ ¿î¿ëÀ» ½ÇÇöÇÏ·Á¸é DLL ¿¡ native code¸¦ ¹èÄ¡ÇØ dllimport (¶Ç´Â µ¿µîÀÇ °Í. »ç¿ëÇÏ´Â ¾ð¾î¿¡ µû¶ó¼­ ´Ù¸¨´Ï´Ù) ¸¦ »ç¿ëÇØ P/Invoke ·Î ¸í½ÃÀûÀ¸·Î ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ±× ÀÌ¿ÜÀÇ ¹æ¹ýÀ» »ç¿ëÇÏ´Â °æ¿ì´Â ó¸®ÀÇ ¹«°Å¿î COM »óÈ£ ¿î¿ë ±â´ÉÀ» »ç¿ëÇØ native code¿¡ ¾×¼¼½º ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. À̰ÍÀº ºÐ¸íÇÏ°Ô ºÒÆíÇÑ ¹æ¹ýÀÌ¸ç ¸¹Àº °æ¿ì C++ ¿Í ºñ±³ÇØ ÆÛÆ÷¸Õ½º°¡ Å©°Ô µÚ¶³¾îÁý´Ï´Ù.
  C++
»óÈ£ ¿î¿ë ±â´ÉÀº C++ ¾ð¾îÀÇ ÆÛÆ÷¸Õ½º Çâ»ó ±â´ÉÀ¸·Î¼­ Åë»óÀº º¸¿©Áö°í ÀÖÁö ¾Ê½À´Ï´Ù. ±×·¯³ª C++ »óÈ£ ¿î¿ë ±â´ÉÀÌ Á¦°øÇÏ´Â À¯¿¬¼º°ú Æí¸®¼º¿¡ ÀÇÇØ CLR ¸¦ Ÿ°ÙÀ¸·Î ÇÏ´Â °ÍÀ¸·Î ÆÛÆ÷¸Õ½º¸¦ Çâ»ó½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù.

´ÜÀÏ À̹ÌÁö³»ÀÇ ³×ÀÌÆ¼ºê ÄÚµå¿Í ¸Å´ÏÁö ÄÚµå
  Visual C++
¿¡¼­´Â  ¸Å´ÏÁö ÄÚµå·Î ÇÏ´Â ÇÔ¼ö¿Í ³×ÀÌÆ¼ºê ÄÚµå·Î ÇÏ´Â ÇÔ¼ö¸¦ ÇÁ·Î±×·¡¸Ó°¡ °³°³¿¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¼±ÅÃÀ» ½Ç½ÃÇÏ·Á¸é #pragma managed ¶ó´Â  #pragma unmanaged ¸¦ »ç¿ëÇÕ´Ï´Ù. ¿¹¸¦ ±×¸² 3¿¡ ³ªÅ¸³À´Ï´Ù. ¾î·Á¿î ÄÄÇ»ÅÍ Å½ºÅ©¸¦ ½ÇÇàÇÏ´Â °æ¿ì ÄÚ¾î ÇÔ¼ö¸¦ ³×ÀÌÆ¼ºê ÄÄÆÄÀÏ ÇØ ´Ù¸¥ Äڵ带 ¸Å´ÏÁö ÄÄÆÄÀÏ ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÑ ÀÏÀÌ ÀÖ½À´Ï´Ù.  C++ ¿¡¼­´Â ´ÜÀÏÀÇ À̹ÌÁö ³»¿¡ ¸Å´ÏÁö ÄÚµå¿Í ³×ÀÌÆ¼ºê Äڵ带 È¥Àç½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù. ³×ÀÌÆ¼ºê ÇÔ¼ö·ÎºÎÅÍ ¸Å´ÏÁö ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °æ¿ì(¶Ç´Â ±× ¿ªÀÇ °æ¿ì) Ưº°ÇÑ ±¸¹®À» ±â¼úÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.  C++ ¿¡¼­ ÀÌ·¯ÇÑ ¼¶¼¼ÇÔ¿¡ ÀÇÇØ  ¸Å´ÏÁö ÄÚµå·ÎºÎÅÍ ³×ÀÌÆ¼ºê Äڵ忡ÀÇ ÃµÀÌ , ¹× ³×ÀÌÆ¼ºê ÄÚµå·ÎºÎÅÍ ¸Å´ÏÁö Äڵ忡ÀÇ ÃµÀ̸¦ ¿ëÀÌÇÏ°Ô Á¦¾îÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
¸Å´ÏÁö ÄÚµå·ÎºÎÅÍ ³×ÀÌÆ¼ºê Äڵ忡 õÀÌ ÇÏ´Â °æ¿ì(¶Ç´Â ±× ¿ªÀÇ °æ¿ì) ÄÄÆÄÀÏ·¯ ¹× ¸µÄ¿¿¡ ÀÇÇÑ ¼ÍÅ©ÀÇ »ý¼ºÀÌ ½ÇÇà Ç÷ο쿡 Æ÷ÇÔµÇ°Ô µË´Ï´Ù. ´ç¿¬ÇÑ ÀÏÀÔ´Ï´Ù¸¸  ÇÁ·Î±×·¡¸Ó´Â ÀÌ·¯ÇÑ ¼ÍÅ©ÀÇ »ý¼º¿¡ ÀÇÇÑ ÄÚ½ºÆ®¸¦ ȸÇÇÇÏ°í ½Í´Ù°í »ý°¢ÇÕ´Ï´Ù.  CLR °ú ÄÄÆÄÀÏ·¯´Â õÀÌÀÇ ÄÚ½ºÆ®¸¦ ÃÖ¼ÒÇÑÀ¸·Î ¾ïÁ¦Çϱâ À§ÇØ ´Ù¼öÀÇ Ã³¸®¸¦ ½ÇÇàÇÕ´Ï´Ù¸¸ °³¹ßÀÚÀÇ ÂÊ¿¡¼­ õÀÌÀÇ ¹ß»ý ºóµµ¸¦ ÃÖ¼ÒÈ­ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
  
±×¸² 4ÀÇ ÆÄÆ® A ¿¡ ³ªÅ¸³»´Â C++ ¾îÇø®ÄÉÀ̼ÇÀº  ÀϺÎÀÇ ÄÚµå (Z.cpp) °¡ (/clr ¸¦ »ç¿ëÇØ) MSIL  ±×¸®°í ´Ù¸¥ ÄÚµå (X.cpp ¿Í Y.cpp) °¡ ³×ÀÌÆ¼ºê Äڵ忡 ÄÄÆÄÀÏ µÇ°í ÀÖ½À´Ï´Ù. ÀÌ ÇÁ·Î±×·¥ÀÇ  Y.cpp °ú Z.cpp ¿¡´Â º¹¼öÀÇ ÇÔ¼ö°¡ Æ÷ÇԵǾî ÀÖ¾î ¼­·Î ´Ù¼öÀÇ È£ÃâÀ» ½ÇÇàÇϰí ÀÖ½À´Ï´Ù. ±× °á°ú  ¸Å´ÏÁö ÄÚµå¿Í ³×ÀÌÆ¼ºê ÄÚµåÀÇ ÃµÀ̰¡ ´Ù¼ö ¹ß»ýÇϰí ÀÖ¾î ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¼Óµµ¸¦ ÀúÇϽÃ۰í ÀÖ½À´Ï´Ù.

µµ 4 Changing Managed Boundaries
±×¸² 4.  Changing Managed Boundaries

  ±×¸² 4.
ÀÇ ÆÄÆ® B ´Â ÀÌ ÇÁ·Î±×·¥À» ÃÖÀûÈ­ÇØ ¸Å´ÏÁö ÄÚµå¿Í ³×ÀÌÆ¼ºê ÄÚµåÀÇ ÃµÀ̸¦ ÃÖ¼ÒÈ­ÇÏ´Â ¹æ¹ýÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. À̰ÍÀº »óÈ£ È£ÃâÀÌ ´Ù¼ö ¹ß»ýÇϰí ÀÖ´Â ÀÎÅÍÆäÀ̽º¸¦ ƯÁ¤ÇØ À̰͵éÀ» ¸Å´ÏÁö ¿µ¿ª ¶Ç´Â ³×ÀÌÆ¼ºê ¿µ¿ªÀÇ ¾î´À ÂÊÀΰ¡¿¡ Á¤¸®ÇØ À̵¿ÇÏ´Â °ÍÀ¸·Î ÀÎÅÍÆäÀ̽º°£¿¡ ºó¹øÇÏ°Ô ¹ß»ýÇϴ õÀ̸¦ Á¦°ÅÇÑ´Ù°í ÇÏ´Â »ý°¢¿¡ ±Ù°ÅÇϰí ÀÖ½À´Ï´Ù.  Visual C++ ÀÇ »óÈ£ ¿î¿ë ±â´ÉÀ» »ç¿ëÇÏ¸é  ÀÌ Å½ºÅ©¸¦ °£´ÜÇÏ°Ô ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
¿¹¸¦ µé¸é ,±×¸² 4. ÀÇ A À¸·ÎºÎÅÍ B ·Î ±¸¼ºÀ» º¯°æÇÏ·Á¸é /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇØ Y.cpp ¸¦ ÀçÄÄÆÄÀÏ ÇÒ »ÓÀÔ´Ï´Ù. Y.cpp Àº ¸Å´ÏÁö Äڵ忡 ÄÄÆÄÀÏ µÇ¾î Z.cpp ·ÎºÎÅÍ ÀÇ È£Ãâ¿¡ ¼ö¹ÝÇÏ´Â ¸Å´ÏÁö ÄÚµå¿Í ³×ÀÌÆ¼ºê ÄÚµåÀÇ ÃµÀÌÀÇ ÄÚ½ºÆ®´Â ¾ø¾îÁý´Ï´Ù.  ¹°·Ð Y.cpp ÀÌ MSIL °¡ µÇ´Â °ÍÀÇ ÆÛÆ÷¸Õ½º ÄÚ½ºÆ®µµ °í·ÁÇØ  ÀÌ·¯ÇÑ ±¸¼º º¯°æÀÌ ¾îÇø®ÄÉÀ̼ǿ¡ ÀÖ¾î Ÿ´çÇÑ Æ®·¹ÀÌµå ¿ÀÇÁÀÎ °ÍÀ» È®ÀÎÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

°í ÆÛÆ÷¸Õ½º ¸¶¼£¸µ
  ¸Å´ÏÁö
ÄÚµå¿Í ³×ÀÌÆ¼ºê ÄÚµåÀÇ »óÈ£ ¿î¿ë°ú °ü°èµÇ´Â ó¸® Áß¿¡¼­ °¡Àå ÄÚ½ºÆ®ÀÇ ºñ½Ñ ó¸®ÀÇ 1 °³°¡ ¸¶¼£¸µÀÔ´Ï´Ù.  C# À̳ª Visual Basic .NET µîÀÇ ¾ð¾îÀÇ °æ¿ì  ¸¶¼£¸µÀº (±âÁ¤ÀÇ ¸¶»þ·¯ ¶Ç´Â ICustomMarshaler À» ±¸ÇöÇÏ´Â °æ¿ì¿¡´Â Ä¿½ºÅÒ ¸¶¼£¸µ Äڵ带 »ç¿ëÇØ) P/Invoke °¡ ºÒ·Á °¬À» ¶§¿¡ CLR ¿¡ ÀÇÇØ ¾Ï¹¬ÀûÀ¸·Î ½ÇÇàµË´Ï´Ù.  C++ »óÈ£ ¿î¿ë ±â´ÉÀ» »ç¿ëÇÏ¸é  ÇÁ·Î±×·¡¸Ó°¡ Çʿ信 µû¶ó¼­ Äڵ峻ÀÇ µ¥ÀÌÅ͸¦ ¸í½ÃÀûÀ¸·Î ¸¶¼È ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀÇ ÀåÁ¡Àº  ÇÁ·Î±×·¡¸Ó°¡ µ¥ÀÌÅ͸¦ ³×ÀÌÆ¼ºê µ¥ÀÌÅÍ¿¡ ÇÑ ¹ø ¸¶¼È ÇÏ´Â °Í¸¸À¸·Î  ÀÌ ¸¶¼£¸µ µ¥ÀÌÅÍÀÇ °á°ú¸¦ º¹¼öÀÇ È£Ãâ·Î Àç ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ±â ¶§¹®¿¡ ¸¶¼£¸µÀÇ ÄÚ½ºÆ®¸¦ ¸Þ¿ï ¼ö°¡ ÀÖ´Ù°í ÇÏ´Â Á¡¿¡ ÀÖ½À´Ï´Ù.
  ±×¸² 5
Àº /clr ½ºÀ­Ä¡¸¦ »ç¿ëÇØ ÄÄÆÄÀÏ µÈ ½º´ÏÆêÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ÀÌ Äڵ忡´Â for ·çÇÁ°¡ 1 °³ Æ÷ÇԵǾî ÀÖ¾î ±× ³»ºÎ¿¡¼­ ³×ÀÌÆ¼ºê ÇÔ¼ö (GetChar) °¡ ºÒ·Á °¡°í ÀÖ½À´Ï´Ù. ±×¸² 6 ¿¡¼­´Â °°Àº Äڵ尡 C# ·Î ½ÇÀåµÇ°í ÀÖ½À´Ï´Ù. ±×°÷¿¡¼­´Â ÀÌÇÏ¿¡ ³ªÅ¸³»µíÀÌ GetChar ÀÇ È£Ãâ¿¡ ÀÇÇØ CSharpType Ŭ·¡½º°¡ NativeType ¿¡ ¸¶¼È µÇ°í ÀÖ½À´Ï´Ù.

class NATIVECODE_API NativeType {

public:

    NativeType();

    int pos;

    int length;

    char *theString;

};

C++ ¿¡¼­ À¯Àú°¡ ¸í½ÃÀûÀ¸·Î ³×ÀÌÆ¼ºêÇüÀ» »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡  ¾Ï¹¬ÀûÀÎ ¸¶¼£¸µÀº ÇÊ¿ä ¾ø½À´Ï´Ù. ÀÌ ÃÖÀûÈ­¿¡ ÀÇÇØ ÄÚ½ºÆ®¸¦ Å« ÆøÀ¸·Î »è°¨ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¿¹¿¡¼­´Â C++ ÀÇ ±¸ÇöÀº C# ÀÇ ±¸Çö°ú ºñ±³ÇØ 18 ¹è °í¼ÓÀ¸·Î ½ÇÇàµË´Ï´Ù.

.NET
ÇüŸ¦ »ç¿ëÇÑ ÅÛÇø´°ú STL
  Visual C++ 2005
¿¡ »õ·Ó°Ô µµÀÔµÈ ÆÛÆ÷¸Õ½º ±â´É Áß¿¡¼­µµ ƯÈ÷ Èï¹Ì·Î¿î °ÍÀ¸·Î¼­ ¸Å´ÏÁöÇüÀ» »ç¿ëÇÑ ÅÛÇø´ (STL/CLI À» Æ÷ÇÔÇÑ) ¸Å´ÏÁö Äڵ忡 ÀÇÇÑ ÇÁ·Î±×·¥ ÀüüÀÇ ÃÖÀûÈ­  Áö¿¬ Àоîµé¿©±â Deterministic Finalization °¡ ÀÖ½À´Ï´Ù. Visual C++ .NET 2003 ¿¡¼­´Â ³×ÀÌÆ¼ºêÇü ÅÛÇø´ÀÇ MSIL À» »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸  ¸Å´ÏÁöÇüÀ» ÅÛÇø´ÀÇ ÆÄ¶ó¹ÌÅÍÇüÀ¸·Î¼­ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. Visual C++ 2005 ¿¡¼­ ÀÌ Á¡¿¡ ´ëÇØ ¼öÁ¤À» Çϰí ÀÖ¾î ÅÛÇø´¿¡ ¸Å´ÏÁöÇü ¶Ç´Â ¾ð ¸Å´ÏÁöÇüÀ» ÆÄ¶ó¹ÌÅͷμ­ Æ÷ÇÔÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÇöÀç´Â ÅÛÇø´¿¡ ÀÇÇØ Á¦°øµÇ´Â ÈǸ¢ÇÑ ±â´ÉÀ» .NET ¾È¿¡¼­ ±â¼úµÈ ÄÚµå·ÎºÎÅÍ ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾î ÀÖ½À´Ï´Ù (Blitz++ ³ª Boost ¶óÀ̺귯¸®¿¡ ÀÇÇØ µÈ ½ÇÀû¿¡ ´ëÇØ¼­µµ ´ëÃæ ÈȾ´Â °ÍÀ» ÀØÁö ¸»¾Æ ÁÖ¼¼¿ä).
  C++
ÀÇ STL (Standard Template Library) ´Â  ¶óÀ̺귯¸® ¼³°è¿¡ À־ÀÇ °¡Àå Áß¿äÇÑ À̳뺣À̼Ç(innovation)ÀÇ 1 °³ÀÔ´Ï´Ù.  STLÀÌ Á¦°øÇÏ´Â ´Ù¼öÀÇ ÄÁÅ×À̳ʳª ¾Ë°í¸®ÁòÀÌ ¶Ù¾î³­ Ãß»óÈ­¸¦  ÆÛÆ÷¸Õ½º¿¡ ¿µÇâÀ» ÁÖ´Â ÀÏ ¾øÀÌ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.  Visual C++ .NET 2003¿¡¼­ ÅÛÇø´¿¡ À־ÀÇ Á¦¾àÀ» À§ÇØ  ¸Å´ÏÁöÇü¿¡ ´ëÇØ¼­´Â STL µ¿µîÀÇ ¶óÀ̺귯¸®´Â ¾ø¾ú½À´Ï´Ù.  Visual C++ 2005 ¿¡¼­´Â ÀÌ Á¦¾àÀÌ Á¦°ÅµÇ¾îSTL/CLI ·Î ºÒ¸®´Â ¶óÀ̺귯¸®°¡ µµÀԵǰí ÀÖ½À´Ï´Ù. À̰ÍÀº STL ÀÇ °ËÁõ °¡´ÉÇÑ ¹öÁ¯ÀÌ¸ç  ¸Å´ÏÁöÇüÀ» Ãë±ÞÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.  .NET ¿¡ óÀ½À¸·Î ÄÁÅ×À̳ʸ¦ Á¦°øÇÑ °ÍÀº ±âº» Ŭ·¡½º ¶óÀ̺귯¸®(BCL) ÀÔ´Ï´Ù¸¸ Visual C++ ±×·ìÀº STL/CLI ÀÇ ÆÛÆ÷¸Õ½º°¡ ¿ì¼öÇÏ´Ù°í »ý°¢Çϰí ÀÖ½À´Ï´Ù.  STL/CLI ÀÇ »ó¼¼ÇÑ °Í¿¡ ´ëÇÏ¿©´Â Visual C++ Developer Center ¿¡ °ÔÀçµÇ°í ÀÖ´Â Stan Lippman ÀÇ ÈǸ¢ÇÑ ±â»ç ¡¸STL.NET Primer¡¹(¿µ¾î) ¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.
  STL/CLI
¸¦ ÀÌ¿ëÇϸé STL ÀÇ vector,list,deque,map,set,hash map,hash set µî À» ÀÚÀ¯·Ó°Ô ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í  ¼ÒÆ® , °Ë»ö , ÁýÇÕ Á¶ÀÛ , ³»Àû , Àü ¿ä¼Ò °¡»ê µîÀÇ ¾Ë°í¸®Áòµµ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.  STL/CLI ÀÇ ¾Ë°í¸®Áò¿¡ °üÇØ¼­ Çϳª ³î¶ó°Ô ÇÏ´Â °ÍÀº  ³×ÀÌÆ¼ºê ¹öÁ¯°ú STL/CLI ¹öÁ¯À¸·Î °°Àº ±¸ÇöÀÌ Ã¤¿ëµÇ°í ÀÖ´Â °ÍÀÔ´Ï´Ù.  STL ÀÌ ¶Ù¾î³­ ¼³°è¿¡ ÀÇÇØ  À̽ļºÀÌ ³ô°í ÆÄ¿öÇ®ÇÑ Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù°í ÇÏ´Â ÇüÅ·Π¸ðµç ÇÁ·Î±×·¡¸Ó°¡ ÇýÅÃÀ» ¹Þ½À´Ï´Ù.

°áÁ¤·Ð¿¡ ÀÇÇÑ ÆÛÆ÷¸Õ½ºÀÇ Çâ»ó
  C++
ÀÌ ¶Ù¾î³­ ¶óÀ̺귯¸®¿¡´Â ´Ù¾çÇÑ ÆÐÅÏÀ̳ª °ü¿ë¾î¸¦ °¡Áö°í ÀÖ¾î À̰͵éÀ» ÀÚÀ¯·Ó°Ô »ç¿ëÇÏ´Â °ÍÀ¸·Î È¿À²ÀûÀÎ Äڵ带 ¿ëÀÌÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.  RAII (Resource Acquisition Is Initialization)¸¦ Æ÷ÇÔÇØ ÀÌ·¯ÇÑ ÆÐÅÏÀ̳ª °ü¿ë¾îÀÇ »ó´ç¼ö´Â Deterministic Finalization À¸·Î ºÒ¸®´Â C++ ¾ð¾îÀÇ ±â´ÉÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù. Deterministic Finalization ÀÇ ±âº» ±â´ÉÀº  ¿ÀºêÁ§Æ®°¡ delete ¿¬»êÀÚ¿¡ ÀÇÇØ »èÁ¦µÇ¾úÀ» ¶§ (heap¿¡ ¹èÄ¡µÈ ¿ÀºêÁ§Æ®ÀÇ °æ¿ì) ¶Ç´Â ¿ÀºêÁ§Æ®°¡ ½ºÄÚÇÁÀÇ ¹Û¿¡ ³ª¿ÔÀ» ¶§ (½ºÅÿ¡ ¹èÄ¡µÈ ¿ÀºêÁ§Æ®ÀÇ °æ¿ì)¿¡  ¿ÀºêÁ§Æ®ÀÇ ¼Ò¸êÀÚ¸¦ ±âµ¿ÇÏ´Â °ÍÀÔ´Ï´Ù. Deterministic Finalization Àº ÆÛÆ÷¸Õ½ºÀÇ Çâ»ó¿¡ µµ¿òÀÌ µË´Ï´Ù. ¿ÀºêÁ§Æ®°¡ (Àý´ëÀûÀ¸·Î ÇÊ¿äÇÑ ¹üÀ§¸¦ ³Ñ¾î) ÀÚ¿øÀ» ±æ°Ô º¸°ü À¯ÁöÇϸé ÇÒ¼ö·Ï  ´Ù¸¥ ¿ÀºêÁ§Æ®°¡ °°Àº ÀÚ¿øÀ» ÃëµæÇÏ·Á°í ÇßÀ» ¶§ÀÇ ÆÛÆ÷¸Õ½º ÀúÇϰ¡ °Ý·ÄÇØÁö±â ¶§¹®ÀÔ´Ï´Ù.
  CLR
ÆÄÀ̳θ®Àú¸¦ »ç¿ëÇÏ¸é ¿ÀºêÁ§Æ®°¡ ½ºÄÚÇÁÀÇ ¹Û¿¡ ³ª¿Â Èİ¡ ÀÖ´Â ½ÃÁ¡¿¡¼­ ÆÄÀ̳θ®Àú Äڵ尡 ½ÇÇàµË´Ï´Ù (¶ôÀ» ÇØ¹æÇÏ´Â Äڵ尡 ÆÄÀ̳θ®Àú¶ó°í °¡Á¤Çϰí ÀÖ½À´Ï´Ù). ´Ù¸¸  ÆÄÀ̳¯Á¦·¹ÀÌ¼Ç thread°¡ ¿ÀºêÁ§Æ®ÀÇ ÆÄÀ̳θ®Àú¿¡ ´ëÇØ¼­ ±âµ¿µÇ±â Àü¿¡ ½ÇÇàµÉ °ÍÀº ¾ø½À´Ï´Ù. À̰ÍÀº ºÐ¸íÇÏ°Ô ÃÖÀûÀÎ µ¿ÀÛÀ̶ó°í´Â ¸»ÇÒ ¼ö ¾ø½À´Ï´Ù. ÇÁ·Î±×·¡¸Ó°¡ ¿¹±â ÇÑ Å¸Àֿ̹¡ ÆÄÀ̳¯Á¦·¹ÀÌ¼Ç thread°¡ ½ÇÇàµÈ´Ù°í´Â ÇÒ ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù. °Ô´Ù°¡ ÆÄÀ̳θ®Àú°¡ ½ÇÇàµÇ±â Àü¿¡ ¿ÀºêÁ§Æ®ÀÇ º¸°ü À¯ÁöÇϰí ÀÖ´ø ¸Þ¸ð¸®°¡ °¡º£Áö Ä÷ºÆ® µÉ °ÍÀº ¾ø½À´Ï´Ù. À̰ÍÀº  ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â ¸Þ¸ð¸®ÀÇ Áõ°¡·Î ¿¬°áµË´Ï´Ù.
  .NET
º£À̽ºÀÇ ÄÚµå·Î ÀÌ ¹®Á¦¸¦ ȸÇÇÇÏ´Â ÀϹÝÀûÀÎ °ü¿ë¾îÀÇ Çϳª·Î  Dispose ÆÐÅÏÀÌ ÀÖ½À´Ï´Ù. Dispose ÆÐÅÏÀ» »ç¿ëÇÏ·Á¸é  Å¬·¡½º¿¡ Dispose ¸Þ¼Òµå¸¦ ½ÇÀåÇØ  ¿ÀºêÁ§Æ®°¡ ºÒÇÊ¿äÇÏ°Ô µÇ¾úÀ» ¶§¿¡ ±× ¸Þ¼Òµå¸¦ È£ÃâÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ ¸Þ¼Òµå°¡ ºÒ·Á °¡´Â Äڵ峻ÀÇ Àå¼Ò´Â C++ ÇÁ·Î±×·¡¸Ó°¡ ¿ÀºêÁ§Æ®ÀÇ »èÁ¦¸¦ ½ÇÇàÇÏ´Â Àå¼Ò¿Í °°½À´Ï´Ù. ±×·¯³ª C++ ¿¡ ÀÖ¾ú¾î Á¶Â÷ ÀÌ·¯ÇÑ Ã³¸®´Â ¿¡·¯ÀÇ ¹ß»ýÀ¸·Î ¿¬°áµÇ±â ½±°í , Äڵ尡 ¸Å¿ì ÀåȲÇÏ°Ô µË´Ï´Ù.  C# µîÀÇ ¾ð¾î¿¡¼­´Â "using" ÄÁ½ºÆ®·¡Æ®°¡ Ãß°¡µÇ°í ÀÖ¾î ¿¡·¯ÀÇ ¹ß»ýÀ̳ª ÀåȲÇÑ ±â¼úÀÇ È¸ÇÇ¿¡ µµ¿òÀÌ µË´Ï´Ù. ´Ù¸¸  Áß¿äÇÑ ÄÉÀ̽º¿¡¼­´Â  ¿ª½Ã ±â¼úÀÌ º¹ÀâÀÌ µÇ¾î  ¿¡·¯ÀÇ ¿øÀÎÀ¸·Îµµ µË´Ï´Ù.
  
ÀÌ·¯ÇÑ ¹æ¹ý°ú´Â ´Þ¶ó C++ ÀÇ RAII °ü¿ë¾î´Â ÀÚ¿øÀÇ Ãëµæ°ú ÇØ¹æÀ» ÀÚµ¿ÀûÀ¸·Î ½Ç½ÃÇÕ´Ï´Ù. ±×¸®°í  ÇÁ·Î±×·¡¸Ó°¡ Äڵ带 Ãß°¡ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡  ¿¡·¯°¡ ¹ß»ýÇÒ °¡´É¼ºµµ ³·¾ÆÁý´Ï´Ù.  Visual C++ .NET 2003 ¿¡¼­´Â ½ºÅÿ¡ ¹èÄ¡µÈ .NET ¿ÀºêÁ§Æ®ÀÇ Deterministic Finalization Àº ¼­Æ÷Æ®µÇ°í ÀÖÁö ¾Ê¾Ò½À´Ï´Ù¸¸ Visual C++ 2005 ¿¡¼­´Â ÀÌ ±â´ÉÀÌ ¼­Æ÷Æ®µÇ°í ÀÖ½À´Ï´Ù.
  ±×¸² 7
ÀÇ Àü¹ÝÀÇ ÄÚµå·Î Socket_t ÇüÅÂÀÇ ¿ÀºêÁ§Æ®°¡ ½ºÅà º£À̽ºÀÇ ±¸¹®À» »ç¿ëÇØ  ±×¸®°í ½ºÅà º£À̽ºÀÇ Å¬¸° ¾÷ ½Ã¸àƽ½º¸¦ °®Ãß´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.  3 Çà°¿¡¼­ ¿¹¿Ü°¡ ½½·Î¿ì µÇ¾úÀ» °æ¿ì´Â ¾î¶»°Ô µÇ´Â °ÍÀϱî¿ä. ½ºÅà º£À̽ºÀÇ ½Ã¸àƽ½º°¡ »ç¿ëµÇ°í Àֱ⠶§¹®¿¡ mainSock ÀÇ ¼Ò¸êÀÚ°¡ È®Á¤ÀûÀ¸·Î ½ÇÇàµË´Ï´Ù. ´Ù¸¸ ,backupSock ÀÌ ¾ÆÁ÷ ½ºÅÃ»ó¿¡ ÀÛ¼ºµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡  ÆÄ±âµÇ´Â ¿ÀºêÁ§Æ®´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.
  
ÀÌ ¿¹¿Í ÀǹÌÀûÀ¸·Î µî°¡ÀÎ Äڵ带 C# ·Î ÀÛ¼ºÇÏ¸é ±×¸² 7 ÀÇ ÈĹݿ¡ °¡¸®Å°µíÀÌ ±â¼úÀÌ ¾à°£ º¹ÀâÀÌ µÇ¾î  ¿¡·¯·Î ¿¬°áµÇ±â ½¬¿öÁý´Ï´Ù. À̰ÍÀº »ç¼ÒÇÑ ¿¹¿¡ Áö³ªÁö ¾Ê½À´Ï´Ù¸¸  Å½ºÅ©°¡ º¹ÀâÇÏ°Ô µÇ´Â °Í¿¡ µû¶ó ½Ç¼ö¸¦ ¹üÇÒ °¡´É¼ºÀÌ ³ô¾ÆÁý´Ï´Ù.

Áö¿¬ Àбâ
  .NET Framework
¿¡¼­´Â ÆÛÆ÷¸Õ½ºÀÇ Á¶Á¤À» Çϰí ÀÖ½À´Ï´Ù¸¸  CLR ÀÌ ÀÐÈ÷´Â ±âµ¿½Ã¿¡ ¾à°£ÀÇ Áö¿¬ÀÌ ¹ß»ýÇÕ´Ï´Ù. ¾îÇø®ÄÉÀ̼ÇÀÌ ¸¹°Ô´Â ¸Å´ÏÁö Äڵ尡 ¾ø´Â ÄÚµå ÆÐ½º³ª ½Ã³ª¸®¿À°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ °æÇâÀº  ±âÁ¸ÀÇ ·¹°¡½Ã ÇÁ·Î±×·¥¿¡ .NET ±â´ÉÀ» Â¥³Ö´Â °æ¿ì¿¡ ƯÈ÷ ÇöÀúÇÕ´Ï´Ù. ÀÌ·¯ÇÑ È¯°æ¿¡¼­´Â CLR ÀÇ Àоîµé¿©¿¡ °ü·ÃÇÏ´Â ¾îÇø®ÄÉÀÌ¼Ç ±âµ¿½ÃÀÇ Áö¿¬À» ȸÇÇÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.  DLL ÀÇ Áö¿¬ Àбâ·Î ºÒ¸®´Â Visual C++ ÀÇ ±âÁ¸ÀÇ ±â´ÉÀ» »ç¿ëÇÏ´Â °ÍÀ¸·Î  ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù.
  
À̰ÍÀº ½ÇÁ¦·Î »ç¿ëÇÒ °æ¿ì¿¡ óÀ½ DLL À» ÀоîµéÀδٰí ÇÏ´Â »ý°¢¿¡ ±Ù°ÅÇϰí ÀÖ½À´Ï´Ù. .NET ¾î¼Àºí¸®ÀÇ DLL À» ÀоîµéÀÌ´Â °æ¿ì¿¡µµ °°Àº °³³äÀ» Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸µÄ¿ ¿É¼Ç /DELAYLOAD:dll ¿¡ Áö¿¬ Àд .NET ¾î¼Àºí¸®¸¦ ÁöÁ¤Çϸé ÁöÁ¤ÇÑ .NET ¾î¼Àºí¸® »Ó¸¸ÀÌ ¾Æ´Ï¶ó CLR ÀÇ Àб⵵ Áö¿¬ ½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù (¸ðµç .NET ¾î¼Àºí¸®°¡ Áö¿¬ ÀоîµéÀÌ°Ô µÇ´Â °æ¿ì). ±× °á°ú  ³×ÀÌÆ¼ºê ¾îÇø®ÄÉÀ̼ǰú µ¿ÀÏÇÑ Á¤µµÀÇ ¼Óµµ·Î ±âµ¿ÇÒ ¼ö ÀÖ°Ô µÇ¾î  ¸Å´ÏÁö ¾îÇø®ÄÉÀ̼ǿ¡ °üÇÑ °¡Àå ÀϹÝÀûÀÎ ºÒ¸¸ÀÇ 1 °³°¡ ÇØ¼ÒµÇ°Ô µË´Ï´Ù.

dllexport
°¡ Ç×»ó À¯¸®ÇÑ °èÃ¥À̶ó°í´Â ÇÒ ¼ö ¾ø´Â ÀÌÀ¯
  __declspec(dllexport)
¸¦ »ç¿ëÇÏ´Â °Í¿¡´Â  ¸î°³ÀÇ °áÁ¡ÀÌ ÀÖ½À´Ï´Ù.  dllexport ¿¡ °üÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ´Â °ÍÀº  ¸Å´ÏÁö ÄÚµå·Î ÀÛ¼ºµÈ 2 °³ÀÇ À̹ÌÁö (DLL ¶Ç´Â exe) ÀÌ  #using ÀÌ ¾Æ´Ñ dllexport ¸¦ °³ÀÔ½ÃÄÑ ±â´ÉÀ» °ø°³Çϰí ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. dllexport ´Â ³×ÀÌÆ¼ºê ÄÁ½ºÆ®·¢Æ®À̱⠶§¹®¿¡  __declspec(dllexport) ¸¦ °³ÀÔ½ÃÄÑ DLL ÀÇ °æ°è¸¦ ³ÑÀº È£ÃâÀÌ ¹ß»ýÇÒ ¶§¸¶´Ù ¿ì¼± ¸Å´ÏÁö ÄÚµå·ÎºÎÅÍ ³×ÀÌÆ¼ºê Äڵ忡ÀÇ ÃµÀ̰¡ °è¼ÓµÇ¾î ³×ÀÌÆ¼ºê ÄÚµå·ÎºÎÅÍ ¸Å´ÏÁö Äڵ忡ÀÇ ÃµÀ̰¡ »ý±é´Ï´Ù. À̰ÍÀº ÆÛÆ÷¸Õ½ºÀÇ ¾ÇÈ­·Î ¿¬°áµË´Ï´Ù.
  
ÀÌ ÆÛÆ÷¸Õ½ºÀÇ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¿É¼ÇÀº ÇÑÁ¤µÇ¾î ÀÖ½À´Ï´Ù.  __declspec(dllexport) ¸¦ ´Ü¼øÇÑ "½ºÀ­Ä¡" ·Î µ¹¿¬ ¹Ù²Ù¾î  ¸Å´ÏÁö Äڵ忡ÀÇ ¼ÍÅ©¸¦ ¹ß»ý½ÃŰÁö ¾Ê´Â ÄÁ½ºÆ®·¢Æ®·Î º¯È¯ÇÏ´Â ÀÏÀº ÇÒ ¼ö ¾ø½À´Ï´Ù. Ãßõ µÇ´Â ÇØ°áÃ¥Àº  export µÇ´Â ±â´ÉÀ» ¸Å´ÏÁöÇü (ÂüÁ¶ÇüÀÇ class ¶Ç´Â °ª ÇüÀÇ  struct) À¸·Î ·¦ ÇÏ´Â °ÍÀÔ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ  ÀÓÆ÷ÅÍ´Â "#using" À» °³ÀÔ½ÃÄÑ export DLL ¿¡ ¾×¼¼½º ÇØ  Á÷Á¢ DLL ÀÇ ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ÀÌ¿Í °°ÀÌ º¯°æÇÏ´Â °ÍÀ¸·Î ¸Å´ÏÁö Ŭ¶óÀÌ¾ðÆ®°¡ ¸Å´ÏÁö Äڵ带 È£ÃâÇØµµ õÀ̰¡ ¹ß»ýÇÏÁö ¾Ê°Ô µË´Ï´Ù. ÀÌ ±¸Á¶¸¦ ±×¸² 8 ¿¡ ³ªÅ¸³À´Ï´Ù. ÆÄÆ® A ´Â __declspec(dllexport) ÀÇ »ç¿ë¿¡ ¼ö¹ÝÇÏ´Â ÄÚ½ºÆ®¸¦ ³ªÅ¸³»°í ÀÖ¾î ÆÄÆ® B ´Â .NET ÇüÅ¿¡ ÀÇÇÑ ÇÔ¼öÀÇ ·¦Çΰú #using ¸¦ »ç¿ëÇÑ ÃÖÀûÈ­ÀÇ °á°ú¸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ´Ù¸¸  ÀÌ ¹æ¹ý¿¡´Â  export DLL ÀÇ ¾ð ¸Å´ÏÁö ÀÓÆ÷ÅͰ¡ DLL ÀÇ ±â´ÉÀ» __declspec(dllimport) ÇÒ ¼ö ¾ø´Ù°í ÇÏ´Â ÀáÀçÀûÀÎ ¹®Á¦°¡ ¼ö¹ÝÇÕ´Ï´Ù. º¯°æÀ» ½Ç½ÃÇÏ´Â °æ¿ì¿¡´Â  ÀÌ Á¡¿¡ ´ëÇØ °í·ÁÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

±×¸² 8 »êÅ© ÄÚ½ºÆ®ÀÇ »è°¨
±×¸² 8. ¼ÍÅ© ÄÚ½ºÆ®ÀÇ »è°¨

  ±×¸² 8.
ÀÇ ÆÄÆ® A ´Â __declspec(dllexport) À» »ç¿ëÇØ ¸Å´ÏÁö ÇÔ¼ö¸¦ ¸Å´ÏÁö Äڵ忡 °ø°³ÇÏ´Â °æ¿ìÀÇ ÃµÀÌ ÆÐ½º¸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ÆÄÆ® B ´Â ÇÔ¼ö¿¡ÀÇ ¾×¼¼½º¸¦ ³ªÅ¸³»°í ÀÖ¾î ±×°÷¿¡¼­´Â ¸Å´ÏÁöÇü¿¡ ÀÇÇÑ ÇÔ¼öÀÇ ·¦°ú #using ÀÌ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù. ±× °á°ú  ÆÄÆ® A ÀÇ ÇÁ·Î¼¼½º¿Í´Â ´Þ¶ó  ÄÚ½ºÆ®ÀÇ ºñ½Ñ »êÅ©°¡ Á¦°ÅµÇ°í ÀÖ½À´Ï´Ù.

Åë°è
  Visual Studio .NET 2002 C++
¿¡ µµÀÔµÈ ÀÌ·¡ Visual C++ ¿¡ ÀÇÇÑ .NET Framework Àº Å©°Ô ÁøÈ­ÇØ ¿Ô½À´Ï´Ù.  C++ ÀÌ Á¦°øÇÏ´Â Áö±Ý±îÁö ¾øÀ» ¸¸Å­ÀÇ À¯¿¬¼º¿¡ ÀÇÇØ C++ ÇÁ·Î±×·¡¸Ó´Â ÆÛÆ÷¸Õ½ºÀÇ ³ôÀº ¸Å´ÏÁö Äڵ带 Àͼ÷ÇØÁø ¹æ¹ýÀ¸·Î ±â¼úÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. .NET ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ ¾ð¾î´Â ¸¹ÀÌ ÀÖ½À´Ï´Ù¸¸  ÆÛÆ÷¸Õ½ºÀÇ ÃÖ´ëÈ­¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é Visual C++ À» ¼±ÅÃÇØ¾ß ÇÕ´Ï´Ù.


Kang Su Gatlin ´Â , ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿¡¼­ Visual C++ ÆÀÀÇ ÇÁ·Î±×·¥ ¸Å´ÏÀú¸¦ ´ã´çÇϰí ÀÖ¾î ÇÁ·Î±×·¥ÀÇ °í¼Ó µ¿ÀÛÀ» ½ÇÇöÇϴ ü°èÀûÀÎ ¹æ¹ýÀÇ Å½±¸¿¡ ³¯¸¶´Ù ÀÓÇϰí ÀÖ½À´Ï´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ÀÔ»ç ÀÌÀü¿¡´Â  ÇÏÀÌ ÆÛÆ÷¸Õ½º ÄÄÇ»ÆÃ°ú ±×¸®µå ÄÄÇ»ÆÃÀÇ ÀÏ¿¡ Á¾»çÇϰí ÀÖ¾ú½À´Ï´Ù.


Mike Montwill Àº  Microsoft Visual C# ÆÀÀÇ °³¹ßÀÚÀÔ´Ï´Ù. ¼¼¸¸Æ½ ¿£Áø°ú IL ÀÇ »ý¼º¿¡ Á¾»çÇØ ¿Â ±×´Â  ÇöÀç´Â ´ëºÎºÐÀÇ ½Ã°£À» ÄÄÆÄÀÏ·¯¿Í µð¹ö°ÅÀÇ °øÅë ¿µ¿ªÀÇ ÀÛ¾÷¿¡ ¼ÒºñÇϰí ÀÖ½À´Ï´Ù. Visual Studio 2005 ±×¸®°í ±×°¡ ¸¶À½¿¡ µå´Â ±â´ÉÀº  µð¹ö°Å ºñÁÖ¾ó¶óÀÌÀúÀÔ´Ï´Ù.


ÀÌ ±â»ç´Â MSDN Magazine - 2005 ³â 1 ¿ùÈ£·ÎºÎÅÍ ÀÇ ¹ø¿ªÀÔ´Ï´Ù.
MSDN
¸Å°ÅÁø ÀϺ»¾îÆÇÀÇ ÃֽŠÁ¤º¸´Â MSDN Flash ´º½º·¹ÅÍ·Î Á¦°øÇϰí ÀÖ½À´Ï´Ù.