Pythonという言語は、異なるモジュール同士をつなぐ”糊”(glue)のような役割を持つ側面がある。それは、IronPythonが、Pythonの資産と.NETの資産を扱えることからも分かる。

またそういった側面と動的言語の柔軟性から、PythonおよびIronPythonは組み込みにもよく使われる。ここで、IronPythonを自作したアプリケーションに組み込む事例を紹介しておこう。

IronPythonのコンソールアプリケーションである ipy.exe と同じ機能を持たせるためのプログラムを取り上げる。

以下のプログラムは、IronPython 2.0α1の公開されているソースコードから抜粋したものだ。中身は、宣言部を合わせても20行にも満たない。


using System;
using Microsoft.Scripting.Hosting;
using Microsoft.Scripting.Internal;
using IronPython.Hosting;

internal sealed class PythonConsoleHost : ConsoleHost {

    protected override void Initialize() {
        base.Initialize();
        this.Options.LanguageProvider = ScriptEnvironment.GetEnvironment().GetLanguageProvider(typeof(PythonLanguageProvider));
    }
    
    [STAThread]
    static int Main(string[] args) {
        return new PythonConsoleHost().Run(args);
    }
}

これを、以下のようにC#コンパイラ(csc.exe)でコンパイルしてほしい。


$ csc console.cs /R:Microsoft.Scripting.dll /R:Microsoft.Scripting.Vestigial.dll /R:IronPython
.dll

たったこれだけで、ipy.exeと同じ機能を持つことができる。console.exeを動かして試してみよう。


$ console
Traceback (most recent call last):
  File , line 0, in ##2
  File , line 0, in Import##6
ImportError: No module named site
IronPython console: IronPython 2.0A1 (2.0.10427.02) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> sys.version
'2.4.0 (IronPython 2.0A1 (2.0.10427.02) on .NET 2.0.50727.42)'
>>>

一部警告メッセージが出ている(エラー内容は環境によって多少異なる)が、ipy.exeと同じ動きをしていることが読み取れる。

組み込みに使用する場合、実装側と組み込み側で、関数の呼び出しや値のやり取りを行いたい場合がある。次の例は、C#のソースコード内で作成したオブジェクトをIronPython側で操作する方法だ。


using System;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using Microsoft.Scripting.Internal;
using IronPython.Hosting;
using CON = System.Console;

public class Test {
           public int value = 0;
}

class Program {
    [STAThread]
    static void Main(string[] args) {
        PythonEngine pe = PythonEngine.CurrentEngine;
        
        Test       obj = new Test();
        CON.WriteLine("pre> obj.value = {0}", obj.value);
        ScriptDomainManager.CurrentManager.Host.DefaultModule.SetVariable("obj", obj);
        pe.Execute("obj.value = 123");
        CON.WriteLine("post> obj.value = {0}", obj.value);
    }
}

Console.exe同様csc.exeでコンパイルを行い、早速実行してみよう。


$ test
pre> obj.value = 0
post> obj.value = 123

確かに、C#のソースコード内で作成したTestクラスのobjオブジェクトの値を、組み込んだIronPython側で操作できていることが確認できる。

新たな予感

以上、新たに内部を大きく変えた IronPython 2.0について、その基礎とも言えるDLRを中心に紹介した。

.NET黎明期、多くの言語が.NET上で走るだろうといわれつつ、多くは広まらなかった。しかし、DLRの登場により、今度こそ多くの言語が登場するのではないか?とワクワクさせられる。

しかも、DLRを実装したIronPythonは内部のソースコードも公開されている。そのうちオリジナル言語を作成する者が出てきてもおかしくない状況だ。まさに、プログラム言語の"カンブリア爆発”がいつ起こってもおかしくないと言えよう。

この新たな技術がもたらすであろう未来を夢想しつつ、本稿を終えたい。