Roslyn — แพลตฟอร์มคอมไพเลอร์ .NET
การแนะนำ
สำหรับผู้ที่คลุกคลีอยู่ในแวดวงเทคโนโลยีมาระยะหนึ่ง คำว่า “.NET” คงจะคุ้นเคยกันดี พวกเขาอาจรู้ด้วยว่าพัฒนาโดย Microsoft อย่างไรก็ตาม สิ่งที่ทำให้ประหลาดใจก็คือ .NET ถูกสร้างขึ้นเป็นโอเพ่นซอร์สในปี 2559 บทความนี้เน้นไปที่Roslynซึ่งเป็นแพลตฟอร์มคอมไพเลอร์ที่ใช้ใน .NET
ก่อนที่จะเจาะลึกลงไปใน Roslyn สิ่งสำคัญคือต้องเข้าใจก่อนว่า .NET คืออะไร
.NET คืออะไร ?
.NET (หรือที่เรียกว่า .NET core) เป็นแพลตฟอร์มนักพัฒนาแบบโอเพ่นซอร์สแบบข้ามแพลตฟอร์มฟรี ที่พัฒนา โดยMicrosoftสำหรับสร้างแอปพลิเคชันประเภทต่างๆ มากมายสำหรับเว็บ อุปกรณ์พกพา เดสก์ท็อป เกม IoT และอื่นๆ มันเป็นตัวตายตัวแทนข้ามแพลตฟอร์มของ .NET Framework ที่เป็นกรรมสิทธิ์ซึ่งทำงานบนWindows เป็น หลัก
.NET มีภาษาโปรแกรม 3 ภาษาดังต่อไปนี้
ค#
C# เป็นภาษาโปรแกรมระดับสูงสำหรับวัตถุประสงค์ทั่วไปที่สนับสนุนกระบวนทัศน์ที่หลากหลาย C# ครอบคลุมถึงการพิมพ์แบบสแตติก, การพิมพ์แบบคาดเดายาก, ขอบเขตของคำศัพท์, ความจำเป็น, การประกาศ, การทำงาน, ทั่วไป, การเขียนโปรแกรมเชิงวัตถุและเชิงคอมโพเนนต์
ฉ#
F# เป็นภาษาการเขียนโปรแกรมแบบหลายกระบวนทัศน์ที่เน้นการทำงานเป็นหลัก มีวัตถุประสงค์ทั่วไป พิมพ์อย่างเข้มงวด ซึ่งรวมถึงวิธีการเขียนโปรแกรมเชิงหน้าที่ ความจำเป็น และเชิงวัตถุ
วิชวลเบสิก
Visual Basic เป็นภาษาการเขียนโปรแกรมเชิงวัตถุแบบหลายกระบวนทัศน์ ซึ่งเน้นที่ความชัดเจนมากกว่าความกะทัดรัด
โรสลินคืออะไร?
Roslyn เป็นชื่อรหัสของโครงการแพลตฟอร์มคอมไพเลอร์ .NET ซึ่งได้ชื่อมาจากเมืองที่มีชื่อเดียวกันในวอชิงตัน สหรัฐอเมริกา
.NET Compiler Platform คือชุดคอมไพเลอร์โอเพ่นซอร์สและ API การวิเคราะห์โค้ดสำหรับภาษา C # และ Visual Basic (VB.NET)
โครงการประกอบด้วยคอมไพเลอร์ C# และ VB.NET เวอร์ชันที่เขียนด้วยภาษาเป้าหมายเอง ( คอมไพเลอร์ที่โฮสต์เอง ) คอมไพเลอร์พร้อมใช้งานผ่านโปรแกรมบรรทัดคำสั่งและเป็น API ที่สามารถใช้งานได้จากภายในโค้ด .NET

จะเขียนคอมไพเลอร์จากภาษาเป้าหมายได้อย่างไร ?
เมื่อฉันเรียนรู้ภาษาโปรแกรมด้วยคอมไพเลอร์ที่เขียนด้วยภาษานั้นเป็นครั้งแรก มันทำให้เกิดคำถามกับฉัน: เป็นไปได้อย่างไรที่จะสร้างคอมไพเลอร์โดยใช้ภาษาเดียวกับที่ควรจะคอมไพล์ นี่คือวิธีการทำ
ในขั้นต้น คอมไพเลอร์ถูกเขียนด้วยภาษาโปรแกรมที่มีอยู่ และเมื่อภาษาพัฒนาเพียงพอแล้ว การพัฒนาคอมไพเลอร์สามารถเปลี่ยนไปใช้ภาษาที่กำลังคอมไพล์ได้ ทำให้คอมไพเลอร์สามารถสร้างตัวเองได้ คอมไพเลอร์ประเภทนี้เรียกว่าคอมไพเลอร์ที่โฮสต์เอง
ไขปริศนา!!!
อะไรทำให้โรสลินพิเศษ
Roslyn โดดเด่นกว่าคอมไพเลอร์อื่น ๆ ส่วนใหญ่เนื่องจากเหตุผลดังต่อไปนี้
- Roslyn เป็น โครงการโอเพ่นซอร์ส : ไม่เหมือนคอมไพเลอร์ส่วนใหญ่ซึ่งเป็นกรรมสิทธิ์และโอเพ่นซอร์ส Roslyn เป็นซอฟต์แวร์โอเพ่นซอร์ส ซึ่งหมายความว่าทุกคนสามารถดูซอร์สโค้ด แก้ไข และมีส่วนร่วมในโครงการได้ สิ่งนี้ทำให้มีความโปร่งใสและยืดหยุ่นมากขึ้น และช่วยให้นักพัฒนาสามารถสร้างต่อยอดได้
- Roslyn เป็นแพลตฟอร์มไม่ใช่แค่คอมไพเลอร์เท่านั้น Roslyn เป็นมากกว่าคอมไพเลอร์ เป็นแพลตฟอร์มที่สมบูรณ์สำหรับการสร้างคอมไพเลอร์และเครื่องมือภาษา ประกอบด้วยชุดของ API ที่ช่วยให้นักพัฒนาสามารถทำงานกับโครงสร้างไวยากรณ์ โมเดลความหมาย และองค์ประกอบภาษาอื่นๆ ในระดับละเอียด สิ่งนี้ทำให้สามารถสร้างเครื่องมือทางภาษาที่มีประสิทธิภาพ เช่น การวิเคราะห์โค้ด การปรับโครงสร้างใหม่ และการสร้างโค้ด
- Roslyn ให้ข้อเสนอแนะตามเวลาจริง : Roslyn ออกแบบมาเพื่อให้ข้อเสนอแนะตามเวลาจริงในขณะที่คุณเขียนโค้ด ขณะที่คุณพิมพ์ โปรแกรมแยกวิเคราะห์ของ Roslyn จะสร้างโครงสร้างไวยากรณ์จากโค้ดของคุณ และจะใช้โมเดลความหมายเพื่อวิเคราะห์และทำความเข้าใจโค้ด ซึ่งช่วยให้ IDE สามารถกรอกโค้ดที่สมบูรณ์ ตรวจสอบข้อผิดพลาด และคุณสมบัติอื่นๆ ที่ช่วยให้คุณเขียนโค้ดได้รวดเร็วและแม่นยำยิ่งขึ้น
- Roslyn เป็นข้ามแพลตฟอร์ม : ในขณะที่คอมไพเลอร์แบบดั้งเดิมมักจะเชื่อมโยงกับระบบปฏิบัติการเฉพาะ Roslyn ได้รับการออกแบบให้ข้ามแพลตฟอร์ม สามารถใช้สร้างแอปพลิเคชันสำหรับ Windows, Linux และ macOS ทำให้มีความยืดหยุ่นและปรับเปลี่ยนได้มากขึ้น
สถาปัตยกรรมของโรสลิน
ด้วยเลเยอร์ API ของ Roslyn ที่จำลองไปป์ไลน์คอมไพเลอร์แบบดั้งเดิม คุณจะสามารถเข้าถึงการวิเคราะห์โค้ดของคอมไพเลอร์ C# และ Visual Basic อย่างที่ไม่เคยมีมาก่อน มันเหมือนกับการผ่านหลังเวทีไปสู่การทำงานภายในของคอมไพเลอร์
ขั้นตอนการรวบรวมของ Roslyn สามารถแยกออกได้เป็นสองสามขั้นตอน
- การแยกวิเคราะห์
- ประกาศ
- ผูกพัน
- การปล่อย IL

การแยกวิเคราะห์
ขั้นตอนนี้ประกอบด้วยสองขั้นตอนย่อยซึ่งตามด้วยการแยกวิเคราะห์หลังการทำโทเค็น
- Tokenization —ในบริบทของคอมไพเลอร์ การทำ Token (หรือที่เรียกว่า lexing, การวิเคราะห์คำศัพท์) คือกระบวนการแปลงซอร์สโค้ดเป็นลำดับของสตริงที่มีความหมายที่กำหนด (โทเค็น) โปรแกรมที่ทำโทเค็นเรียกว่า tokenizer หรือ lexer
- การแยกวิเคราะห์ — ในเฟสการแยกวิเคราะห์เอาต์พุตจากเฟสโทเค็นจะใช้เพื่อสร้างโครงสร้างข้อมูลที่ชื่อว่าต้นไม้ไวยากรณ์นามธรรม ซึ่งให้การแสดงโครงสร้างของอินพุตในขณะที่ตรวจสอบไวยากรณ์ที่ถูกต้อง
ในเฟสนี้แหล่งที่มาและข้อมูลเมตาที่นำเข้าจะถูกวิเคราะห์เพื่อสร้างสัญลักษณ์ที่มีชื่อ
ผูกพัน
ขั้นตอนนี้จับคู่ตัวระบุในรหัสกับสัญลักษณ์
การปล่อย IL
ในเฟสนี้ รหัสเป็นภาษากลางจะถูกปล่อยออกมาพร้อมกับข้อมูลทั้งหมด
ด้วยการใช้คอมไพเลอร์แบบทันเวลา (JIT) ที่เหมาะสม ทำให้สามารถรันโค้ด IL บนสถาปัตยกรรมคอมพิวเตอร์ใดๆ ที่เข้ากันได้กับคอมไพเลอร์ JIT
ควบคู่ไปกับแต่ละขั้นตอนเหล่านี้ในการรวบรวม แพลตฟอร์มคอมไพเลอร์ .NET เปิดเผยชุดของ API ที่อนุญาตให้เข้าถึงข้อมูลจากแต่ละขั้นตอนเหล่านั้น
- Parser — Syntax Tree API
- ขั้นตอนการประกาศ — Symbols API
- Binder — API การวิเคราะห์การเชื่อมโยงและโฟลว์
- IL Emitter — ปล่อย API


SDK คอมไพเลอร์ .NET ประกอบด้วย API หลายเลเยอร์
API ของคอมไพเลอร์
API เหล่านี้ประกอบด้วยโมเดลวัตถุที่สอดคล้องกับข้อมูลที่เปิดเผยในแต่ละเฟสของไพพ์ไลน์คอมไพเลอร์ รวมถึงข้อมูลวากยสัมพันธ์และความหมาย
ประกอบด้วย สแน็ปช็อต ที่ไม่เปลี่ยนรูปแบบของการเรียกใช้คอมไพเลอร์เดี่ยว รวมถึงการอ้างอิงแอสเซมบลี ตัวเลือกคอมไพเลอร์ และไฟล์ซอร์สโค้ด
โดยที่ไม่เปลี่ยนรูปหมายความว่าเมื่อเราเปลี่ยนวัตถุ สำเนาที่แก้ไขจะถูกส่งกลับ
การเปลี่ยนแปลงไม่ได้นี้ช่วยรักษาความปลอดภัยของเธรด และให้ประโยชน์ด้านประสิทธิภาพ
มี API ที่แตกต่างกันสองรายการที่แสดงถึงภาษา C# และภาษา Visual Basic
API การวินิจฉัย
ในกระบวนการคอมไพล์ คอมไพเลอร์จะสร้างข้อมูลการวินิจฉัยเกี่ยวกับโค้ด รวมถึงข้อผิดพลาดทางไวยากรณ์ คำเตือน และสถิติ
เลเยอร์ API ของคอมไพเลอร์เปิดเผยข้อมูลข้างต้นผ่าน API ที่ขยายได้ซึ่งอนุญาตให้เสียบตัววิเคราะห์ที่ผู้ใช้กำหนดเข้ากับกระบวนการคอมไพล์
API การเขียนสคริปต์
เลเยอร์คอมไพเลอร์ของ Roslyn รวมถึงโฮสติ้งและสคริปต์ API ซึ่งช่วยให้ผู้ใช้สามารถเรียกใช้ข้อมูลโค้ดและสร้างบริบทการดำเนินการรันไทม์
REPL แบบโต้ตอบ C# (Read-Evaluate-Print Loop) ใช้ API เหล่านี้ ช่วยให้ผู้ใช้สามารถใช้ประโยชน์จาก C# เป็นภาษาสคริปต์และรันโค้ดแบบโต้ตอบได้ในขณะที่เขียน

API พื้นที่ทำงาน
API เหล่านี้ทำหน้าที่เป็นจุดเริ่มต้นสำหรับการวิเคราะห์โค้ดและการปรับโครงสร้างใหม่สำหรับโซลูชันทั้งหมด
ยิ่งไปกว่านั้น เลเยอร์ Workspaces ของ Roslyn ยังเปิดเผยช่วงของ API ที่ใช้ในขณะที่สร้างเครื่องมือวิเคราะห์โค้ดและปรับโครงสร้างที่ทำงานภายในสภาพแวดล้อมโฮสต์ เช่น Visual Studio IDE
การใช้งานบางอย่างของ API เหล่านี้ ได้แก่ การจัดรูปแบบ ค้นหาการอ้างอิงทั้งหมด และ API การสร้างรหัส
สรุป
จากความรู้ที่เราได้รับมาจนถึงตอนนี้ เห็นได้ชัดว่าโรสลินเป็นจุดเปลี่ยนที่สำคัญในวิวัฒนาการของคอมไพเลอร์
มันทำหน้าที่เป็นแหล่งความรู้และแรงบันดาลใจสำหรับภาษาโปรแกรมและคอมไพเลอร์ที่กำลังจะมาถึง
ในความเห็นของฉัน การตัดสินใจของไมโครซอฟท์ในการทำให้เทคโนโลยีนี้เป็นเทคโนโลยีโอเพนซอร์สนั้นถือเป็นเรื่องที่สำคัญอย่างยิ่ง เนื่องจากทำให้ชุมชนทั่วโลกสามารถทำงานร่วมกันและเพิ่มขีดความสามารถได้ ซึ่งเป็นการปูทางไปสู่อนาคตที่สดใส
วิธีการมีส่วนร่วม
ซอฟต์แวร์โอเพ่นซอร์สมีชัยเหนือเนื่องจากการบริจาคจากบุคคลที่มีความกระตือรือร้นจากชุมชน การพัฒนา Roslyn เกิดขึ้นผ่าน GitHub หากคุณต้องการมีส่วนร่วม นี่คือลิงก์ไปยังแนวทางการสนับสนุนที่ให้ไว้ในที่เก็บ GitHub
https://github.com/dotnet/roslyn/blob/main/docs/contributing/Building%2C%20Debugging%2C%20and%20Testing%20on%20Windows.md
อ้างอิง
คู่มือ C# บนแพลตฟอร์มการเรียนรู้ของ Microsoft
https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/
บทความวิกิพีเดีย
https://en.wikipedia.org/wiki/Roslyn_(compiler)— ในโรสลิน
https://en.wikipedia.org/wiki/Lexical_analysis— ในการวิเคราะห์คำศัพท์
https://en.wikipedia.org/wiki/Parsing#Parser— ในการแยกวิเคราะห์
https://en.wikipedia.org/wiki/Self-hosting_(compilers)— ในการโฮสต์ด้วยตนเอง
Xamarin University บรรยายโดย Matthew Robins
https://youtu.be/Gv7vuA-7UVA
ที่เก็บ GitHub ของ Roslyn
https://github.com/dotnet/roslyn
วิดีโอโดย Velocity Code
https://youtu.be/8KdW_VfqLIg
บทความ Techopedia เกี่ยวกับภาษาระดับกลาง
https://www.techopedia.com/definition/24290/intermediate-language-il-net
บทความ “เมื่อโอเพ่นซอร์สมาถึง Microsoft” โดย Richard Campbell
https://www.codemag.com/Article/2009041/When-Open-Source-Came-to-Microsoft#:~:text=NET%20Framework%20open%2Dsource%3B%20the,%2C%20build%2C%20and%20test%20systems.