JScript .NET の紹介
Andrew Clinick Microsoft Corporation
July 14, 2000 日本語版最終更新日 2000 年 10 月 10 日
この記事は、もともと MSDN Online Voices のコラム "Scripting Clinic" に掲載されたものです。
今週は、オーランドでの Professional Developers Conference (PDC) で JScript .NET と Visual Basic.NET が初めて一般に公開され、また、Windows Script version 5.5 (ダウンロード ) がリリースされて、スクリプトが大きく前進しました。この機会に JScript® および Visual Basic® Scripting Edition (VBScript) の主な利点と、新しい .NET プラットフォームを活用するためにスクリプティング全般がどのように進化していくかということをお話ししようと思います。
VBScript はどうなるか
JScript .NET について話すと、いつも、VBScript はどうなるのか、新しい .NET スクリプティング プランの中でどのような位置を占めるのかという質問を受けます。4 年あまり前の VBScript の誕生以来、 Visual Basic の関数を VBScript に追加し、 VBScript を従来から使用していた場面で "本当の" Visual Basic を使えるようにしてほしい、という要望が絶えず寄せられていました。VBScript はバージョン 5.0 と 5.5 で目ざましい改善が行われたため、VBScript にあと何が追加できるかとなると、結局、Visual Basic の機能のほとんどすべてを追加しなければならないということになります。これを達成するには (そして、VBScript ユーザーに喜んでもらうためには)、Visual Basic を自分たちで再実装するか、Visual Basic チームと協力して、Visual Basic をスクリプト エンジンにしなければなりません。我々は後者を選びました。この方法であれば、言語としての整合性を保つことができ、オートメーション (IDispatch) オブジェクトだけでなく、最終的にはどんなオブジェクトでも呼び出すことができるなど、多くの新しい機能を VBScript に持たせることができるからです。
このような 2 つの言語の統合で注意していただきたいことは、少数の VBScript 機能 (Eval および Execute 関数など) は、Visual Basic.NET の最初のリリースでは使用できないということです。角を矯めて牛を殺すように見えるかもしれませんし、"ダイナミック" なスクリプティング言語という Visual Basic.NET の概念に反するように見えるかもしれませんが、そうではありません。Visual Basic.NET の最初のリリースは、サーバー上で ASP+ を使用して Web Services およびアプリケーションを構築することを目標としています。こういう場面では、おそらく Eval や ExecuteGlobal などの関数は使用されないでしょう。これらの機能は、(この言語のダイナミックな機能がより有用になる) Microsoft Internet Explorer との統合に合わせて、次のリリースで Visual Basic.NET 言語に再び追加される予定です。嬉しいことに、Internet Explorer 向けの Visual Basic.NET に Eval が追加されるということは、ほかの .NET アプリケーション向けの Visual Basic.NET にも Eval が追加されることを意味します。これらは同じ言語だからです。
Visual Basic の新しい機能は、MSDN で詳しく説明されていますので、ここで説明を繰り返すのはやめて、この記事では JScript の新機能に焦点を合わせることにします。重要なことは、今後、修得すべき Visual Basic 言語は 1 つだけだということです。このことが .NET 開発者としてのみなさんの生活を容易にするでしょう。これについてのみなさんのご意見を scripting ニュースグループまたは電子メール (msscript@microsoft.com) でぜひお寄せください。
JScript .NET
これはおそらく、1996 年に Internet Explorer 3.0 で JScript バージョン 1.0 が登場して以来、JScript の機能に関する最大の躍進でしょう。JScript は従来、インターネットでの遍在的な、クロスプラットフォーム サポートのために、クライアントサイド スクリプトの開発に使用されてきましたが、サーバー上、特に Active Server Pages (ASP) での JScript の使用が確実に増えています。たとえば、みなさんのお気に入りの Web サイト (MSDN) でも、インターネット上のほかの多くのサイトと同じように、大量のサーバーサイド JScript が使用されています。
サーバーで JScript が使用されるようになった結果、人々はパフォーマンスの向上を求めるようになりました。サーバーでは、パフォーマンスが高すぎるということは決してないのです。しかし、ここで、従来の JScript および VBScript 言語と新しい Visual Basic.NET および JScript .NET 言語は両方ともほとんど同じようなパフォーマンス特性を持っていることを指摘しておきましょう。一般的なケースでは、一方が他方より極端に高速だということはありません。
スクリプトが大きくなるほど、スクリプト作成者はより堅牢なコードを書く必要があります。また、プログラムが複雑になるほど、スクリプト作成者はオートメーション (IDispatch) オブジェクトしか扱えないという JScript の制約に不満を感じるようになります。
JScript .NET は、このような要件を念頭に置いて設計されました。JScript チームは新しい言語機能が進化論的に追加されて、JScript に関する既存のスキルを .NET の世界で活用できるようにしたいと考えました。JScript .NET はまったく新しい言語ではなく、既存の言語の新しいバージョンであると受け止めてもらう必要がありました。
進化
JScript の進化で重要な点は、この言語が JScript として認識されるものであり続けて、既存の JScript コードを実行でき、強化機能が既存の言語定義の範囲内で動作することです。たとえば、新しい機能の 1 つとして、型の導入があります。JScript .NET での型は、既存の変数および関数宣言メカニズムの拡張であり、完全にオプションです。スクリプト言語だけが持つ利点の 1 つは、コードを書くときに変数の型を気にする必要がないことであり、さらに言えば、変数そのものも気にする必要がないことです。型をオプションにすることによって、開発者は既存の JScript スキルとソース コードを活用することができ、なおかつ、新しいプログラムと既存のプログラムに型を追加して、パフォーマンスと堅牢性の向上という利点を享受するためのスムーズな移行パスを提供できます。
ECMA との緊密な連携
ECMAScript 標準との連携が、JScript の成功に大いに貢献しています。この標準により、ECMAScript Technical Committee のメンバー全員と協力して、この言語の刷新を進めることが可能になりました。このことは、JScript と JavaScript の両方が非常に高い互換性を維持すること、また、新しい機能は双方で討議され、設計されることを意味します。このアプローチにより、個々の企業内に隔離された開発ではなく、多数の企業のアイデアを両方の言語に活かすことができます。
JScript .NET の開発もこの協力関係に沿って進められ、新機能のすべてがほかの ECMA メンバーと協力して設計されました。JScript .NET PDC リリースの言語機能は、最終的なものではありません。できるだけ早く設計を完成させるために、ほかの ECMA メンバーと協力して作業を進めています。事実、今週、ECMA 会議が開催され、残っている問題の解決を図ることになっています。
パフォーマンス
JScript .NET の機能の感触については、もう十分でしょう。実際の機能のいくつかとそれらが開発にどのような違いをもたらすかを述べることにします。おそらく、JScript .NET の最も重要な機能は、パフォーマンスの向上です。JScript .NET のパフォーマンスに最も大きな影響を与えているのは、それが真のコンパイル言語だということであり、このことが C# や Visual Basic.NET に匹敵するパフォーマンスの達成を可能にしています。言語という観点から見ると、JScript のパフォーマンス向上の主要なメカニズムは、型の追加です。JScript .NET での型指定は、従来の (明示的な) 型宣言と暗黙的な型推論の両方を介して導入されました。型推論は、スクリプトでの変数の使い方を分析して、変数の型を自動的に推論するエキサイティングな技術です。これは、変数の型指定をしなくても、既存のスクリプトを使用する際にかなりの速度向上が得られることを意味します。たとえば、 次のような JScript プログラムを考えてみましょう。
function test()
{
for (var x = 0; x < 100; x++)
{
print(x);
}
}
JScript .NET がこのプログラムをコンパイルするとき、x の使い方を分析して、x は数値を保持するためにだけ使われていると判断します。結果として、x を数として定義することができます。これによりパフォーマンスの向上が得られます。 JScript コンパイラ は、潜在的にどんな型の値でも含むことができる汎用の Object (Variant) ではなく、数として x の使用を最適化できるからです。
JScript コンパイラの型推論機能を利用するためには、いくつかの簡単なルールに従う必要があります。幸い、これらのルールは一般的なコーディング規則の一部でもあるので、みなさんは既存のコードの中ですでにこれらのルールに従っているかもしれません。次の 2 つの簡単なルールに従う必要があります。
- ローカル変数は必ず宣言すること。これは当然のように聞こえるかもしれませんが、重要なことです。JScript が型を推論できるのはローカル (関数) 変数だけであり、グローバル変数の型は推論できません。暗黙的に変数を宣言した場合 ( var ステートメントで宣言せずに変数を使用した場合)、その変数はグローバル変数になり、最適化できません。
- 1 つの変数は 1 つのデータ型でのみ使用すること。変数を宣言して、数を格納するために使用した場合は、文字列や別のデータ型を格納するために使用しないでください。このような使い方をすると、JScript はその変数を汎用 Object (Variant) にするしかありません。
これらの簡単なルールに従う方法の例をいくつか示します。
// 型を推論できません -- glob はグローバルです。
var glob = 42;
function myfunc()
{
// 型を推論できません -- s は宣言されていないので、
// グローバルとして作成されます。
s = "hello";
// ここでは型推論が機能します -- i は宣言されています。
var i = 0;
// 型を推論できません -- q に複数のデータ型が代入されています。
var q = new Date();
q = 3.14159;
}
型推論は優れた技術ですが、欠点が 2 つあります。その 1 つは、常に慎重すぎることです。もう 1 つは、型推論はパフォーマンスの向上をもたらしますが、型の不一致やその他のプログラミング エラーの発見には役立たないことです。これに対処するために、JScript .NET には変数を特定の型として明示的に宣言する手段が用意されています。これは、 var ステートメントの新しい型注釈構文を使用して、関数パラメータ リストと戻り値の型について行われます。型注釈を記述するには、変数、パラメータ、または関数の宣言にコロン (:) を追加して、型名を続けます。
例:
// 整数変数を宣言します。
var myInt : int = 42;
// 文字列を返す関数を宣言します。
function GetName() : String
{
// 関数コード
}
// 倍精度のパラメータを取り、ブール値を返す関数を宣言します。
function CheckNumber(dVal : double) : Boolean
{
// 関数コード
}
関数に型注釈を追加する例として、私の記事「Scripting Web Services」の気象条件関数を変換しました。この関数は 1 個の文字列パラメータ strCity を取り、文字列を結果として返します。型注釈によって JScript .NET コンパイラはコンパイル済みの関数を最適化できるだけでなく、関数が呼び出されたときには常にコンパイル時に型のチェックを行うことができます (これは C# や Visual Basic などのほかの言語でも機能します)。ここでのキーポイントは、型注釈の追加はオプションですが、かなりの利点が得られるということです。したがって、できれば使用することをお勧めします。
function getConditions(strCity : String) : String
{
var now : Date = new Date();
switch (strCity.toUpperCase())
{
case "LONDON":
if (now.getMonth() <= 7 || now.getMonth() >= 9)
{
return "overcast";
}
else
{
return "partly overcast and humid";
}
break;
case "SEATTLE":
if (now.getMonth() == 7 && now.getDay() == 4)
{
return "torrential rain";
}
else
{
return "rain";
}
break;
case "LA":
return "smoggy";
break;
case "PHOENIX":
return "damn hot";
break;
default:
return "partly cloudy with a chance of showers";
}
}
JScript .NET では、.NET Framework の型を使用して変数を宣言することもできます。追加の型を JScript に導入するには、新しい型を含んでいる名前空間をインポートするか、ユーザー定義の型をクラスとして宣言します。.NET Framework の型と JScript 組み込みオブジェクトが重なり合っている可能性があるので、JScript .NET では、型注釈のための両者のマッピングが用意されています。
| Boolean (ブール値) |
.NET Framework Boolean / JScript boolean |
| Number (数値) |
.NET Framework Double / JScript number |
| String (文字列) |
.NET Framework String / JScript string |
| Int (整数) |
.NET Framework Int32 |
| Long (長整数) |
.NET Framework Int64 |
| Float (浮動小数点) |
.NET Framework Single |
| Double (倍精度) |
.NET Framework Double |
| Object (オブジェクト) |
.NET Framework Object / JScript Object |
| Date (日付) |
JScript Date object |
| Array (配列) |
JScript Array |
| Function (関数) |
JScript Function object |
JScript .NET のパフォーマンス向上のもう 1 つの大きな要因は、Option Fast の導入です。このオプションは、若干の機能性を犠牲にして、さらなる最適化を可能にする特定のルールの実施をコンパイラに指示します。Option Fast が有効なときには、JScript は次のように振る舞います。
- すべての変数を宣言する必要があります。
- 関数に値を代入したり、関数を再定義することはできません。
- 組み込み JScript オブジェクトの定義済みプロパティに値を代入したり、定義済みプロパティを削除することはできません。
- 組み込みオブジェクトに expando プロパティを追加することはできません。
- 関数呼び出しには、正しい数の引数を指定しなければなりません。
- 関数呼び出しの中で arguments プロパティを使用することはできません。
新しい Option Fast 機能は、コードの作成を迅速にしますが、言語の振る舞いを変えるので、既存の JScript プログラムに Option Fast を追加しただけでは、1 つ以上のコンパイラ エラーが発生するかもしれません。しかし、プログラムに少々手を加えれば、かなりのパフォーマンス向上が見られるはずです。
コンパイル
JScript .NET の主要な新機能の 1 つは、.NET IL (Intermediate Language: 中間言語) にコンパイルできることです。つまり、少し工夫すれば、JScript コードから Visual Basic.NET、C#、またはその他の .NET 言語と事実上は同じコンパイル済みコードを生成することができます。したがって、スクリプト開発者は面倒な仕事はコンパイラに任せて、自分の仕事をすることができます(スクリプト作成者は、EXE または DLL を手にするのにコンパイル段階を経なければならないというのは、あまりに 20 世紀的だということは分かっていますが、もうしばらくの間、これは秘密にしておきましょう)。
高速なスクリプトを書きたいときには、コンパイルはいやなものですが、それなりの用途もあるので、JScript .NET ではスクリプトを EXE または DLL にコンパイルできるようになっています。したがって、毎回ソースをコンパイルしなくても、あらかじめコンパイル済みのコードを送り出すことができます。
生産性
JScript コードの実行が速くなると、より多くの JScript コードを、そしておそらく、より大きなプログラムを書きたくなるでしょう。現在の JScript で大きなプログラムを書くのは、かなり難しいかもしれません。コードをカプセル化するメカニズムがあまり用意されていないからです。また、できあがったコードは必ずしも堅牢とは言えません。JScript にはカプセル化を可能にするプロトタイプ継承モデルがありますが、あまり知られていず、理解されているとはとても言えません。また、非常に "脆弱" な種類のカプセル化なので、堅牢なコードを書くのは困難です。存在しないオブジェクトのプロパティを参照しようとすると、JScript は自動的にそのプロパティを追加するだけであり、それが存在しないことを通知しません。この機能は一般に expando プロパティと呼ばれ、既存のオブジェクトを非常に簡単に拡張できるため、JScript を非常にとっつきやすくしています。しかし、 expando 機能は両刃の剣です。
このような柔軟性は、結局は堅牢で大規模なスクリプトの作成を困難にするからです。これを解決するために、JScript .NET ではクラスとパッケージが導入されました。クラスにより、機能とデータをカプセル化するオブジェクトを非常に簡単に開発することができ、既存のクラスを拡張でき (精神衛生のために、単一継承)、インターフェイスを実装できるという利点もあります。このことに関して、最もよいことは、JScript は完全な .NET 言語なので、ほかの .NET 言語で定義されたクラス (またはインターフェイス) を拡張 (または実装) できるということです (その逆も可能です)。
デフォルトでは、JScript のクラスは動的プロパティ (expando) をサポートしないので、expando が原因で発生する問題を回避することができます。しかし、この言語を進化させ、既存のコードでクラスを使用できるようにするために (クラス ライブラリを書く場合に役立ちます)、また、クールな機能であるという理由から、JScript クラスはそのクラスを expando としてマークすることによって、動的プロパティを扱うことができます。
JScript でクラスを宣言するには、 class ステートメントを使用します。これには、おなじみの function および var 宣言を使用して定義されたメソッドとプロパティが含まれます。コンストラクタ関数を作成するための現在の JScript 構文を使い慣れている人にとっては、クラスへの移行はかなり簡単なはずです。ほとんどのオブジェクトは、コンストラクタ関数を同じ名前のクラスで囲み、クラス メンバを宣言し、関数宣言をクラスの内側に移動する必要があります。外側のクラスを expando としてマークしている場合はクラス メンバを宣言する必要もありませんが、このようにすると堅牢なコードにはなりません。以下に例を示します。
JScript 5.5 コード
// メソッドを持たない単純なオブジェクト
function Car(make, color, year)
{
this.make = make;
this.color = color;
this.year = year;
}
function Car.prototype.GetDescription()
{
return this.year + " " + this.color + " " + this.make;
}
// 新しい Car オブジェクトを作成して使用します。
var myCar = new Car("Accord", "Maroon", 1984);
print(myCar.GetDescription());
JScript .NET コード
// 関数を class ステートメント内にラップします。
class Car
{
// クラス メンバを宣言します。この例では型を使用しましたが、
// 使用しなくてもかまいません。クラスを 'expando' としてマークすれば、
// これらのメンバを宣言する必要はありません。
var make : String;
var color : String;
var year : int;
// 古いコンストラクタ関数はそのまま。
function Car(make, color, year)
{
this.make = make;
this.color = color;
this.year = year;
}
// 関数をクラス内に移動します。
function GetDescription()
{
return this.year + " " + this.color + " " + this.make;
}
}
// 新しい Car オブジェクトを作成して使用します。
var myCar = new Car("Accord", "Maroon", 1984);
print(myCar.GetDescription());
デフォルトでは、クラス内の function および var 宣言は、パブリックに参照可能な関数あるいはプロパティとして宣言されますJScript .NET はプライベートおよびプロテクトとして宣言されるプロパティと関数もサポートします。function またはvar 宣言の前に private または protected を付けるだけで、目的の参照性を設定することができます。
JScript .NET は、 get または set 修飾子を使用することによって、プロパティ アクセサ (property accessors) - プロパティが読み書きされるときに実行するカスタム関数 - の宣言もサポートします。例を示します。
class Person
{
// プライベート変数 -- クラスの外部では実際のデータを
// 見ることはできません。
private var m_sName : String;
private var m_iAge : int;
// コンストラクタ -- 新しいオブジェクトを作成するために呼び出されます。
function Person(name : String, age : int)
{
this.m_sName = name;
this.m_iAge = age;
}
// set 関数がないので、Name は読み取り専用です。
function get Name() : String
{
return this.m_sName;
}
// Age は読み取り/書き込みですが、
// "意味のある" 値にしか設定できません。
function get Age() : int
{
return this.m_sAge;
}
function set Age(newAge : int)
{
if ((newAge >= 0) && (newAge <= 110))
this.m_iAge = newAge;
else
throw newAge + " is not a realistic age!";
}
}
var fred : Person = new Person("Fred", 25);
print(fred.Name);
print(fred.Age);
// これはコンパイラ エラーになります - Name は読み取り専用です。
fred.Name = "Paul";
// これは問題ありません。
fred.Age = 26;
// 値が長すぎるので、実行時エラーになります。
fred.Age = 200;
継承
JScript クラスは、class ステートメントに extends キーワードを追加することによって、JScript またはほかの .NET Framework 言語 (C#、Visual Basic など)で書かれた既存のクラスを継承し、拡張することができます。この機能によって、JScript プログラムは .NET プラットフォームの豊富な機能をごく簡単に利用することができます。これを説明するために、私は Windows 2000 のサービスを作成する単純な JScript プログラムを書きました (スクリプト作成者からよく寄せられる要望です)。このスクリプトは、.NET Framework の ServiceBase クラスを拡張するクラスで構成されています。
/* Simple JScript service
Andrew Clinick July 2000
*/
// 必要な .NET 名前空間をインポートします。
import System;
import System.ServiceProcess;
import System.Diagnostics;
import System.Timers;
class SimpleService extends ServiceBase
{
private var timer : Timer;
// コンストラクタ -- サービスのプロパティをセットアップします。
function SimpleService()
{
CanPauseAndContinue = true;
ServiceName = "JScript Service";
timer = new Timer();
timer.Interval = 1000;
timer.AddOnTimer(OnTimer);
}
// サービス開始時に呼び出されるメソッド
protected override function OnStart(args : String[])
{
// イベント ログにエントリを作成して、タイマを開始します。
EventLog.WriteEntry("JScript Service started");
timer.Enabled = true;
}
// サービス停止時に呼び出されるメソッド
protected override function OnStop()
{
EventLog.WriteEntry("JScript Service stopped");
timer.Enabled = false;
}
// サービスの一時停止時に呼び出されるメソッド
protected override function OnPause()
{
EventLog.WriteEntry("JScript Service paused");
timer.Enabled = false;
}
// サービス再開時に呼び出されるメソッド
protected override function OnContinue()
{
EventLog.WriteEntry("JScript Service continued");
timer.Enabled = true;
}
// タイマが進むたびに呼び出されるメソッド
function OnTimer(source : Object, e : EventArgs)
{
EventLog.WriteEntry("Hello World from JScript!");
}
}
// サービスを作成して、実行します。
ServiceBase.Run(new SimpleService());
SimpleService クラスは、ServiceBase クラスを拡張します。また、ServiceBase のさまざまなイベント ハンドラをオーバーライドする関数をいくつか持っています。クラスがロードされると、NT サービスとして必要な機能のすべてを自動的に取得します。私が実際に書かなければならなかったコードは、Timer に接続して、1 秒ごとにイベント ログに書き出すためのスクリプトだけでした。System.Diagnostics 名前空間を含めたので、EventLog.WriteEntry を呼び出すだけでよいことに注目してください。これが、イベント ログに実際にテキストを書き出すために必要なすべての Windows API 呼び出しを行います。
ここではパッケージについて詳しく説明しませんが、パッケージはクラスを追加できる名前空間を作成するためのメカニズムとなります。これによって、カプセル化にさらに柔軟性が加わります。同種のクラスのセットを 1 つのパッケージにまとめることができるので、コードの整理が簡単になります。
デバッグ
JScript がいかに優れた言語になったとしても、プログラマはやはりミスを犯すことがあるので、優れたデバッグ サポートが開発者の生産性を高めるための主要な要件であることに変わりはありません。われわれは JScript .NET のデバッグ機能を強化して、完全な Visual Studio.NET デバッグを可能にしました。JScript 5 のデバッグで苦労したことがある人は、Visual Basic.NET および C# で使用されているのと同じテクノロジに基づく新しいデバッグ機能を歓迎するでしょう。ほかの Visual Studio.Net 言語と同じように JScript でも、コードのステップ実行、ブレークポイントの設定、[イミディエイト] および [ウォッチ] ウィンドウの使用など、優れたデバッグ機能が可能になったと言えば十分でしょう。
JScript .NET の使用例
JScript .NET のこのリリースの第一の焦点は、サーバーでのスクリプティングであり、特に ASP+ によって提供される新しい機能です。ASP+ の使い方を説明するために、私はいくつかの簡単なデモを書きました。
SQL Server にアクセスする ASP+ ページ
最初のデモは、JScript .NET と .NET Framework の新しいデータ アクセス クラスを使用する単純な ASP+ ページです。おなじみの スクリプティング メカニズムを使用して、SQL Server pubs サンプル データベース内の authors テーブルにクエリを発行します。あまりエキサイティングでないことはわかっていますが、JScript の新しい機能の使い方がわかります。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<%@ language="JScript" %>
<link rel="STYLESHEET" type="text/css" href="style.css">
<%
// 接続、コマンド、およびデータセットをセットアップします。
var myConnection:SQLConnection = new SQLConnection("server=scripting;uid=sa;pwd=;database=pubs");
// SQL を実行します。
var myCommand:SQLDataSetCommand = new SQLDataSetCommand("select * from Authors", myConnection);
// 変数を宣言し、
// JScript の新しい型指定機能を使用して型指定します。
var ds:DataSet = new DataSet();
var myTable:DataTable
var myColumns:ColumnsCollection
var myCol:DataColumn
var myRows:RowsCollection
var myRow:DataRow
// FillDataSet メソッドを呼び出すことによって、データを取得します。
myCommand.FillDataSet(ds, "Authors");
myTable = ds.Tables[0]
%>
<h1>
<%=ds.Tables[0].TableName%>
</h1>
<br>
<TABLE>
<THEAD>
<TR>
<%
// テーブル内の列を反復処理して、
// テーブルの最初に列名を書き出します。
myColumns = myTable.Columns
for (myCol in myColumns)
{
%>
<TH class="spec">
<%=myCol.ColumnName%>
</TH>
<%
}
%>
</TR>
</THEAD>
<%
// すべての行を取得して、それぞれの行について TR を書き出します。
myRows = myTable.Rows
// enumerator オブジェクトではなく for in を使用して
// コレクションを反復処理できることに注目してください。
for (myRow in myRows)
{
%>
<TR>
<%
for(var i:int=0;i<myColumns.Count;i++)
{
%>
<TD class="spec">
<%=myRow[i]%>
</TD>
<%
}
%>
</TR>
<%
}
%>
</TABLE>
このスクリプトのキーポイントは、for...in を使用してコレクションを反復処理できることです。あなたが JScript 開発者ならば、これは大きな前進です。操作対象のコレクションの型を気にする必要がなくなるからです。JScript が代わりにやってくれます。
もう 1 つ注目すべき点は、ASP+ はコントロールをデータセットにバインドする機能を提供してくれることです。つまり、実はこのようなスクリプトを書く必要さえないのですが、この例では、プロセスをなじみのあるものにしておきたいと考えました。
Web Services
今までは、JScript を使用して Web Services を作成するには、リモート スクリプティングが唯一の手段でした。リモート スクリプティングは優れた技術ですが、ブラウザ以外にサービスを呼び出す手段がなく、XML メッセージの形式が独自であるという制約があります。Web Services を呼び出す標準的手段としての SOAP の登場により、XML の独自な形式は、ますます魅力に乏しいものとなっています。幸い、ASP+ は Web Services を定義するための優れた手段を備えています。
あなたがしなければならないことは、JScript .NET クラスを作成して、それを ASMX ファイルに入れることだけです。残りの作業は ASP+ がやってくれます。ASP+ はサービス定義言語 (Service Description Language: SDL) を自動的に作成して、SOAP リクエストを処理します。私は Weather Web Services をわずか数分で変換することができました。その ASMX ファイルを以下に示します。
<%@ WebService Language="JScript" class="Weather"%>
import System
import System.Web.Services
class Weather {
WebMethodAttribute function getConditions(strCity : String) : String
{
var now = new Date();
switch (strCity.toUpperCase())
{
case "LONDON":
if (now.getMonth() <= 7||now.getMonth() >=9)
{
return "overcast"
}
if
{
return "partly overcast"
}
break;
case "SEATTLE":
if (now.getMonth() == 7 && now.getDay()==4)
{
return "torrential rain"
}
else
{
return "rain"
}
break;
case "LA":
return "smoggy"
break;
case "PHOENIX":
return "damn hot"
break;
default:
return "partly cloudy with a chance of showers"
}
}
}
まとめ
JScript .NET は、JScript とスクリプティング プラットフォームの大きな進化であり、既存のスクリプト言語に基づいたリッチで堅牢な言語を提供すると同時に、より大きなスクリプトの構築を開始するための柔軟な手段を提供します。JScript および Visual Basic におけるこれらすべての機能強化の鍵は、それらの基盤となっている .NET Framework にあります。.NET Framework は、ソリューションの中で使用できるさらに多くのスクリプト可能オブジェクトを提供し、スクリプトの可能性を広げて、ほとんどあらゆるものをマシンまたはインターネット上でスクリプト処理できるようにします。これは JScript .NET の第一段階に過ぎません。今後の展開について、みなさんのフィードバックをお聞かせください。
Andrew Clinick は、Microsoft Script Technology グループのプログラム マネージャであり、スクリプトに関係するものならば、おそらく何らかの形で彼が関わっています。彼は余暇の大半をアメリカのテレビでラグビーの中継番組を探し、新しいアメリカ人の同僚にクリケットを説明するのに費やしています。
|