特集

Linuxで動く.NET環境「Mono 1.0」の実力(前編)

株式会社ピーデー
川俣 晶
2004/10/05

Page1 Page2 Page3 Page4

C#コンパイラ

 ここからは一般ユーザーとしてログインすれば十分である。

 まずは、C#でメッセージを1行出力するだけのプログラムを作成してみよう。ホーム・ディレクトリの下に適当なディレクトリを作成し、そこにhello.csというファイル名で以下の内容のテキスト・ファイルを作成する。

using System;

class HelloWorld
{
  [STAThread]
  static void Main(string[] args)
  {
    Console.WriteLine("Hello World!");
  }
}
C#で記述したHello Worldプログラム

 入力したら、「mcs hello.cs」を実行してコンパイルを行う。mcsコマンドは、monoにおけるC#コンパイラである。このコマンドにより「hello.exe」という実行ファイルが生成されるので、lsコマンドにより、ファイルを確認しておこう。

[autumn@luna hello]$ mcs hello.cs
Compilation succeeded
[autumn@luna hello]$ ls
hello.cs  hello.exe
[autumn@luna hello]$

 ここで、「え! Linuxなのに拡張子が“.exe”なの!」と思う読者もいると思うが、そのとおりである。この拡張子「.exe」のファイルは、一見Windowsのネイティブ・コードの実行ファイルのように見えるが、そうではなく、実際にはMSILという仮想コードで記述されたWindowsに直接依存しない実行ファイルである(もちろん、プログラマが内部にWindowsに依存したコードを書き込めば、Windowsに依存してしまう場合はあり得るが、ファイル形式そのものはWindowsに依存しない形で定義されている)。

 さて、これを実行するために、直接「hello」を実行したり、「./hello.exe」を実行しようとしたりしても、プログラムは実行されない。hello.exeを実行するためには、monoコマンドを経由する必要がある。つまり、行の先頭にmonoを付けて、「mono hello.exe」を実行すればよい。

[autumn@luna hello]$ mono hello.exe
Hello World!
[autumn@luna hello]$

 このとおり、確かに実行することができた。

 しかし、この程度では、確かにC#コンパイラが稼働していると納得することはできない。もっと複雑なプログラムではどうだろうか。サンプル用に筆者が作った素数を計算するプログラム「prime.cs」をコンパイルして、実行してみよう。

[autumn@luna prime]$ mcs prime.cs
Compilation succeeded
[autumn@luna prime]$ mono prime.exe -?
usage: prime [-d][-l][-c][SIZE][REPEAT_COUNT]
options: -l   list all primes
         -c   output number of primes
         -d   output time of process
SIZE default is 100000
REPEAT_COUNT default is 10000
[autumn@luna prime]$ mono prime.exe -c
found: 9592
[autumn@luna prime]$

 このとおり、条件判断やループを含むプログラムも確かにコンパイル、そして実行することができた。

 ちなみに、Monoに含まれる多くのツール(コマンド)が、C#で記述されMono自身でコンパイルと実行が行われていることから考えれば、本当にきちんと動いているのかという疑問を持つことはあまり意味がないだろう。コンパイルと実行ができている時点で、それが確かに動いているという証明になる。

熱血VBプログラマ応援団 出張番外編「MonoBASIC コンパイラ」

 まだアルファ・テストの段階でサポート外ではあるが、C#コンパイラとは別に、「MonoBASICコンパイラ」というものがMonoには含まれている。これは、プログラム言語的にはVisual Basic .NETのスーパーセットになるものだそうである。

 まだまじめに利用を検討する段階にはなさそうではあるが、多少は動作するので軽く見てみよう。まずは、C#と同じようにHello Worldプログラムを記述してみよう。

Imports System

Module HelloWorld
  Sub Main()
    Console.WriteLine("Hello World!")
  End Sub
End Module
Visual Basic .NETで記述したHello Worldプログラム

 なお、最初のImportsステートメントは、Visual Studio .NET使用時には無くてもよいものである。その理由は、このステートメント相当のインポート設定がプロジェクトのプロパティに既定の設定として登録済みであるためである。そのような設定を持っていないMonoBASICコンパイラを使用する場合は、Importsステートメントを明示的に記述しておく必要がある。

 これをコンパイルして実行した経過を以下に示す。

[autumn@luna vbhello]$ mbas hello.vb
--------
MonoBASIC: THIS IS STILL ALPHA AND UNSUPPORTED SOFTWARE, USE AT YOUR OWN RISK.
--------
Compilation succeeded
[autumn@luna vbhello]$ ls
hello.exe  hello.vb
[autumn@luna vbhello]$ mono hello.exe
Hello World!
[autumn@luna vbhello]$

 このように、MonoでもC#一辺倒にならず、VB互換言語をサポートしていこうという動きがあるのは、やはりVBの存在感の大きさ故のことだろう。もちろん、VBを前向きに評価するのではなく、後ろ向きの互換性だけを想定している可能性も考えられる。しかし、Visual Basic .NETの互換言語ではなく、あえてスーパーセットを作ろうとしていることを考えると、やはり何らかの意味で前向きにVBを評価しているのではないかと筆者は感じる。VBの未来像という意味でも、もしかしたらMonoは何か注目に値することを提示してくれる可能性があるかもしれない。

 頑張れVBプログラマ、君たちが使うVisual Basic .NETはオープンソースの世界からも意識されている可能性に満ちたプログラム言語だ!

 前編となる今回では、Monoをインストールし、C#およびVisual Basic .NETのコンパイラを試してみた。近日公開予定の後編では、LinuxとWindowsの異なる2つの環境でコンパイルした実行ファイルの互換性や実行速度の検証、そして本題であるMono上でのASP.NET Webアプリケーションの動作についてレビューする。お楽しみに。End of Article


 INDEX
  [特集]Linuxで動く.NET環境「Mono 1.0」の実力(前編)
     1.WindowsとLinuxとを結ぶ「Mono」
     2.Monoが生まれた背景
     3.Monoの機能とインストール
   4.C#コンパイラとVB.NETコンパイラ
  [特集]Linuxで動く.NET環境「Mono 1.0」の実力(後編)
     1.バイナリの互換性を検証する
     2.環境間の相違と対策/Monoと.NET Frameworkとの速度比較
     3.XSPを用いたASP.NET
     4.Apacheを用いたASP.NET
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間