bsp. für polimorphe algorythmen...
-
ich habe davon gehört (ich glaube das kam aus der linux kernelentwicklungsecke) das es möglich ist programme zu schreiben die sich praktisch nach einen muster selbst verändern bzw, eine veränderte kopie von sich erstellen. das wird angewendet um performance zu steigern oder größe etc. von ein einer funktion.
meine frage:
wie kommt man auf den veränderten code von dem programm zurück das sich passend mutiert hat?
und wie macht man sowas, ich finde das sehr interessant.. erinnert mich an "darwin"
-
http://www.nyx.net/~gthompso/quine.htm
Hier wird beschrieben, wie man Programme erzeugt, die ihren eigenen Quellcode ausgeben (ggf. in leicht veränderter Version).
-
also ich finde das als hobby-coder etwas merkwürdig.
main(p){printf(p,34,p="main(a){printf(p,34,p=%c%s%c,34); }",34); }oder
#define X(Y) main(){printf("#define X(Y) %s\nX(%s)\n",#Y,#Y);} X(main(){printf("#define X(Y) %s\nX(%s)\n",#Y,#Y);})das ist mein favorit:
char s[] = { 0x6D, 0x61, 0x69, 0x6E, 0x28, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x69, 0x6E, 0x74, 0x20, 0x69, 0x3B, 0x0D, 0x0A, 0x09, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x28, 0x22, 0x63, 0x68, 0x61, 0x72, 0x20, 0x73, 0x5B, 0x5D, 0x20, 0x3D, 0x20, 0x7B, 0x22, 0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x66, 0x6F, 0x72, 0x28, 0x69, 0x3D, 0x30, 0x3B, 0x73, 0x5B, 0x69, 0x5D, 0x21, 0x3D, 0x27, 0x5C, 0x30, 0x27, 0x3B, 0x69, 0x2B, 0x2B, 0x29, 0x20, 0x7B, 0x0D, 0x0A, 0x09, 0x09, 0x69, 0x66, 0x28, 0x20, 0x28, 0x69, 0x26, 0x37, 0x29, 0x3D, 0x3D, 0x30, 0x20, 0x29, 0x20, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x28, 0x22, 0x5C, 0x6E, 0x22, 0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x28, 0x22, 0x30, 0x78, 0x25, 0x30, 0x32, 0x58, 0x2C, 0x20, 0x22, 0x2C, 0x73, 0x5B, 0x69, 0x5D, 0x29, 0x3B, 0x0D, 0x0A, 0x09, 0x7D, 0x0D, 0x0A, 0x09, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x66, 0x28, 0x22, 0x30, 0x5C, 0x6E, 0x7D, 0x3B, 0x5C, 0x6E, 0x25, 0x73, 0x5C, 0x6E, 0x22, 0x2C, 0x73, 0x29, 0x3B, 0x0D, 0x0A, 0x7D, 0 }; main() { int i; printf("char s[] = {"); for(i=0;s[i]!='\0';i++) { if( (i&7)==0 ) printf("\n"); printf("0x%02X, ",s[i]); } printf("0\n};\n%s\n",s); }das ist auch interessant:
#include<iostream.h> main(){char*s="#include<iostream.h>%cmain(){char*s=%c%s%c;cout.form(s,10,34,s,34,10);}%c";cout.form(s,10,34,s,34,10);}ich verstehe nur leider nicht das geringste.ich habe mir das andewrs vorgestellt. was macht das überhaupt? was sind das für merkwürdige wie speicheradressen aussehnde werte und kryptische zeichen? ist das wirklich cpp standard? funktioniert das unter jedem os?