[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の目指しているものだと私は理解しています。このために、

  1. 共通の抽象構文木(AST)
  2. 言語依存のセマンティックスの実現を助ける
  3. 実行環境サービス(GC、オブジェクト管理、コンソール、etc)

などを共通化しようとしてDLRが開発されています。このDLRの開発は、まだ始まったばかりで仕様も完璧とは言い難いものもあります。ですが、ソースコードを公開することでフィードバックを受けながら仕様を洗練していくIronPythonの開発手法を採用しています。このため色々な方達が開発に参加することもできます。

もちろんASTなんて、俺は知らないで構わないのです。私自身も言語実装者じゃありませんし、どちらかと言えば利用する側に属しますから。唯、こういう仕組みで他言語間の共有をやろうとするアプローチもあると言うことです。じゃあ.NET FrameworkのCLIも同じじゃなかったの?という疑問も聞こえてくるのですが、そこはコンパイルする言語かインタープリタ的な言語かによるアプローチの違いと考えることができます。

PS:ASTなどにご興味がある方は、Jim Hugunin氏のBlogも参考にしてください。それから以前にご紹介したJohn Lam氏のCompiler Dev Labのエントリも参考にしてください。