次のページ 前のページ 目次へ

6. Windows&Linuxバイナリ互換の指針

6.1 ウインドウシステム非対応とその目的の理解

これについては少々がっかりする人がいるかもしれませんが、現状のWinuxではウインドウシステムをサポートしないことにしています。 実際論として、WindowsとLinuxの大きな違いはウインドウシステムであり、この相違を吸収するライブラリを作成すれば、その付加価値は大きいと思われます。 ただ、よく考えてください。両方で動作するからには、片方のみに存在する機能は使えないという事です。 操作性を重視する為のウインドウシステムにこの様な制約を加えるということは、その存在価値を著しく失墜させると私は考えます。 また、Windowsにおいては変化が激しく、2年から3年でフルチェンジが行われ、その変化に対応するだけで大量の工数が必要になります。 それよりも、ハード/ソフトの変化が激しくても誰かが勝手に変更してくれるブラウザに着目し、これに対応させる方が利口ではないでしょうか?

6.2 取扱説明書不要のブラウザ対応

インターネットが普及後、最もポピュラーなソフトといえばブラウザでしょう。 Windows系の人はインターネットエクスプローラでしょうし、MacやUNIX系の人はネットエスケープナビゲータの操作に精通しているはずです。 また、両者の操作性の違いはごくわずかで、青下線の文字列をクリックすればリンクされたページに飛ぶことや、 気に入ったページのアドレスを記憶したりする操作はあえて説明の必要はありません。 実際、OSがなくてもブラウザとメールクライアントさえあればよいというパソコンユーザも数多いと思います。

Winuxではウインドウシステムに対応する代わりにブラウザの通信プロトコルであるHTTPプロトコルに対応しています。 つまり、Winuxで作成されたソフトウェアは1つ以上のWebサーバを持ち、同一のパソコン内でループバック通信して、GUIを100%ブラウザに任せる方式をとっています。 通信機構を同一コンピュータ内で使用するのは、もったいない使い方のようですが、ブラウザという世界共通,プラットホーム共通のソフトを利用することにより、 ユーザは直感的に操作が出来て、プログラマーにとってもウインドウ対応に工数を費やすことなく、アルゴリズム創作に集中できるという大きなメリットがあります。

GUIにブラウザを使用する方法は最近のLinux設定ツールであるWebminも採用しており、今後最も有望な方法です。 ブラウザはどんなプラットホームにも勝手に対応してくれます。 またネットワークを接続すれば、実行しているパソコン以外からも操作できますし、 それがWindowsであろうがLinux,PDA,携帯電話であろうが、ブラウザを実行できる機器であればよいのです。

余談ですが、私はGUIをブラウザに統一したOSの構想を練っています。 すべての操作がブラウザ上で行えれば、ウインドウシステム自体が必要ないと考えます(CADなどの分野はムリですが)。 電源ONですぐにブラウザが立ち上がる様な感覚が実現できれば、マイクロ※フトに勝てるかも?

6.3 実行形式の違いを吸収する変換プログラム

既に説明したとおりWindowsではPE,LinuxではELFという実行形式がありますが、 どちらもファイルの先頭の数バイトを特定のコードで規定している為、両用で使用できるファイルは作成できません。 従って両者のバイナリ互換を実現するには、

1)Linuxのカーネルを改造し、PEフォーマットを実行できるようにする。
2)両者のフォーマットのみを変換するプログラムを作り、変換して実行する。

という2通りの方法がありますが、Winuxでは2)の方法を採用します。 実行環境の違いを気にしなくてよいのがメリットであるバイナリ互換がカーネル改造という超特殊な環境を必要とするのはおかしいと考えるからです。 また、フォーマット変換は一瞬で終了しますし、Winuxで作成された実行形式ファイルは非常に小さく、PEとELFの両方をインストールしてもディスク容量的には全然問題がありません。

要約すると、まずWindows環境にてコンパイルし、EXE(PE)ファイルを作成する。 EXE作成と同時に変換プログラムによりEXEをELFに変換する。 ということです。なお、変換プログラム自身をELFに変換することにより、Linux上で実行時に変換するということもできます。

6.4 開発環境はWindows環境を利用する

私としてはどちらの環境で開発してももかまわないのですが、一般的にはWindowsのVisualC++環境が使いやすいとされています。 私は一発コンパイル,一発動作を当然と考えていますが、そうでない人にとっては、デバッグ性が優れているWindows環境の方がいいみたいです。 WinuxではVisualC++環境を標準としました。 VisualC++は優れたコンパイラですが、やっかいな点もあります。例えば「例外処理を有効にする」というオプションはデフォルトでONですが、 これによって、関数の前処理と後処理の部分にリアルモード(16ビットモード)命令が挿入され、これをLinuxで実行すれば当然ながら停止させられます。

VisualC++の環境は費用がかかり、いやだという人もいるかもしれません。 ただWinuxの場合は、C++言語がコンパイルでき、Win32のEXEが作成できればよいので、高機能なものは必要ないですし、最新である必要もありません。 一番安いVisualC++.NETスタンダード(1万円強)とかVisualC++の古いバージョンをアウトレットで購入すればよいのです。 とはいっても開発環境1台きりの出費なので、それによって開発時間が短くなれば元はとれるでしょう。 なお、VisualC++.NETスタンダードはうたい文句が学習用となっていますが、十分強力なツールで、ブラウザやHTMLエディタの機能も入っています。 また、テキストエディタがかなり改善されているので、私は外部エディタを使わなくなってしまいました。 パッケージにはCD−ROMが4枚あり、インストールには2GB位のハードディスク容量が必要ですが、機能が豊富でこれが1万円強なのかという驚きがありました。文句なしにお勧めです。

気をつけて欲しいのが、コンパイラに含まれている再頒配布可能コードの存在です。 これを自由にコピーしてよいのは、あくまでWindows上だけで動くソフトを作成する場合です。 Linuxで動かす事ができる本システムでは使ってはなりません。

6.5 日本語コードはシフトJISのみとする

これについては作り初めてから発見したことですが、文字コードというものは表示部と入力部だけの問題であり、 これらをすべてブラウザに任せれば(大抵のブラウザは得意とするところです)、複数の文字コードを扱う必要がないということです。 開発環境はWindows環境を利用することから、シフトJISに統一します。 したがって、プログラミングする際に文字コードには全然気にする必要はありませんし、通常の日本語処理関数を使用できます。 またLinux環境にシフトJISコードの入ったファイルがあっても問題はありませんし、高機能なエディタなら編集も可能です。

6.6 高速で再利用可能なメモリの動的取得機構

malloc() の様なメモリの動的取得に関してですが、Linuxではライブラリがほとんどの処理を行っている関係上、自作する必要があります。 Winuxはサーバ的なプログラムになるので、 メモリの動的取得/開放を繰り返してゴミができ、どんどんメモリ消費が増えていくような方法では長期間の常時起動に問題が生じます。 また、あまり細かくメモリを管理し過ぎるのも、取得/開放時にCPUパワーを消費する事になります。 これはギガ単位のメモリが当たり前の時代には合わないアルゴリズムだと思います。 某マイクロ※フトは未だにこのような考え方を捨てきれてません(ハードディスクを整列化するデフラグがよい例です)。

Winuxでは取得するメモリサイズを等比的な24種類(32,64,128,256,512......)に固定します。 つまり、33バイトの取得の場合でも実際には64バイトを取得します。 129バイトの取得の場合は実際には256バイトを取得します。 開放時にはそのブロックをサイズ別のリストに登録する方法をとり、64バイトのブロックであれば64バイトの再利用リストに登録されます。 当然次に64バイトブロックの要求があれば再利用リストからブロックを取得します。 これにより、ブロックの100%再利用が可能となり、メモリ消費量はある一定値以上に増えにくくなりますし、 リスト構造をたどっていくというものに比べて遥かに高速処理できます。 デメリットは、メモリ容量が1.5倍ほどいることだけです。(ギガ単位のメモリを積んでいるマシンでも実際には200メガくらいしかつかっていないのでは..)

6.7 汎用デバイスドライバによる1本化

拡張ボードなどを使用するとき、専用のデバイスドライバがLinuxに対応していない事が多いのですが、 アクセス方法が分かっている場合は、ドライバを自作する方法をとるでしょう。 WindowsとLinuxのバイナリ互換を目指すならば、そのドライバの仕様は同じものにしなくてはなりません。 結局は両方のドライバを作成するはめにもなりかねません。

Winuxでは汎用のドライバを1つ用意することで解決しています。 そのドライバを組み込んでおけば、PCIバスの検索から、I/O,メモリ読み書きまでドライバを意識せずに通常のAPI関数の感覚でアクセスできます。 拡張ボードを何枚も使用する場合でもWinux専用ドライバ1つあれば事足り、同一のプログラムで動作することは言うまでもありません。

6.8 コンパクト化と「あるものはすべて利用する」という精神

ソフトウェアの価値という問題について考えると、案外無視されているのがコンパクト化ではないでしょうか。 ソフトの容量が大きくなるということは工数や人数が必要ということです。 例えば、ソースファイルの容量が2倍あるとすれば、コーディング,コンパイル,デバッグ,取説作成,クレーム対処のすべての工数が2倍になります。 すべて1人でやればよいのですが、2人以上の作業になるとさらに工数が1.5倍くらい必要となります。 人数が増えるということは、開発方針や思想がぼやけてくるデメリットもあります。

ある会社の失敗談で文書をすべてコンピュータデータ化しろという方針を徹底したところ、 複数の人間が全く同じ内容の文書をそれぞれデータ化したため、莫大な工数だけを消費し、データ化が進まなかった事例があります。 ソフト技術者は仕事自体が利己的な為、これと同様な事態に陥りやすいと言えます。 誰しもある程度簡単である程度勉強になり、成果が自慢になるような作業をしたがります。 ただそれではいいもの(高付加価値で利益が上がり、短期で完成する)は出来ないのです。 自尊心を捨て、「あるものはすべて利用する」という精神を持つ事が必要です。ただ、あるものを選ぶセンスも必要ですが...

WinuxではGUIをブラウザに任せています。これによりOSやハードウェアの違いを吸収しています。 外部とのデータインターフェースをHTTPプロトコルに統一することで、ファイヤウオールやルータ、DNS,プロキシサーバなど、 既にあり、誰かが勝手に更新してくれるものをそのまま利用することができます。 これは大幅な工数低減になることはいうまでもありません。


次のページ 前のページ 目次へ