|





|
|
このページで紹介しているソースコード、プロジェクトファイルのダウンロードができます。
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"")"の部分をプログラム実行中に変更して、
実行することが可能です。

動的に作成したコードの即実行サンプルプログラムソースコード
Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.Text
Module DynamicCompileAndRun
Sub main()
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)ダウンロードが可能です。

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

このテキストボックスのVisua Basicでかかれたソースコードを修正することで、
メッセージボックスを表示する以外のことも可能です。
今回のプリプロセッサ式に作ったプログラミング言語は、本格的なものとはいえないのですが、
ごく限られた目的のためのドメイン特化言語(DSL:Domain Specific Language)、糊づけ言語(Glue Language)
を実装するには役に立つことがあることでしょう。
|
|