高レベルでプログラムを組むということ

Javaが好きです。C#CLRも好きですし、Smalltalkなんかも大好きです。最近ではECMAScriptFlash環境を好んで使っています。
その上、ここのところ、ネイティブで直接マシン語に落ちるプログラムをほとんど書いていません。あえていうなら授業の素材かな。これだって、「いかに高レベルな書き方で動かすか」というネタなので、出来上がったものはネイティブとは離れていきます。


そりゃもちろん、 Florian はその筋を長いことやっている職業プログラマーですんで、低レベルなところや、泥くさいチューニングも得意です。
バイトコードVM上で動くプログラムを高級言語で組んでいても、とっさにVM上のバイトコードに落ちているところを想像したりします。さらには、VMがどうやってJITをかけているのか、オブジェクトエンジンのメッセージパッシングやキャッシュ、GCなどのタイミングもある程度読めます。この辺まで来るとブラックボックスの内側なので、実行結果のプロファイリングからの推理になりますが。
もちろんいざとなればマシン語レベルまで落ちます。バス幅やCPUキャッシュやレジスタとコンテクストスイッチや割り込みまで直接触ります。今時のCPUは命令実行スロットやハイパースレッディングでよしなにやっつけちゃうのでさすがにクロック数まで測りませんが、総計算量のケタぐらいは一応計算します。


でも。
いくらそういうのが得意(というか、好き)だからといって、アルゴリズムを実現するアプリの上でいちいちマシン語に落ちているところは想像しません。
だって、思考が重いですから。もう、アルゴリズムレベルで十分複雑なのであれば、そこから先を考える時間があったらアルゴリズム自体を見直した方が圧倒的に効率がいいですし、工数も減ります。
ましてや、最適化なんてのは8割方単純作業なので、下手に手作業でやるよりもコンパイラVMに任せた方が漏れやミスがなくていいでしょうし。
なによりも、OSやランタイムを作った人たちを基本的に信用しています。たとえば入出力のような部分においては、開発や保守に十分な時間をかけているのであれば下手に自前でやるよりもAPIの向こう側に任せた方が実行効率がいいと信じています。OSの都合はOSしか知らないはずなので、OSに任せた方が最適解は求めやすかろう、と。


かくして、 Florian のプログラムは全体的に、環境の流儀に逆らわない方向で組まれます。あの面倒くさいEPOC R7(というか、Symbian(^^;))をディスクプリタやアクティブオブジェクトを駆使して作った直後にC#で無名関数だらけのソースを書いたりもします。なんというか、マルチリンガルで論理と情緒が入り乱れる「政治」を議論しているような感じです。
実際のところ、プログラムというのはロジックであって、言語に非依存で存在しているという古くからある説を半分くらいは信じています。でも、だからこそ、可能な限り高レベルで、頭の中の思考の鋳型にはめやすい言語やパラダイムの方がプログラムにはなりやすいともいえます。
残り半分の部分で、頭の一時記憶に入りきらないような複雑なロジックをどうやって俯瞰するのかを模索する必要があります。結局、「ここから先は考えなくてもいい」という定理の部分をどんどん増やしていくことがレベルを上げていくという行為であり、レベルを上げさえすれば、もっと複雑なロジックだって俯瞰できるようになるよね、と、無条件に信じちゃっています。


かくして、 Florian はこのところ高レベルな環境ばっかりでプログラムを組んでいるのでした。あんまり組み込みやってないってのも大きいんだけど(^^;)。組み込みは……低レベルなところしか作らせてもらえないからなぁ。
ともあれ、無理やりまとめると、

  • 低レベルまで知っていると、高レベルな環境で組んでいても安心
  • 高レベルな環境は頭が悪くても複雑な論理を伏線付きで作れていい感じ
  • でも、だれか組み込みの仕事ください(えー(^^;)?)

ってかんじぃ? どんだけー。