ไมโครซอฟท์ช่วยเปิด Win32 API ให้ภาษาอื่นนอกจาก C/C++ เริ่มต้นที่ C# และ Rust

by mk
23 January 2021 - 03:03

ไมโครซอฟท์มีแนวทางหลอมรวม Win32 และ UWP เข้าด้วยกันภายใต้ Project Reunion ซึ่งประกอบด้วยโครงการย่อยหลายอย่าง เป้าหมายข้อหนึ่งของ Reunion คือเปิดให้ใช้ภาษาโปรแกรมรุ่นใหม่ๆ เขียนแอพบนวินโดวส์ได้หลากหลายขึ้น

ข้อจำกัดสำคัญของ Win32 API แบบดั้งเดิมคือมันถูกสร้างขึ้นในยุคภาษา C/C++ จึงรองรับเฉพาะภาษานี้ หากต้องการเขียนโปรแกรม Win32 ด้วยภาษาโปรแกรมอื่น จำเป็นต้องมี binding หรือ wrapper มาทำหน้าที่เชื่อมต่อ API ให้

ที่ผ่านมามีโครงการสร้าง binding/wrapper ของภาษาต่างๆ แต่เป็นโอเพนซอร์สที่สร้างโดยชุมชนนักพัฒนา และกระบวนการรองรับ API ต้องทำกันเองด้วยมือทั้งหมด จึงมีปัญหาเรื่องรองรับ API ไม่ครบถ้วน ส่งผลให้ binding ของแต่ละภาษามีคุณภาพต่างกัน ทำงานซ้ำซ้อนกันแต่ไม่สมบูรณ์สักอัน

ล่าสุดไมโครซอฟท์เข้ามาแก้ปัญหานี้ด้วยโครงการ win32metadata ที่เป็นการสร้าง metadata ของ API ทั้งหมดออกมาเป็นภาษาต่างๆ ให้อัตโนมัติ

เบื้องหลังของโครงการ win32metadata คือการไล่อ่านไฟล์ header ของ Windows SDK ทั้งหมด ดูว่าไฟล์ DLL อิมพอร์ตฟังก์ชันใดบ้าง (ด้วยคอมไพเลอร์ ClangSharp) แล้วเจนเป็นไฟล์ Windows Metadata (.winmd) เพื่อให้นักพัฒนา wrapper ในภาษาอื่นๆ สามารถนำไปใช้ต่อได้ง่าย

ตัวอย่างหน้าตาของไฟล์ .winmd ที่สร้างด้วย win32metadata

ไมโครซอฟท์ร่วมมือกับนักพัฒนาโครงการโอเพนซอร์ส 2 ตัว ได้แก่ PInvoke สำหรับภาษา C# และ winapi-rs สำหรับภาษา Rust นำเครื่องมือ metadata ตัวนี้มาใช้งานแล้ว โดยฝั่งของ C# ออกมาเป็นรูปเป็นร่างแล้วในชื่อโครงการ Cs/Win32 ส่วนโครงการ Rust ชื่อว่า windows-rs

ไมโครซอฟท์บอกว่า C# และ Rust เป็นแค่จุดเริ่มต้นเท่านั้น ตอนนี้กำลังรองรับภาษาที่สามคือ Modern C++ (มาตรฐานใหม่คือ C++17 ขึ้นไป) และจะใช้แนวทางจับมือกับโครงการโอเพนซอร์สที่มีอยู่แล้ว เพื่อขยายไปยังภาษาอื่นๆ ต่อไป

ที่มา - Microsoft

Blognone Jobs Premium