Phoenix SDK June 2008 CTP Release

今回はPhoenix SDK June 2008 CTP Releaseについてのお話でございます。

Phoenixとはなにかご存知のない方は、まず下記Blog「Phoenixのご紹介」をご覧になってみてください。

https://blogs.msdn.com/dd_jpn/archive/2006/12/06/1220192.aspx

Phoenix SDKのインストールについて

Phoenix SDK June 2008は、「英語版Visual Studio 2008」, 「英語版Visual C++ 2008 Express Edition」, 「英語版Visual C# 2008 Express Edition」上にインストールすることができます。(日本語版のVisual Studio上での動作につきまして、私は動作確認をしておりませんので残念ながら解りません。)

Phoenix SDK June 2008を「英語版Visual C# 2008 Express Edition」上へインストールする場合、同時に「英語版Visual C++ 2008 Express Edition」をインストールしておく必要があります。これは、Phoenix SDK June 2008がデバッグ中にdebug CRTファイルを参照するためです。このdebug CRTファイルは「英語版Visual C# 2008 Express Edition」には入っておりません。

Phoenix SDK June 2008をインストール後、Visual StudioのIDE Project TemplateにPhoenix用のProjectがいくつか追加されます。

Phoenixのプログラミング方法について

Phoenixは、Managed Codeのライブラリとして提供されております。Phoenixのプログラミングは、このManaged Codeライブラリを使い行いますので、C++よりもC#でコードを書く方がより自然だと思います。

Phoenixでできること

Phoenix SDKを使うことにより、ざっくりとした説明ですが、大体以下のことができるようになります。

・ソースコードの解析(新しい言語コンパイラのフロントエンド部分を開発できます。)

・バイナリコードの解析(コンパイル後のバイナリコードを読込み、解析することができます。)

・最適化ツールの開発(コンパイル後のバイナリコードを、より最適なコードに書き換えることができます。)

・バイナリ生成(バイナリファイルを作成できます。)

Phoenixを使ってプログラミング

Phoenixの「バイナリコードの解析」機能を使い、Managed Codeで記述されたプログラムの実行形式(PE Formatファイル)を読み込み、プログラム中に定義されているすべての関数名のリストを表示するプログラムを作ってみました。

・まず初めに、以下のC#のソースコードをHello.csファイルへ保存し、C#コンパイラでコンパイル、ビルドし(コンパイルコマンドは、csc.exe /debug Hello.cs)、Hello.exe Managed Code PEファイルを用意しておいてください。

using System;

class Hello {

static void Main(string[] args) {

Console.WriteLine("Hello!");

sub1();

}

static void sub1() {

Console.WriteLine("Sub1()");

}

}

・次に、以下のC#のソースコードをTest.csファイルへ保存し、Phoenix SDKをインストールしたVisual Studio 2008上でコンパイル、ビルドしてTest.exeを作成してください。

using System;

public class Test {

static void Main(string[] arguments) {

Phx.Targets.Architectures.Architecture architecture;

Phx.Targets.Runtimes.Runtime runtime;

// Register x86 architecture and runtime.

architecture = Phx.Targets.Architectures.X86.Architecture.New();

runtime = Phx.Targets.Runtimes.Vccrt.Win32.X86.Runtime.New(architecture);

Phx.GlobalData.RegisterTargetArchitecture(architecture);

Phx.GlobalData.RegisterTargetRuntime(runtime);

// Register Msil architecture and runtime.

architecture = Phx.Targets.Architectures.Msil.Architecture.New();

runtime = Phx.Targets.Runtimes.Vccrt.Win.Msil.Runtime.New(architecture);

Phx.GlobalData.RegisterTargetArchitecture(architecture);

Phx.GlobalData.RegisterTargetRuntime(runtime);

Phx.Initialize.BeginInitialization();

Phx.Initialize.EndInitialization("", arguments);

Phx.PEModuleUnit moduleUnit = Phx.PEModuleUnit.Open(arguments[0]);

moduleUnit.LoadGlobalSymbols();

Phx.Lifetime lifetime = moduleUnit.Lifetime;

Phx.ProgramUnit programUnit = Phx.ProgramUnit.New(lifetime, null, Phx.GlobalData.TypeTable, moduleUnit.Architecture, moduleUnit.Runtime);

programUnit.AddModuleUnit(moduleUnit);

Phx.Phases.PhaseConfiguration config = Phx.Phases.PhaseConfiguration.New(lifetime, "CallGraph Phases");

config.PhaseList.AppendPhase(Phx.PE.BuildCallGraphPhase.New(config));

config.PhaseList.DoPhaseList(programUnit);

foreach (Phx.Unit unit in moduleUnit.ChildUnits) {

if (unit.IsFunctionUnit && !unit.IsNative) {

string funcName = unit.AsFunctionUnit.FunctionSymbol.ToString();

Phx.Output.WriteLine("Function Symbol: {0}", funcName);

}

}

moduleUnit.Close();

}

}

・次に、Command Prompt Window上にて、上記説明で作成したTest.exeプログラムにHello.exeへのPathを引数に与えて起動してください。

すると、Command Prompt Window上には、以下の文字列が表示されると思います。

Function Symbol: Main

Function Symbol: sub1

Function Symbol: .ctor

このように、Hello.csプログラム内で定義されている関数名 Main, sub1, .ctor (これはClass Helloのコンストラクタ) が表示されます。

おわりに

今回のサンプルはあまりおもしろいものではありませんでしたが、もうちょっとがんばって自分用のコンパイラを作ってみるのも楽しいかもしれません。

関連するリンク

下記は、Microsoft Research Web Site上にあるPhoenixのホームページです。

https://research.microsoft.com/phoenix/

「Phoenix SDK June 2008 CTP Release」は、以下のWeb SiteからDownloadできます。

https://connect.microsoft.com/Phoenix/Downloads/DownloadDetails.aspx?DownloadID=12911