15 Şubat 2024
İlk bakışta, çevirmenin onu kullanmanın tek bir yolu var gibi görünebilir: C# kodunu besleyerek, çıktı olarak eşdeğer C++ kodunu almayı bekliyoruz. Aslında bu yol en yaygın olanıdır, ancak tek yol olmaktan uzaktır. Aşağıda kod çeviri çerçevesi ve ilgili yardımcı programlar tarafından sağlanan diğer modlar bulunmaktadır.
Ürünler, kodu diğer dillere çevirme prosedürünün ayrıntılarını ve bununla ilgili sınırlamaları öğrenmesi gereken programcılar tarafından geliştirilir. Sonuç olarak, ürün geliştiricileri tarafından yapılan C# değişikliklerinin diğer diller için yayın sürecini bozduğu doğru olduğunda durumlar ortaya çıkar.
Proje geliştirilirken, bu tür sorunların otomatik olarak tespit edilmesi için birkaç yol denedik:
C# dil sürümünü sınırlamak, C# programcılarından disiplin gerektirir ve genellikle zahmetlidir. Bu kısıtlamaları aşmanın bir yolu, çeviriyi iki aşamada yapmaktır: önce modern C# dilinin yapılarını geçmiş standartlardan desteklenen benzerleriyle değiştirin ve ardından doğrudan çeviriye geçin.
Eski bir ayrıştırıcıya dayalı bir çevirmen kullanırken düşürme işlemi yalnızca harici araçlar kullanılarak yapılabilir (örneğin, Roslyn temelinde yazılmış yardımcı programlar). Öte yandan, Roslyn'e dayalı çevirmenler her iki aşamayı ardışık olarak gerçekleştirir, bu da onlar tarafından çevrilen kodun yanı sıra daha eski araçlarla çeviri için kod hazırlarken aynı kodu kullanmanıza olanak tanır.
Bu, ürün kodunu çevirmeye benzer, ancak biraz farklı gereksinimleri içerir. On milyonlarca satırdan oluşan bir kütüphaneyi çevirirken, öncelikle orijinal C# kodunun davranışını mümkün olduğunca kesin bir şekilde takip etmek önemlidir – daha basit ama farklı etkileri olan kodun hata ayıklaması daha uzun sürebilir. Öte yandan, çevrilen kodun kullanım örnekleri, C# ile yazılmış orijinal örneklerin davranışına uymasa bile, mümkün olduğunca basit görünmelidir ve kodun C++'da nasıl kullanılacağını açıkça göstermelidir.
Örneğin, C# programcıları, geçici nesneler oluştururken genellikle using deyimi kullanarak kaynak sızıntılarını önler ve bunların serbest bırakılma anını kesin olarak ayarlar, GC'ye güvenmezler. Using ifadesinin katı bir çevirisi, “using
ifadesi bloğunda bir istisna fırlatılırsa ve Dispose()
da bir istisna fırlatırsa, hangisi yakalama bağlamında sona erer?” Türündeki birçok ince ayrıntı nedeniyle oldukça karmaşık C++ kodu verir. Bu tür kod, C++ programcısını yanıltır ve kütüphanenin kullanımının zor olduğu izlenimini yaratır, ancak aslında yığın üzerinde akıllı bir işaretçiye sahip olmak yeterlidir; bu işaretçi, doğru anıda nesneyi siler ve kaynakları serbest bırakır.
API sağlayan kütüphaneler, C# uygulamalarına uygun olarak XML yorumları aracılığıyla belgelendirilebilir. Örneğin, Doxygen formatında C++'a yorumları aktarmak basit bir görev değildir. İşaretleme dışında, türlerin referanslarını (çünkü C# tam adları nokta ile yazılırken, C++ çift iki nokta ile yazılır) ve üyelerini, kullanılan özelliklerin ise bir getirici mi yoksa bir ayarlayıcı mı olduğunu anlamak gereklidir. Ayrıca, anlamsız ve eksik olabilen kod parçalarını çevirmek gerekir.
Bu görev, çevirmenin kendisi ve dışsal yardımcı programlar aracılığıyla çözülür; örneğin, oluşturulan XML belgelerini analiz ederek ve yöntem kullanım örnekleri gibi ek parçaları hazırlayarak.
Gördüğümüz gibi, C# kodunu C++'a yüksek kalitede çevirmenin yanı sıra, kaynak kodunun çevrilebilirliğini belirleyebilen, gerektiğinde dil sürümünü düşürebilen, dönüştürülen kütüphanelerin kullanım örneklerini ve belgelerini çevirebilen profesyonel bir çerçeve olmalıdır.