2008-02-23-01-仕事で RPNToGo を思い出す - project-enigma

2008-02-23-01-仕事で RPNToGo を思い出す

>> Site top >> weblog >> 月別アーカイブ >> 2008年02月のlog >> 2008-02-23-01-仕事で RPNToGo を思い出す

最終更新日付:2013/12/31 07:37:23


仕事で RPNToGo を思い出す

2008 年 02 月 23 日

...そんなことがあった。

なにかというと、仕事で逆ポーランド記法で記述した計算式を処理するルーチンを書くことになったのだ。それも、それなりにパフォーマンスが求められるような局面。

陰郎は考えた。パフォーマンスが重要なら、いつもの陰郎のアプローチはダメだ。なぜなら、陰郎はスピードやステップ数よりも保守性や論理的な意味での構造を重視する。それは、長期に渡って複数の開発者によってメンテナンスされる対象としては良いことだが、時としてそれはパフォーマンスに悪影響をおよぼす。普段とは違う、もっとマシン寄りのアプローチが必要だ。

蛇足だが、陰郎がパフォーマンスよりも保守性や可読性を重視するのには相応の理由がある。陰郎が仕事をするフィールドは、長期に渡って仕様変更やメンテナンスが入る業務システムだ。「CD-ROM に焼いたら終わり」のパッケージソフトでもないし、自分だけが理解していれば良い個人所有コードでもない。保守性や変更容易性がなによりも重視される分野では、ハードウェアにお金を積んで「パフォーマンスを買う」ということになる。善悪是非は抜きにして、それが現実だ、そして多くの場合はそれが妥当な選択とも言えるだろう。いまやソフトウェア開発にかける人件費よりも、ハードウェアの方がはるかに安いのだから。

その意味では、RPN 式処理の実装だってものすごく高い性能要求があったわけではなかった。ただ、「遅すぎるのは困るね」という認識はあり、また現在参加しているプロジェクトが(詳細は書けないが)ちょっと毛色の変わったところでもあり、また性能面での努力をするだけの余裕もあった、というところだ。

詳細は省くけれども、文字列としての RPN 式を中間コードに「コンパイル」しておき、ごく簡単なVMを作成して処理するようにした。その実行処理のループ内をカリカリにチューニングするのだ。コードを修正してはコンパイラが生成するアセンブラコードをファイルに落とし、修正前と比較する。陰郎にとってアセンブラは外国語だが、比較して命令数が少ないかどうかを見るくらいならできる。そうやって、少しずつだがコードから命令を削り落としていく。switch 文が確実にテーブルジャンプに置き換えられるように工夫してみたり、算術キャストによる型変換を避けるために共用体を使用してみたり。最初は苦しかったが、なかなか楽しい体験だった。できあがったコードは、陰郎の感覚で言えば「美しくはなかった」が、速度を重視するコードの書き方というのが少しだけわかったような気がしたものである。

この作業をしながら、例えばスクリプト言語などのインタプリタで内部的にオブジェクトコードを作成してVMで処理する、ということも少し理解できたような気がした。RPNのスタックベースの処理などごく簡単なものに過ぎないが、基本的な部分は変わらない。オペコードとオペランドのシーケンスを作ることと、それを正しく処理できるVMを作ること。それができれば、基本的にはそれで That's all である。実はそんなことを Palmでやりたいと思っていた案件があるのだ。しかしそれが現実のものとなるには、陰郎は時間をかけてその分野に習熟しなければならない。それがいつになるのかは、やっぱりわからない。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.