page0040
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 機能密度に関するおはなし
-(by [[K]], 2013.06.17)
** はいけい
-もともとはとあるところへ寄稿するための文章でしたが、ちょ...
** ほんぶん
-こんにちは。自称「変人プログラマ」の川合秀実です。私は趣...
*** コードゴルフとは?
-川合流に表現してしまえば、コードゴルフは最適化の一種です...
*** コードゴルフは役立つ技術か?
-明言します、役には立ちません。メモリやディスクが貴重だっ...
-ではコードゴルフは無価値なのでしょうか?とんでもない! ...
-今、自動車なら時速100kmだって簡単に出せますが、それでも...
-コードゴルフは芸術です。パズルでもあります。数学的な美し...
*** コードゴルフは役に立たない技術か?
-価値があることは納得していただけたとして(笑)、では本当...
-まず、コードゴルフのスキルと、プログラミングのスキルには...
-プログラミングに対する知識が多ければ多いほど、コードゴル...
-プログラミング言語の優劣の評価にコードゴルフを使うことも...
-処理速度が重要な場合はこんな指標は何の役にも立ちませんが...
-プログラミング言語に限りません。OSの優劣だって比較できま...
-念を押しますが、重い処理をすることを考えている場合は、コ...
-コードゴルフは、ディスクを節約します。ダウンロード時間も...
-逆に考えてみましょう。サイズが最小ではないということは、...
*** 機械語でのコードゴルフ
-私は機械語のコードゴルフが大好きです。ここからはその話を...
-まずなぜ機械語のコードゴルフがいいのかですが、それはほか...
-そもそもコードゴルフはどれだけ小さく書けるかを競うわけで...
-結局人間向けの普通のプログラミング言語は無駄がいっぱいな...
-機械語のコードゴルフを極めても、機械語を直接扱うときくら...
*** Hello, world!のコードゴルフ
-確か2006年ごろだったでしょうか。画面に"hello, world!"を...
-この58バイトを世界で最初に達成した人が誰なのかわからない...
--http://d.hatena.ne.jp/kikx/20061111
-に書いてあるので、「菊やん」さんかなと思っております。
-[このあたりにコンソールでの実行画面を入れる]
-一方で、同じ課題をMS-DOS上でやったらどうなるでしょうか。...
-これで分かることは、OSごとに結構違うということです。そし...
-私はこの発想を原点において、できるだけアプリケーションに...
-g01なら、先のアプリをたったの17バイトで記述できます。な...
-ちなみに今の私は当時の私よりもスキルか向上しているので、...
*** ルールの重要性
-この競争の際に、競争相手といろいろなルールを作りました。...
-いやそれどころか、「ファイルサイズが0バイトのアプリだっ...
-私が仲間内で決めたルールは、大雑把に言えばこんな感じでし...
--(1) シグネチャは2バイト以上とする
--(2) 専用APIは作らない
--(3) 一般的に役立ちそうな仕様なら(=ほかの課題のゴルフ...
--(4) ちゃんと正常終了する
-(1)についてはちょっと解説させてください。シグネチャとい...
それはけしからんということになりました。なぜなら、間違え...
-シグネチャの必要性はいいとして、じゃあそれは1バイトでい...
-ちなみに先に示したMS-DOSのhelloは、シグネチャがない形式...
-(4)も補足が必要かもしれません。課題となる出力をこなした...
*** charsのコードゴルフ
for (i = 0x20; i != 0x7f; i++) {
putchar(i);
}
-で出力されるものと同一の出力結果を求められるのが、通称ch...
-[このあたりにコンソールでの実行画面を入れる]
-DOSではシグネチャなしで17バイトまで行きました。フェアに...
-おっとここで補足が必要かもしれません。helloといいcharsと...
-私は先に機械語のコードゴルフについて、他の言語よりも短く...
-この先、話の流れ上g01はもう出てこないのですが、しかしg01...
*** x86以外の機械語でコードゴルフ
-今までLinuxのhelloの58バイトの話からの流れで、x86の機械...
-そのためにはOSだけではなく機械語の命令体系も設計しなけれ...
-私の研究によれば、この究極の条件でのhelloのサイズは、15...
-この結果はx86の機械語の命令体系にも無駄が多く残っていた...
-helloとかcharsはコンソールアプリで、はっきりいって見栄え...
-以下のような画像を描画するプログラムは13バイトで書けます...
http://osecpu.osask.jp/download/app0020b.jpg
-以下のような画像の場合は71バイトで書けます。これはすごい...
http://osecpu.osask.jp/download/bball.png
-[このあたりで今までのサイズ比較表を入れる]
*** charsの美しさ
-それではcharsの改良過程を比較して、鑑賞する事にしましょ...
-まずMS-DOS用の.COM形式でごく普通にcharsを作ると、以下の...
B402 // 機能番号=2(一文字表示API)
B220 // A=32(文字コード)
CD21 // MS-DOSのシステムコール命令(Aの文字が表示され...
FEC2 // Aに1を加える
80FA7F // Aと127を比較
75F7 // 等しくなければCD21のところへ戻って繰り返し
B20A // A=10(文字コード:改行)
CD21 // MS-DOSのシステムコール命令(改行される)
B44C // 機能番号=76(プログラムの終了API)
B000 // 終了コード=0
CD21 // MS-DOSのシステムコール命令(終了する)
-このままでも他のOSと比べれば十分に小さくて無駄が少なくて...
--(1) x86の仕様によると、この文脈では FEC2 の代わりに 42 ...
--(2) MS-DOSの仕様によると、この文脈では C3 という1バイト...
-その結果は以下のとおりです。これが17バイトで、MS-DOSにお...
B402 // 機能番号=2(一文字表示API)
B220 // A=32(文字コード)
CD21 // MS-DOSのシステムコール命令(Aの文字が表示され...
42 // Aに1を加える
80FA7F // Aと127を比較
75F7 // 等しくなければCD21のところへ戻って繰り返し
B20A // A=10(文字コード:改行)
CD21 // MS-DOSのシステムコール命令(改行される)
C3 // プログラムの終了
-うーん、美しい。・・・え、この美しさが分からないですか?...
-次はOSECPU(おせくぷ、OSの名前)の例です。8バイトのchars...
05E1 // シグネチャ
20C20 // A=32(文字コード)
1 // ラベル1
2B0750FF07 // 機能番号=65287(文字列表示API)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
9401 // Aに1を加える
A10C7F6 // Aと127を比較して等しくなければラ...
208A // A=10(文字コード)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
2B0750FF06 // 機能番号=65286
2B10 // 終了コード=0
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
-なんかちょっと見ただけでもすごく長そうです。はい、なんと...
--(3) 43B019EBFA8411CFE10 は BFA8 という短縮形に置き換える
--(4) 20C20-1-...-9401-A10C7F6 は 60C20C7F...87 という短...
--(5) プログラムの末尾の正常終了処理は全て省略できるので...
--(6) プログラム最後の改行処理も省略できるので書かないこ...
-そうするとこうなります。
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
2B0750FF07 // 機能番号=65287(文字列表示API)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
BFA8 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
87 // 繰返し範囲終了
-これで31バイトです。かなり短くなりました。まだ8バイトで...
-ここで説明が必要だと思うので書きます。まず(3)の短縮形は...
パターンだと思っているのですが、x86の設計者はそうは思わな...
-さて、このプログラムはまだまだ小さくできます。OSECPUでは...
--(7) 2B0750FF07-2132B11CF4B11B1-48D890B130-BFA8-CF5B11B1...
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
514B00 // Aの文字を文字列表示APIを使って表示
87 // 繰返し範囲終了
-これで10バイトです。一気に8バイトが見えてきました。さら...
--(8) プログラム末尾の87は省略してよい
--(9) プログラムが00で終わる場合、これも省略してよい
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
514B // Aの文字を文字列表示APIを使って表示
-ついに8バイトになりました。無駄がなくて美しいです!
-(7)の是非はいったん保留にして、(8)と(9)について説明した...
-私はこれに対し次のような見解を持っています。まずソースレ...
-以上の説明の流れで感じてもらえたと思いますが、コードゴル...
-そして(7)ですが、これも短縮形なのです。それに尽きます。5...
*** こだわりのポイント
-私のこだわりポイントについて話す前に、まずはコードゴルフ...
-今のところ、私がライバルだと感じている人は世界に一人しか...
-しかしそれはたぶん大きな間違いです。私たちはたった二人な...
-ということで、完全無差別級のコードゴルフは日本が最高レベ...
-きっと誰も賛同してくれないのを分かってて言っていますが(...
-現在charsに関しては世界記録は私が保持している8バイトです...
-先のcharsの鑑賞のところで、私はたった1バイトを削っただけ...
-自分でも、何もここまでやらなくても・・・と思うことはよく...
-私は今までずっと競争してきた仲良しのライバルになら負けて...
-そもそもコードゴルフの美学は何ですか。そう、無駄がないこ...
-余談ですが、日本人はコードゴルフに向いているような気がし...
-先の例ではどんどん削って短くしていく方向でのコードゴルフ...
-charsの場合ですと、32と127(20と7F)は削れない情報だと思...
-これは当たり前の事実ですが、charsを1バイト小さくするため...
-でもこう考えてみてください。OSの改良によって小さくなるア...
なったり小さくなったりまちまちなことがありました。そんな...
-とにかく一番やっちゃいけないのは、charsしか小さくならな...
*** おわりに
-さてコードゴルフの世界が少しは分かっていただけたでしょう...
** ほそく
-この文章で出てくる「競争相手」はもちろんneriさんのことで...
-文中で「私たち」という言葉が何度か出ていますが、それはあ...
* こめんと欄
#comment
終了行:
* 機能密度に関するおはなし
-(by [[K]], 2013.06.17)
** はいけい
-もともとはとあるところへ寄稿するための文章でしたが、ちょ...
** ほんぶん
-こんにちは。自称「変人プログラマ」の川合秀実です。私は趣...
*** コードゴルフとは?
-川合流に表現してしまえば、コードゴルフは最適化の一種です...
*** コードゴルフは役立つ技術か?
-明言します、役には立ちません。メモリやディスクが貴重だっ...
-ではコードゴルフは無価値なのでしょうか?とんでもない! ...
-今、自動車なら時速100kmだって簡単に出せますが、それでも...
-コードゴルフは芸術です。パズルでもあります。数学的な美し...
*** コードゴルフは役に立たない技術か?
-価値があることは納得していただけたとして(笑)、では本当...
-まず、コードゴルフのスキルと、プログラミングのスキルには...
-プログラミングに対する知識が多ければ多いほど、コードゴル...
-プログラミング言語の優劣の評価にコードゴルフを使うことも...
-処理速度が重要な場合はこんな指標は何の役にも立ちませんが...
-プログラミング言語に限りません。OSの優劣だって比較できま...
-念を押しますが、重い処理をすることを考えている場合は、コ...
-コードゴルフは、ディスクを節約します。ダウンロード時間も...
-逆に考えてみましょう。サイズが最小ではないということは、...
*** 機械語でのコードゴルフ
-私は機械語のコードゴルフが大好きです。ここからはその話を...
-まずなぜ機械語のコードゴルフがいいのかですが、それはほか...
-そもそもコードゴルフはどれだけ小さく書けるかを競うわけで...
-結局人間向けの普通のプログラミング言語は無駄がいっぱいな...
-機械語のコードゴルフを極めても、機械語を直接扱うときくら...
*** Hello, world!のコードゴルフ
-確か2006年ごろだったでしょうか。画面に"hello, world!"を...
-この58バイトを世界で最初に達成した人が誰なのかわからない...
--http://d.hatena.ne.jp/kikx/20061111
-に書いてあるので、「菊やん」さんかなと思っております。
-[このあたりにコンソールでの実行画面を入れる]
-一方で、同じ課題をMS-DOS上でやったらどうなるでしょうか。...
-これで分かることは、OSごとに結構違うということです。そし...
-私はこの発想を原点において、できるだけアプリケーションに...
-g01なら、先のアプリをたったの17バイトで記述できます。な...
-ちなみに今の私は当時の私よりもスキルか向上しているので、...
*** ルールの重要性
-この競争の際に、競争相手といろいろなルールを作りました。...
-いやそれどころか、「ファイルサイズが0バイトのアプリだっ...
-私が仲間内で決めたルールは、大雑把に言えばこんな感じでし...
--(1) シグネチャは2バイト以上とする
--(2) 専用APIは作らない
--(3) 一般的に役立ちそうな仕様なら(=ほかの課題のゴルフ...
--(4) ちゃんと正常終了する
-(1)についてはちょっと解説させてください。シグネチャとい...
それはけしからんということになりました。なぜなら、間違え...
-シグネチャの必要性はいいとして、じゃあそれは1バイトでい...
-ちなみに先に示したMS-DOSのhelloは、シグネチャがない形式...
-(4)も補足が必要かもしれません。課題となる出力をこなした...
*** charsのコードゴルフ
for (i = 0x20; i != 0x7f; i++) {
putchar(i);
}
-で出力されるものと同一の出力結果を求められるのが、通称ch...
-[このあたりにコンソールでの実行画面を入れる]
-DOSではシグネチャなしで17バイトまで行きました。フェアに...
-おっとここで補足が必要かもしれません。helloといいcharsと...
-私は先に機械語のコードゴルフについて、他の言語よりも短く...
-この先、話の流れ上g01はもう出てこないのですが、しかしg01...
*** x86以外の機械語でコードゴルフ
-今までLinuxのhelloの58バイトの話からの流れで、x86の機械...
-そのためにはOSだけではなく機械語の命令体系も設計しなけれ...
-私の研究によれば、この究極の条件でのhelloのサイズは、15...
-この結果はx86の機械語の命令体系にも無駄が多く残っていた...
-helloとかcharsはコンソールアプリで、はっきりいって見栄え...
-以下のような画像を描画するプログラムは13バイトで書けます...
http://osecpu.osask.jp/download/app0020b.jpg
-以下のような画像の場合は71バイトで書けます。これはすごい...
http://osecpu.osask.jp/download/bball.png
-[このあたりで今までのサイズ比較表を入れる]
*** charsの美しさ
-それではcharsの改良過程を比較して、鑑賞する事にしましょ...
-まずMS-DOS用の.COM形式でごく普通にcharsを作ると、以下の...
B402 // 機能番号=2(一文字表示API)
B220 // A=32(文字コード)
CD21 // MS-DOSのシステムコール命令(Aの文字が表示され...
FEC2 // Aに1を加える
80FA7F // Aと127を比較
75F7 // 等しくなければCD21のところへ戻って繰り返し
B20A // A=10(文字コード:改行)
CD21 // MS-DOSのシステムコール命令(改行される)
B44C // 機能番号=76(プログラムの終了API)
B000 // 終了コード=0
CD21 // MS-DOSのシステムコール命令(終了する)
-このままでも他のOSと比べれば十分に小さくて無駄が少なくて...
--(1) x86の仕様によると、この文脈では FEC2 の代わりに 42 ...
--(2) MS-DOSの仕様によると、この文脈では C3 という1バイト...
-その結果は以下のとおりです。これが17バイトで、MS-DOSにお...
B402 // 機能番号=2(一文字表示API)
B220 // A=32(文字コード)
CD21 // MS-DOSのシステムコール命令(Aの文字が表示され...
42 // Aに1を加える
80FA7F // Aと127を比較
75F7 // 等しくなければCD21のところへ戻って繰り返し
B20A // A=10(文字コード:改行)
CD21 // MS-DOSのシステムコール命令(改行される)
C3 // プログラムの終了
-うーん、美しい。・・・え、この美しさが分からないですか?...
-次はOSECPU(おせくぷ、OSの名前)の例です。8バイトのchars...
05E1 // シグネチャ
20C20 // A=32(文字コード)
1 // ラベル1
2B0750FF07 // 機能番号=65287(文字列表示API)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
9401 // Aに1を加える
A10C7F6 // Aと127を比較して等しくなければラ...
208A // A=10(文字コード)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
2B0750FF06 // 機能番号=65286
2B10 // 終了コード=0
43B019EBFA8411CFE10 // OSECPUのシステムコール命令
-なんかちょっと見ただけでもすごく長そうです。はい、なんと...
--(3) 43B019EBFA8411CFE10 は BFA8 という短縮形に置き換える
--(4) 20C20-1-...-9401-A10C7F6 は 60C20C7F...87 という短...
--(5) プログラムの末尾の正常終了処理は全て省略できるので...
--(6) プログラム最後の改行処理も省略できるので書かないこ...
-そうするとこうなります。
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
2B0750FF07 // 機能番号=65287(文字列表示API)
2132B11CF4B11B1 // メモリを1バイト確保する
48D890B130 // Aを確保したメモリへ書き込む
BFA8 // OSECPUのシステムコール命令
CF5B11B1 // メモリを1バイト開放する
87 // 繰返し範囲終了
-これで31バイトです。かなり短くなりました。まだ8バイトで...
-ここで説明が必要だと思うので書きます。まず(3)の短縮形は...
パターンだと思っているのですが、x86の設計者はそうは思わな...
-さて、このプログラムはまだまだ小さくできます。OSECPUでは...
--(7) 2B0750FF07-2132B11CF4B11B1-48D890B130-BFA8-CF5B11B1...
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
514B00 // Aの文字を文字列表示APIを使って表示
87 // 繰返し範囲終了
-これで10バイトです。一気に8バイトが見えてきました。さら...
--(8) プログラム末尾の87は省略してよい
--(9) プログラムが00で終わる場合、これも省略してよい
05E1 // シグネチャ
60C20C7F // A=32~126までの繰り返し範囲開始
514B // Aの文字を文字列表示APIを使って表示
-ついに8バイトになりました。無駄がなくて美しいです!
-(7)の是非はいったん保留にして、(8)と(9)について説明した...
-私はこれに対し次のような見解を持っています。まずソースレ...
-以上の説明の流れで感じてもらえたと思いますが、コードゴル...
-そして(7)ですが、これも短縮形なのです。それに尽きます。5...
*** こだわりのポイント
-私のこだわりポイントについて話す前に、まずはコードゴルフ...
-今のところ、私がライバルだと感じている人は世界に一人しか...
-しかしそれはたぶん大きな間違いです。私たちはたった二人な...
-ということで、完全無差別級のコードゴルフは日本が最高レベ...
-きっと誰も賛同してくれないのを分かってて言っていますが(...
-現在charsに関しては世界記録は私が保持している8バイトです...
-先のcharsの鑑賞のところで、私はたった1バイトを削っただけ...
-自分でも、何もここまでやらなくても・・・と思うことはよく...
-私は今までずっと競争してきた仲良しのライバルになら負けて...
-そもそもコードゴルフの美学は何ですか。そう、無駄がないこ...
-余談ですが、日本人はコードゴルフに向いているような気がし...
-先の例ではどんどん削って短くしていく方向でのコードゴルフ...
-charsの場合ですと、32と127(20と7F)は削れない情報だと思...
-これは当たり前の事実ですが、charsを1バイト小さくするため...
-でもこう考えてみてください。OSの改良によって小さくなるア...
なったり小さくなったりまちまちなことがありました。そんな...
-とにかく一番やっちゃいけないのは、charsしか小さくならな...
*** おわりに
-さてコードゴルフの世界が少しは分かっていただけたでしょう...
** ほそく
-この文章で出てくる「競争相手」はもちろんneriさんのことで...
-文中で「私たち」という言葉が何度か出ていますが、それはあ...
* こめんと欄
#comment
ページ名: