Entry

プログラムの構成方針とかメモ

2011年12月31日

個人的なプログラムの構成方針とかメモ。

ひとつのプログラム(ライブラリ・実行モジュール)は単一の開発言語なりパラダイムになりに則っている必要はないので,適材適所で使い分けるわけだけれども,ある程度使用場面をカテゴライズしておくとすっきりすることがあります。どゆ場面でどゆ開発環境を前提にすればいいのか,ちと検討してみます。

例えば,まともな画像処理のプログラムを作る場合,基本処理を LL(Lightweight Language)で書くようなことは普通しません。ある程度処理内容が固まっている場合(実験的な実装ではない場合)で,パフォーマンスを求める場合は,アセンブリで書くこともある。また,技術者がユーザになる場合の実装(ライブラリになることがほとんど)では,Python や Ruby のバインディングを作っておくと便利になることがあります。.net な環境はアンマネージドな DLL とリンクしやすいので,Windows 環境では C# でインターフェイスを作ることもできる。

個人的な方針として,ある程度開発言語間で使いまわすことを予定したプログラムは,比較的水準の低い言語(C/C++,アセンブリ等)で書くべきだと思っています。核とも呼べる基本処理については特にそう。もっとも,このことは,一般に高水準の開発言語が同じコードを使いまわすことを予定していることを考えると,矛盾しているようにも見えます。しかし,高水準の言語が提供するのは,基本的にインターフェイスのみだと考えた方が,却ってモジュール化が進んだりする。

というのも,基本処理を高水準で実装すると,低水準に戻ることが難しくなるからです。はじめから低水準で本体を実装しておけば,あとでいくらでも高水準の機能を使うことができる。

例えば,Java で画像クラスを書いた場合,これは JVM 上で動くことが確定したプログラムになります。とゆことは,将来的にこのプログラムをアセンブリで最適化したいと思っても,もうできない。また,JVM に乗っかっているので,.net や他の LL から使いまわすことも基本的にできなくなります。使いまわしが利くようで利かないプログラムになってしまう。同様の理屈は,各 LL にも当てはまる。高水準の言語で書くということは,あらかじめハードウェアに対して抽象化された水準でプログラムを書くことになるので,ハードウェアに依存した最適化は施しにくくなります。

一方で,同じくプログラムを使いまわすとしても,異なるプラットフォーム間で同じコードが動くという意味では,高水準の言語の方が可搬性があります。上と同じことになるけれども,高水準の言語はハードウェアやプラットフォームの違いを抽象化して差異を吸収しているので,こゆ芸当ができる。

上の二つは,どちらもプログラムの使いまわしやすさ,つまり,可搬性(portability)について書いたわけだけれども,様子が随分異なります。ここでは,前者の可搬性を垂直的な可搬性と呼ぶことにします。また,後者の意味で使われる可搬性を,水平的な可搬性と呼ぶことにしましょう。抽象性の水準そのものを行き来する意味で「垂直的」,同じ抽象性の中で動作環境を行き来する意味で「水平的」です。

こう考えると,プログラムを構成する場合,各処理の抽象度の水準をあらかじめ把握しておく必要があることが分かってきます。まだよくまとまってはいないけれども,原則として,垂直的な可搬性が必要な場合は,低水準の開発言語でなるべく多くの開発環境をサポートできるようにすることになるのだと思う。一方,水平的な可搬性を求める場合,そのプログラムは高水準の開発言語をサポートすることになるはずです。さらに,C++ のテンプレートのようなジェネリックな実装については,開発言語の抽象性とは別に,可搬性を考える必要があるのだと思う。

ま,言葉にすると当たり前の話なんですが。そういった理由から,通常製品と呼ばれるもののコアは C なりアセンブリなりで書かれている場合が多いようです。売り物の場合は,それだけで製品のラインナップが増えることにもなる(C# オプションとか,Java オプションとかを作れる)。

この点,C++ はどうかというと,抽象度が機能によってまちまちになるので,実装する際はかなり注意しないといけないと思う。例えば,テンプレートの機能を画像処理の基本機能に使うのは,一見使い回しが利くように見えて,実は単に複雑になるだけだったりする。画像処理ではアセンブリを使うことがたまにあるけれども,ジェネリックなプログラムはアセンブリに落とし込めるほど型が一定していないからです。かといって特殊化してインラインでアセンブリを使えばいいかというと,そゆわけにもいかない。なぜなら,テンプレートにする意味がほとんどなくなってしまうからです。こゆのは最初からアセンブリで書いて,テンプレートを使うにしてもインターフェイスだけを公開する方がすっきりとまとまるはずです。

あまりまとまらないけれどもそんな感じ。垂直方向と水平方向,バランスをとりながら設計/実装することになるわけだけれども,なかなか難しいんですよね。これが。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN