Yıllar önce bir sabah kendi kendini değiştiren bir kodda hata ayıklamaya çalıştım, bir talimat aşağıdaki talimatın hedef adresini değiştirdi, yani bir şube adresini hesaplıyordum. Assembly dilinde yazılmıştı ve programa her seferinde bir talimat girdiğimde mükemmel çalıştı. Ama programı çalıştırdığımda başarısız oldu. Sonunda, makinenin bellekten 2 talimat aldığını ve (talimatlar bellekte düzenlendiği için) değiştirdiğim talimatın zaten getirildiğini ve bu nedenle makinenin talimatın değiştirilmemiş (yanlış) sürümünü çalıştırdığını fark ettim. Elbette, hata ayıklarken, bir seferde yalnızca bir talimat veriyordu.
Demek istediğim, kendi kendini değiştiren kod, test etmek / hata ayıklamak için son derece kötü olabilir ve genellikle makinenin davranışına (donanım veya sanal) ilişkin gizli varsayımlara sahiptir. Dahası, sistem (şimdi) çok çekirdekli makinelerde yürütülen çeşitli iş parçacıkları / süreçler arasında kod sayfalarını asla paylaşamaz. Bu, sanal belleğe, vb. Birçok avantajı ortadan kaldırır. Ayrıca, donanım düzeyinde yapılan şube optimizasyonlarını da geçersiz kılar.
(Not - JIT'i kendi kendini değiştiren kod kategorisine dahil etmedim. JIT, kodun bir gösteriminden alternatif bir gösterime çeviri yapıyor, kodu değiştirmiyor)
Sonuçta, bu sadece kötü bir fikir - gerçekten temiz, gerçekten belirsiz, ama gerçekten kötü.
Tabii ki - sahip olduğunuz tek şey 8080 ve ~ 512 baytlık bir bellekse, bu tür uygulamalara başvurmanız gerekebilir.