マイクロソフトは、C++でいかにしてMicrosoft Officeのクロスプラットフォームを実現したのか

2014年12月2日

マイクロソフトは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レイヤがさらに乗る。

fig

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"」では、ソースコードを例示しつつ、プラットフォームごとのコンパイラの細かな振る舞いの違い、データ型のサイズの違いなどをどうやって吸収するのか、といったテクニックが説明されています。

あわせて読みたい

Office プログラミング言語 Microsoft




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本