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

ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA โดยข้อกำหนดจำเพาะ (specification) ของภาษา C# ปรากฏในเอกสารที่รับรองโดย ISO และ ECMA เอกสารนี้ (ECMA-334 และ ISO/IEC 23270) เป็นอกสารหนาหกร้อยหน้า พรรณนาถึงข้อกำหนดของภาษา C# โดยละเอียดทุกแง่มุม เป็นเอกสารที่เปิดให้สาธรณะชนดาวน์โหลดมาอ่านได้โดยอิสระ
ภาพหน้าปก ภาษา 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 ที่ต้องมีในคอมพิวเตอร์ทุกเครื่องอยู่แล้ว

โค้ดภาษาแอสเซมบลีและภาษา CLI แสดงความแตกต่างระหว่างการทำงานที่เน้นรีจิสเตอร์กับการทำงานที่เน้น Stack

ตัวอย่างโค้ดที่เห็นในภาพ

บรรทัดที่ 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 แสดงกลไกคุณสมบัติวัตถุวิธี

คุณสมบัติที่น่าพอใจซึ่งมีอยู่ในภาษา 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 ว่ามีข้อดีอย่างไรจึงได้รับการรับรองเป็นมาตรฐานสากล