ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA

ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA
มาตรฐานที่ว่าคือมาตรฐานที่รับรองโดยองค์กร ISO และ ECMAโดย ECMA เป็นองค์กรมาตรฐานสากล มีศูนย์กลางอยู่ที่กรุงเจนิวาประเทศสวิสเซอร์แลนด์ มาตรฐานที่ได้รับการรับรองจาก ECMA เป็นที่ยอมรับเช่นเดียวกับมาตรฐาน ISO
ข้อกำหนดจำเพาะ (specification) ของภาษา C# ปรากฏในเอกสารที่รับรองโดย ISO และ ECMA เอกสารนี้ (ECMA-334 และ ISO/IEC 23270) เป็นอกสารหนาหกร้อยหน้า พรรณนาถึงข้อกำหนดของภาษา C# โดยละเอียดทุกแง่มุม เป็นเอกสารที่เปิดให้สาธารณะชน download มาอ่านได้โดยอิสระ
ส่วนภาษา JAVA ไม่ได้ถูกรับรองจาก ISO, ECMA หรือองค์กรมาตรฐานสากลใด ๆ จึงไม่มีเอกสารพรรณนาข้อกำหนดจำเพาะที่เปิดให้สาธรณะชนดาวน์โหลดมาอ่านได้
นอกจากตัวภาษาแล้ว platform ที่รองรับภาษาคือ .Net Framework ก็เป็นมาตรฐาน ISO, ECMA ด้วย
(ขณะที่ platform ของภาษา JAVA ไม่ได้เป็นมาตรฐาน ISO, ECMA)
นอกไปจากนั้นองค์ประกอบรองข้างของภาษา C# อาทิ compiler .NET Core, CoreCLR, ASP.NET MVC ฯลฯ ต่างก็เป็น Open Source ทั้งหมด ทำให้สาธารณะชนนำไปดัดแปลง ศึกษา พัฒนาต่อยอดได้อย่างอิสระ (เป็นข้อกำหนดอนุญาตการใช้งานแบบ MIT, BSD และ Apache )
ภาษา CLI (Common Intermediate Language) ก็ถูกรับรองจาก ECMA (มาตรฐาน ECMA-335) ด้วยเช่นกัน ทำให้สาธารณะชนสามาถเข้าถึงรายละเอียดทุกอย่างของมันได้
ภาษา .NET ทุกภาษา (อาทิ C#, F#, VB.NET ) จะต้องถูกแปลให้เป็นภาษา CLI ก่อน หลังจากนั้นตัว Run Time หรือ JIT จึงจะแปลให้เป็นรหัส Binary สำหรับ CPU อีกครั้งตอน Runโปรแกรม
ไม่เหมือนภาษา C ที่ compiler จะแปล source code ไปเป็นรหัส Binaryโดยตรง
ข้อดีของการแปลเป็น CLI ก่อนคือ เมื่อท่านพัฒนาโปรแกรมด้วยภาษา C# แบบ .NET Core แล้ว ท่านจะได้ผลลัพธ์เป็นไฟล์โปรแกรมที่มีนามสกุล .exe หรือ .dll ที่สามารถนำไป Run ในระบบปฏิบัติการอะไรก็ได้ (เช่น windows ,Linux,Mac OS, Android ฯลฯ ) หาก OS นั้นมี JIT สำหรับ CLI อยู่
และยิ่งไปกว่านั้น โปรแกรมที่ท่านเขียนยังสามารถ Run ใน CPU อะไรก็ได้ (เช่น intel core i , intel itanium CPU ที่ใช้สถาปัตยกรรมแบบ ARM ฯลฯ) ทำให้ท่านสามารถพัฒนาApplication ที่ทำงานในหลาย ๆ platform ได้
CLI เป็นภาษาระดับต่ำเทียบเท่ากับภาษา Assembly แปลกที่ภาษา Assembly ของ CPU แต่ละตระกูลจะไม่เหมือนกัน ไม่สามารถใช้งานทดแทนกันหรือร่วมกันได้ ขณะที่ภาษา CLI เป็นมาตรฐานเดียวและสามารถนำไปใช้ได้กับ CPU ได้ทุกตระกูล ที่เป็นไปได้เพราะ JIT จะ compile ภาษา CLI ให้เป็นรหัส Binary สำหรับ CPU นั้น ๆ
ภาษา CLI จึงดีกว่าภาษา Assembly ในแง่ของการเคลื่อนย้ายได้ (portable) คือย้ายโค้ดจากระบบปฏิบัติการหนึ่งไป Run ในอีกระบบปฏิบัติการหนึ่งได้เหมือนกับภาษาระดับสูง
ภาษา Assembly จะเน้นการประมวลผลโดยยักย้ายถ่ายเทข้อมูลระหว่าง register ภายใน CPU เป็นหลัก ปัญหาของการทำเช่นนี้คือ CPU แต่ละตระกูลแต่ละรุ่นล้วนมีชื่อและจำนวนของ registerไม่เหมือนกัน
เพื่อหลีกเลี่ยงปัญหานี้ภาษา CLI จึงไม่มีการทำงานกับ register แต่เปลี่ยนไปเน้นการประมวลผลโดยยักย้ายถ่ายเทข้อมูลกับ stack (โครงสร้างข้อมูล) แทน จึงทำให้เกิดภาวะ portable เพราะทุก CPU และทุกระบบปฏิบัติการล้วนแล้วแต่มี stack โดยที่ stack ก็ไม่ต้องการฮาร์ดแวร์อะไรมากไปกว่าหน่วยความจำแบบ RAM ที่ต้องมีในคอมพิวเตอร์ทุกเครื่องอยู่แล้ว

ตัวอย่างโค้ดที่เห็นในภาพ
บรรทัดที่ 1 คือภาษา Assembly ของ CPU ตระกูล x86 ซึ่งทำหน้าที่นำจำนวนสองจำนวนมาบวกกัน
จำนวนแรกจะอยู่ใน register eax และอีกจำนวนอยู่ใน register edx
คำสั่ง add คือ Mnemonic ทำหน้าที่นำค่าใน eax และ edx ซึ่งเป็นOperandมาบวกกัน ผลลัพธ์ที่ได้จะถูกเก็บทับลงไปใน register eax
ส่วนโค้ดที่เทียบเท่ากันในภาษา CLI คือบรรทัดที่ 3-6 โดยมันจะแทนที่ Operand ตัวแรก คือ eax ด้วย 0 และ edx ด้วย 1
บรรทัด 3 นำค่าตัวแปร 0 ใส่ใน stack
บรรทัด 4 นำค่าในตัวแปร 1 ใส่ใน stack
บรรทัด 5 ดึงค่าออกจาก stack มาสองค่าแล้วนำมาบวกกัน แล้วใส่กลับลงไปใน stack
บรรทัด 6 ดึงค่าจาก stack มาใส่ตัวแปร 0
บรรทัดที่ 1 คือภาษา Assembly ของ CPU ตระกูล x86 ซึ่งทำหน้าที่นำจำนวนสองจำนวนมาบวกกัน
จำนวนแรกจะอยู่ใน register eax และอีกจำนวนอยู่ใน register edx
คำสั่ง add คือ Mnemonic ทำหน้าที่นำค่าใน eax และ edx ซึ่งเป็นOperandมาบวกกัน ผลลัพธ์ที่ได้จะถูกเก็บทับลงไปใน register eax
ส่วนโค้ดที่เทียบเท่ากันในภาษา CLI คือบรรทัดที่ 3-6 โดยมันจะแทนที่ Operand ตัวแรก คือ eax ด้วย 0 และ edx ด้วย 1
บรรทัด 3 นำค่าตัวแปร 0 ใส่ใน stack
บรรทัด 4 นำค่าในตัวแปร 1 ใส่ใน stack
บรรทัด 5 ดึงค่าออกจาก stack มาสองค่าแล้วนำมาบวกกัน แล้วใส่กลับลงไปใน stack
บรรทัด 6 ดึงค่าจาก stack มาใส่ตัวแปร 0

คุณสมบัติที่น่าพอใจซึ่งมีอยู่ในภาษา CLI แต่ไม่มีในภาษา Assembly คือ มันถูกออกแบบมาให้เขียนโปรแกรมแบบวัตถุวิธี (OOP: Object Oriented Programming) ได้ด้วย
โค้ดที่เห็นคือตัวอย่างภาษา CLI ที่ใช้หลักการ OOP เพื่อนิยามคลาส นิยาม method แบบ static และแสดงวิธีเรียกใช้งาน method โดยนำโค้ดการบวกเลขสองจำนวนเหมือนโค้ดในตัวอย่างที่ผ่านมาใช้เป็นโค้ดตัวอย่างภายใน method
โค้ดบรรทัดที่ 1-11 คือนิยามคลาส foo
โปรดสังเกตคำสั่งหรือคีย์เวิร์ด class, public, static มีวิธีเขียนและตำแหน่งเหมือนการเขียนในภาษา C#
เนื่องจากภาษา CLI เป็นภาษาแบบ OOP ทำให้ method ทุก method ต้องเป็นสมาชิกของคลาส
บรรทัดที่ 3-10 คือตัวอย่างวิธีนิยาม method สมาชิก
บรรทัดที่ 3 นอกจากคำสั่ง .method ที่ใส้ไว้หน้าส่วนประกาศ method แล้ว ส่วนหัวของ method ในภาษา CLI ก็มีหน้าตาก็คล้าย ๆ การเขียนนิยาม method ในภาษา C#
โปรดสังเกตว่าโค้ดบรรทัด 5-9 อันเป็นส่วนลำตัวของ method จะคล้ายโค้ดในตัวอย่างก่อนหน้านี้
ยกเว้นตอนจบคือบรรทัด 9 ที่ใช้คำสั่ง ret เพื่อส่งผลลัพธ์กลับไปยังโค้ดที่เรียกใช้มัน
บรรทัด 13 แสดงตัวอย่างวิธีเรียกใช้ method Add()
เราสามารถเรียกใช้ method นี้ได้ทันทีโดยไม่ต้องสร้าง object จากคลาส foo ก่อนเพราะมันเป็น method แบบ static มันจึงมีภาวะเป็น method ของคลาส ไม่ใช่ method ของobject
โค้ดบรรทัดนี้เป็นภาษา C# ทำหน้าที่ประกาศตัวแปรแบบตัวเลขจำนวนเต็มชื่อ r นำค่าผลลัพธ์การทำงานของmethod Add() มาใช้กำหนดเป็นค่าเริ่มต้นของตัวแปร
บรรทัดที่ 15-18 คือโค้ดภาษา CLI แสดงตัวอย่างการเรียกใช้ method Add()
โดยจะมีการทำงานเหมือนโค้ดบรรทัดที่ 13 บรรทัดเดียว
คำสั่ง ldc.i4.x ทำหน้าที่นำตัวเลขแบบ int32 ใส่ลงใน stack
บรรทัดที่ 17 แสดงวิธีเรียกใช้ method Add()
คำสั่ง stloc.0 ในบรรทัดที่ 18 ทำหน้าที่นำค่าออกจาก stack ไปใส่ในตัวแปรท้องถิ่น 0
จากบทความนี้ ทำให้ท่านมั่นใจในการพัฒนาโปรแกรมด้วยภาษา C# มากยิ่งขึ้น
เนื่องด้วยภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA ดังกล่าวมาแล้ว
รวมถึงท่านผุ้อ่านได้เห็นตัวอย่างการ Code ด้วยภาษา CLI ว่ามีข้อดีอย่างไรจึงได้รับการรับรองเป็นมาตรฐานสากล
โค้ดที่เห็นคือตัวอย่างภาษา CLI ที่ใช้หลักการ OOP เพื่อนิยามคลาส นิยาม method แบบ static และแสดงวิธีเรียกใช้งาน method โดยนำโค้ดการบวกเลขสองจำนวนเหมือนโค้ดในตัวอย่างที่ผ่านมาใช้เป็นโค้ดตัวอย่างภายใน method
โค้ดบรรทัดที่ 1-11 คือนิยามคลาส foo
โปรดสังเกตคำสั่งหรือคีย์เวิร์ด class, public, static มีวิธีเขียนและตำแหน่งเหมือนการเขียนในภาษา C#
เนื่องจากภาษา CLI เป็นภาษาแบบ OOP ทำให้ method ทุก method ต้องเป็นสมาชิกของคลาส
บรรทัดที่ 3-10 คือตัวอย่างวิธีนิยาม method สมาชิก
บรรทัดที่ 3 นอกจากคำสั่ง .method ที่ใส้ไว้หน้าส่วนประกาศ method แล้ว ส่วนหัวของ method ในภาษา CLI ก็มีหน้าตาก็คล้าย ๆ การเขียนนิยาม method ในภาษา C#
โปรดสังเกตว่าโค้ดบรรทัด 5-9 อันเป็นส่วนลำตัวของ method จะคล้ายโค้ดในตัวอย่างก่อนหน้านี้
ยกเว้นตอนจบคือบรรทัด 9 ที่ใช้คำสั่ง ret เพื่อส่งผลลัพธ์กลับไปยังโค้ดที่เรียกใช้มัน
บรรทัด 13 แสดงตัวอย่างวิธีเรียกใช้ method Add()
เราสามารถเรียกใช้ method นี้ได้ทันทีโดยไม่ต้องสร้าง object จากคลาส foo ก่อนเพราะมันเป็น method แบบ static มันจึงมีภาวะเป็น method ของคลาส ไม่ใช่ method ของobject
โค้ดบรรทัดนี้เป็นภาษา C# ทำหน้าที่ประกาศตัวแปรแบบตัวเลขจำนวนเต็มชื่อ r นำค่าผลลัพธ์การทำงานของmethod Add() มาใช้กำหนดเป็นค่าเริ่มต้นของตัวแปร
บรรทัดที่ 15-18 คือโค้ดภาษา CLI แสดงตัวอย่างการเรียกใช้ method Add()
โดยจะมีการทำงานเหมือนโค้ดบรรทัดที่ 13 บรรทัดเดียว
คำสั่ง ldc.i4.x ทำหน้าที่นำตัวเลขแบบ int32 ใส่ลงใน stack
บรรทัดที่ 17 แสดงวิธีเรียกใช้ method Add()
คำสั่ง stloc.0 ในบรรทัดที่ 18 ทำหน้าที่นำค่าออกจาก stack ไปใส่ในตัวแปรท้องถิ่น 0
จากบทความนี้ ทำให้ท่านมั่นใจในการพัฒนาโปรแกรมด้วยภาษา C# มากยิ่งขึ้น
เนื่องด้วยภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA ดังกล่าวมาแล้ว
รวมถึงท่านผุ้อ่านได้เห็นตัวอย่างการ Code ด้วยภาษา CLI ว่ามีข้อดีอย่างไรจึงได้รับการรับรองเป็นมาตรฐานสากล