Scott Hanselman氏によるインタビューのなかで, ノベル社のAaron Bockover氏は、Bansheeを開発することの難しさについて話している。BansheeはMono上でC#によって作られたクロスプラットフォームのアプリケーションで、Linux、Max OS X、そしてWindowsで動作する。
Bansheeの開発が始まったのは、2005年にAaron back氏がLinux用のメディアプレイヤーを作り始めたときだ。Mono上で構築することで、最終的にはLinux、Mac OS X (v.1.4から)で動作するクロスプラットフォームのアプリケーションになり、今年の夏までにはWindowsもサポートする。すでにWindows環境でも動作しているが、いくつかの点を修正してから公開される予定だ。
Banshee開発の目的のひとつは、Mono上でのアプリケーション開発を見本を作ることだった。このプロジェクトが始まったときは、Monoはまだ初期段階で、あまり支持者がいなかった。類似した出自のアプリケーションには、画像管理システムであるF-SpotとメモアプリケーションのTomboyがある。
BansheeはMono上で構築することのメリットを享受したが、他方、Monoも進化し、このメディアプレイヤーを開発している中で発見された問題を解決して、さらに安定した。 例えばMonoのC#コンパイラにジェネリックが導入されたとき、初めてジェネリックを使ったプロジェクトがBansheeだ。そしてその過程でコンパイラのバグが発見されて、後になって修正された。
Monoのコンパイラ、ガーベッジコレクタやJITは.NETのコードをLinuxへ移植して作ったものではなく、すべてのコードが仕様から書き起こされている。.NETのライブラリは、マイクロソフト社によって文書化された公開APIに基づいて書かれた。最終的にはMSILバイトコードを生成して、Windows、Linux、Max OSのうちのどのプラットフォームでも実行できるようになる。互換性がとても高いため、.NET frameworkの既存のバグまでMonoに移植してしまっている可能性が高いが、それは異なるプラットフォームでアプリケーションを実行したときでも、コードの実行順が同じになることを保証するためだ。このようなクロスプラットフォーム対応方法には多くの難問があるが、大多数はファイルアクセスに関するものだ。Mono上で開発するとき、開発者はアプリケーションがどのファイルシステムを使うのか、POSIXのファイルシステムなのか、FATファイルシステムやNTFSなのか意識していない。Monoには複数のSystem.IOライブラリの実装があり、どのファイルシステムでも正常に動作するようになっているからだ。
詳細を見てみよう。例えばSystem.IO.Directory.GetFiles()メソッドの実装だ。このメソッドは配列を返却する。呼び出し元は、このメソッドが完全な配列を構築して返却するまで待たなければならない。しかし、この方式だとディレクトリに大量のファイルがある場合、性能が悪化してしまう。性能悪化を回避するために、ディレクトリ内のファイルを見つける別の方法として、開発者はMono.Posixライブラリを使うこともできる。このライブラリを使えば、メソッドはIEnumerable型を返却するので、目的のファイルをより速く見つけられる。
Bansheeが使っているのはIO抽象レイヤだ。このレイヤはデフォルトではすべてのプラットフォームでSystem.IOを利用できるようにする。しかし、アプリケーションがPOSIXシステムを見つけると、Mono.Posixライブラリを利用するようになり、より高い性能を生み出す。
一般的に言って、抽象レイヤには2種類ある。ひとつはハードウエアを抽象化するレイヤで、このレイヤの必要性は明らかだ。そしてもうひとつはプラットフォームを抽象化するレイヤで、そのプラットフォームが提供する最良の特徴を利用できるようにする。このレイヤの例には、GNOMEの抽象レイヤが挙げられる。このレイヤには、ディスクトップ環境が提供する機能の上で構築されたアプリケーションが、スクリーンセイバによって動作を妨げられるのを防ぐ機能がある。また、特定の必要不可欠な機能を実装していないプラットフォームのために、Monoは各プラットフォーム用の拡張ライブラリにそのような機能を実装している。例えば、Mono.Addinsライブラリは、Mono上でなくても、Visual Studioを使っている.NET開発者が利用できる。このライブブラリは独立して使えるアドオンだからだ。
BansheeのようなMonoアプリケーションは、ビルドするときに実行環境の検証をおこなう。ビルド処理で、核になるコンポーネントと必要な追加ライブラリが実行環境をもとにしてに作成される。Windowsなら必要な情報はすべてソリューションファイルに記述されている。このファイルはVisual Studioで開くことができ、ビルドを行うと必要なDLLが付け加えられる。LinuxでもWindowsでのビルドと違う点は特にない。WindowsでのビルドがWindowsのPCで行われるように、LinuxでのビルドはLinuxで行われる。実行時に実行環境の検証をすることもでき、特定のケースで行われるが、推奨はされていない。