Šta je novo?

Ispis koda programa koji se izvrsava?

eMe

Čuven
Učlanjen(a)
05.01.2003
Poruke
386
Poena
619
Evo jednog (meni) interesantnog pitanja koje mi je postavio prijatelj. Da li je moguce napisati program (u bilo kom programskom jeziku), koji na monitor ispisuje kod samog sebe; znaci kod programa koji se izvrsava. S'obzirom da mi je programiranje malko jache od ' Hello World ' to i nisam znao u kom smeru da krenem. Eto...cisto da vidim da li neko ima neku ideju (nista obavezno). :D
Pozdrav
 
Iz PHP-a moze...

Ucitas array sa file funkcijom i bacis neki loop koji ce ga ispisati...

Za programske jezike koji se kompajliraju (znaci ne za script jezike kao sto je PHP) ne bih znao sta da ti kaze... Ne verujem da moze, a ako moze onda nije ni malo naivno.
 
Interpreteri jos nekako, ali kompajlirani exe programi - nikako; taj kod kada je kompajliran, preveden je u binarni kod koji izvrsava masina i kojem je svejedno u kom je jeziku pisan. Source se ne smesta nigde u exe. Ono sto moze da se uradi jeste da se prema generisanom binarnom kodu eventualno zakljuci koji kompajler je koriscen (microsoft, borland, gnu, itd). Na osnovu toga postoje neki alati koji koji mogu da urade eventualno reverzibilni inzenjering, ali ne mogu da dobiju onakav source kakav je bio kada je pisan, nego onakav kakav taj alat generise kod prema disassembliranom kodu. Ah, da, zaboravih da napomenem da ni sa takvim alatima za reverzibilni inzenjering nema garancije da ce generisanje koda uvek uspeti.

Ako hoces da radis nesto u vezi takvog reinzenjeringa, treba da znas odlicno assembler, strukture kompajlera i odlicno poznajes kompajler za koji pokusavas da izvedes kod; tj. da znas tacno kako taj kompajler zamenjuje neku komandu viseg programskog jezika sa karakteristicnim nizom komandi masinca. MS i Borland C/C++ kompajler ne moraju to da rade na isti nacin, na primer - jos ako rade neke vrste svojih optimizacija po velicini ili brzini izvrsnog koda, onda se stvari malcice komplikuju. Najcesce gubis i nazive varijabli, objekata, jer se kompajliranjem zamenjuju sa generickim nazivima, itd.
 
Pitanje je bilo da li se može napisati u bilokome jeziku...
Prvo mi pada na pamet Basic sa aktiviranim trace pri izvršavanju...
To može da ispisuje i source i varijable itd... Naravno se misli na interpretiranje a ne na kompajliranje.

Teoretski bi moglo uraditi ovo za bilokoji jezik, da se u kompajleru doda da nakon svake linije ispiše istu na ekran, zapravo to bi se moglo verovatno uraditi nekako i u samom source kodu sa nekim makroima...
 
Ma ono sto sam gore napisao se odnosi na bilo koji exe program i "povratka" njegovog koda, tj genericki princip. Sam source nije nikakav problem staviti u exe, bilo kao resource ili na neki drugi nacin, ali prikazivati liniju koja se upravo izvrsava? Kada ga kompajliras, opet se postavlja pitanje prikazivanja tekuce linije - racunar izvrsava masinac, a ne komandu viseg programskog jezika (koja je zamenjena najcesce sa nizom masinskih komandi - koju od njih prikazati?). Ovde postoji jedan drugi problem - ovo mora da se gleda kao implementacija debugging tehnika, ali program koji debaguje sam sebe? Mislim, sta kada debug trace linija naleti na deo programa koji je zaduzen za debug? Mrtva petlja?

Sve vreme pokusavam da pricam o slucaju koji ne zahteva duplo fizikalisanje, tj da se ne radi ono seljacko:

[code:1]
a = b + c;
printf('a = b + c');
if( a > trt ){
printf('if (a > trt){');
...
}
[/code:1]
 
Znaci zakljucak bi bio da programi koji se kompajliraju (a ustvari sam na njih i mislio) ne mogu da ispisuju svoj kod. Naravno da mi ni na pamet nije bio reverzibilni inzenjering, a kako vidim tek mi sad nece pasti na pamet.
Pozdrav
 
Probaj nesto ovako (C kod) -)


#include <stdio.h>

#define TRACE(x) printf("%s(%ld) " #x "\n", __FILE__, __LINE__);x

int main(int argc, char argv[])
{
TRACE(printf("Hello World\n");)
TRACE(return 0;)
}
 
Generalno, i dekompajleri u vecini slucajeva ne mogu da
povrate prava imena varijabli ali ako ti je potreban program
koji pored svoje glavne svrhe jos i stampa svoj kod, mozes
da napravis pretkompajler koji ce prvo napraviti dopunjenu
kopiju tvog originalnig koda tako sto ce nakon svake linije
ubacivati i njeno stampanje, pa tek onda kompajlirati taj
novokreirani fajl umesto prvobitnog, koji uvek ostaje
nepromenjen (tj. bez dodataka) Xehe.

Na taj nacin neces morati da brines o odrazavanju ma kakve
izmene koda na tvoj sopstveni kod. Moras samo da obuhvatis
par dodatnih slucajeva:

1) Include-ovani fajlovi pozvani sa #include "...",
2) Kod van tela f-ja
3) Sam zavrsetak programa i kod ispod zavrsetka programa.
 
eMe je napisao(la):
Evo jednog (meni) interesantnog pitanja koje mi je postavio prijatelj. Da li je moguce napisati program (u bilo kom programskom jeziku), koji na monitor ispisuje kod samog sebe; znaci kod programa koji se izvrsava. S'obzirom da mi je programiranje malko jache od ' Hello World ' to i nisam znao u kom smeru da krenem. Eto...cisto da vidim da li neko ima neku ideju (nista obavezno). :D
Pozdrav
E ovaj zadatak je bio u "Galaksiji" od pre vishe godina , dok je josh Dejan Ristanovich (sada je glavni u PC Press-u ) bio urednik jedne rubrike koja se bavila glavolomkama. Reshen je uspesno , ali se ja sad ne secham kako type;
 
Ne znam kako su to tad resili, ali evo mog resenja. Koristi mali "trik" ali provereno radi. Radjen u pascalu

[code:1]
program ispisivanje_sopstvenog_koda;
var f:text;
a:string;

begin
assign (f, 'kod.txt');
reset (f);
repeat
readln (f,a);
writeln (a);
until EOF(f);
close(f);
end.
[/code:1]

Naravno kad ovo otkucate u pascalu, snimite kao kod.txt, kompajlirajte i pokrenite program i ispisace vam samog sebe!
 
Ovaj, mislim da covek nije mislio na program na nivou zadataka iz casopisa ili iz skole, nego da takve stvari radi normalan, komercijalni program koji radi inace i svoju namenu i ima neku svrhu.
 
Silver.... mislio sam na bilo kakvo resenje, na bilo kom nivou :)
Kao sto sam i rekao.... nista obavezno... samo malo da se mozga
 
Vrh Dno