26 มกราคม 2567
การออกแบบและการพัฒนาตัวแปลรหัส C# เป็น C++ ได้รับการดำเนินการโดยทีม CodePorting เท่านั้น ซึ่งต้องการการสำรวจหลายครั้ง การใช้วิธีการหลายวิธี และการทดสอบที่แตกต่างกันตามแบบจำลองหน่วยความจำและด้านอื่น ๆ ในที่สุด ได้เลือกสองวิธี หนึ่งในนั้นกำลังใช้งานอยู่ในการเปิดตัว C++ ของผลิตภัณฑ์ Aspose ค่ะ
ตอนนี้เรามาพูดถึงเทคโนโลยีที่ใช้ในโปรแกรมแปลภาษา. โปรแกรมแปลภาษาเป็นแอปพลิเคชันคอนโซลที่เขียนด้วยภาษา C# ซึ่งทำให้สามารถฝังลงในสคริปต์ที่ทำการทดสอบเช่น แปล-คอมไพล์-ทดสอบ ได้ง่าย ๆ นอกจากนี้ยังมีส่วนของ GUI ที่ช่วยให้คุณสามารถทำเหมือนกันได้โดยการคลิกที่ปุ่ม
การวิเคราะห์ไวยากรณ์ถูกดำเนินการโดยไลบรารี NRefactory ในรุ่นที่เก่าของโปรแกรมแปลภาษาและโดย Roslyn ในรุ่นใหม่
โปรแกรมแปลภาษาใช้การวิ่งผ่าน AST tree หลายครั้งเพื่อเก็บข้อมูลและสร้างรหัส C++ ที่เป็นผลลัพธ์ สำหรับรหัส C++ ไม่มีการสร้าง AST representation แทนที่เราจะจัดการรหัสผลลัพธ์ในรูปแบบข้อความเท่านั้น
มีกรณีหลาย ๆ ครั้งที่ต้องการข้อมูลเพิ่มเติมเพื่อปรับแต่งโปรแกรมแปลภาษา ข้อมูลเหล่านี้ถูกส่งผ่านทางตัวเลือกและแอตทริบิวต์ ตัวเลือกถูกใช้กับโปรเจคทั้งหมด โดยทั่วไปใช้เพื่อระบุชื่อแมโครส่งออกคลาสหรือสัญลักษณ์เงื่อนไข C# ที่ใช้ในการวิเคราะห์รหัส แอตทริบิวต์ถูกใช้กับประเภทและองค์ประกอบและให้ข้อมูลเฉพาะเจาะจงสำหรับเขา เช่น: ระบุว่าสมาชิกคลาสต้องการคุณลักษณะ const
หรือ mutable
ในรหัสที่แปลหรือว่าเอนทิตีใดต้องการถูกยกเว้นจากการแปล
เมื่อแปลจาก C# เป็น C++, คลาสและโครงสร้างจะถูกแปลงเป็นคลาส C++. สมาชิกและรหัสต้นฉบับของพวกเขาจะถูกแปลงเป็นความใกล้เคียงที่สุด ประเภทและเมธอดทั่วไปจะถูกแมปเป็นเทมเพลต C++. การอ้างอิง C# จะถูกแปลงเป็นสมาร์ทพอยน์เตอร์ (shared หรือ weak). คลาสอ้างอิงถูกกำหนดไว้ใน Library. รายละเอียดภายในของตัวแปลรหัสจะถูกอธิบายใน บทความ ที่แยกออกมา
ดังนั้น โปรเจคที่ถูกแปลงจาก C# เป็น C++ ขึ้นอยู่กับ Library ของเราแทนที่จะใช้ .NET libraries:
เพื่อสร้าง Library และโปรเจคที่ถูกแปลงของตัวแปลรหัส ณ จุดนี้เราใช้ Cmake ในการสนับสนุน. ณ ขณะนี้เราสนับสนุนคอมไพล์เลเวล VS 2017 และ 2019 (Windows), GCC, และ Clang (Linux).
เหมือนที่กล่าวไว้แล้ว ส่วนใหญ่ของการประยุกต์ใช้ .NET ของเราเป็นตัวอ่อนที่ปรับใช้กับไลบรารีของบุคคลที่สาม ซึ่งรวมถึง:
ทั้ง Translator และ Library ได้รับการทดสอบอย่างละเอียด การทดสอบของ Library ใช้ GoogleTest framework ส่วนการทดสอบของ Translator ส่วนใหญ่เขียนด้วย NUnit/xUnit และแบ่งเป็นหลายหมวดหมู่เพื่อให้แน่ใจว่า:
เราใช้ GitLab เป็นระบบควบคุมเวอร์ชัน สำหรับ CI เราใช้ Jenkins ผลิตภัณฑ์ที่ถูกแปลงมีให้ใช้เป็นแพ็คเกจ NuGet และเป็นไฟล์เก็บถาวรที่สามารถดาวน์โหลดได้
ในระหว่างการทำงานกับโครงการนี้เราพบกับปัญหาต่าง ๆ มากมาย บางส่วนเป็นปัญหาที่คาดคะเนไว้ และอื่น ๆ ถูกเปิดเผยขึ้นมาในระหว่างการทำงาน:
Object
และคลาสในไลบรารีส่วนใหญ่ไม่มี RTTI ซึ่งทำให้เป็นไปไม่ได้ที่จะทำการแมปประเภทของ .NET ไปยัง STL ได้yield
)แม้ว่าจะมีปัญหาเหล่านี้ โครงการแปลรหัสยังคงน่าสนใจอย่างมากจากมุมมองทางเทคนิค และความซับซ้อนทางวิชาการของมันทำให้เราเรียนรู้สิ่งใหม่ๆ ตลอดเวลา
ในระหว่างการทำงานในโครงการแปลรหัส พวกเราได้ประสบความสำเร็จในการสร้างระบบที่แก้ปัญหางานวิชาการที่น่าสนใจเกี่ยวกับการแปลรหัส พวกเราได้จัดการเผยแพร่ Aspose libraries รายเดือนสำหรับภาษาที่ไม่ควรทำงานด้วย
มีแผนที่จะเผยแพร่บทความเพิ่มเติมเกี่ยวกับโครงการแปลรหัส บทความถัดไป จะอธิบายกระบวนการแปลงอย่างละเอียด รวมถึงวิธีที่โครงสร้าง C# ที่เป็นที่แน่นอนถูกแมปไปยัง C++ อีกอย่าง บทความอื่น ๆ จะพูดถึงรูปแบบการจัดการหน่วยความจำ
เราจะพยายามตอบคำถามที่ถามมาให้ดีที่สุด หากผู้อ่านสนใจด้านอื่น ๆ ของการพัฒนาโครงการแปลรหัส เราอาจพิจารณาเขียนบทความเพิ่มเติมเกี่ยวกับมัน