protect

ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ

วันพุธที่ 29 กรกฎาคม พ.ศ. 2558

UnManaged code VS Managed code ตอนที่ 2

หลังจากตอนที่แล้วผมได้อธิบายเกี่ยวกับ UnManged code แบบคร่าวๆ มาแล้ว ตอนนี้ก็จะขออธิบายเกี่ยวกับรายละเอียดของ Managed code ของ .Net Framework ครับ

ตอนที่ Microsoft เปิดตัวชุด .Net Framework ทาง Microsoft ได้เปิดตัวภาษาใหม่ขึ้นมาอีกถึง 4 ภาษาได้แก่ C#, Visual Basic .Net, Visual C++.Net และ J# ทั้ง 4 ภาษานี้จะมีสิ่งที่เหมือนกันคือ เมื่อ compiler compile code ที่ถูกเขียนโดย 4 ภาษา ตัว compiler จะสร้าง file นามสกุล exe โดยโครงสร้างภายใน file exe นี้กลับไม่ได้บรรจุ Native code เหมือนกับ UnManged code แต่ภายใน file exe ที่ถูกสร้างขึ้นมาจะประกอบไปด้วย 4 ส่วนหลักๆ ได้แก่

1) PE32/PE32+
    ในส่วนนี้จะเป็นตัวบอกว่าโปรแกรม exe สามารถ execute หรือ run ได้กับชนิดของ cpu 32 bit หรือ 64 bit 

     ถ้าโปรแกรมมีการเขียนโปรมแกรมแบบ type-unsafe ในส่วนของ Native code ที่ได้มาจากการ compile code ก็จะบรรจุอยู่ในส่วนนี้ด้วย ผมได้อธิบายรายละเอียดของ type-safe กับ type-unsafe ที่นี้ครับ

2) CLR Header   
     ในส่วนนี้จะเก็บ ข้อมูลดังต่อไปนี้
       - version ของ .Net Framework ที่โปรแกรมต้องการ
       - เก็บตำแหน่งของ entry point. อย่างง น่ะครับ entry point คือ function void Main() นั้นเอง ฝรั่งเขาเรียกอย่างนี้แหละ ทุกโปรแกรมที่เป็นชนิด application จะต้องมี entry point เสมอน่ะครับ แต่ถ้าโปรแกรมเป็นชนิด library (compile code มาแล้วได้ file นามสกุล dll) ไม่จำเป็นต้องมี entry point
       - เก็บขนาดและตำแหน่งของ meta data

3) Meta data
    ในส่วนนี้จะเป็นการเก็บรายละเอียดของ Data Type ที่ถูกเรียกใช้ในโปรแกรม โดยมีการจัดเก็บในรูปแบบของตาราง ซึ่งมีทั้งหมด 2 ตารางได้แก่
    - ตารางแรกจะเป็น ตารางที่เก็บข้อมูลของ Data Type และสมาชิกของ Data Type ที่โปรแกรมสร้างขึ้น
    - ตารางที่สอง ก็จะเก็บ Data Type และสมาชิกของ Data Type ที่โปรแกรมมีการ reference 

     ตัวอย่างง่ายๆ น่ะครับ 

       public class MyExample
       {
              public int i;
              public MyCar myCar;
       }      
      public class MyCar
      {
              public int door;
      }
     

     จะเห็นว่า Data Type ที่ชื่อ MyCar จะเป็นของตัวโปรแกรมเอง ดังนั้นข้อมูลของ MyCar รวมทั้ง Data Type ของสมาชิกและชื่อของสมาชิกใน MyCar จะถูกเก็บไว้ในตารางแรก 
      ส่วน Data Type int ซึ่งเป็น Data Type ของ System ข้อมูลของ Data Type int จึงถูกเก็บไว้ใน ตารางที่สอง ในส่วนนี้จะเก็บ Data Type int แค่ครั้งเดียวเท่านั้นแม้ว่าจะมีการเรียกใช้ 2 ที่ก็ตาม (เรียกใช้ใน MyExample และเรียกใช้ใน MyCar)

      ตารางทั้งสองจะไม่มีส่วนใดในการเก็บข้อมูลของ myCar, i และ door น่ะครับ myCar, i และ door จะถูกสร้างและถูกจัดการเมื่อมีการ execute โปรแกรมหรือ run โปรแกรมนั้นเอง

     
4) IL language
     เมื่อ compiler compile code สิ่งหนึ่งที่ compiler ทำคือทำการแปลงภาษาต้นฉบับนั้นให้เป็นภาษา IL ( intermedia language) เพราะฉนั้น code ที่เราเขียนขึ้นไม่ว่าจะเขียนด้วยภาษา C# หรือ Visual Basic .Net สุดท้ายเมื่อ compiler compile เสร็จ code ที่ถูกเขียนขึ้นมาก็จะถูกแปลงมาเป็นภาษา IL นั้นเอง

เอาล่ะซิครับ ภายใน file ชนิด Managed Code ไม่มีที่เก็บภาษา Native CPU เพื่อที่จะให้ CPU execute ได้เลย แล้วโปรแกรม Managed Code ที่เราเขียนขึ้นมามันจะสามารถทำงานได้ยังไงกันเนี้ย 

พบกันตอนหน้าครับ
TuChay
  


UnManaged code VS Managed code ตอนที่ 1


ในช่วงที่ผมเริ่มต้นศึกษา C# ครั้งแรกประมาณปี 2000 ผมจะเจอคำว่า UnManaged code กับ Managed code เยอะมาก ในตอนนั้นยอมรับเลยว่าไม่เข้าใจความหมายของสองคำนี้เลยจริงๆ ตอนนี้พอจะเข้าใจบ้างเลยอยากอธิบายให้สำหรับคนที่ยัง งงๆ เหมือนกับผมในสมัยนั้นได้ทำความเข้าใจได้ดียิ่งขึ้น

ถ้าผู้อ่านเคย compile code ด้วยภาษา C++ หรือ Visual Basic จะทราบว่าหลังจาก compile code เสร็จ ตัว compiler จะสร้าง file ขึ้นมาใหม่มา 1 file ที่มีนามสกุล .exe โดยเนื้อหาภายใน file เราหรือมนุษย์ทั่วไปจะไม่สามารถอ่านและทำความเข้าใจกับมันได้ เพราะเนื้อหาภายใน file เป็นสิ่งที่ CPU อ่านและทำความเข้าใจได้คนเดียว เนื้อหา file นามสกุล exe นี้เราจะเรียกมันว่าเป็นภาษา Native CPU หรือภาษาพื้นฐานสำหรับ CPU เท่านั้น

File นามสกุล .exe ที่มนุษย์ไม่สามารถอ่านได้นี้แหละครับ เราเรียกว่า UnManaged Code หมายถึงหลังจาก compiler compile code ไปแล้ว เราไม่สามารถแก้ไขหรือดูเนื้อหาอะไรภายใน file นั้นได้อีก (แต่จริงๆ แล้วก็สามารถแก้ได้โดยใช้ โปรแกรม Hex Editor คนที่ใช้ tool พวกนี้ส่วนใหญ่เป็น cracker ครับและต้องเป็นผู้มีความชำนาญ assembly language เป็นอย่างสูง)

ด้วยข้อจำกัดของ UnManaged code ข้อนี้ล่ะครับทำให้การทำ code sharing มีความยุ่งยากมาก ผมขอยกตัวอย่างจากประสบการณ์ ตรงเลยครับ :)

ในบริษัทหนึ่งมีทีมงานอยู่ 2 ทีมคือทีมที่เชี่ยวชาญภาษา VC++ กับอีกทีมที่เชี่ยวชาญภาษา Visual Basic ทั้งสองทีมต่างมีการพัฒนา library เป็นของตัวเอง วันหนึ่งทั้งสองทีมจะต้องทำงานร่วมกัน เอาล่ะสิครับปัญหาแรกเลยคือเขาจะตัดสินใจใช้ภาษาอะไรเป็นภาษาหลัก เพราะทั้ง VC++ และ Visual Basic ต่างก็มีข้อดีและข้อจำกัด รวมถึงการดึง library ที่เคยพัฒนาแล้วมาใช้ข้าม platform (Visual Basic เรียกใช้ dll ที่ถูกเขียนด้วยภาษา VC++ หรือ VC++ เรียกใช้ dll ที่ถูกเขียนด้วยภาษา Visual Basic)

นี้แหละปัญหาของ UnManged code นี้ขนาดพัฒนาโปรแกรมภายใต้ระบบปฏิบัติการเดียวกันน่ะครับ ลองนึกดูว่าถ้าบริษัทตัวอย่างข้างบนมีลูกค้าที่ใช้ทั้งระบบปฏิบัติการ Windows และลูกค้าที่ใช้ระบบปฏิบัติการ Linux บริษัทจะต้องมีทีมงานหรือ software engineer จำนวนเท่าไรเพื่อพัฒนาโปรแกรมเดียวกันแต่ใช้งานได้ทั้ง Windows และ Linux

ด้วยข้อจำกัดของ UnManged code นี้แหละครับทางบริษัท Sun Microsystem จึงได้พัฒนาภาษาคอมพิวเตอร์ภาษาใหม่ที่ชื่อว่า Java ซึ่งเป็นภาษาที่เป็น Managed code ภาษาแรกบนโลกในปี 1996 จุดประสงค์ของภาษา Java คือต้องการให้นักพัฒนาโปรแกรมเขียนโปรแกรมครั้งเดียวแต่สามารถนำไปใช้ได้ทั้งระบบปฏิบัติการ Windows และ ระบบปฏิบัติการ Linux แต่ก็นั้นแหละครับมันเป็นภาษาใหม่ซึ่งในสมัยนั้นมันเป็นภาษาที่ค่อนข้างทำความเข้าใจได้ยากรวมถึง editor ในสมัยนั้นก็ยังไม่ดีพอ ดังนั้นในช่วงแรกๆ ของภาษา Java จึงเน้นไปที่นักศึกษาส่ะมากกว่า

หลังจากนั้น Microsoft ก็ได้เปิดตัวภาษาใหม่ที่เป็น Managed code ภายใต้ชุดพัฒนา Microsoft .Net Framework ในปี 2002 จุดเด่นหลักๆ ของ Microsoft .Net Framework คือ CLR (Common Language Runtime) ซึ่งรายละเอียดของ Managed code ในรูปแบบของ Microsoft สามารถติดตามต่อได้ที่ภาคสองเลยครับ

ขอบคุณสำหรับการติดตามครับ
TuChay


วันจันทร์ที่ 27 กรกฎาคม พ.ศ. 2558

Hello my first blog!!!!!


นี้เป็นบทควารมแรกของผมครับ ถ้าท่านผู้อ่านได้อ่านข้อความนี้ ผมรู้สึกดีใจและเป็นเกียรติอย่างยิ่งครับที่ท่านได้เข้ามาอ่าน

ผมตั้งใจจะใช้ blog นี้เผยแพร่ความรู้ (อันน้อยนิด) จากประสบการณ์การทำงานในด้าน programming ของผมให้กับผู้อ่านผู้ทีมีความสนใจในด้านการเขียนโปรแกรม โดยเฉพาะเด็กรุ่นใหม่ๆ น่ะครับ

สิ่งที่ผมตั้งใจจะเขียนส่วนใหญ่จะเป็นเรื่องของ C#, Java, Mono, UML, Hadoop และก็เรื่องอื่นที่น่าสนใจแล้วแต่กรณีและสถานการณ์

ผมหวังว่าผู้อ่านจะติดตามอ่านบทความของผมต่อไปเรื่อยๆ น่ะครับ

ขอบคุณครับ
TuChay.