[MD3] PowerShellについて

MD3の説明でPowerShellの関数って、言語拡張のように見せれるので、中々おもしろいという話をしました。この説明で例題に取り上げたのが、「Windows PowerShell in Action」という書籍なのですが、この書籍で提供されるているサンプルをご紹介したいと思います。本自体は、500頁ちょっとありますので、読むのも大変なんですけど(私の堅い枕の1つです)。 Capter8のサンプルに「class.ps1」と「demo-class.ps1」というファイルがあります。詳細は「class.ps1」を見ていただく必要がありますが、「demo-class.ps1」で以下のような記述を行っています。 CustomClass point { note x 0 note y 0 method ToString { “($($this.x), $($this.y))” } method scale { $this.x *= $args[0] $this.y *= $args[0] } } $p = new point このコードの中で「CustomClass」「note」「method」「new」というキーワードが、実は関数として「class.ps1」で定義されています。クラスという定義方法をPowerShellは提供していませんが、上記のように関数を使用することで、あたかもオペレータを拡張したように見えます。個人的には、これって「おもしろいよなー」と思っています。 この面白ろさというかを皆さんにお伝えしたくて、MD3でPowerShellを取り上げました。それから、DownLoadセンターを見ていてPowerShellを利用する方にお勧めのドキュメントをみつけました。それは、PowerShell Graphical Help Fileです。PowerShellのヘルプのchm形式です。英語で記述されていますが、構文などの全体像を見るのに役立ちます。

1

[MD3]動的言語について2

前回の続きで、今回は動的言語による柔軟性を少しまとめたいと思います。Pythonでは、eval()関数とexec文が命令の動的実行として用意されています。たとえば、「eval(“1 + 1”) 」とか、「exec “””class: ps  …. “””」という感じです。eval()関数は文字列で指定した式の実行を行い、exec文は文字列で指定した文の集まりを実行することができます。 PowerShellでは、Invoke-Expressionコマンドレットが文字列で指定した式の実行を行い、$ExecutionContext.InvokeCommand.InvokeScript()メソッドで文字列で指定した文の実行を行うことができます。これ以外に、PowerShellでは以下のような記述もできます。$a = “Power Shell”$a.Length          #Lengthプロパティの呼び出し$a.”Length”$b = “Length”$a.$b「$a.Length」と「$a.”Length”」、そして「$a.$b」も文字列のLengthプロパティを呼び出しています。プロパティに関しては、このような書き方もできるのがPowerShellという言語です。 動的言語としては、当り前の機能と言われればその通りなんのですが、上記の命令を使用するには注意が必要になります。それは、文字列で渡す式や命令に不正な意図を持ったものを実行させないようにすることです。この機能は便利なのですが、セキュリティホールになる可能性があります。もちろん動的言語の実行環境に対する権限を制約することで、少ない権限での実行は可能になります。ただ、セキュアにするという視点を忘れては行けないということです。 ・DLRは何を目指しているか色々な動的言語がありますが、それぞれの実行環境はその言語の世界に閉じています。もちろんライブラリなどによって外部のモジュールやコンポーネントと連携することはできます。でも、呼び出す相手と自分の環境のギャップを埋めるモノを使って、連携していると考えられます(スムーズに連携していてもです)。MS技術以外にも沢山の動的言語もあります。これらの様々な言語で作成されたオブジェクトを共有できたら素晴らしいものになるというのが、DLRの目指しているものだと私は理解しています。このために、 共通の抽象構文木(AST) 言語依存のセマンティックスの実現を助ける 実行環境サービス(GC、オブジェクト管理、コンソール、etc) などを共通化しようとしてDLRが開発されています。このDLRの開発は、まだ始まったばかりで仕様も完璧とは言い難いものもあります。ですが、ソースコードを公開することでフィードバックを受けながら仕様を洗練していくIronPythonの開発手法を採用しています。このため色々な方達が開発に参加することもできます。 もちろんASTなんて、俺は知らないで構わないのです。私自身も言語実装者じゃありませんし、どちらかと言えば利用する側に属しますから。唯、こういう仕組みで他言語間の共有をやろうとするアプローチもあると言うことです。じゃあ.NET FrameworkのCLIも同じじゃなかったの?という疑問も聞こえてくるのですが、そこはコンパイルする言語かインタープリタ的な言語かによるアプローチの違いと考えることができます。 PS:ASTなどにご興味がある方は、Jim Hugunin氏のBlogも参考にしてください。それから以前にご紹介したJohn Lam氏のCompiler Dev Labのエントリも参考にしてください。 

0

[MD3] 動的言語について1

MD3でご説明したDynamic Languageですが、論点は大きく2種類に分類できます。 リリース済みの言語 Dynamic Language Runtime対応の言語 ・リリース済みの言語  IronPython(1.0、1.0.1、1.1)とWindows PowerShell 1.0がリリースされている動的言語(スクリプト言語)として説明しました。それぞれのl特徴として言語レベルのリフレクションを持ち、実行時にオブジェクトを拡張できるという特徴を持っています。Pythonでは、setattr()、getattr()、hasattr()関数などを持ち、関数デコレータによる関数(或いは、メソッド)の拡張とメタクラスによるクラス拡張をサポートしています。 PowerShellでは、PowerShellオブジェクト(PSObject)を使うことで実行時にプロパティ・メソッドを拡張できます。またGet-Memberコマンドレットなどによるリフレクション機能をサポートしています。トリッキー(?)な特徴として、関数呼び出しに丸カッコが不要な点があります。たとえばnewという関数を定義して、「$a = new 引数」というオペレータのような記述ができます。これは関数なのですが、独自のオペレータを定義したように見せられるという特徴にも繋がっています。 ・Dynamic Language Runtime(DLR)対応の言語 4月に行われたMIXというイベントでSilverLightとともに発表された.NET Frameworkに対する動的言語向けの拡張フレームワークです。このDLR対応で試すことができるCTPが公開されています。 IronPython 2.0 アルファ1 SilverLight 1.1 アルファ ASP.NET Futures 上記の3種類がDLR対応の言語として、Python、Managed JScript(JSX)を試すことができます。MIXで発表された言語としては、Managed VisualBasic(VBX)、IronRubyがあります。そしてDLRそのもののソースコードがIronPython 2.0アルファ1に含まれていますので、自分で色々と試すことができます。 ・ASP.NET Future MD3でお見せしたデモですが…済みません。勘違いしていて、しょうもないエラーが多発してしまいました。原因は「<% Title %>」にありました。インラインコードを「<%=Title %>」とすべきなのですがイコールを忘れていたために、正常に動作しませんでした(緊張していました。多分…)。言語をIronPythonで作成した場合のコードビハインドファイルですが、デフォルトでは日本語を記述できません(例えば、u’日本語’)。このためunicodeの16進数表記を使用します。コードビハインド ファイルのエンコードをUTF-8などに変更すれば、u’日本語’の表記を使うことができるようになります。 他の言語との連携ですが、PythonでJScriptを使用するには以下のようなコードを記述します。import clrj = clr.Use(‘JScriptファイルへのフルパス’, ‘js’)これで変数「j」を経由して、JScriptの関数などを呼び出すことができます。JScriptからPythonのコードを利用するには以下のようなコードを記述します。p = LoadModule(‘Pythonファイルへのフルパス(拡張子除き)’, ‘py’)これで変数「p」を経由して、Pythinで定義された関数やクラスを呼び出すことができます。UseメソッドやLoadModule関数の第2引数が、言語の識別子です。現状でサポートしている識別子は、「py」「js」「vbx」「rb」のようです。  今回は、ここまでとします。次回は、シェアードObjectの話を含めてまとめたいと思います。

1

MD3にご参加頂きありがとうございます

MD3の動的言語のセッションにご参加いただいた方々、ありがとうございました。ご要望を頂きました、PPTとSilverLight1.1SDKに含まれているDLR Consoleのキーボードマッピングを日本語キーボードに対応させたスクリプトをUpさせていただきます。 内容に関しては、後日エントリを追加させていただきます。 Dynamic Language.zip

3

Dynamic Languageについて(MD3)

MD3に向けて、Dynamic Languageに取り組んでいます。可能であれば、IronRubyなどもお見せできたら良いなぁと考えていますが、無理そうです(John Lamのブログに7月の予定とありました)。このためASP.NET FuturesとIronPython2.0アルファ1、SilverLight1.1アルファを調べています。Dynamic Language Runtime対応ということで、言語向けASTからDLR用のASTを生成しているように見えます。このDLR用のASTで動的言語のオブジェクト(DynamicType)を共有しているようです。もっとも、インスタンスを作成する演算子(例えば、JavaScriptではnew、Pythonでは「()」など)は、実装する言語依存のようで他の言語のオブジェクトとの連携を言語実装者がどこまで実装するかに依存しているようです。

0

Blogを始めました

皆様、こんにちは。荒井でございます。今度から、msdnブログを始めました。まだ、どのような内容を記述していくかは、決めていませんが、その時々の情報をお知らせしていければと考えていますので、宜しくお願いいたします。取り急ぎ、ご挨拶まで。

0