• ベストアンサー

このようなプログラム言語はありますか?

簡単に言うと、 「自分自身のプログラムを実行して、自分自身のプログラム自体を書き換えてしまう」 このようなプログラムを作成できるプログラム言語ってあるのでしょうか? 無いとしたら、なぜ無いのか推測でいいので答えてください。 わかりにくい説明ですみません。m(__)m

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.11

コンパイルを必要とする言語で考えると, コンパイルしないとダメなので大変なのです。 最初からコンパイルしないプログラムだと,簡単にできますよ。 ---kakikae.vbs------------------------------ Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.CreateTextFile("A:\kakikae.vbs",True) f.Write "msgbox " & Chr(34) & "私はすでに死んでいます。" & Chr(34) ------------------------------------------ たったこれだけ。 上の点線内の4行をメモ帳などテキストエディタにコピペして, フロッピーディスクに,「kakikae.vbs」というファイル名で保存し, そのVBSを「ダブルクリック」して開いてみてください。 「kakikae.vbs」自体が「kakikae.vbs」によって書き替わります。 書き替わることによって,元のプログラムは死にます。 (死んだヤツが「死んだ」と言うのだろうか?) フロッピーディスクがAドライブでない場合は, 3行目の A:\ を B:\ などに書き替えてください。 また,ドライブは,Aドライブである必要はありません。任意のフォルダでも動作します。 勝手に,HD内でプログラムを動作させるのは悪いかなと思ったのと, フォルダ構造はPCによって違うので無難なAドライブにしただけです。 JavaScriptをされているということですが, 工夫すればJavaScriptでも同様なことはできると思います。 サーバー上にあるHTMLに貼り付いたJavaScriptや .jsファイル では大したことはできません。 ローカルに保存した .jsファイル やJavaScriptを組み込んだHTAファイルだとかなり強烈なことができます。 JSはVBSに比べて,若干制約が多いのと,動作が不安定になります。 上記のものを改良すると,自己増殖も可能ですし,ウイルスも作れます。 今回は自分自身をターゲットにしていますが,自分自身以外のファイルを削除したり,別の場所にコピーすることもできます。 また他のファイルも生成可能で,レジストリの書き替えなどもバキバキにこなすことができます。 つまりPC内をぐちゃぐちゃにしてしまうのは簡単。 また,「kakikae.vbs」 みたいなVBSを自動作動させるVBSを作れば,「kakikae.vbs」 をダブルクリックする必要さえなくなります。 つまり,いわゆる時限爆弾的な物もできます。 改良すると危険な物にもなります,扱いには注意してください。 また,くれぐれも犯罪行為には使用しないでください。

rouden
質問者

お礼

VBScriptですか! 大変参考になりました。 ウイルスを作成する気はまったくないので、誤解しないでください。 回答ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (14)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

ANo.2 の方もおっしゃってますが、インタプリタでもできますね。 たとえばperlとかで、 eval 文字列変数 で文字列変数を変更しておけば。 これを、ご質問が意図する書き換えと呼ぶならですが。

rouden
質問者

お礼

「perl」は専門外なのでちょっと戸惑っています。 何はともあれ、 回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • Pesuko
  • ベストアンサー率30% (2017/6702)
回答No.3

完全にご希望に沿わないですが、自己増殖型プログラムとして「FORTH」 があります。 かのスターウォーズEP4(初回)のコンピュータ画面の一部分はFORTHでプログラムされたとか。 別に人工知能のために「LISP」があります。 「FORTHが共にあらんことを」 http://kaiunix.cs.shinshu-u.ac.jp/Lesson/ProgLangT/2005/VariousLanguage.html http://ja.wikipedia.org/wiki/Forth http://ja.wikipedia.org/wiki/Lisp http://www.google.co.jp/search?hl=ja&c2coff=1&rls=GGLD%2CGGLD%3A2004-41%2CGGLD%3Aja&q=%E8%87%AA%E5%B7%B1%E5%A2%97%E6%AE%96%E5%9E%8B%E8%A8%80%E8%AA%9E&lr=

rouden
質問者

お礼

自己増殖型ですか! 少し興味がある範囲です。 回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

アセンブラはできますよね。 インタプリタ系言語は、似たようなことが…できるはず javaも関数の動的な定義ができたと思います 完全にバイナリにコンパイルする言語は、インラインアセンブラを駆使すれば可能かも その言語自身でコーディングされたスタイルではちょっと無理かも…コンパイルされたプログラムにコンパイラ自身が組み込まれていないと実行可能なコードを生成できません

rouden
質問者

お礼

>コンパイルされたプログラムにコンパイラ自身が組み込まれていないと実行可能なコードを生成できません やはり、コンパイラが付いてないと実行形式ファイルは無理ですか・・・。 回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • JUN-2
  • ベストアンサー率26% (360/1349)
回答No.1

アセンブラ言語(機械語)を使えば、自分自身のコードを書き換えることが可能ですね。 プログラムコードのあるアドレスが判れば、目的のアドレスのコードを書き換え、書き換えた場所にジャンプすれば、その書き換えたコードを実行することができます。

rouden
質問者

お礼

アセンブラ言語ですか・・・。 いきなり難しい言語が出てきて驚きました。 回答ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A