Bertahun-tahun yang lalu saya menghabiskan pagi mencoba untuk men-debug beberapa kode modifikasi diri, satu instruksi mengubah alamat target dari instruksi berikut, yaitu, saya sedang menghitung alamat cabang. Itu ditulis dalam bahasa assembly dan bekerja dengan sempurna ketika saya mengikuti instruksi program satu per satu. Tetapi ketika saya menjalankan program itu gagal. Akhirnya, saya menyadari bahwa mesin sedang mengambil 2 instruksi dari memori dan (seperti instruksi yang diletakkan dalam memori) instruksi yang saya modifikasi telah diambil dan dengan demikian mesin sedang menjalankan versi instruksi yang tidak dimodifikasi (salah). Tentu saja, ketika saya men-debug, itu hanya melakukan satu instruksi dalam satu waktu.
Maksud saya, kode yang mengubah diri sendiri bisa sangat buruk untuk diuji / debug dan sering kali memiliki asumsi tersembunyi mengenai perilaku mesin (baik itu perangkat keras atau virtual). Selain itu, sistem tidak pernah dapat membagikan halaman kode di antara berbagai thread / proses yang dijalankan pada mesin multi-core (sekarang). Ini mengalahkan banyak manfaat untuk memori virtual, dll. Ini juga akan membatalkan pengoptimalan cabang yang dilakukan di tingkat perangkat keras.
(Catatan - saya tidak memasukkan JIT dalam kategori kode modifikasi diri. JIT menerjemahkan dari satu representasi kode ke representasi alternatif, itu tidak mengubah kode)
Secara keseluruhan, itu hanya ide yang buruk - sangat rapi, sangat tidak jelas, tetapi sangat buruk.
tentu saja - jika yang Anda miliki hanyalah memori 8080 dan ~ 512 byte, Anda mungkin harus menggunakan praktik semacam itu.