myavuzselim
29/12/2006, 22:25
Merhaba,
Bir virtual machine hakkında bir yazı okurken aklıma geldi. Mesela programınız öyle hızlı çalışmalı ki, programı hızlandırmanın en iyi yolu programın çalıştığı kodu değiştirmek olsun. Bunu yapmak ne kadar kolaydır diyerekten bir deney yaptım. Sizce şu programın çıktısı ne olur?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ifunc_t(int,int);
int test(int x, int y) {
return x + y + 37;
}
#define SIZE 100
int main() {
ifunc_t * func = (ifunc_t*) malloc(SIZE);
int i;
memcpy(func, test, SIZE);
char * ptr = (char*) func;
for (i=0; i<SIZE; i++) {
if (ptr[i] == 37)
ptr[i] = 100;
}
printf("func(%d,%d) = %d\n", 3, 5, func(3,5));
return 0;
}
Bu program intel linux üzerinde (2.6.17-10-386) amaçladığım çıktıyı veriyor. Tabi döngüde yaptığım şey kör dövüşü, çalışmış olmasının bir şans olduğunu biliyorum. Ayrıca hatırladığım kadarıyla her platform rastgele yerden kod çalıştırılmasına izin vermiyordu.
Şimdi bir kütüphane düşünün, getCode(func) dediğimde bana bu fonksiyonun o platformdaki assembly kodunu temsil eden bir yapı döndürsün. Ben bu yapıda istediğim değişiklikleri yapayım, sonra getFunc(code) dediğimde bana bu kodu derleyip çalişacak bir fonksiyon döndürsün. Var mıdır böyle bir sey?
Bu ne işimize yarar? Belki pek bir işe yaramaz, eğlencelik :)
Bir virtual machine hakkında bir yazı okurken aklıma geldi. Mesela programınız öyle hızlı çalışmalı ki, programı hızlandırmanın en iyi yolu programın çalıştığı kodu değiştirmek olsun. Bunu yapmak ne kadar kolaydır diyerekten bir deney yaptım. Sizce şu programın çıktısı ne olur?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ifunc_t(int,int);
int test(int x, int y) {
return x + y + 37;
}
#define SIZE 100
int main() {
ifunc_t * func = (ifunc_t*) malloc(SIZE);
int i;
memcpy(func, test, SIZE);
char * ptr = (char*) func;
for (i=0; i<SIZE; i++) {
if (ptr[i] == 37)
ptr[i] = 100;
}
printf("func(%d,%d) = %d\n", 3, 5, func(3,5));
return 0;
}
Bu program intel linux üzerinde (2.6.17-10-386) amaçladığım çıktıyı veriyor. Tabi döngüde yaptığım şey kör dövüşü, çalışmış olmasının bir şans olduğunu biliyorum. Ayrıca hatırladığım kadarıyla her platform rastgele yerden kod çalıştırılmasına izin vermiyordu.
Şimdi bir kütüphane düşünün, getCode(func) dediğimde bana bu fonksiyonun o platformdaki assembly kodunu temsil eden bir yapı döndürsün. Ben bu yapıda istediğim değişiklikleri yapayım, sonra getFunc(code) dediğimde bana bu kodu derleyip çalişacak bir fonksiyon döndürsün. Var mıdır böyle bir sey?
Bu ne işimize yarar? Belki pek bir işe yaramaz, eğlencelik :)