2017年3月25日土曜日

3: UNOとは何か?

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

Main body START

UNOとは何か?

-Hypothesizer

我々は、既に、UNOが、基本的に、何であるかを話し合った。

-Rebutter

そうだ。UNO(Universal Network Objects)は、LibreOfficeを構築するのに使われているテクノロジーであり、UNOオブジェクトとはどのようなものか、UNOオブジェクトをどのように操作できるか、その他関連する諸々の仕様の総体だ。UNOオブジェクトは、オブジェクト指向言語の意味で、一種のクラスインスタンスだ。

-Hypothesizer

ここでは、UNOのいくつかの特徴を学ぼう。

-Rebutter

オーケー。

-Hypothesizer

UNOは、プログラミング言語に依存しない抽象的な仕様の体系であり、そうした仕様が個別のプログラミング言語(例えば、C++やJava)上の仕様にマッピングされる。

-Rebutter

よく分からない。仕様は全て抽象的なものだと思う。Javaの仕様は抽象的であって、Oracle JDKやOpenJDKはその実装だ。

-Hypothesizer

. . . そう、「抽象的な」というのは、蛇足の形容詞だった。忘れてくれ。

-Rebutter

それで、「プログラミング言語に依存しない」というのは、具体的にどういう意味なのか?

-Hypothesizer

うーん、例えば、UNOにはstringというデータ型が定義されているが、このデータ型は、特定のプログラミング言語のデータ型ではない。UNOの仕様はJavaの仕様にマッピングされるが、Javaにはstringというデータ型はない。

-Rebutter

stringというデータ型は、ライブラリの中のクラスとして提供されるのではないのか?

-Hypothesizer

いや。stringというデータ型は、Javaでは、 java.lang.Stringにマッピングされる。

-Rebutter

ああ、「マッピングされる」というのはそういう意味か。. . . あるプログラミング言語の中で生きているUNOオブジェクトは、別のプログラミング言語から操作できるのだろう?

-Hypothesizer

そう。あるプロセスのあるプログラミング言語の中で生きているUNOオブジェクトは、同じプロセスの別のプログラミング言語からも、別のプロセスのあるプログラミング言語からも操作できる。そうしたプログラミング言語へのマッピングが存在すればの話だが。別のプロセスは、別のマシンにいてもよい。

-Rebutter

あるプログラミング言語の中で生きているUNOオブジェクトが別のプログラミング言語から操作できるためには、2つのプログラミング言語間で授受されるstringデータが、相互に合意したバイナリーシーケンスで授受されなければならないはずだ。

-Hypothesizer

そう、そういう合意したフォーマットがあるはずだ。ただ、そのフォーマットが具体的にどのようなものなのかが書かれた文書を私は知らない。2つのプログラミング言語環境間にはブリッジと呼ばれるものが確立される。あるstringデータがJava環境からC++環境に受け渡されるとき、ブリッジのJava側は、java.lang.Stringインスタンスを合意したバイナリーシーケンスに変換し、合意したバイナリーシーケンスをブリッジの反対側へ渡す。ブリッジの反対側は、合意したバイナリーシーケンスをC++でのstringインスタンスに変換する。. . . すくなくとも、それが私の推測だ。互いに別のプロセスにある2つのUNOプログラミング言語環境間には、プロセス間ブリッジと呼ばれるブリッジが確立される。

-Rebutter

あるプログラミング言語の中のUNOオブジェクトは、その同一のプログラミング言語環境からも、一種のブリッジを介して操作されるのか?

-Hypothesizer

たぶん違うが、確信はない。私の知る限りの文書にはそういう詳細は書かれていない。そう推測する理由はあるが、ここではそれを説明するのはやめておこう。

-Rebutter

UNOの仕様が全体として、あるプログラミング言語にそんなにスムーズにマッピングできるものなのだろうか?

-Hypothesizer

実のところ、できない。私が見る限り、一部に妙なところがある。例えば、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」が使われる . . . しかし、それをスムーズなマッピングとは私は呼ばない。

-Rebutter

なるほど。プログラミング言語に依存しない仕様をある特定のプログラミング言語にマッピングしようとすれば、そうした歪曲は不可避なのだろう。

-Hypothesizer

理論的には、そういう歪曲を許せば、UNOは、いろいろなプログラミング言語にマッピングできる。実際には、UNOがマッピングされている主なプログラミング言語は、C++とJavaだ。LibreOfficeは、おおむねC++で実装されており、我々は、UNO拡張機能をJavaで実装するつもりだ。UNOの一部は LibreOffice Basicにマッピングされているが、LibreOffice Basicでできることは、限られているようだ。例えば、私の知る限り、UNO拡張機能は、LibreOffice Basicでは開発できない。他のプログラミング言語へのマッピングもあるが、これらのプログラミング言語で何ができるのか私は知らない。

-Rebutter

ははあ。

Main body END

References

  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>