2013-04-22

自由ソフトウェア運動の思想に囚われた技術的に劣った選択

このところ、自由ソフトウェアのコピーレフトライセンスは方向性を間違えており、許諾的なオープンソースライセンスが流行っているとする主張がある。

漢(オトコ)のコンピュータ道: フリーソフトウェア運動は方向性を間違えてはいない

これについて思うことがあるので書く。その前に、まず自由ソフトウェアとは何かということから説明しなければならない。

もちろん、許諾的なオープンソースライセンスと呼ばれるもののほとんどは、ストールマンの自由四原則を満たす。

What is free software? - GNU Project - Free Software Foundation (FSF)

すなわち、

  • あらゆる目的でプログラムを実行する自由(自由0)
  • プログラムがいかにして動作するのかを検証し、変更して自分の意のままに動作させる自由(自由1)。ソースコードへのアクセスはこの自由への前提条件である。
  • 複製物を再配布し、隣人を助ける自由(自由2)
  • 改変版の複製物を他人に再配布する自由(自由3)。これにより、全体を自分の改変による恩恵にあずからせることができる。ソースコードへのアクセスはこの自由の前提条件である。

自由0はしばしば守られていない。たとえば、多くのソフトウェアは、ソフトウェアの利用方法に制限を設けている。犯罪行為に用いないと同意させるのは自由0ではないし、非商用であるとか、非組み込み用途に限るとか、非エンタープライズ用途に限るとか制限をつけるのも、自由0を満たさない。

自由1は当然である。ソフトウェアがいかにして動作するのかという事は、利用者が自ら検証可能であるべきだ。そのためには、ソースコードにアクセスできなければならない。

自由2と自由3が別々になっているのは不思議に思うかもしれない。しかし、世の中にはどうも、このうちのどちらか一方だけの自由は許すが、他方を許したくない人間が存在するのだ。

ストールマンは自由ソフトウェア運動として、強力なコピーレフトライセンスによる自由の保証を使った。従来の著作権の利用法というのは、著作権という独占的な権利が認められ、許諾を得なければ著作権侵害になるということを盾に、様々な利用上の制限を課しているというものだった。例えば、原則として複製物を再配布してはならないとか、改変してはならないとかいう類の権利だ。そういうことをしたければ、著作者からの明示的な許諾が必要になる。

ストールマンは著作権を利用して、自由を保証する許諾契約を作り上げた。著作物の複製物を再配布したり、改変版を再配布する許諾を得たければ、契約に同意する必要がある。その契約は、利用者に複製物や改変版複製物を提供する場合、その契約と同じ契約を提供しなければならないというものだ。これにより、派生物はすべて一つの契約で提供され、ソフトウェアの利用者の自由を保証できる。

なお、ソフトウェアの複製物を受け取る際には、この契約に同意する必要はない。たとえ複製物が契約違反な方法で再配布されていたとしても、受け取る事自体はあらかじめ契約に同意しなくても許諾されている。ただし、受け取った複製物を他人に再配布する際には、契約に同意しなければならない。その契約は、先程も説明したように、利用者の自由を保証する。

これがGPLというライセンスだ。ストールマンは従来の著作権、つまり複製の権利(コピーライト)という言葉に対して、コピーレフトなる造語を作り出した。

世の中には、GPLを汚染であるとか感染であるとかみなす向きがあるが、これは正しくない。むしろ、GPLは利用者を守るためにあるのだ。そもそも、著作権が明示的な許諾を必要とする以上、あらゆる著作物は汚染する。もし、他人の著作物を、ある限定された利用に対して許諾を得て使っているとしよう。その利用範囲を超えると、新たに許諾を得なければならない。

これは、合意した利用法を超えた範囲では、その著作物を使えないという事である。もし他人の著作物を含む自分の著作物がある場合、他人に著作物の利用方法を制限されてしまう。

これは作り手を保護するという意図がある。たとえば、前にテープという媒体に限定して提供する許諾契約を結んでいて、今新しく光学ディスクという媒体が出てきたが、これに対しては新しく契約を結び直すという具合に。

これは著作者の利益になるが、利用者の自由を制限する。今まで想定されていなかった利用法がでるたびに、許諾契約を取りなおさなければならない。

GPLは著作権をうまくハックして、利用者に自由を保証する許諾契約、つまり提供者に自由を保証させなければ著作権利用許諾を与えない許諾契約を作り出した。これはうまく動いた。

さて、ストールマンはMITのコンピューター更新の際、自由なOSが存在しないという現状に直面した。ソースコードも提供されないような不自由なOSを、さらに利用方法まで制限される契約に同意して、始めて利用を許されるようになるのだ。ストールマンは不自由なソフトウェアの利用を拒否した。MITを辞めて、自由なOSであるGNUを開発しだしたのだ。

GNUは、その本来の意図した完全なOSにはいまだに届いていないが、広く使われている。さらに、今はGPLv2という古い時代遅れのライセンスだが、一応は自由なソフトウェアのカーネルが存在するので、GNUにLinuxカーネルを加えて、GNU/Linuxというシステムとして使うことができる。ストールマンが単にLinuxとは呼ばず、GNU/Linuxと呼べと言っているのはこのためだ。

その後、この自由ソフトウェアの本質を理解しない浅はかな人間が、オープンソース運動を立ち上げた。彼ら利用者を制限することを恥としない人間は、提供者が利用者の自由を制限しても許される、むしろ自由の制限を許さないのは自由ではないと考えた。そこで、オープソースライセンスという劣ったライセンスを作り出した。

ほとんどのオープンソースライセンスは、ストールマンの自由原則を満たす。ただし、利用者の自由を保証しない。オープンソースライセンスは、「このソフトウェアのソースコードを提供してやるよ。複製物の再配布もいいよ。改変してもいいし、改変版の再配布もいいよ」とはいう。ただし、その自由の権利を利用者に保証させる義務がない。

つまり、ほとんどのオープンソースライセンスと呼ばれているライセンスで提供されているソフトウェアのソースコードを改変して、その改変版の複製物のバイナリのみを再配布することも許されるのだ。ソースコード提供の義務はない。しかも、利用方法を制限することも許される。非商用利用に限るとか、非組み込み、非エンタープライズ用途に限るなどといった邪悪な制限も許される。

これは利用者の自由を保証しない。

前置きの説明が非常に長くなった。本題の話をしよう。

GNUにはGCCというコンパイラーとその周辺ツール集のソフトウェアがある。これはGPLというコピーレフトなライセンスで提供されている。GCCは長らくコピーレフトを疎ましく思う連中からも使われていた。なぜならば、GCC以外の選択肢などないからだ。GCCはその独占的な技術的優位を利用して、コピーレフトを普及させた。

技術的優位に立つというのは非常に重要だ。いかに自由なソフトウェアといえども、技術的に劣ったソフトウェアは見向きもされない。人は全自由とひきかえに僅かな利便性を選択する生き物だからだ。そのため、自由なソフトウェアはブッチギリで優れたソフトウェアでなければならない。GCCはこの長年、そのような優れたソフトウェアであった。

ただし、GCCは自由ソフトウェアの思想に囚われた、技術上劣った選択をたびたびしてきた。たとえば、GCCは長年コンパイル済みヘッダーの実装を拒んできた。おそらく、コンパイル済みのヘッダーのみを配布されるのを恐れたからであろう。

GCCのソースコードも、モジュール化されておらず、個々の機能に分割して利用することができなかった。たとえば、C言語やC++のパーサーだけを取り出して使うとか、GCCに内部表現を渡して、その後からバイナリ生成までGCCに任せるだとか、そういう部分的な機能の利用が難しかった。そもそも、内部表現は規格化されておらず、互換性を考慮することなく変更されていった。そういうことがやりたければ、GCC全体に組み込むしかないのだ。

これも、GCCをバラバラにして一部分だけ不自由なソフトウェアに組み込みやすくするのを防ぐ意図があったのだろう。

さて、そうこうしているうちに、LLVMという全く新しいオープンソースのソフトウェアプロジェクトが立ち上がった。LLVMもGCCとおなじく、コンパイラーとその周辺ツール集である。LLVMは最初からモジュール化された設計をしており、機能毎に容易に分割できる。しかも、内部表現も規格化し、簡単に変更しない方針を取っている。

LLVMには、コピーレフトを汚染だとか感染だとか考える不遜な企業から大いに支援を受けた。その結果、すばらしい速度で機能が向上していった。現に今、LLVMのClangは、C++11を機能完全で実装するまでに至った。これはGCCもまだやり遂げていない。しかも、GCCの実装には、細かい規格違反のバグが多数ある。Clangにそのようなバグを探すのは難しい。もちろん、バグトラッカーを見れば、やはり多数発見されているのは確かだが。

問題はここだ。自由を保証するため、意図的に技術上優れた設計ではなく、不自由に転用しにくい設計にしてしまうこと。これをしてしまうと、技術的優位に立つことができなくなる。技術的優位に立てなければ、人には使われない。人に使われなければ意味がない。

もうひとつ設計上の話をしよう。カーネルの話だ。

GNUは本来、完全なOSを目指していた。OSにはカーネルも含まれる。現在、GNUではHurdというカーネルを開発中である。残念ながら、このカーネルは未だ実用には至っていない。機能的な優劣はもとより、まだまともに使える段階ですらない。そこで、いまはGNUとLinuxカーネルを組み合わせて使っている。

カーネルには、BSD系列もあり、こちらは共通の先祖を元にだいぶ分散しているが、どれも、少なくとも普通に使える程度には成熟している。Hurdはいまだに使えない。現時点でHurdがなんとか動く環境は、x86エミュレーター内である。実機で動く環境を用意することすら難しい。BSD系列は、ともかくも実機で動かすことはできるというのに。

なぜGNUはともかくも使えるカーネルを開発できなかったのか。十分な金がないのか? 有能なカーネル開発者がいないのか? そうではない。理由は、自由を保証するための設計上の選択だ。

GNUがカーネルを開発しようとしていた頃、まだLinuxカーネルはなかった。カーネルの開発は手間がかかる。もし既存の土台として利用できる自由なカーネルがあれば、それを利用したいものである。その当時、BSDならあった。BSDは色々とライセンス上の問題と訴訟を抱えていたが、最終的には解決されたし、それがカーネル選択の多大な悪影響を与えたわけではない。むしろ、GNUのメンバーには、BSDカーネルに精通しているものもおり、BSDカーネルの選択は妥当なものであると思われた。

もし、当時GNUがBSDカーネルを土台に選択していれば、いまごろは、BSD系列のひとつぐらいにはまともに動くカーネルが出来上がっていた可能性は大いにある。

しかし、ストールマンはGNU Hurdの土台としてMachというカーネルを選択した。Machカーネルはマイクロカーネルとして設計されていた。マクロカーネルとは、カーネル自体は非常に小さく、他の設計のOSならば通常なカーネルで行うような処理もほとんど、ユーザーランド実装で行われる設計だ。GCCはモジュール化を避けていたのを考えると不思議だが、これにも理由がある。

コンピューターの利用者がコンピューターの所有者であるとは限らない。利用者がコンピューターの管理者であるとは限らない。GNUがマイクロカーネルを選んだ理由は、権限を持たないコンピューター利用者にも、最大限の自由を保証したかったからだ。

マイクロカーネルならば、ほとんどの処理はユーザーランドで実装される。つまり、管理者権限を持たずとも、利用者ごとまったく異なるシステムを構築できるのだ。カーネルを変更する権限は必要ない。つまり、権限を持たない利用者でも、自分の環境は自由に設定でき、しかもその設定は他のユーザーに影響を及ぼさない。

GNU Hurdは、このような利用者の自由を保証するという思想上の設計から、マイクロカーネルを選んだ。その結果、いまだに実用に至っていない。

自由を保証する設計は、時として高くつく。例えば、GNU Hurdは設計上、forkをCopy-on-writeで実装できないそうだ。そのため、forkしてexecのようなコードのかわりに、posix_spawnの利用を推奨している。

もちろん、現状がこのままでいいわけがない。ソフトウェアの自由を深く考えないオープンソース(笑)は間違った考え方であり、目先の利便性だけを考えると長期的には不幸を招く。

たとえば、ソニーの邪悪な制限コンピューターPlaystation 4は、BSD系のOSを利用しているという話だし、コンパイラーにはLLVMを利用しているという話だ。しかし、利用者には自由原則はひとつとして保証されない。利用者はソニーがあらかじめ定めた方法でのみ、この忌まわしき制限PS4の操作が許される。ソースコードは公開されず、実装を検証することもできないし、複製物の再配布もできないし、改変版をインストールすることもできない。

これは、邪悪なPS4が利用するBSD系OSやLLVMが、許諾的なオープンソースライセンスで提供されているためである。許諾的なオープンソースライセンスは、ストールマン自由原則を満たすとはいえ、利用者の自由を保証しないので、とても弱いライセンスである。

スマートフォンに使われているAndroidというOSは、Linuxカーネルを用いている。残念ながら、Linuxカーネルは時代遅れのGPLv2を利用しているので、例えばソフトウェアを搭載して出荷されるコンピューターに、改変版を実行しないような制限装置がもうけられていたとしても、ライセンス上どうすることもできない。この制限コンピューターで有名なTivo社にちなんで、Tivoizationと呼ばれている。時代遅れのGPLv2のLinuxカーネルは、多くのAndroid搭載のスマートフォンが制限コンピューターに成り下がることを許している。多くのスマートフォンでは、コンピューター所有者の意に反して、OSの書き換えを制限しているのだ。もし読者がスマートフォンを購入しようと思い立ったならば、そのような制限スマートフォンは絶対に購入してはならない。制限コンピューターは利用者の自由を制限しているのだ。そのような制限コンピューターを所有したいとは思わないだろう。

利用者の自由を保証するため、Tivoizationの害悪から利用者を守るために、GPLv3は重要である。そのため、GPLv3のコンパイラーであるGCCや、GPLv3のOSであるGNU Hurdの存在は大きい。GCCはLLVMの脅威にさらされているとはいえ、まだ戦える。GNU Hurdはいつ戦いの土台に立てるのだろうか。

13 comments:

Anonymous said...

毎回毎回、よくもまあライセンス関連では全く筋が通らない記事を書くものですね

Anonymous said...

Hurdとマイクロカーネル回りは聞いたことのない話がいっぱいあるんだが識者とまでは言えないのでそれ以上はコメント控えます。

Anonymous said...

BSDとGPLだったらGPLのほうが邪悪

Anonymous said...

↑違う、GPLは必要。それはいいんだけど・・・

自由ソフトウェアの思想をもとに「オープンソースは劣っている」と主張するのはともかく、「オープンソース(笑)は間違った考え方」ってのはそれ自体が間違いです。
“オープンソースだけでは不足であって、自由ソフトウェアも当然必要”、と言うなら諸手を上げて賛成するところだけど、“オープンソースは間違っている”と切り捨てることには絶対に賛成はできない。実際オープンソースはその定義上も現実的にも、ほぼ自由ソフトウェアの一側面でしょ。
FROSSという言葉からも明らかなように、自由ソフトウェアとオープンソースは容易に両立できる概念ってことを、もう少し深く考えたらどうか。

Anonymous said...

s/FROSS/FLOSS

Anonymous said...

開発者の意向による「邪悪な制限」の介入をも許すオープンソースと、利用者の自由を最重視し保証する自由なライセンスとでは両立しない。
FLOSSという言葉は制限の強さのみに着眼した人間による産物じゃないかと。

Anonymous said...

この人は自由ソフトウェア=コピーレフトって形に勝手に言葉を捻じ曲げて使うからね
許容的なライセンスの自由ソフトウェアもあるし
コピーレフトなライセンスを用いてもオープンソースであることに変わりはない
実際にはこの記事で言ってるのはコピーレフトと非コピーレフトの対比であって、断じて自由ソフトウェアとオープンソースの対比ではない

Anonymous said...

世界にはアスペも必要という話。

Anonymous said...

捻じ曲げて使っているというより、あんたが曲解していると思われ

> 許容的なライセンスの自由ソフトウェアもあるし
> コピーレフトなライセンスを用いてもオープンソースであることに変わりはない

http://www.gnu.org/philosophy/open-source-misses-the-point.html

Anonymous said...

オープンソースとフリーソフトウェアが二つで一つなわけではないけれど、どっちかが間違ってるわけではないし、この二つは普通に両立してるでしょう

Anonymous said...

「自由を保証するため、意図的に技術上優れた設計ではなく、不自由に転用しにくい設計にしてしまうこと。」これは一種のモラルハザードかもしれないですね。経済学者や社会学者の意見が知りたいところです。

Anonymous said...

コメント9番さんのURI先を読めばわかると思うけど

>わたしたちの知る限り、既存のすべての自由ソフトウェアはオープンソースとして適格でしょう。
と書いてあるとおり、自由ソフトウェアは同時にオープンソースソフトウェアとしての側面を持つし(逆は真では無い)

>ほとんどすべてのオープンソース・ソフトウェアも自由ソフトウェアです。
と書いてある通り、非コピーレフトなライセンスであってもオープンソースであればだいたい自由ソフトウェアであることが多い
https://www.gnu.org/licenses/license-list.ja.html
代表的なBSDライセンスも自由ソフトウェアライセンスです

Anonymous said...

本題と関係なく申し訳ないですが
> そこで、オープソースライセンスという劣ったライセンスを作り出した。
s/オープソース/オープンソース/