Kodgenerasyonda sayısal adres yerine kalıcı IAddress kullanmak
HydraScript adlı C# dil yorumlayıcısının yazarı, kodgenerasyonda sayısal indeks yerine kalıcı IAddress nesnelerine geçişi anlatıyor. Bu yaklaşım, instruction ekleme, silme ve değiştirme sırasında adreslerin bozulmasını önlüyor. Visitor deseniyle AST'yi işleyen derleyici ya da yorumlayıcı yazan .NET geliştiricileri için somut bir mimari örnek.
Kilit noktalar
- Numerik indeks, instruction silindiğinde veya eklendiğinde kayar; bu da jump hedeflerini bozar.
- IAddress, bir instruction'ın konumundan bağımsız kimliğidir ve her adres Next bağlantısı taşır.
- AddressedInstructions, LinkedList ile iki Dictionary kombinasyonuyla uygulanır.
- Replace, yeni instruction'a eski adresi devreder; böylece gelen jump'lar bozulmaz.
- Remove sonrası önceki adresin Next alanı yeniden bağlanmalıdır, ancak ona işaret eden Goto'lar ayrıca ele alınmalıdır.
- Fragment eklerken AddRange, iç referansları korur, ofset hesabı gerekmez.
HydraScript dil yorumlayıcısında kodgenerasyon, sayısal adreslere dayandığı için yanlış jump hedefleri üretiyor ve statik analiz bir süre devre dışı bırakılmak zorunda kalıyor. Yazar, mantığı AST düğümlerinden ayırıp Visitor desenine geçerken adres hesaplamasını da yeniden tasarlamış.
Yeni çözümde her instruction, konumundan bağımsız bir IAddress nesnesiyle tanımlanıyor. AddressedInstructions tipi bağlı liste ile sözlükleri birleştiriyor, her instruction ise bir sonraki adresini Next özelliğiyle tutuyor. Silme ve Replace işlemleri adresleri koruyor, fragment ekleme de iç referansları kendiliğinden taşıyor. Yazının kendisi, bu yapının kodunu ve sonuçlarını ayrıntılı gösteriyor; derleyici yazan geliştiriciler için okumaya değer.
Gerçek dünyada kullanımı
- Kendi dilini ya da DSL'ini C# ile yazan ekibin bytecode üreticisi ve sanal makinesi.
- Optimizasyon geçişleri ekleyen bir derleyici ön ucunda dead-code elimination yapılması.
- Visitor deseniyle AST işleyen ve dallanma içeren kod üreten bir yorumlayıcı.
Neden önemli
Sayısal adresleme, her optimizasyon ya da kod değişikliğinde indeksleri elle yeniden hesaplatır ve hatayı kolayca gizler. Kalıcı adres kavramı, derleyici geliştirmede bu tür hataları yapısal olarak azaltır.