<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
我々は、既に、UNOが、基本的に、何であるかを話し合った。
そうだ。UNO(Universal Network Objects)は、LibreOfficeを構築するのに使われているテクノロジーであり、UNOオブジェクトとはどのようなものか、UNOオブジェクトをどのように操作できるか、その他関連する諸々の仕様の総体だ。UNOオブジェクトは、オブジェクト指向言語の意味で、一種のクラスインスタンスだ。
ここでは、UNOのいくつかの特徴を学ぼう。
オーケー。
UNOは、プログラミング言語に依存しない抽象的な仕様の体系であり、そうした仕様が個別のプログラミング言語(例えば、C++やJava)上の仕様にマッピングされる。
よく分からない。仕様は全て抽象的なものだと思う。Javaの仕様は抽象的であって、Oracle JDKやOpenJDKはその実装だ。
. . . そう、「抽象的な」というのは、蛇足の形容詞だった。忘れてくれ。
それで、「プログラミング言語に依存しない」というのは、具体的にどういう意味なのか?
うーん、例えば、UNOにはstringというデータ型が定義されているが、このデータ型は、特定のプログラミング言語のデータ型ではない。UNOの仕様はJavaの仕様にマッピングされるが、Javaにはstringというデータ型はない。
stringというデータ型は、ライブラリの中のクラスとして提供されるのではないのか?
いや。stringというデータ型は、Javaでは、 java.lang.Stringにマッピングされる。
ああ、「マッピングされる」というのはそういう意味か。. . . あるプログラミング言語の中で生きているUNOオブジェクトは、別のプログラミング言語から操作できるのだろう?
そう。あるプロセスのあるプログラミング言語の中で生きているUNOオブジェクトは、同じプロセスの別のプログラミング言語からも、別のプロセスのあるプログラミング言語からも操作できる。そうしたプログラミング言語へのマッピングが存在すればの話だが。別のプロセスは、別のマシンにいてもよい。
あるプログラミング言語の中で生きているUNOオブジェクトが別のプログラミング言語から操作できるためには、2つのプログラミング言語間で授受されるstringデータが、相互に合意したバイナリーシーケンスで授受されなければならないはずだ。
そう、そういう合意したフォーマットがあるはずだ。ただ、そのフォーマットが具体的にどのようなものなのかが書かれた文書を私は知らない。2つのプログラミング言語環境間にはブリッジと呼ばれるものが確立される。あるstringデータがJava環境からC++環境に受け渡されるとき、ブリッジのJava側は、java.lang.Stringインスタンスを合意したバイナリーシーケンスに変換し、合意したバイナリーシーケンスをブリッジの反対側へ渡す。ブリッジの反対側は、合意したバイナリーシーケンスをC++でのstringインスタンスに変換する。. . . すくなくとも、それが私の推測だ。互いに別のプロセスにある2つのUNOプログラミング言語環境間には、プロセス間ブリッジと呼ばれるブリッジが確立される。
あるプログラミング言語の中のUNOオブジェクトは、その同一のプログラミング言語環境からも、一種のブリッジを介して操作されるのか?
たぶん違うが、確信はない。私の知る限りの文書にはそういう詳細は書かれていない。そう推測する理由はあるが、ここではそれを説明するのはやめておこう。
UNOの仕様が全体として、あるプログラミング言語にそんなにスムーズにマッピングできるものなのだろうか?
実のところ、できない。私が見る限り、一部に妙なところがある。例えば、UNOの「long」型はJavaの「int」型にマッピングされ、UNOの「any」型はJavaの「java.lang.Object」型にマッピングされ、UNOの「any」型はUNOの「long」型を格納できるが、Javaでは、「java.lang.Object」は「int」型を格納できない。というのも、「java.lang.Object」はプリミティブデータを格納できないから。そういう場合は、「java.lang.Integer」が使われる . . . しかし、それをスムーズなマッピングとは私は呼ばない。
なるほど。プログラミング言語に依存しない仕様をある特定のプログラミング言語にマッピングしようとすれば、そうした歪曲は不可避なのだろう。
理論的には、そういう歪曲を許せば、UNOは、いろいろなプログラミング言語にマッピングできる。実際には、UNOがマッピングされている主なプログラミング言語は、C++とJavaだ。LibreOfficeは、おおむねC++で実装されており、我々は、UNO拡張機能をJavaで実装するつもりだ。UNOの一部は LibreOffice Basicにマッピングされているが、LibreOffice Basicでできることは、限られているようだ。例えば、私の知る限り、UNO拡張機能は、LibreOffice Basicでは開発できない。他のプログラミング言語へのマッピングもあるが、これらのプログラミング言語で何ができるのか私は知らない。
ははあ。
- Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide