- - PR -
.NET on Windows, Linux, FreeBSD and so on.
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-16 18:44
.NETではECMA準拠のCLRとFCLが稼動してるコンピュータであれば、OSやCPUに依存せずどこでも実行できると述べていますが、これはどういった意味で言っているのでしょうか?
確かに、CILはCPUネイティブな命令ではないのでCLRが存在すればどこでも認識できると思います。また、クラスライブラリについても同様です。 しかし、Windows上でコンパイルしたプログラムをどうやってLinuxやFreeBSD上に配布するのでしょうか?Windowsではマネージモジュールの形式にPE形式を採用していますが、この形式をLinuxやFreeBSD上で適用できるような感じがしません。 LinuxにはXimianのMonoが、FreeBSDにMicrosoftの.NET Frameworkが、それぞれ用意されていてRuntimeには互換性があるのはわかりますが、実行ファイル形式は互換性を持っているのでしょうか? 実際にWindowsでコンパイルしてLinuxで走らせればわかることかもしれないですが、上記の疑問に対して情報をもっている方がいらしたら、フォローお願いします。 | ||||||||
|
投稿日時: 2003-05-16 19:27
これ、どこかに記述されていますか? 少なくともMicrosoftの資料ではこのような記述はみたことないですが。。。 そもそもFCLがWindows以外のものに移植される可能性はいまのところないと思います。 それにECMAではFCLは規定されてないですよね。CLIはFCLじゃないし。 #微妙に誤解があるんじゃないかな。 CLRや互換性のあるFCLが整備されるようになったら、いろんなOS上で動作することが できるようになるかもしれない、って文脈なら雑誌記事とかで見るけど。 | ||||||||
|
投稿日時: 2003-05-16 21:07
ちょっと書き方まずかったかもしれません。 記述自体はJeffrey Richter著の「プログラミング .NET Framework」の「はじめに」とでそのように記載されています。 ただ、この本を読む限り(PE形式を採用してることもあり)、.NETは言語は統一されてはいるが、プラットフォームに非依存というところまでは行ってないように感じたので投稿しました。ここには優秀な方がたくさんいるようなので。
ということは、今の時点ではプラットフォームには依存しているということでしょうか? それと、少し話がそれてしまいますが、Javaはどうなのでしょうか?僕はJavaはLinux上でしか使ったことがなく、Windows上では使ったことがないのですが、Javaはプラットフォーム非依存を提唱していますよね? これはJavaVM上であればLinux上でコンパイルしたプログラムがWindows上で動くということなのでしょうか?最初の投稿で書いた原因と同じで、Linuxで作ったプログラムがWindowsで動くという感覚がわからないです。。。 この辺の事情もご存知であれば教えていただきたいと思います。 | ||||||||
|
投稿日時: 2003-05-16 22:44
こんばんは、meiです。
例えば、Rotor(SSI CLI)の場合、FreeBSD上であっても、 MS Windows PE 32-bit Intel 80386 console executableを作成します。 これをWindowsに持っていくと、そのまま動きます。 じゃ、FreeBSDでどうやって動かすかというと、clixというコマンドを使って、 >clix xxx.exe みたいに実行します。 | ||||||||
|
投稿日時: 2003-05-17 03:07
なるほど。当たり前ですが、やはり他のプラットフォームではコマンドが必要になってしまうわけですね。 もう1つ疑問があります。(すいません、どんどん話が拡散して) Windows上で、Microsoftが用意したFCLのクラスを利用してコンパイルしたプログラムを仮にFreeBSDやLinux上でコマンドを通じて実行できた場合、果たしてどこまで実行できるのでしょうかね。 例えば、Microsoft.System.* や Microsoft.Win32.* などの名前空間に存在するクラスを使ってしまった場合、やはりWindows以外では動かなくなってしまいますよね? ということは、現時点では .NET はプラットフォーム非依存ということなるのは難しい?・・・ DLLも結局PE形式ですから、これもUNIX系OS上でDLLを解析できるようなコマンドが存在するものなのでしょうか?ただ、たとえ解析できたとしても結局Win32APIをラップしてるクラスは使えない・・・ これさえも、UNIX用に用意されてるなんて話はないですよね??? | ||||||||
|
投稿日時: 2003-05-17 10:36
こんにちは、meiです。
誤解させてしまったかも知れませんが、 マネージドモジュールはPEヘッダの後にCLRヘッダがあります。 PEヘッダ部分は単にMSCorEE.dllを呼び出しているだけのはずです。 Win32APIをラップというのがどのレベルにもよりますが、 PInvokeなら名前通りNGとなります。(nativeなdllが移植されているなら別ですが) 究極的には、System.Console.WriteLineすらもWin32APIのラップなので、 何処でプラットフォーム依存部分を抽象化させているかでしょう。
.NETはプラットフォーム非依存を狙っている訳ではないので、 理論的には難しいですが、実際には、 MonoなんかはSystem.Windows.FormsやらMicrosoft.VisualBasicすら使えますので、 結構いけるとは思います。 あと、.NETとJavaとのスタンスの違いについては、 http://www.unisys.co.jp/club/net_essence/no08.html ↑このあたりをみるとイメージしやすいかも。 | ||||||||
|
投稿日時: 2003-05-19 08:36
monoプロジェクト・・・
Borlandの次期開発製品も、LinuxとWindows両対応、.NET対応です。 Windows APIの呼び出しはできませんが(当たり前)、CLRはJavaや昔のBASICと同じ、中間言語です。ネイティブコンパイラではありません。インタプリタが逐次翻訳しながら実行するので、.NET Frameworkがインストールされた環境であるなら、プラットフォームOSには依存しなくなるでしょう(プラットフォームOSに依存したAPIの呼び出しを除く)。 | ||||||||
|
投稿日時: 2003-05-19 09:35
なんか不正確な表現が多いな。。。 > CLRは…中間言語です。 中間言語を指す言葉はMSILです。CLRは実行環境ですので「言語」じゃありません。 > インタプリタが逐次翻訳しながら実行するので、… CLRはインタプリタではありません。 実行時にはJITコンパイラを使い、メソッド単位でMSILからネイティブコードを 生成して実行します。 あと、.NET Frameworkも最終的にはWindows APIを呼び出すことで実行されてます。 Monoの場合は知りませんが、FreeBSD上で動くsscliの場合は、Windows APIの部分を FreeBSDのAPIに置き換えるような仕組みをとおして実行されているらしいです。 #Dr.Kさんへ 現時点でFCLはWindows向けのものしか用意されていません。 Mono等が用意しているのは、FCLの互換環境であって、すべてが用意されて いるわけではありません。 現時点では.NET Frameworkはプラットフォーム依存です。 |