アカウント名:
パスワード:
#define FALSE -1
もう「CとしてもFortran 77としてもシェルスクリプトとしても正しいプログラム」とか「シェルスクリプトとして実行すると自分自身をMakefileとして自分自身をコンパイルするプログラム」はあるよねw
言語1のプログラムが言語2のプログラムを出力して、言語2のプログラムが言語3のプログラムを出力して、言語3のプログラムが最初の言語1のプログラムを出力するというような循環的な自己出力プログラムは一般化されています [sigfpe.com]。
Fnxyは言語xで書かれたプログラム(関数)であるとする。Fnxyはn個の文字列G1, ..., Gnを引数として取り、言語yによるプログラムYを出力する。Yはn個の文字列G2, G3, ..., Gn, G1に対して言語yで書かれた関数G2を適用するものであるとする。
このとき、言語xによるプログラムF3xy(F3xy, F3yz, F3zx)は言語yによるプログラムF3yz(F3yz, F3zx, F3xy)を出力する。F3yz(F3yz, F3zx, F3xy)はF3zx(F3zx, F3xy, F3yz)を出力し、F3zx(F3zx, F3xy, F3yz)はF3xy(F3xy, F3yz, F3zx)を出力するので元に戻る。
これを応用して、各言語での関数定義の構文などを定義すると、循環的な自己出力プログラムを出力するプログラム [sigfpe.com]が書けます。
//から始まる形式のコメントを使っていいのなら、コンパイラがShift_JISに対応しているか否かで挙動が変わるプログラムが書ける……ってのも、既出?
あーMozillaでそれをナチュラルにやってるソースがあって(外人が書いてるから仕方ない)日本語環境でコンパイルしたときだけ一部のテストが失敗するというわかりにくいバグになってたことがあったなー。修正後は再発防止にstatic_assert入れといた
マシン語で、エントリポイントを変えると別のプログラムになる、ってのが昔あったような。オペコードとオペランドが交互に並んでいて、それを逆に解釈するみたいなイメージ。
マシン語だと自分を書き直しながら走るコードを書いたりしませんでした?単純な所ではジャンプ命令のフラグ判定を違うものに差し替えたりとかジャンプ先のアドレスを書き換える事で実行モードの違いを出すとか。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
優勝はもらった (スコア:0)
#define FALSE -1
Re:優勝はもらった (スコア:2)
Re: (スコア:0)
もう「CとしてもFortran 77としてもシェルスクリプトとしても正しいプログラム」とか「シェルスクリプトとして実行すると自分自身をMakefileとして自分自身をコンパイルするプログラム」はあるよねw
Re:優勝はもらった (スコア:3)
言語1のプログラムが言語2のプログラムを出力して、言語2のプログラムが言語3のプログラムを出力して、言語3のプログラムが最初の言語1のプログラムを出力するというような循環的な自己出力プログラムは一般化されています [sigfpe.com]。
Fnxyは言語xで書かれたプログラム(関数)であるとする。
Fnxyはn個の文字列G1, ..., Gnを引数として取り、言語yによるプログラムYを出力する。
Yはn個の文字列G2, G3, ..., Gn, G1に対して言語yで書かれた関数G2を適用するものであるとする。
このとき、言語xによるプログラムF3xy(F3xy, F3yz, F3zx)は言語yによるプログラムF3yz(F3yz, F3zx, F3xy)を出力する。
F3yz(F3yz, F3zx, F3xy)はF3zx(F3zx, F3xy, F3yz)を出力し、F3zx(F3zx, F3xy, F3yz)はF3xy(F3xy, F3yz, F3zx)を出力するので元に戻る。
これを応用して、各言語での関数定義の構文などを定義すると、循環的な自己出力プログラムを出力するプログラム [sigfpe.com]が書けます。
Re:優勝はもらった (スコア:1)
//から始まる形式のコメントを使っていいのなら、コンパイラがShift_JISに対応しているか否かで挙動が変わるプログラムが書ける……ってのも、既出?
1を聞いて0を知れ!
Re: (スコア:0)
あーMozillaでそれをナチュラルにやってるソースがあって(外人が書いてるから仕方ない)日本語環境でコンパイルしたときだけ一部のテストが失敗するというわかりにくいバグになってたことがあったなー。
修正後は再発防止にstatic_assert入れといた
Re: (スコア:0)
マシン語で、エントリポイントを変えると別のプログラムになる、ってのが昔あったような。
オペコードとオペランドが交互に並んでいて、それを逆に解釈するみたいなイメージ。
Re: (スコア:0)
マシン語で、エントリポイントを変えると別のプログラムになる、ってのが昔あったような。
オペコードとオペランドが交互に並んでいて、それを逆に解釈するみたいなイメージ。
マシン語だと自分を書き直しながら走るコードを書いたりしませんでした?
単純な所ではジャンプ命令のフラグ判定を違うものに差し替えたりとか
ジャンプ先のアドレスを書き換える事で実行モードの違いを出すとか。