Herhangi bir akıllı çalışma zamanı kodu değişikliği durumu var mı?


119

Çalışma zamanı kod değişikliği için herhangi bir meşru (akıllı) kullanım (çalışma zamanında kendi kodunu değiştiren program) düşünebiliyor musunuz?

Bu teknik virüsler tarafından tespit edilmekten kaçınmak için kullanıldığından, modern işletim sistemleri bunu yapan programlara kaşlarını çatıyor gibi görünüyor.

Tüm düşünebildiğim, derleme zamanında bilinemeyen bir şeyi çalışma zamanında bilerek bazı kodları kaldıracak veya ekleyecek bir tür çalışma zamanı optimizasyonu.


8
Modern mimarilerde, önbelleğe alma ve talimat ardışık düzenine kötü bir şekilde müdahale eder: kendi kendini değiştiren kod, önbelleği değiştirmez, bu nedenle engellere ihtiyacınız olur ve bu muhtemelen kodunuzu yavaşlatır. Ve zaten komut kanalında bulunan kodu değiştiremezsiniz. Bu nedenle, kendi kendini değiştiren koda dayalı herhangi bir optimizasyonun, örneğin bir çalışma zamanı kontrolünden daha üstün bir performans etkisine sahip olması için kod çalıştırılmadan önce gerçekleştirilmesi gerekir.
Alexandre C.

7
@Alexandre: Kendi kendini değiştiren kodun, keyfi sayıda çalıştırılmasına rağmen nadiren değişiklik yapması (örneğin bir, iki kez) yaygındır, bu nedenle tek seferlik maliyet önemsiz olabilir.
Tony Delroy

7
Bunun için herhangi bir mekanizma olmadığı için bunun neden C veya C ++ olarak etiketlendiğinden emin değilim.
MSalters

4
@Alexandre: Microsoft Office'in tam olarak bunu yaptığı biliniyor. Sonuç olarak (?) Tüm x86 işlemcileri kendi kendini değiştiren kod için mükemmel desteğe sahiptir. Diğer işlemcilerde, her şeyi daha az çekici kılan maliyetli senkronizasyon gereklidir.
Mackie Messer

3
@Cawas: Genellikle otomatik güncelleme yazılımı yeni derlemeleri ve / veya çalıştırılabilirleri indirir ve mevcut olanların üzerine yazar. Ardından yazılımı yeniden başlatacaktır. Bu firefox, adobe vb. Kendi kendini değiştirme tipik olarak, çalışma zamanı sırasında kodun bazı parametreler nedeniyle uygulama tarafından bellekte yeniden yazılması ve mutlaka diske geri gönderilmemesi anlamına gelir. Örneğin, bu yolları akıllıca tespit edebiliyorsa, yürütmeyi hızlandırmak için bu belirli çalıştırma sırasında kullanılmayacaksa, tüm kod yollarını optimize edebilir.
NotMe

Yanıtlar:


117

Kod değişikliği için birçok geçerli durum vardır. Çalışma zamanında kod oluşturmak aşağıdakiler için yararlı olabilir:

  • Bazı sanal makineler performansı artırmak için JIT derlemesini kullanır.
  • Üretme uzmanlaşmış işlevleri anında uzun bilgisayar grafikleri ortak olmuştur. Örneğin, Rob Pike ve Bart Locanthi ve John Reiser Donanım Yazılımında Bitmap Graphics on the Blit (1984) veya Chris Lattner tarafından Apple'ın OpenGL yığınlarında çalışma zamanı kod uzmanlığı için LLVM kullanımı hakkındaki bu gönderiye (2006) bakın .
  • Bazı durumlarda yazılım , yığın üzerinde (veya başka bir yerde) dinamik kod oluşturulmasını içeren trambolin olarak bilinen bir tekniğe başvurur . Örnekler, GCC'nin yuvalanmış işlevleri ve bazı Unices'in sinyal mekanizmasıdır .

Bazen kod çalışma zamanında koda çevrilir (buna dinamik ikili çeviri denir ):

  • Apple'ın Rosetta'sı gibi emülatörler , öykünmeyi hızlandırmak için bu tekniği kullanır. Başka bir örnek, Transmeta'nın kod dönüştürme yazılımıdır .
  • Valgrind veya Pin gibi gelişmiş hata ayıklayıcılar ve profil oluşturucular , kodunuz yürütülürken onu kullanmak için kullanır.
  • X86 komut setine uzantılar yapılmadan önce, VMWare gibi sanallaştırma yazılımları , sanal makinelerde ayrıcalıklı x86 kodunu doğrudan çalıştıramıyordu. Bunun yerine, sorunlu talimatları anında daha uygun özel koda çevirmesi gerekiyordu.

Kod değişikliği, komut setinin sınırlamalarını aşmak için kullanılabilir:

  • Bilgisayarların bir alt yordamdan geri dönme veya dolaylı olarak belleği adresleme talimatı olmadığı bir zaman (uzun zaman önce, biliyorum) vardı. Kendi kendini değiştiren kod, alt yordamları, işaretçileri ve dizileri uygulamanın tek yoluydu .

Daha fazla kod değişikliği durumu:

  • Birçok hata ayıklayıcı, kesme noktalarını uygulama talimatlarının yerini alır .
  • Bazı dinamik bağlayıcılar çalışma zamanında kodu değiştirir. Bu makale , etkin bir kod değişikliği biçimi olan Windows DLL'lerinin çalışma zamanında yeniden konumlandırılması hakkında bazı arka plan bilgileri sağlar.

10
Bu liste, kendisini değiştiren kod örneklerini ve bağlayıcılar gibi diğer kodu değiştiren kodu karıştırıyor gibi görünüyor.
AShelly

6
@AShelly: Dinamik bağlayıcı / yükleyicinin kodun bir parçası olduğunu düşünürseniz, o zaman kendini değiştirir. Aynı adres alanında yaşıyorlar, bu yüzden bunun geçerli bir bakış açısı olduğunu düşünüyorum.
Mackie Messer

1
Tamam, liste artık programlar ve sistem yazılımı arasında ayrım yapıyor. Umarım bu mantıklı gelir. Sonunda herhangi bir sınıflandırma tartışmaya açıktır. Her şey, programın (veya kodun) tanımına tam olarak ne dahil ettiğinize bağlıdır.
Mackie Messer

35

Bu, bilgisayar grafiklerinde, özellikle optimizasyon amacıyla yazılım oluşturucularda yapılmıştır. Çalışma zamanında birçok parametrenin durumu incelenir ve rasterizer kodunun optimize edilmiş bir sürümü oluşturulur (potansiyel olarak birçok koşullu ortadan kaldırır), bu da birinin grafik temellerini, örneğin üçgenleri çok daha hızlı oluşturmasına izin verir.


5
İlginç bir okuma, Michael Abrash'ın DDJ hakkındaki 3 Parçalı Pixomatic makaleleridir: drdobbs.com/architecture-and-design/184405765 , drdobbs.com/184405807 , drdobbs.com/184405848 . İkinci bağlantı (Bölüm2), piksel boru hattı için Pixomatic kod kaynakçısından bahseder.
typo.pl

1
Konuyla ilgili çok güzel bir makale. 1984'ten, ama yine de iyi bir okuma: Rob Pike ve Bart Locanthi ve John Reiser. Saldırıda Bitmap Grafikleri için Donanım Yazılım Değişimi .
Mackie Messer

5
Charles Petzold, bu türden bir örneği "Güzel Kod" başlıklı bir kitapta açıklıyor: amazon.com/Beautiful-Code-Leading-Programmers-Practice/dp/…
Nawaz

3
Bu cevap kod üretmekten bahsediyor , ancak soru kodun değiştirilmesiyle ilgili ...
Timwi

3
@Timwi - kodu değiştirdi. Büyük bir if's zincirini ele almak yerine, şekli bir kez ayrıştırdı ve oluşturucuyu yeniden yazdı, böylece her seferinde kontrol etmek zorunda kalmadan doğru şekil türü için ayarlandı. İlginç bir şekilde, bu artık açık kod ile ortaktır - anında derlendiğinden, çalışma zamanında belirli bir durum için yeniden yazabilirsiniz
Martin Beckett

23

Asm komut kümesi sen olabilir bazı gerekli talimatı yoksun çünkü biri geçerli nedendir inşa kendini. Örnek: x86'da bir kayıttaki değişkene bir kesme yaratmanın bir yolu yoktur (örneğin, ax içindeki kesme numarasıyla kesme yapmak). Yalnızca işlem koduna kodlanmış sabit sayılara izin verildi. Kendi kendini değiştiren kodla bu davranışı taklit edebiliriz.


Yeterince adil. Bu tekniğin herhangi bir kullanımı var mı? Tehlikeli görünüyor.
Alexandre C.

4
@Alexandre C .: Eğer doğru hatırlıyorsam, birçok çalışma zamanı kitaplığı (C, Pascal, ...) Interrupt çağrılarını gerçekleştirmek için DOS çarpı bir işlevi yapmak zorunda kaldı. Bu tür bir işlev, kesme numarasını parametre olarak aldığından, böyle bir işlevi sağlamanız gerekir (elbette sayı sabit olsaydı, doğru kodu oluşturabilirdiniz, ancak bu garanti edilmezdi). Ve tüm kütüphaneler, kendi kendini değiştiren kodla uyguladı.
flolo

Kod değişikliği yapmadan bunu yapmak için bir anahtar durumu kullanabilirsiniz.
Boyut

17

Bazı derleyiciler bunu statik değişken başlatma için kullanır ve sonraki erişimler için koşullu maliyetten kaçınırdı. Başka bir deyişle, "bu kodu yalnızca bir kez çalıştırır", ilk çalıştırıldığında bu kodu işlemsiz kodun üzerine yazarak uygularlar.


1
Çok güzel, özellikle de muteks kilitlerinden / kilit açmalarından kaçınıyorsa.
Tony Delroy

2
Gerçekten mi? ROM tabanlı kod için veya yazma korumalı kod segmentinde yürütülen kod için bu nasıl olur?
Ira Baxter

1
@Ira Baxter: Yeniden konumlandırılabilir kod yayan herhangi bir derleyici, kod segmentinin en azından başlangıç ​​sırasında yazılabilir olduğunu bilir. Yani "bazı derleyiciler kullandı" ifadesi hala mümkün.
MSalters

17

Birçok durum var:

  • Virüsler, yürütmeden önce kodlarını "gizlemek" için genellikle kendi kendini değiştiren kod kullanırlar, ancak bu teknik aynı zamanda sinir bozucu ters mühendislik, kırma ve istenmeyen bilgisayar korsanlığı için de yararlı olabilir.
  • Bazı durumlarda, çalışma süresi sırasında (örneğin yapılandırma dosyasını okuduktan hemen sonra) - sürecin geri kalanında - belirli bir dalın gereksiz yere değil, her zaman veya asla alınmayacağı bilindiğinde belirli bir nokta olabilir. hangi yoldan dallanacağını belirlemek için bazı değişkenleri kontrol ederek, dallanma talimatının kendisi buna göre değiştirilebilir
    • Örneğin, sanal gönderimin belirli bir çağrı ile değiştirilebileceği şekilde, olası türetilmiş türlerden yalnızca birinin ele alınacağı bilinebilir.
    • Hangi donanımın mevcut olduğunu tespit ettikten sonra, eşleşen bir kodun kullanımı kodlanmış olabilir
  • Gereksiz kod, işlemsiz talimatlarla veya üzerinden atlayarak değiştirilebilir veya sonraki kod biti doğrudan yerine kaydırılabilir (konumdan bağımsız işlem kodları kullanıldığında daha kolaydır)
  • Kendi hata ayıklamasını kolaylaştırmak için yazılan kod, stratejik bir konumda hata ayıklayıcı tarafından beklenen bir tuzak / sinyal / kesinti talimatı enjekte edebilir.
  • Kullanıcı girdisine dayalı bazı yüklem ifadeleri, bir kitaplık tarafından yerel koda derlenebilir
  • Çalışma zamanına kadar görünmeyen bazı basit işlemleri satır içine almak (ör. Dinamik olarak yüklenen kitaplıktan) ...
  • Koşullu olarak kendi kendine enstrümantasyon / profil oluşturma adımları ekleme
  • Çatlaklar, onları yükleyen kodu değiştiren kitaplıklar olarak uygulanabilir ("kendi kendine" tam olarak değişiklik yapmaz, ancak aynı tekniklere ve izinlere ihtiyaç duyar).
  • ...

Bazı işletim sistemlerinin güvenlik modelleri, kendi kendini değiştiren kodun kök / yönetici ayrıcalıkları olmadan çalışamayacağı anlamına gelir ve bu da genel amaçlı kullanım için pratik değildir.

Wikipedia'dan:

Katı W ^ X güvenliğine sahip bir işletim sistemi altında çalışan uygulama yazılımı, yazmasına izin verilen sayfalardaki talimatları yürütemez - yalnızca işletim sisteminin hem belleğe talimat yazmasına hem de daha sonra bu talimatları yürütmesine izin verilir.

Bu tür işletim sistemlerinde, Java VM gibi programlar bile JIT kodunu yürütmek için kök / yönetici ayrıcalıklarına ihtiyaç duyar. (Daha fazla ayrıntı için http://en.wikipedia.org/wiki/W%5EX adresine bakın)


2
Kendi kendini değiştiren kod için kök ayrıcalıklarına ihtiyacınız yoktur. Java VM de istemiyor.
Mackie Messer

Bazı işletim sistemlerinin bu kadar katı olduğunu bilmiyordum. Ancak bazı uygulamalarda kesinlikle mantıklı. Ancak Java'yı root ayrıcalıklarıyla çalıştırmanın güvenliği gerçekten artırıp artırmadığını merak ediyorum ...
Mackie Messer

@Mackie: Bunu azaltması gerektiğini düşünüyorum, ancak belki bazı bellek izinlerini ayarlayabilir ve ardından etkili uid'i bir kullanıcı hesabına geri döndürebilir ...
Tony Delroy

Evet, katı güvenlik modeline eşlik edecek izinleri vermek için ayrıntılı bir mekanizmaya sahip olmalarını beklerdim.
Mackie Messer

15

Sentez OS temelde kısmen API çağrıları ile ilgili olarak programınızı değerlendirdi ve sonuçları ile OS kodu değiştirilmiştir. Ana faydası, birçok hata kontrolünün ortadan kalkmasıdır (çünkü programınız işletim sisteminden aptalca bir şey yapmasını istemeyecekse, kontrol etmesi gerekmez).

Evet, bu bir çalışma zamanı optimizasyonu örneğidir.


Noktayı göremiyorum. Bir sistem çağrısının işletim sistemi tarafından yasaklanacağını söylerseniz, muhtemelen kodu kontrol etmeniz gerekecek bir hata alırsınız, değil mi? Bana öyle geliyor ki, bir hata kodu döndürmek yerine çalıştırılabilir dosyayı değiştirmek bir çeşit aşırı mühendislik.
Alexandre C.

@Alexandre C.: Bu şekilde boş işaretçi kontrollerini ortadan kaldırabilirsiniz. Çoğunlukla, arayan için bir argümanın geçerli olduğu önemsiz derecede açıktır.
MSalters

@Alexandre: Araştırmayı linkten okuyabilirsiniz. Oldukça etkileyici hızlanmalara sahip olduklarını düşünüyorum ve asıl mesele bu: -}
Ira Baxter

2
Nispeten önemsiz ve G / Ç'ye bağlı olmayan sistem çağrıları için tasarruflar önemlidir. Örneğin, Unix için bir deamon yazıyorsanız, stdio'nun bağlantısını kesmek, çeşitli sinyal işleyicileri kurmak vb. İçin yaptığınız bir dizi kazan-plaka sistem çağrısı vardır. Bir çağrının parametrelerinin sabitler olduğunu ve sonuçlar her zaman aynı olacaktır (örneğin kapanış stdin), genel durumda yürüttüğünüz kodların çoğu gereksizdir.
Mark Bessey

1
Tezi okursanız, bölüm 8, veri toplama için önemsiz olmayan gerçek zamanlı G / Ç hakkında gerçekten etkileyici bazı rakamlar içerir. Bunun 1980'lerin ortalarında bir tez olduğunu ve üzerinde çalıştığı makinenin 10 olduğunu hatırlıyor musunuz? Mhz 68000, düz eski yazılımla CD kalitesinde ses verilerini (saniyede 44.000 örnek) yakalayabilen bir yazılımdı. Sun iş istasyonlarının (klasik Unix) bu oranın yalnızca 1 / 5'ine ulaşabileceğini iddia etti. Ben o günlerden eski bir assembly dili kodlayıcısıyım ve bu oldukça muhteşem.
Ira Baxter

9

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.


1
Bilmiyorum, iyi ve kötü, bunun hakkında düşünmek için doğru kategoriler gibi görünmüyor. Elbette gerçekten ne yaptığınızı ve neden yaptığınızı da bilmelisiniz. Ancak bu kodu yazan programcı muhtemelen programın ne yaptığını görmenizi istememiştir. Elbette böyle bir kodda hata ayıklamak zorunda kalırsanız kötü olur. Ancak bu kod büyük olasılıkla bu şekilde tasarlanmıştı.
Mackie Messer

Modern x86 CPU'ları kağıt üzerinde gerekenden daha güçlü SMC algılamasına sahiptir: Kendi kendini değiştiren kodla x86'da eski talimat getirmeyi gözlemleme . Ve x86 olmayan çoğu CPU'da (ARM gibi), talimat önbelleği veri önbellekleriyle uyumlu değildir, bu nedenle yeni depolanan baytların talimat olarak güvenilir bir şekilde yürütülebilmesi için manuel yıkama / senkronizasyon gereklidir. community.arm.com/processors/b/blog/posts/… . Her iki durumda da SMC performansı, bir kez değiştirip birçok kez çalıştırmadığınız sürece modern CPU'larda korkunçtur .
Peter Cordes

7

Bir işletim sistemi çekirdeği görünümünden, her Tam Zamanında Derleyici ve Bağlayıcı Çalışma Zamanı, program metni kendi kendini değiştirir. Öne çıkan örnek, Google'ın V8 ECMA Komut Dosyası Yorumlayıcısı olacaktır.


5

Kendi kendini değiştiren kodun bir başka nedeni (aslında "kendi kendini üreten" bir koddur), performans için Tam Zamanında bir derleme mekanizması uygulamaktır. Örneğin, bir cebirsel ifadeyi okuyan ve bunu bir dizi girdi parametresi üzerinde hesaplayan bir program, hesaplamayı belirtmeden önce makine kodundaki ifadeyi dönüştürebilir.


5

Donanım ve yazılım arasında mantıksal bir fark olmadığını eski kestaneyi biliyorsunuz ... kod ile veri arasında mantıksal bir fark olmadığını da söyleyebiliriz.

Kendi kendini değiştiren kod nedir? Veri olarak değil, bir komut olarak yorumlanabilmesi için yürütme akışına değerler koyan kod. Elbette, işlevsel dillerde gerçekten hiçbir farkın olmadığı teorik bakış açısı vardır. E'nin bunu, eşit statü varsayımı olmaksızın zorunlu dillerde ve derleyici / yorumlayıcılarda doğrudan yapabileceğini söylüyorum.

Bahsettiğim şey, pratik anlamda verilerin program yürütme yollarını değiştirebileceğidir (bir anlamda bu son derece açıktır). Bir derleyici-derleyici gibi, bir programın komuttan komuta geçişinde olduğu gibi, birinin ayrıştırma sırasında içinden geçtiği, durumdan duruma geçen (ve ayrıca diğer değişkenleri değiştiren) bir tablo (veri dizisi) oluşturan bir şey düşünüyorum. , süreçteki değişkenleri değiştirme.

Dolayısıyla, bir derleyicinin kod alanı oluşturduğu ve tamamen ayrı bir veri alanına (yığın) başvurduğu olağan durumda bile, yürütme yolunu açık bir şekilde değiştirmek için veriler yine de değiştirilebilir.


4
Mantıksal bir fark yok, doğru. Yine de kendi kendini değiştiren çok fazla entegre devre görmedim.
Ira Baxter

@Mitch, IMO'nun yürütme yolunu değiştirmesinin kodun (kendi kendine) değiştirilmesiyle ilgisi yoktur. Ayrıca, verileri bilgi ile karıştırıyorsunuz. Ben yıl yorumunu cevap veremez LSE benim yanıta b / I Feabruary beri, orada formu kovuldum c içinde ifade etmek için 3 yıllık (1000 gün) meta-LSE benim pov Amerikalılar ve İngilizler değil kendi İngilizce yapmak.
Gennady Vanin Геннадий Ванин

4

En iyi algoritmayı oluşturmak için evrimi kullanan bir program uyguladım. DNA planını değiştirmek için kendi kendini değiştiren kod kullandı.


2

Kullanım durumlarından biri, antivirüs programlarını test etmek için meşru bir DOS yürütülebilir COM dosyası olan EICAR test dosyasıdır .

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Kendi kendine kod değişikliği kullanmalıdır çünkü yürütülebilir dosya, kodlanabilir talimatların sayısını önemli ölçüde sınırlayan [21h-60h, 7Bh-7Dh] aralığında yalnızca yazdırılabilir / yazılabilir ASCII karakterleri içermelidir.

Detaylar burada açıklanmıştır


Ayrıca DOS'ta kayan noktalı işlem gönderimi için kullanılır

Bazı derleyiciler CD xx, x87 kayan noktalı komutların yerine 0x34-0x3B arasında değişen xx yayınlayacaktır . Yana CDiçin işlem kodu inttalimat, bu kesme 34h-3BH içine atlamak edeceğiz ve x87 işlemci mevcut değilse yazılımda bu talimat taklit. Aksi takdirde, kesme işleyicisi bu 2 baytı değiştirecektir, 9B Dxböylece daha sonraki işlemler emülasyon olmadan doğrudan x87 tarafından işlenecektir.

MS-DOS'ta x87 kayan nokta öykünmesi için protokol nedir?


1

Linux Kernel sadece bunu kernel Modülleri vardır.

Emacs'ın da bu yeteneği var ve her zaman kullanıyorum.

Dinamik bir eklenti mimarisini destekleyen herhangi bir şey, esas olarak çalışma zamanında kodun değiştirilmesidir.


4
zorlukla. her zaman yerleşik olmayan dinamik olarak yüklenebilir bir kitaplığa sahip olmanın, kendi kendini değiştiren kodla çok az ilgisi vardır.
Dov

1

Sürekli güncellenen bir veritabanına göre istatistiksel analizler çalıştırıyorum. İstatistik modelim, kullanılabilir hale gelen yeni verileri barındırmak için kod her çalıştırıldığında yazılır ve yeniden yazılır.


0

Bunun kullanılabileceği senaryo bir öğrenme programıdır. Kullanıcı girdisine yanıt olarak program yeni bir algoritma öğrenir:

  1. benzer bir algoritma için mevcut kod tabanını arar
  2. Kod tabanında benzer bir algoritma yoksa, program sadece yeni bir algoritma ekler
  3. benzer bir algoritma varsa, program (belki de kullanıcının yardımıyla) hem eski amaca hem de yeni amaca hizmet edebilmek için mevcut algoritmayı değiştirir.

Java'da bunun nasıl yapılacağı sorusu var: Java kodunun kendi kendine değiştirilme olasılıkları nelerdir?


-1

Bunun en iyi versiyonu Lisp Makroları olabilir. Sadece bir ön işlemci olan C makrolarından farklı olarak Lisp her zaman tüm programlama diline erişmenizi sağlar. Bu, lisp'deki en güçlü özellik hakkındadır ve başka hiçbir dilde mevcut değildir.

Ben kesinlikle bir uzman değilim ama lisp adamlarından birini bu konuda konuşturun! Lisp'in etraftaki en güçlü dil olduğunu söylemelerinin bir nedeni var ve akıllı insanlar hayır, muhtemelen haklılar.


2
Bu gerçekten kendi kendini değiştiren kod mu yaratıyor yoksa daha güçlü bir ön işlemci mi (işlevler üretecek)?
Brendan Long

@Brendan: gerçekten, ama olduğu önişleme yapmak doğru bir yol. Burada çalışma zamanı kodu değişikliği yoktur.
Alexandre C.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.