2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

自分自身を書き換えるプログラム

1 :kimura:03/05/27 14:30
ちょっと疑問に思ったことがあるので、質問させていただきます。
それは、自分自身のソースコードを書き換えるプログラムについてなのですが……

あるプログラムの n 行目に、次のような個所があり、(FOR ループによる繰り返し等で)何度も処理されるものとします。

IF T=0 THEN {処理A} ELSE {処理B}

そして、プログラムのスタート時には、T=0 なのですが、プログラムを処理していく中で、T=1 となり、T の値は、二度と 0 には、戻らないものとします。

すると、IF 〜 THEN の条件判定処理にかかるコストをなくすため、ソースコードの n 行目には、プログラムの設計時には、単に、

{処理A}

と、書いておいて、プログラムを実行していく中で、T=1 となった時点で、n 行目を、

{処理B}

と、書き換えたいのです。

-----------------

該当個所の処理(この例では、IF 〜 THEN の条件判定処理)にかかるコストが無視できるほど小さいものであれば、こんなことは考えなくていいのでしょうが、
そうでない場合は、自分自身のソースコードを書きかえるプログラム(コンパイラ言語であれば、書き換えた後、再コンパイルしなければなりませんが……)というのは、現実性があるのでしょうか?


まとめると、
「自分が実行中のフローチャートを、自ら書き換えるプログラム」
の可能性について、お聞きしたいのです。


2 :デフォルトの名無しさん:03/05/27 14:30
         ∧_∧
         < `ш´>  >>1 お前の感じている感情は精神疾患の一種だ。
       _φ___⊂)     しずめる方法は俺が知っている。俺に任せろ
      /旦/三/ /|
    | ̄ ̄ ̄ ̄ ̄|  |
    | 流鬱百円 |/


3 :デフォルトの名無しさん:03/05/27 14:30
3GET

4 :デフォルトの名無しさん:03/05/27 14:43
アセンブラ時代にはよくやったなー。


5 :デフォルトの名無しさん:03/05/27 14:46
無限ループのこと?

6 :デフォルトの名無しさん:03/05/27 14:49
コボラー?

7 :デフォルトの名無しさん:03/05/27 14:52
>>4
今でもたまにやります。
x86じゃないけど。


8 :デフォルトの名無しさん:03/05/27 14:54
自分自身を書き換えなくても、イベント駆動型のプログラミングとやってること
同じじゃん。

9 :デフォルトの名無しさん:03/05/27 14:54
lisp の方がいいよ。

10 :デフォルトの名無しさん:03/05/27 14:55
C なら関数ポインタの出番だろう。

11 :デフォルトの名無しさん:03/05/27 15:07
だからオペレーティングシステムはいろんなプログラムを実行できるわけであって...以下略

12 :デフォルトの名無しさん:03/05/27 15:12
>>1はVBでOSを作る気か?

13 :bloom:03/05/27 15:13
http://homepage.mac.com/ayaya16/

14 :デフォルトの名無しさん:03/05/27 15:18
恐怖の自己増殖オートマトンですね。
発案者の天才ノイマンですら作れませんでした。
1には無理です。

15 :デフォルトの名無しさん:03/05/27 15:19
なんでこんなに安いの???

http://ime.nu/ime.nu/www.net-de-dvd.com/


16 :デフォルトの名無しさん:03/05/27 15:32
自分を書き換えるプログラムか〜・・・
面白そう。
絶対不可能じゃないと思うけど・・・。

インタプリンタ系スクリプトで、コンパイルした実行プログラムはメモリに常駐。
必要があれば、ソースを編集。 再コンパイルでメモリ常駐。
こんな感じで作れそう。

・・・・って、ウイルス作るのか?


17 :デフォルトの名無しさん:03/05/27 15:35
MD5Hashが合うようにコードを書き換えるウィルス、、とか

18 :デフォルトの名無しさん:03/05/27 16:02
Windows上ではコード領域を書き換えようとすると例外が起こる

19 :デフォルトの名無しさん:03/05/27 16:02
機械語、Lisp、Forthあたりでは普通のテクニックかと。


20 :デフォルトの名無しさん:03/05/27 16:58
>>18
VirtualProtect使えば問題なし

21 :デフォルトの名無しさん:03/05/27 20:17
φ(.. ) 書き書き

22 :サンプルです:03/05/27 20:18
★見て★
http://endou.kir.jp/betu/linkvp2/linkvp.html

23 :デフォルトの名無しさん:03/05/27 20:37
10年前からウイルスの自己書き替え進化を待ってるんだが。
まだなのか。もう待ちくたびれたぞ!

24 :デフォルトの名無しさん:03/05/27 21:02
prologなんかも自己書き換えがデフォルトだな。

25 :デフォルトの名無しさん:03/05/27 21:06
>>23
あるウィルスにウィルスが感染して新しいウィルスが誕生したってのはあったらしい

26 :デフォルトの名無しさん:03/05/28 11:31
>>25
こえ〜!

27 :山崎渉:03/05/28 12:36
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉

28 :デフォルトの名無しさん:03/05/28 23:12
より存在し続けるために、などと言ってみるテスト

29 :デフォルトの名無しさん:03/05/29 12:01
糞スレ



30 :デフォルトの名無しさん:03/05/29 12:55
プログラマを書き換えて性能アップを図るプログラムを開発希望

31 :デフォルトの名無しさん:03/05/29 13:24
このスレを書き替えて良スレにしてほしい

32 :デフォルトの名無しさん:03/05/31 06:16
>>18
そうだよね。基本的にコード領域は書き換えられない。
でも変数にコードぶっこんで、それをコールするようにしとけば
実行時に変数を書き換えることで実現可能。
Cマガに載ってて試したよ。

処理内容が予め分かっているのならDLLを切り替えるので十分だと思ふ。
関数ポインタよりニュアンスが近いかと

33 :デフォルトの名無しさん:03/05/31 09:20
Cマガってそんなしょうもないテクニックが載っているんだ。

34 :デフォルトの名無しさん:03/05/31 09:22
なんで誰も「単発質問スレ立てるな」といわないの?

35 :デフォルトの名無しさん:03/05/31 09:39
>>1
そういう時はさ
ループを2つ用意しておいて

for(i=0;i<n;i++) ・・・ { ・・・処理A・・・ if T<>0 then break;}
for(i<n;i++) ・・・ { ・・・処理B・・・ }

と T=0になったら最初のループをブレークしてしまえばいいんだよ。
もちろん T というフラグを作らずに、T= 0以外にするような条件が出来た時にブレークすればいい

36 :デフォルトの名無しさん:03/05/31 11:02
ま、ストラテジパターンマンセーってことで。

37 :デフォルトの名無しさん:03/06/12 02:22
1.IFくらい気にしない
2.関数ポインタにしておいて必要に応じて差し替える
3.functorにしておいて(以下略
4.その他

>>18
>Windows上ではコード領域を書き換えようとすると例外が起こる

自前の領域なら大丈夫。

int main()
{
  int   x = 0;
  BYTE  *code = (BYTE *)malloc(64);
  
  code[0] = 0xB8;    // mov eax
  code[1] = 0x64;    // 100
  code[2] = 0x00;
  code[3] = 0x00;

  code[4] = 0x00;
  code[5] = 0xC3;    // ret

  // 関数ポインタにキャストして実行してやると x = 100になる
  x = (*((int (*)(void))&code))();

  printf( "x = %d\n", x );

  free( code );
  return 0;
}

38 :デフォルトの名無しさん:03/06/12 02:23
>>37
mallocを使う必要があるの?

39 :デフォルトの名無しさん:03/06/12 02:33
■自分自身を書き換えるプログラム

1.早寝、早起きをする。
2.暴食暴飲をさける。
3.運動をする。
4.身の回りを整理整頓する。
5.廊下は走らない。

40 :デフォルトの名無しさん:03/06/12 02:37
>>39
実行時エラーのヨカン


41 :デフォルトの名無しさん:03/06/12 02:41
>>40

この時間まで起きてれば、1.でエラーですね。

面目ない

42 :デフォルトの名無しさん:03/06/12 05:18
>>41
いや、面白くない

43 :デフォルトの名無しさん:03/06/25 13:32
lisp の方がいいよ。

44 :デフォルトの名無しさん:03/06/25 14:57
女を侵す。
女を犯す。
女を冒す。

45 :デフォルトの名無しさん:03/06/25 14:58
男を侵す。
男を犯す。
男を冒す。


46 :デフォルトの名無しさん:03/06/25 15:45
>>1
メモリ容量や速度に極端な制限がある、
昔のコンピュータならそないな事するケースがあった
と聞くが。

高階関数、リフレクション、項書き換えシステム
・・・ってなあたりかな、おなじみの関連分野は。
あと最近だと
アスペクト指向で、Cross-cutting concernsの括り出し/追加に、
コンパイル・コードを直接編集する手法が使われたり、
Apache Jakarta プロジェクトにバイト・コード編集ライブラリが出てたり、
ってな話題もあったな。結構継続的に研究されてる概念のよかーん

47 :デフォルトの名無しさん:03/06/25 15:58
まあ >>1 の問題の解法としては >>35 を改良する方が余程よいだろう


48 :デフォルトの名無しさん:03/06/25 17:37
漏れ的には >>37 の方が萌え だな

49 :デフォルトの名無しさん:03/06/25 18:39
てか、>>37そのまま動くか?少しぐぐってみたら、
windowsならAPIのVirtualProtect使わなきゃならんってあったんだけど。

50 :_:03/06/25 18:43
http://homepage.mac.com/hiroyuki44/

51 :デフォルトの名無しさん:03/06/25 20:46
>>49 >>20

52 :デフォルトの名無しさん:03/06/25 22:46
自分自身でカキまくる、おサルスレはここですか?

53 :デフォルトの名無しさん:03/06/25 23:40
「本当のプログラマーはPascalを使わない」読んだ時は感激したな。
まあ今の保護された状況では無理だが。ring0に突入すれば可能か?
もう一回読みたいんだが、どこかにソースないかな?日本語では
なさそうなんだが…

54 :デフォルトの名無しさん:03/06/26 00:27
http://www.genpaku.org/realprogrammerj.html

55 :53:03/06/30 10:37
>>54
サンクス。でも昔読んだのと違うなぁ。配列の添え字をマイナスに
して自己書き換えする話が消えてる。古いビット探してみるかな。

56 :山崎 渉:03/07/15 10:31

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

57 :山崎 渉:03/07/15 14:12

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

58 :デフォルトの名無しさん:03/07/17 22:06
>>54
感動!

59 :山崎 渉:03/08/02 02:47
(^^)

60 :デフォルトの名無しさん:03/08/08 22:25
x = (*((int (*)(void))&code))();
ここがよくわからない…

61 :デフォルトの名無しさん:03/08/08 22:30
スレタイしか読んでないけどオーバーレイですか?なつかしいですね。

62 :デフォルトの名無しさん:03/08/08 23:14
>>60
引数voidで返り値intの関数ポインタとしてcodeをキャストしそれを呼ぶ。
で、xに値が返ってくる。
おけ?

63 :デフォルトの名無しさん:03/08/08 23:28
// お前らインラインアセンブラ教えてくだちい!
__asm {


64 :デフォルトの名無しさん:03/08/08 23:30
  HLT
}

65 : ◆chuouI0.kM :03/08/08 23:44
// お前らインラインアセンブラ教えてくだちい!
__asm {



66 :しゃーねーな〜♪:03/08/08 23:59
xor eax, eax; eax = 0

67 :Delフサギコ ◆A6VzDeLphI :03/08/09 00:30
    ∧,,∧  >>53どのあたりに感動するん?
   ミ,,゚Д゚彡
    ミ つ旦)~~
  〜と,,,~),,~)  あれって、
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20020904/1/
この記事と同じ風な逆説記事なんだけど…


68 :デフォルトの名無しさん:03/08/09 01:10
>>67
その記事、ほんとに日経のヤシが書いてんのか?ネタかとオモタ

69 :Delフサギコ ◆A6VzDeLphI :03/08/09 01:13
           _________
   ∧,,∧   / 皆様の評価
  ミ,,゚Д゚彡 <  も見てあげてください。
   ミ つ旦)~~ \ 
 @ミ   ミ     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ∪''∪

70 :デフォルトの名無しさん:03/08/09 02:03
>>67
そいつは懐かしい記事だな。
今、真島はどうしているのだ?

71 :デフォルトの名無しさん:03/08/09 02:06
これもあったねー
http://www.sodan.org/~knagano/emacs/emacs21-emacs20-antinews-j.html

72 :デフォルトの名無しさん:03/08/09 10:46
再帰...


73 :山崎 渉:03/08/15 15:51
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

74 :デフォルトの名無しさん:03/08/16 22:31
lisp の方がいいよ。

14 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)