Mono と Java
Question 100: 何でJavaを使わないんでしょう? 最終的にJava VMをターゲットにしている言語はたくさんあるんですけど。
自由なシステムですぐにでもJava開発できる、とても良いツールが入手できます。 Red Hat は、JavaソースやJavaバイトコードからネイティブ実行可能コードを生成する GCCの Java用フロントエンド を貢献しています; Transvirtual は Kaffe という、JavaのJITエンジンを実装しました; Intelも ORPというJava VMをもっています。
JVM は一般的な用途の仮想マシンとなるようには設計されていません。 一方で、共通中間言語 (CIL)は、幅広いプログラミング言語を対象として設計されており、またJITerにとって最適なものとなるべく設計された、ルールのセットをもっています。
Question 101: Java は CLI をターゲットに出来ますか?
ええ、JavaはCLIをターゲットにすることもあり得ますし、Microsoft J#はそれをやっています。
The IKVM project builds a
Java runtime that works on top of .NET and on top of Mono. IKVM is
essentially a JIT compiler that translates from JVM bytecodes into
CIL instructions, and then lets the native JIT engine take over.
Question 102: JVMバイトコードをCILコンバータ用に書くことができますか?
はい、それが IKVM がやっていることです。
Question 103: monoはCILとjavaのハイブリッド プラットフォームになることができますか?
IKVMで簡単に実現できます。
Question 104: Do you plan to implement a Javascript compiler?
Yes. The beginnings of the JScript compiler can be found on CVS.
Cesar coordinates this effort.
Question 105: Can Mono or .NET share system classes (loaded from mscore.dll and other
libs) or will it behave like Sun's Java VM?
What you can do with mono is to load different applications in their own
application domain: this is a feature of the CLR that allows sandboxing
applications inside a single process space. This is usualy exploited to
compartmentalize different parts of the same app, but it can also be
effectively used to reduce the startup and memory overhead.
Using different appdomains the runtime representation of types and
methods is shared across applications.
Question 106: Monoあるいは.NETは、SunのJava VMのように、システムクラス(mscore.dllや他のライブラリからロードされるもの)を共有することが出来ますか?
あなたがmonoでできることは、そのアプリケーション ドメイン自身の中で、 別のアプリケーションをロードすることです: 単一のプロセス空間内でアプリケーションのサンドボックスを許容するというのは、CLRの失敗です。これは通常、同一のアプリケーションの別の部品を区切るという使い方をするのですが、スタートアップとメモリのオーバーヘッドを効率的に減らすためにも使われます。 別の appdomain を使って、型およびメソッドのランタイム表現は、アプリケーション間で横断的に共有されます。[訳注 - 「プログラミング Microsoft .NET Framework」の20章に詳しい説明がある]
Monoの拡張
Question 107: 仕様にないクラスを作っても良いですかね?
どうぞ。Microsoftのクラスコレクションは非常に膨大ですが、これが完全であるということは決してありません。Monoアプリケーション用に`Camel' (Java Mailにインスパイアされた、Evolutionで使われているメールAPI)の移植を作れればナイスですね。
Mono用のCORBAの実装にあたってみたいと思われるかもしれません。 それは便利なだけでなく、CLIがタイプリッチなシステムであるという事実を考えると、面白そうな話に聞こえます。
Monoを拡張するための詳しい情報については、われわれのアイディアのページを見て下さい。
Question 108: .NETを取り込んで拡張する[Embrace and Extend]計画はありますか?
優れた技術の取り込みは良いことです。技術を非互換のかたちで拡張するのは、ユーザーにとっては悪いことですので、この技術を拡張する計画はありません。
もし革新的なアイディアがあって、新しいクラスを作りたいということでしたら、われわれはそれらのクラスを、Monoでも.NETでも正しく動作するように作ることを推奨します。
Today Mono ships with a number of extra libraries that were
developed either by members of the Mono community, or other
groups.
In some cases, we have found the bits from Microsoft to be
incomplete, but we avoid breaking the API, instead we expose the
missing functionality in new assemblies (See Mono.Security and
System.Security).
Question 109: Is there any way I can develop the class libraries using Linux yet?
Yes. Mono has been selfhosting since March 2002.
Question 110: monoの動作確認済みのコピーを /usr の中にインストールして、実験的なコピーを他の場所に置いて、両方のコピーがそれぞれのライブラリを使うようにすることができますか?(私、Linuxのライブラリパスをまだよく知らないんです)
ええ。単純に、インストール時プレフィックスを2つ使ってください。
移植性
Question 111: MonoはLinuxでしか動作しませんか?
のところ、われわれはLinuxベースのシステムとWindowsで作業を進めています。われわれはコードにLinux主義にならないことを期待していますので、Monoを他のUNIXの変形[Unix variants]に移植するのは簡単であるべきです。
Question 112: Monoを非Linuxベースのシステムに持っていくのはどうですか?
Ximianにおけるわれわれの主要な意図は、GNOMEアプリケーションをMonoで開発することができるようになることです。が、もしあなたがWinformクラスを他のプラットフォーム(たとえば、frame bufferやMaxOS Xなど)に移植することに興味があれば、われわれはそれがオープンソースライセンスのもとで行われる限りは、それを喜んで統合します。
Question 113: どのオペレーティングシステム/CPUをサポートしていますか?
Monoは現在のところ、Linux、Windows、Solaris、FreeBSD, HP-UX, MacOS X上で動作しています。
x86プロセッサ用には、特定のCPU向けのコードの生成と最適化を行うことができるJITエンジンがあります。
SPARC v8, SPARC v9, Itanium, HP-PA, PowerPC, StrongARM の各CPUについては、インタープリタが存在します。
Question 114: MonoはWindowsで動作しますか?
はい。プリコンパイルされたバイナリを
binaries from http://www.go-mono.com/download.htmlから入手できます。
Question 115: MonoはLinuxで動作しますか?
はい。プリコンパイルされたバイナリを
binaries from http://www.go-mono.com/download.htmlから入手できます。
Question 116: monoを実行するにはcygwinが必要ですか?
いいえ。CygwinはMonoをビルドするときにだけ必要となります。
Question 117: Mono は GNOME に依存するようになるでしょうか?
特定のアセンブリを使おうとする時だけ依存するでしょう(たとえば、GUIアプリケーションをやってるときには)。あなたが「Hello WorldエンタープライズP2P Webサービス」を実装することしか興味がないのでしたら、GNOMEのコンポーネントは何も必要ありません。
Question 118: RhinoをC#に移植する計画はありますか?
Eto Demerzal が Rhinoの C#移植を始めています。
Question 119: MacバージョンのC#環境のビルドに成功した人はいますか? いるとしたら、どうやったか説明してくれませんか?
はい。Mono はLinux/PPC および MacOS X (10.2 and 10.3)上で動作します。
既存コードの再利用
Question 120: あなたたちは、どのプロジェクトを再利用したり、土台にして設計するつもりですか?
われわれは近いうちにMonoをプログラマーの手に渡したいと思っています。われわれは既存のオープンソース ソフトウェアの再利用には関心があります。
Question 121: Microsoft SQL Server 2000 を使えるようになるでしょうか、あるいは特定のオープンソース データベースに切り替えることが必要でしょうか? 再コードは必要ですか?
再コードする必要は無いでしょう。
Question 122: VB.NETでプログラミングするときに、それらのアプリケーションがLinuxで実行できることを確信できるようにするには、何を見る必要があるでしょうか?
PInvokeやDLL呼び出しを作り出したり、Microsoft.* ネームスペースのものを使わないことで十分です。また、「この型は、.NET Framework インフラストラクチャのサポートを目的としています。独自に作成したコード内で直接使用することはできません。」[English Versionなら "This type/method supports the .NET Framework infrastructure and is not intended to be used directly from your code."]とマークされているメソッドやクラスはいずれも、たとえ動くと知っていても使わないことです。
Question 123: crystal reports用のビルトインのレポーティングはサポートされますか? これが私たちのシステムの一部でヘビィに使われているんですが。
多分しません。Crystal Reports はプロプラエタリなものです。誰かがその振る舞いをエミュレートしようとするかもしれませんが、まだ誰もそういうボランティアはやっていないです。
Question 124: レジストリに書き込む奴についてはどうですか? 私が理解しているところでは、Linuxはレジストリになるものはもっていません。あの機能に依存するのは避けるべきでしょうか?
避けるようにしてください。Monoでもレジストリのエミュレーションが出来るようにはなるでしょう。しかし、gnomeはレジストリに近いコンフィグレーションシステムを持っているのですが、そのキーは同じものにはならないでしょうから、結局はあなたはおそらく何かしらのランタイム検出を行わなければならなくなるでしょうし、あなたのプラットフォーム固有のやっつけ仕事で作ったそのアセンブリのロードに依存することになるでしょう。
Question 125: System.Data.SqlClient と FreeTDSについてですが、C#にそれらの一部を移植したり、使ったりするでしょうか?
出来ています。
Mono と GCC
Question 126: C#のGCCフロントエンドの作業はやっていますか? CILイメージを生成するGCCバックエンドは? CILイメージを受け取ってネイティブコードを生成するGCCフロントエンドはどうでしょう?
われわれは現在、それらのプロジェクトのボランティアを探しているところです。興味がおありでしたら、協力のセクションを見てください。
Question 127: What about making a front-end to GCC that takes CIL images and
generates native code?
There is no active work on this area, but Mono already provides
pre-compilation services (Ahead-of-Time compilation).
Question 128: でもそれらの作業はGCCコンパイラのGPLのものになるわけですし、フリーでないフロントエンドで皆さんが作業することを許してしまうのではないでしょうか?
皆さん既にJVMバイトコードをターゲットにして、それが出来ています(JVMをターゲットにした、多様な言語のためのコンパイラが130近くあります)。
パフォーマンス
Question 129: Monoはどれくらい速いものになるでしょうか?
われわれは未来を予言することは出来ません。しかし、慎重な見積としては、最低でも「他のJITエンジンと同程度には高速なもの」になるでしょう。
われわれは、ちょうどMicrosoftが彼らの.NET開発プラットフォームについて行っているのと同じように、さまざまなJITエンジンと一緒にMonoを出荷したいのです。われわれは、より高速な、低パフォーマンスで高速ロードのJITや、コード生成時は低速だけどより最適化された出力を生成するような最適化JITを提供することもできました。
Mono's JIT engine has been recently re-architected, and it provides
many new features, and layers suitable for optimization. It is
relatively easy to add new optimizations to Mono.
CILはJavaバイトコードに対して、いくらかアドバンテージになるものです: これは本当の中間表現であり、より良いJITエンジンの作成を簡潔にするCILコードをエミットできるようにするために、数多くの制限が設けられています。
たとえば、CIL上では、スタックはコードジェネレータが好きなように使うことができるアブストラクションではありません。そうではなく、これは解析されたツリーのポストフィックス表現を作成する方法なのです。いかなる呼び出し位置や戻り位置でも、スタックの内容は、命令がどこまで到達しているかに関わらず、同一のオブジェクトタイプを含んでいることが期待されます。
ライセンス
Question 130: Monoで動作する、プロプラエタリなアプリケーションを書くことはできますか?
ええ。ライセンスのスキームは、プロプラエタリな開発者がMonoでアプリケーションを設計することを許容するよう計画されています。
Question 131: Monoプロジェクトでは、どういうライセンスを使っているのですか?
C#コンパイラはGNU GPLの下でリリースされています。ランタイムライブラリはGNU ライブラリ GPLです。クラスライブラリはMIT X11ライセンスの文言に沿ってリリースされています。
LGPLのことを"Lesser GPL"とは呼ばず、"Library GPL"と書いていることに注意。
MonoランタイムとMono C#コンパイラは、LGPLやGPLをコードに使えない人には、プロプラエタリなライセンスの下でも利用することができます。
ライセンスの詳細については、mono-licensing@ximian.comに連絡してください。
Question 132: Monoに特別なライセンスの下でコードを貢献したいんですけど、どんなライセンスなら受け容れてもらえますか?
われわれはまずそのライセンスの互換性を評価しなければならないでしょう。しかし一般的なルールとして、その「コンテナ」モジュールと同一のライセンスの下でそのコードを受け容れます。
特許
Question 133: Monoを完全に禁圧するために特許が利用されることがありえますか?(現在出願されているサブマリン特許や、Microsoftによって特に特許問題を作り出すために変更されたりなどで)
First some background information.
The .NET Framework is divided in two parts: the ECMA/ISO covered
technologies and the other technologies developed on top of it like
ADO.NET, ASP.NET and Windows.Forms.
Mono implements the ECMA/ISO covered parts, as well as being a
project that aims to implement the higher level blocks like
ASP.NET, ADO.NET and Windows.Forms.
The Mono project has gone beyond both of those components and has
developed and integrated third party class libraries, the most
important being: Debugging APIs, integration with the Gnome
platform (Accessibility, Pango rendering, Gdk/Gtk, Glade, GnomeUI),
Mozilla, OpenGL, extensive database support (Microsoft only
supports a couple of providers out of the box, while Mono has
support for 11 different providers), our POSIX integration
libraries and finally the embedded API (used to add scripting to
applications and host the CLI, or for example as an embedded
runtime in Apache).
The core of the .NET Framework, and what has been patented by
Microsoft falls under the ECMA/ISO submission. Jim Miller at
Microsoft has made a statement on the patents covering ISO/ECMA,
(he is one of the inventors listed in the patent): here.
Basically a grant is given to anyone who want to implement those
components for free and for any purpose.
The controversial elements are the ASP.NET, ADO.NET and
Windows.Forms subsets. Those are convenient for people who need
full compatibility with the Windows platform, but are not required
for the open source Mono platform, nor integration with today's
Mono's rich support of Linux.
The Mono strategy for dealing with these technologies is as
follows: (1) work around the patent by using a different
implementation technique that retains the API, but changes the
mechanism; if that is not possible, we would (2) remove the pieces
of code that were covered by those patents, and also (3) find prior
art that would render the patent useless.
特許された機能を提供しないことは、インターオペラビリティを悪化させるものではなく、むしろ、Monoの開発の第一の理由である、自由なソフトウェア / オープンソース ソフトウェアのコミュニティに、良い開発ツールを提供するということになります。
The patents do not apply in countries where software patents are
not allowed.
For Linux server and desktop development, we only need the ECMA
components, and things that we have developed (like Gtk#) or Apache
integration.
Question 134: Is Mono only an implementation of the .NET Framework?
Mono implements both the .NET Framework, as well as plenty of class
libraries that are either Unix specific, Gnome specific, or that are not
part of the .NET Framework but people find useful.
The following map shows the relationship between the components:
Obfuscation
Question 135: Are there any obfuscation programs for Mono/Linux?
We are not aware of these, but some from Windows might work.
Question 136: What could I do to avoid people decompiling my program?
You can use the bundle functionality in Mono.
This would bundle your binary inside a Mono runtime instance, so
you distribute a single executable that contains the code inside.
Notice that for this to work and be practical, you need to get a
commercial license to the Mono runtime.
The reason is that the bundle functionality is covered by the LGPL:
so you would have to distribute your assemblies separatedly to allow
developers to relink mono which would defeat the purpose of bundling
for obscuring your code.
It is not impossible to break, just like any other obfuscators.
That being said, value these days does not lie in particular
tiny routines, but lies in the large body of work, and if someone
steals your code, you are likely going to find out anyways.
Question 137: Any other option?
You could precompile with --aot your code, then disassemble the
original .exe, and remove all the code, then re-assemble and ship
both the vessel .exe and the precompiled code.
This is not a supported configuration of Mono, and you would be
on your own in terms of dealing with bugs and problems here.
Get the companies that build the obfuscation packages to read
the ECMA spec and fix the bugs in their products that generate
non-standard binaries (or, if they expose a bug in mono, please
file a report in our bugzilla).
Pay Ximian/Novell to spend the development time needed to get mono
to support the broken binaries that some of the obfuscation
packages generate (or contribute that support).
その他の質問
Question 138: あなたたちは、CLIは複数の言語が同じ環境で実行できるものだと言いましたが、それはCORBAの目的ではありませんか?
CORBA(あるいはCOM)とCLIの重要な違いは、CLIは「データレベルのインターオペラビリティ」を許容するということです。というのは、全ての言語/コンポーネントが、同一のデータレイアウトとメモリ管理を使うからです。
これは、あなたが他の誰かが提供したデータ型を、彼らのインターフェースを介することなく直接操作することができる、ということです。これは、あなたがパラメータを「マーシャル」(コンバート)する必要がなく(データレイアウトが同一なので、あなたはコンポーネントを直接渡すことができるのです)、また、全ての言語/コンポーネントが同一のガベージコレクタとアドレス空間を共有するので、メモリ管理についても心配する必要がないということでもあります。これはコピーなどではありませんし、また参照カウンタも必要ありません。
Question 139: COMはサポートしますか?
ランタイムでは、UnixシステムではXPCOMを、WindowsではCOMをサポートすることになるでしょう。ダイナミック トランポリンのためのコードの大部分は既に準備できています。
Question 140: Ximian はMonoや関連技術の証明書を提供しますか?
それは可能ですが、計画はありません。つまり、簡潔に言えば否です。
Question 141: バグはどうすれば報告できますか?
一番良いのは、バグを追跡して、バグを再現する簡単なテストを提供してくれることです。そうしたら、あなたはそのバグをバグ追跡システムに追加してください。
あなたが使っているmonoのバージョン情報と、そしてバグを再現できる詳細情報を何でも提供してください。ご参考までに、メーリングリスト上で報告されたバグは簡単に忘れられてしまいますので、バグ追跡システムにそれを記録しておいてもらえた方が良いです。
Question 142: mcsはMSのC#コンパイラと同じコマンドラインオプションをサポートしますか?
Mono C# コンパイラは今ではMicrosoft C# コンパイラの引数と同じものをサポートしています。
Question 143: lists.ximian.comのアーカイブを検索可能にするというのはどうですか?
mono関連のメーリングリストの検索はここから実行できます。
Question 144: cvsやスナップショットからmonoを使っていると、Monoとランタイムが同期していないというエラーメッセージを受け取ります。どうやって直せば良いですか?
monoをcvsから使っているときは、ランタイム内部の変更も待つ必要があります。これはつまり、無闇にアップデートをかける前に、実行できるセットアップを維持しておくべきだということです(実行できるセットアップとしては、単純に、最新のリリースtarballや最新のバイナリ スナップショットがありえます)。 通常は、Cランタイムを再コンパイルする前にcorlibをmcsでコンパイルすれば、上手く事が運びます(ただ、運が悪ければ他の手段をとる必要があるかもしれません)。
Question 145: なぜあなたがたは GtkHtmlの実装に向かっているのですか?
GtkHTMLはCSSをサポートしない、軽量なHTMLレンダリングエンジンで、 われわれはLinux上での日々の作業で、適切にドキュメントを使うために、 必要としているのです。 あなたがドキュメントをブラウズするWebベースのインターフェースには、 ネイティブのGUIツールのような軽快さはありません。おそらく後々、われわれは スクリプトを書いて、webで表示可能なドキュメントを全て生成するでしょう。 しかしわれわれは、Webに接続していない時には、Linux上でネイティブ に使うことが可能な(そして、webページよりまともなインタラクションがある) コマンドラインとGUIのツールを必要としているのです。
Question 146: .NETにインタラクティブにアクセスさせてくれるような、コマンドラインツールはありませんか?
いろんなものがありますが、自由なソフトウェアでMCSを使っているもので、 Rice UniversityのDennis Lu fromが作業している、REPL C# インタープリタがあります。
Question 147: MonoにVisual C++を使うことが出来ますか?
ええ、VC++が生成したアプリケーションであっても、Monoで実行することは可能です。ただし、私たち自身はmanaged C++コンパイラを提供していません。
Question 148: Does Mono support generics?.
Mono doesn't support generics currently but a lot of work is being
done towards it.
Mono全般の問題
もしあなたが、Monoソフトウェアのコンパイルや実行について問題があったり、バグを見つけたと思ったら、 Mono 全般の問題 の文書にあたってみて下さい。
Credits
The FAQ contains material contributed by Miguel de Icaza, Jaime Anguiano, Lluis Sanchez.