codeseek
TOP
.NETサンプルの解説
プログラミング考
codeseekBlog 
勉強会
ダウンロード
リンク
プロフィール
お読みください













累計:
本日
昨日



mail


このページで紹介しているソースコード、プロジェクトファイルのダウンロードができます。
TextboxStudio.zipをダウンロード

DynamicCompileAndGo.zipダウンロード

第26回codeseek勉強会:言語、コンパイラを作ろう まとめページ



第26回codeseek勉強会は、プログラミング言語・コンパイラの仕組みを
学び、よりよいプログラムソースコードを作るための基礎知識としよう
というのが趣旨でした。


1..NETの世界はいろんな言語があります。

VB
C#
python
・・・



2.コンパイラ作成支援

CLR
DLR

yacc
lex
antlr
http://www.limy.org/program/java/antlr/step1.html

BNF



3.コンパイルの流れ

スキャナ lexer 字句解析
パーサー yacc 構文解析 とかが生成
字句解析、構文解析を、lexerやyaccなどを使わず、手作りする
ことも多い

コードジェネレータ CPU(仮想もありえる)が実行できるバイナリを生成



4.MSDNマガジンの記事を紹介

自作室 .NET Framework 用の言語コンパイラを作成する
(英語)Create a Language Compiler for the .NET Framework

このページでは、コンパイラの原理と、Joel Pobar氏が作成したコンパイラの解説がされています。
このコンパイラには、「Good for Nothing" (役立たず) コンパイラ」という名前がつけられていますが、
これはかなりの謙遜で役立たずどころか、コンパイラを学ぶには十分であり、また、新たな言語の基礎
に十分なものです。
お勧めです。



5.ソースコードをコンパイルして実行する例
動的に作成したVisual Basic のソースコードを、そのプロセス内で実行するための
サンプルを作成です。
こちらから(DynamicCompileAndGo.zip)ダウンロードが可能です。

注意
このコードをそのまま実業務に使うことはしないでください。
このようなプログラムには.NETへの理解が必要です。 特に、CodeDom名前空間は重要です。
使う前に、これらを理解してください。
.NET Framework クラス ライブラリ System.CodeDom.Compiler 名前空間

このプログラムをそのまま実行すると以下のメッセージボックスが表示されます。
MsgBox(""動的にコンパイルしたプログラムのMsgBox"")"の部分をプログラム実行中に変更して、
実行することが可能です。
動的に表示したMessagebox


動的に作成したコードの即実行サンプルプログラムソースコード

Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.Text

Module DynamicCompileAndRun
    Sub main()
        '動的に変更できるVBのプログラムソースコードを文字列化する
        Dim sbSource As New StringBuilder
        sbSource.Append("Imports Microsoft.VisualBasic" + vbCrLf)
        sbSource.Append("Public Class DynamicClass" + vbCrLf)
        sbSource.Append("  Sub DynamicMethod()" + vbCrLf)
        sbSource.Append("    MsgBox(""動的にコンパイルしたプログラムのMsgBox"")" + vbCrLf)
        sbSource.Append("  End Sub" + vbCrLf)
        sbSource.Append("End Class" + vbCrLf)
        Dim sSource = sbSource.ToString()

        'コンパイルを実行する
        Dim oCompilerParameters As New CompilerParameters
        oCompilerParameters.GenerateExecutable = False
        oCompilerParameters.GenerateInMemory = True
        Dim oVBCompiler As New VBCodeProvider
        Dim oCompilerResults As CompilerResults
        oCompilerResults = oVBCompiler.CompileAssemblyFromSource(oCompilerParameters, sSource)

        '動的コンパイルしたソースにエラーがあった場合、エラーを表示して、終了
        If oCompilerResults.Errors.Count >= 1 Then
            Debug.Print("動的に与えられたソースコードにコンパイルエラーがありました。")
            For Each oCompilerError As System.CodeDom.Compiler.CompilerError In oCompilerResults.Errors
                Debug.Print(oCompilerError.ToString())
            Next
            MsgBox("ソースコードにエラーがあります。イミディエイトウィンドウにエラーを表示しました。")
            Exit Sub
        End If

        'コンパイルしたアセンブリをインスタンス化して実行
        Dim oDynamicCompiledAssembly As Assembly = oCompilerResults.CompiledAssembly
        Dim oDynamicCompiledClassType As Type = oDynamicCompiledAssembly.GetType("DynamicClass")
        Dim oDynamicCompiledMethodInfo As MethodInfo = oDynamicCompiledClassType.GetMethod("DynamicMethod")
        Dim oDynamicCompiledInstance As Object = Activator.CreateInstance(oDynamicCompiledClassType)
        oDynamicCompiledMethodInfo.Invoke(oDynamicCompiledInstance, Nothing)
    End Sub
End Module



5.Visual Basicによるプリプロセッサ式の簡易言語

Visual Basicコンパイラでコンパイルする前に、ソースコード文字列にプログラム中で修正をする
ことで、簡易なプログラミング言語を作ることができます。

安易な例で申し訳ないですが、Visual Basicの予約語を日本語に直訳してみました。

取り込む Microsoft.VisualBasic
公開 クラス DynamicClass
   DynamicMethod()
    MsgBox("動的にコンパイルしたプログラムのMsgBox")
  ここまでが 
ここまでが クラス

これをVisual Basicに変換するプログラムが以下のものです。
字句・構文解析をしていない、文字列置換だけの安易なものですが、限定された
用途によってはこれで十分なこともあるでしょう。でも、まぁ、参考程度に。

        'プリプロセッサー部
        'ここを書き換えることで、独自の言語とすることができる
        Dim sSource As String = txtSource.Text
        sSource = sSource.Replace("取り込む""Imports")
        sSource = sSource.Replace("クラス""Class")
        sSource = sSource.Replace("公開""Public")
        sSource = sSource.Replace("副""Sub")
        sSource = sSource.Replace("ここまでが""End")

動的にコンパイルして実行できることを応用して、超小型Visual Studioもどきが作成できます。

こちらから(TextboxStudio.zip)ダウンロードが可能です。

TextBoxStudioのソースコード表示フォーム

これを実行するとメッセージボックスが表示されます。

動的に表示したMessagebox


このテキストボックスのVisua Basicでかかれたソースコードを修正することで、
メッセージボックスを表示する以外のことも可能です。


今回のプリプロセッサ式に作ったプログラミング言語は、本格的なものとはいえないのですが、 ごく限られた目的のためのドメイン特化言語(DSL:Domain Specific Language)、糊づけ言語(Glue Language)
を実装するには役に立つことがあることでしょう。