- PR -

.NET on Windows, Linux, FreeBSD and so on.

投稿者投稿内容
Dr. K
常連さん
会議室デビュー日: 2003/04/26
投稿数: 25
投稿日時: 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で走らせればわかることかもしれないですが、上記の疑問に対して情報をもっている方がいらしたら、フォローお願いします。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-05-16 19:27
引用:

Dr. Kさんの書き込み (2003-05-16 18:44) より:
.NETではECMA準拠のCLRとFCLが稼動してるコンピュータであれば、OSやCPUに依存せずどこでも実行できると述べていますが、これはどういった意味で言っているのでしょうか?


これ、どこかに記述されていますか?
少なくともMicrosoftの資料ではこのような記述はみたことないですが。。。
そもそもFCLがWindows以外のものに移植される可能性はいまのところないと思います。
それにECMAではFCLは規定されてないですよね。CLIはFCLじゃないし。

#微妙に誤解があるんじゃないかな。
 CLRや互換性のあるFCLが整備されるようになったら、いろんなOS上で動作することが
 できるようになるかもしれない、って文脈なら雑誌記事とかで見るけど。
Dr. K
常連さん
会議室デビュー日: 2003/04/26
投稿数: 25
投稿日時: 2003-05-16 21:07
引用:

これ、どこかに記述されていますか?
少なくともMicrosoftの資料ではこのような記述はみたことないですが。。。
そもそもFCLがWindows以外のものに移植される可能性はいまのところないと思います。
それにECMAではFCLは規定されてないですよね。CLIはFCLじゃないし。



ちょっと書き方まずかったかもしれません。
記述自体はJeffrey Richter著の「プログラミング .NET Framework」の「はじめに」とでそのように記載されています。
ただ、この本を読む限り(PE形式を採用してることもあり)、.NETは言語は統一されてはいるが、プラットフォームに非依存というところまでは行ってないように感じたので投稿しました。ここには優秀な方がたくさんいるようなので。

引用:

#微妙に誤解があるんじゃないかな。
 CLRや互換性のあるFCLが整備されるようになったら、いろんなOS上で動作することが
 できるようになるかもしれない、って文脈なら雑誌記事とかで見るけど。


ということは、今の時点ではプラットフォームには依存しているということでしょうか?
それと、少し話がそれてしまいますが、Javaはどうなのでしょうか?僕はJavaはLinux上でしか使ったことがなく、Windows上では使ったことがないのですが、Javaはプラットフォーム非依存を提唱していますよね?
これはJavaVM上であればLinux上でコンパイルしたプログラムがWindows上で動くということなのでしょうか?最初の投稿で書いた原因と同じで、Linuxで作ったプログラムがWindowsで動くという感覚がわからないです。。。
この辺の事情もご存知であれば教えていただきたいと思います。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 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
みたいに実行します。
Dr. K
常連さん
会議室デビュー日: 2003/04/26
投稿数: 25
投稿日時: 2003-05-17 03:07
引用:

例えば、Rotor(SSI CLI)の場合、FreeBSD上であっても、
MS Windows PE 32-bit Intel 80386 console executableを作成します。
これをWindowsに持っていくと、そのまま動きます。

じゃ、FreeBSDでどうやって動かすかというと、clixというコマンドを使って、
>clix xxx.exe
みたいに実行します。


なるほど。当たり前ですが、やはり他のプラットフォームではコマンドが必要になってしまうわけですね。
もう1つ疑問があります。(すいません、どんどん話が拡散して)
Windows上で、Microsoftが用意したFCLのクラスを利用してコンパイルしたプログラムを仮にFreeBSDやLinux上でコマンドを通じて実行できた場合、果たしてどこまで実行できるのでしょうかね。
例えば、Microsoft.System.* や Microsoft.Win32.* などの名前空間に存在するクラスを使ってしまった場合、やはりWindows以外では動かなくなってしまいますよね?
ということは、現時点では .NET はプラットフォーム非依存ということなるのは難しい?・・・
DLLも結局PE形式ですから、これもUNIX系OS上でDLLを解析できるようなコマンドが存在するものなのでしょうか?ただ、たとえ解析できたとしても結局Win32APIをラップしてるクラスは使えない・・・
これさえも、UNIX用に用意されてるなんて話はないですよね???
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-05-17 10:36
こんにちは、meiです。

引用:

DLLも結局PE形式ですから、これもUNIX系OS上でDLLを解析できるようなコマンドが存在するものなのでしょうか?ただ、たとえ解析できたとしても結局Win32APIをラップしてるクラスは使えない・・・
これさえも、UNIX用に用意されてるなんて話はないですよね???


誤解させてしまったかも知れませんが、
マネージドモジュールはPEヘッダの後にCLRヘッダがあります。
PEヘッダ部分は単にMSCorEE.dllを呼び出しているだけのはずです。

Win32APIをラップというのがどのレベルにもよりますが、
PInvokeなら名前通りNGとなります。(nativeなdllが移植されているなら別ですが)
究極的には、System.Console.WriteLineすらもWin32APIのラップなので、
何処でプラットフォーム依存部分を抽象化させているかでしょう。

引用:

例えば、Microsoft.System.* や Microsoft.Win32.* などの名前空間に存在するクラスを使ってしまった場合、やはりWindows以外では動かなくなってしまいますよね?
ということは、現時点では .NET はプラットフォーム非依存ということなるのは難しい?・・・


.NETはプラットフォーム非依存を狙っている訳ではないので、
理論的には難しいですが、実際には、
MonoなんかはSystem.Windows.FormsやらMicrosoft.VisualBasicすら使えますので、
結構いけるとは思います。

あと、.NETとJavaとのスタンスの違いについては、
http://www.unisys.co.jp/club/net_essence/no08.html
↑このあたりをみるとイメージしやすいかも。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-05-19 08:36
monoプロジェクト・・・

Borlandの次期開発製品も、LinuxとWindows両対応、.NET対応です。
Windows APIの呼び出しはできませんが(当たり前)、CLRはJavaや昔のBASICと同じ、中間言語です。ネイティブコンパイラではありません。インタプリタが逐次翻訳しながら実行するので、.NET Frameworkがインストールされた環境であるなら、プラットフォームOSには依存しなくなるでしょう(プラットフォームOSに依存したAPIの呼び出しを除く)。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-05-19 09:35
引用:

Jittaさんの書き込み (2003-05-19 08:36) より:
Windows APIの呼び出しはできませんが(当たり前)、CLRはJavaや昔のBASICと同じ、中間言語です。ネイティブコンパイラではありません。インタプリタが逐次翻訳しながら実行するので、.NET Frameworkがインストールされた環境であるなら、プラットフォームOSには依存しなくなるでしょう(プラットフォームOSに依存したAPIの呼び出しを除く)。


なんか不正確な表現が多いな。。。

> 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はプラットフォーム依存です。

スキルアップ/キャリアアップ(JOB@IT)