* 究極の最適化方法?
 -(by [[K]], 2008.11.14)
 *** (0)
 -僕の持論では、プログラミング言語において、高速化の追求が無条件で良しとされるのはアセンブラまでである。Cコンパイラやその他すべての高級言語でも最近は当然のように高速化のための最適化機能をつんでいるが、あれは微妙な機能だと思う。とにかく無条件で最高の速度が出したいときは、僕はアセンブラを使う。高速性においてある程度の妥協をしてもいいときは、CやC++やその他の言語を使う。
 -もちろんどの言語だって実行が速ければ速いに越したことはないが、そのせいでなにやらあやしい動作になったりする処理系もあり、それはもはや本末転倒だと僕は思う。
 *** (1)
 -高級言語を作るにあたって、一番作りやすいのはインタプリタだろうと思う。コンパイラを作るのは結構面倒だ。実行速度がどんなに遅くてもいいよと言われたら、普通のプログラマなら言語処理系をインタプリタで書こうとするだろうし、しかもシンプルに書くだろう。そうすればバグも混入しにくい。言語処理系にバグがあると本当に救いようがないときがあるので、これは全面的にいい傾向だ。
 -しかし確かにこれでは実行速度は遅い。それでコンパイラにしてさらに最適化ルーチンを作っていくわけだけど、これをやるとみんな複雑になってバグを作りこんでしまう。
 -ということで、僕は別の道を提案したい。
 *** (2)
 -たとえば今ここに、なにやら1000行くらいで書かれた非常に複雑な関数があるとしよう。一つの整数を引数に持ち、一つの整数を返す(その他の環境由来の入力はしないとして)。int f(int x)。ここで、xは-9〜+9までの値しかとらない、もしくはその範囲の値しか使わないと分かったとする。そうであれば、この関数はこの形式に最適化できるはずだ。
  int f(int x) { static int r[19] = { ... }; return r[x + 9]; }
 -もちろんこれ以上に簡単にできる可能性もある。もしかしたら散々計算させた挙句に、この関数は、 f(x) = 2 * x - 1 だったりするかもしれない。そういう時はもっと簡単にできるだろう。
 -今の主流の最適化は、みんな処理を追いかけて最適化している。しかし入力と出力の関係をすべて書き出して、その出力を得るための手順を独自に探せばいいじゃないか。つまりそうすれば処理によっては劇的に早くなりそうだ。そしてその処理をアセンブラで出力すればいい。
 -もちろん実際の関数では入力が複数あって物凄くややこしいわけだけど、でもこの方向でがんばるのが将来の最適化の行くべき道なんじゃないだろうか。これはつまり、僕たちが謎の数列を渡されて、その一般項を求めるという行為に似ていると思う。
 -しかもこれのすごいところは、プログラミングとして、入力と出力の関係を示した表を作るということも許されるということだ。これならプログラミング言語とかを全然分からなくても誰でも作れる。結局最適化プログラムは、まずインタプリタを実行してこの対応表を作り、それをできるだけ簡単に生成できる方法を探しているだけなのだから。これってなんかニューロコンピュータみたいでもある。入力から出力が得られるように学習させるわけだ。
 -しかもこれのすごいところは、プログラミングとして、入力と出力の関係を示した表を作るということも許されるということだ。これならプログラミング言語とかを全然分からなくても誰でも作れる。結局最適化プログラムは、まずインタプリタを実行してこの対応表を作り、それをできるだけ簡単に生成できる方法を探しているだけなのだから。これってなんかニューロコンピュータみたいでもある。指定した入力から指定した出力が得られるためにどうしたらいいかを考えさせるわけだから。
 * こめんと欄
 #comment

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS