マイクロソフトは、C++でいかにしてMicrosoft Officeのクロスプラットフォームを実現したのか
マイクロソフトはOfficeソフトウェアのマルチプラットフォーム展開を進め、Windows版、Macintosh版だけでなくWebから使えるOffice Onlineに加え、iPad版、Android版も公開を始めました。
Officeのような大規模なアプリケーションのマルチプラットフォームへの移植は、どのようにして行われているのか。9月に米国で開催されたC++言語のイベント「CppCon 2014」で行われた同社の講演「How Microsoft Uses C++ to Deliver Office (and More) Across iOS, Android, Windows, and Mac, Part I 」がYouTubeで公開されています。
Officeのコア部分はC++で書かれており、それ以外にプラットフォームの違いを抽象化する薄いレイヤ、プラットフォームネイティブなUXのコードなどを組み合わせたものなっているようです。
動画はパート1とパート2の2部構成になっており、全体で2時間もの長いセッションになっています。この記事では、パート1の動画のポイントと思われる内容を書き出してみました。
How Microsoft Uses C++ to Deliver Office (and More) Across iOS, Android, Windows, and Mac
1. Breif Histroy of Microsoft Office Application
・ Officeは30年の歴史がある、つまりコードベースが30年ものだということ
・ Wordは1983年にDOS版から始まった
・ 1985年はMac版をリリース。そしてWindows版も
・ 1990年にOfficeとしてのバンドルが始まった。このときがすべてを書き直すよい機会だった
・ そこでWindows版、Mac版を共通コードにしようとした
・ しかし残念ながらこれは失敗し、Mac版とWindows版はそれぞれターゲットごとコードなった
・ Officeは非常に成功したが、Mac版のWord 6.0は成功しなかった
・ Windows NTとWindows 95が登場し、32ビット化。Unicodeの採用
・ Office 98でもWindows版とMac版は分かれたまま。このときMac版はMetrowerks Code Warriorコンパイラを採用
・ 2005年にMac版はgcc 4.2に。2011年にはClangに
・ 現在、Office for WindowsはVC14コンパイラ
・ Office for iPad、Office for Androidなども
C++の機能と長期にわたる進化がOfficeの価値を支えてきた。ほかの言語ではできなかっただろう。
Officeはその初期からクロスプラットフォームであり、いくつかのアプローチを試みてきたが、C++はそれを支援してきてくれた。
2. Today's Cross Platform Requirements
Office製品のゴール
・ Windows、Apple、Android、Webなどすべてのメジャーなプラットフォームで利用可能なこと
・ コンテンツフィデリティ(フォーマットや見た目)がプラットフォーム間で保たれていること
・ 各プラットフォームでマーケットをリードする体験を提供すること
しかしプラットフォームごとにさまざまな技術。
・ API - Win32/WinRT/iOS/OS X……
・ フォームファクター - Phone、Tablet、Desktop、大型スクリーン…iWatchも?(笑)
・ UXモデル - マウス/キーボード、タッチ
こうしたあらゆる要素を考慮しながら、しかし異なるプラットフォームでも機能や体験の一貫性を保たなければならない。
銀の弾丸はない。唯一のアプローチは、コストとリスクとベネフィットのトレードオフを考えることだ。
3. Cross Platform Technical Strategy
Officeのような大規模なレガシーコードを、大きな違いを持つプラットフォームへどうやって適用していくのか。
・ 良く定義された組み立て可能なコンポーネント
・ 可能なかぎりメカニカルなリファクタリングを行う
・ つねにすべてのプラットフォームで(開発中のコードが)動くようにした
・ 毎日全てのプラットフォームで大規模なドッグフーディング
など。
技術的アプローチ。
Officeは一番下に「Mini PAL's layer」(注:PALはPlatform Abstraction Layer、プラットフォーム抽象化レイヤ)。中央に大きな共通コアIP。ここがC++で書かれている。いちばん上がネイティブなUXレイヤ。クラウドの場合、この上にUXレイヤがさらに乗る。
PowerPointのユニバーサルアプリでは、コードの96%が共通コード。Android版では95%が共通コード。
Write Once、Run Anywhereのソリューションは長い歴史があるが、プラットフォームのインピーダンスマッチも引き起こす。
・ Word 6.0では、Win32エミュレーションライブラリで、シングルコードを共通化しようとして失敗した。
・ そのままではUXが多のプラットフォームの借り物になる
・ プラットフォームとの連係も悪い
こうした間違いを繰り返さないために。私たちのアプローチは、小さなPALs(Platform Abstraction Layers)。
例えば、Officeでは洗練された動的アニメーションを用いる。一般にこれをクロスプラットフォームで実現するには、低レベルから抽象化する。OpenGLやDirectXなど。しかしわれわれはそれぞれのプラットフォームをよく検討し、その結果こうした。
・ Win32はDirectXを利用
・ WinRTはXAMLの上に薄いレイヤを載せた
・ Androidにも薄いレイヤを載せた
・ MacOSとiOSにはCoreAnimationの上に薄いレイヤを載せた
動画のパート1はここまでです。パート2となる「CppCon 2014: Zaika Antoun "Microsoft w/ C++ to Deliver Office Across Different Platforms, Part II"」では、ソースコードを例示しつつ、プラットフォームごとのコンパイラの細かな振る舞いの違い、データ型のサイズの違いなどをどうやって吸収するのか、といったテクニックが説明されています。