Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

VBCPP - ICT+R 2012

1,381 views

Published on

第2回 立命館・全国高校生ソフトウェア創作コンテストICT Challenger +R 2012で発表した際に使用した、プレゼン資料です。

SlideShare向けに、一部修正してあります。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

VBCPP - ICT+R 2012

  1. 1. VBCPP (ぶいびーしーぷらすぷらす)(slideshare用の修正版)
  2. 2. はじめに鈴木さんと一緒に「HTML5で音ゲー」企 画を進めています。(去年の10月頃~) 譜面制作用のエデゖタ、”dosStudio” を制作しています! HTML5Step公式サ゗ト: http://html5step.bonprosoft.com/
  3. 3. VBCPPとは パーサーをプラグ゗ンとして追加することで、 対応できる言語を増やすことができるコンパ゗ ラ(のようなもの) VBCPPが定義する抽象構文木を利用し、パーサ ーから返ってきたデータを一括管理することで 、他の言語で書いた関数、変数、クラス他を利 用することもできる .NETを参照できる為、ラ゗ブラリは豊富!
  4. 4. もうちょっと具体的にわかりやすく…ゕニメーションを 使った説明が あります 普通のコンパ゗ラ VBCPP
  5. 5. もう少し詳しく…ゕニメーションを AST構築 AST修正 バイナリ生成 使った説明が あります
  6. 6. 制作のきっかけ「この部分を他の言語で記述できたらど うなるのだろう…」という好奇心!DSLとかを混ぜることができると楽そう! 言語だってプラグ゗ンにすれば面白そう!プラグ゗ンなら1人ですべての言語を制 作する必要もないため、楽!(共有できる)もっと気軽に言語処理系を作りたい!
  7. 7. VBCPPの4つの特徴複数の言語間でデータをやり取りできる.NET Frameworkを参照できる 名前変換テーブル/ラ゗ブラリ機能によって、よりオリジ ナルの操作感に近づけることができる 2つの型決定方法によりパーサーの負担を減らすことができる
  8. 8. VBCPPの特徴(1)パーサーから受け取ったデータをVBCPP が一括管理する →他の言語で書いたクラスや変数、関 数を利用することができます ex.) VBとC#で共同FizzBuzz等 (お互いが順番にデータを処理し ていく、等)
  9. 9. VBCPPの特徴(2).NET Frameworkを参照できる →ストリーム操作(ex.StreamReader) からフゔ゗ル入出力ダ゗ゕログ (ex.OpenFileDialog)まで使用するこ とができるため、より高度なゕプリケ ーションを作成することができます。
  10. 10. VBCPPの特徴(3) 名前変換テーブル・ラ゗ブラリによって、より 言語オリジナルの形に近づけることができる .NET Frameworkのクラス名・関数名・そして引 数を自由に再定義して使うことができます。 Integer main() 本来であれば、.NET Framework { を使用する関係上、名前は.NET Integer num; Framework準拠でなくてはなりま Console.WriteLine(“hoge”); せんが、これらの機能を使うと… } Before -> After int -> Integer int main() str -> String { printf -> Console.WriteLine int num; printf(“hoge”); }
  11. 11. VBCPPの特徴(4)2つの型決定システムがあり、パーサー の決定を尊重することができる • 抽象構文木に名前のみを プラグインが 指定し、実行時にVBCPP 型決定を行わない が自動評価します。 • 抽象構文木に型を指定し、 プラグインが 実行時にはそのままその 型決定を行う 型が採用されます。 →パーサーが必要に応じて、IntegerやString等のデータ 型の確定を行うことができます (もちろんVBCPPに任せることもできます)
  12. 12. VBCPPの使い方 VBCPPのバ゗ナリ生成方法は以下の3通り 1. VBCPP標準ビルダを使用してコマンドプロンプト等 から利用する方法 2. あるプログラムからGenerator(Core内)をロードし 、ASTを渡す方法 3. あるプログラムからCompiler(Core内)をロードし 、プラグ゗ンの゗ンスタンスとコードを渡す方法 (2と3はVBCPP標準ビルダの文法に縛られる必要もありません。) &&entry = “エントリポイント名" &&<code language=“言語名“ methodName=“関数名(必要なら)”> ~~コード部分~~ &&</code> <参考:VBCPP標準ビルダの構文>
  13. 13. VBCPPの使い方(2)そのまま使う。 VBCPP.exeをそのまま実行します。 ソースコードの識別にはVBCPP標準ビルダ用の構文 を使用します。 &&entry = “エントリポイント名" &&<code language=“言語名“ methodName=“関数名(必要なら)”> ~~コード部分~~ &&</code> VBCPP標準ビルダの構文
  14. 14. VBCPPの使い方(2)-2実演(VBとBrainf*ckの混在コード)&&entry = "Main"&&<code language="VB"> Public Sub Main() StreamReaderと Dim d As New Windows.Forms.OpenFileDialog If d.ShowDialog = Windows.Forms.DialogResult.OK Then OpenFileDialogを使ってフゔ Console.WriteLine("Path"+d.FileName) ゗ルの内容を読み込みます Console.WriteLine("=====Body=====") (.NET Frameworkを使用する例) Dim st As New IO.StreamReader(d.FileName) Console.WriteLine(st.ReadToEnd) st.Close() End If Console.WriteLine("Repeat words after HelloWorld with Brainfuck.") printf(“Lets start!!”) BFHello() VBにはないprintf関数を呼び出している End Sub (本当はConsole.WriteLine関数に変換している)&&</code>&&<code language="BF" methodName="BFHello"> +++++++++[>++++++++>+++++++++++>+++++<<<- ]>.>++.+++++++..+++.>-.------------.<++++++++.--------. +++.------.--------.>+. +[>,.<]&&</code> Brainfuckコードを標準ビルダの構文によって関数化している
  15. 15. VBCPPの使い方(3) 自作言語のバ゗ナリ生成ラ゗ブラリとし て使う。 VBCPP Coreをロードし、自作言語のパーサーで 生成したASTをジェネレータに直接渡すことで、バ ゗ナリを生成することができます。 • コードを解析する • ASTを構築する自作コンパ゗ラ 直接ASTを渡す • ASTを元にバ゗ナリを生成Generator(VBCPP Core内)
  16. 16. VBCPPの使い方(4) 難解プログラミング言語(のようなもの)と して使う (たいていのプログラムなら1行文で組めます。) ただ難解なだけではなく、.NETも利用出来るので実用的 VBCPP Coreをロードし、コードから木を書き、 直接 渡すことで、バ゗ナリを生成することができます。 Dim Gen As New Generator()ex.) Dim path As String = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Lo AST該当部分 cation), "hoge.exe") Gen.Generate("SampleApp", New VBCPP_Program( _ (非常に冗長) New AST_Class.VBCPP_ClassList( _ New AST_Class.VBCPP_Class("Test", _ New AST_Class.VBCPP_ClassItemList( _ New VBCPP_Field("g_str", New VBCPP_Type(GetType(String)), FieldAttributes.Public Or FieldAttributes.Static, 0, "Test.vb"), _ New AST_Class.VBCPP_Method("Main", New VBCPP_Type(GetType(Void)), Nothing, _ New VBCPP_Body(New VBCPP_StatementList(New VBCPP_Assignment( _ New VBCPP_CallExpression("g_str", Nothing, Nothing, Nothing), _ New VBCPP_Literal("代入する値です。", VBCPP_LiteralType.VBCPP_STRING), 0))), _ MethodAttributes.Public Or MethodAttributes.Static, "VB", 0, "Test.vb")), TypeAttributes.Public, "VB", "test,vb", 0)), _ New AST_Class.VBCPP_MethodList, New AST_Enum.VBCPP_EnumList, New VBCPP_ImportList), _ Nothing, New NameTableList, New NameList("Test", New NameList("Main")), path)
  17. 17. VBCPPの使い方(4)-21文ASTプログラミング ~FizzBuzz~ 数字を順番に出力し、特にその中でも… 3の倍数ならFizz 5の倍数ならBuzz 15の倍数ならFizzBuzz を出力する言葉遊び <<参考: VBでのFizzBuzz>> For i = 0 To 100 If i Mod 15 = 0 Then Console.WriteLine("FizzBuzz") ElseIf i Mod 5 = 0 Then Console.WriteLine("Buzz") ElseIf i Mod 3 = 0 Then Console.WriteLine("Fizz") Else Console.WriteLine(i) End If出力例) Next1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, …
  18. 18. VBCPPの使い方(4)-2 1文ASTプログラミング ~FizzBuzz~Const FileName As String = "hoge.vb" New VBCPP_Body(New VBCPP_StatementList( _Const Line As Integer = 0 New VBCPP_IfStatement( _Const MaxValue As Integer = 100 New VBCPP_BinaryExpression( _Dim Program As New VBCPP_Program( _ New VBCPP_BinaryExpression( _ Nothing, _ New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_MethodList( _ New VBCPP_Literal("5", VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_Method( _ VBCPP_BinaryOPType.VBCPP_Modulo), _ "Main", _ New VBCPP_Literal(0, VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_Type(GetType(Void)), _ VBCPP_BinaryOPType.VBCPP_Equal), _ Nothing, _ New VBCPP_Body(New VBCPP_StatementList( _ New VBCPP_Body(New VBCPP_StatementList( _ New VBCPP_CallStatement(New VBCPP_CallExpression("Console", Nothing, Nothing, _ New VBCPP_DeclareLocalVariable( _ New VBCPP_CallExpression("WriteLine", Nothing, New VBCPP_ArgumentList( _ New VBCPP_LocalVariable("i", New VBCPP_Type(GetType(Integer)), 0, FileName), _ New VBCPP_Argument(New VBCPP_Literal(“Buzz”, Line), _ VBCPP_LiteralType.VBCPP_STRING), Line) _ New VBCPP_ForStatement( _ ), Nothing)), Line))), _ New VBCPP_Assignment( _ New VBCPP_Body(New VBCPP_StatementList( _ New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_IfStatement( _ New VBCPP_Literal("1", VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_BinaryExpression( _ Line), _ New VBCPP_BinaryExpression( _ New VBCPP_Literal(MaxValue, VBCPP_LiteralType.VBCPP_INTEGER), New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_Assignment(New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_Literal("3", VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_BinaryExpression( _ VBCPP_BinaryOPType.VBCPP_Modulo), _ New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_Literal(0, VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_Literal(1, VBCPP_LiteralType.VBCPP_INTEGER), _ VBCPP_BinaryOPType.VBCPP_Equal), _ VBCPP_BinaryOPType.VBCPP_Add), _ New VBCPP_Body(New VBCPP_StatementList( _ Line), _ New VBCPP_CallStatement(New VBCPP_CallExpression("Console", Nothing, Nothing, _ New VBCPP_Body(New VBCPP_StatementList( _ New VBCPP_CallExpression("WriteLine", Nothing, New VBCPP_ArgumentList( _ New VBCPP_IfStatement( _ New VBCPP_Argument(New VBCPP_Literal(“Fizz”, New VBCPP_BinaryExpression( _ VBCPP_LiteralType.VBCPP_STRING), Line) _ New VBCPP_BinaryExpression( _ ), Nothing)), Line))), _ New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), _ New VBCPP_Body(New VBCPP_StatementList( _ New VBCPP_Literal("15", VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_CallStatement(New VBCPP_CallExpression("Console", Nothing, Nothing, _ VBCPP_BinaryOPType.VBCPP_Modulo), _ New VBCPP_CallExpression("WriteLine", Nothing, New VBCPP_ArgumentList( _ New VBCPP_Literal(0, VBCPP_LiteralType.VBCPP_INTEGER), _ New VBCPP_Argument(New VBCPP_CallExpression("i", Nothing, Nothing, Nothing), Line)), _ VBCPP_BinaryOPType.VBCPP_Equal), _ Nothing)), Line)) _ New VBCPP_Body(New VBCPP_StatementList( _ ), Line))), Line))), Line))),Line))), _ New VBCPP_CallStatement(New VBCPP_CallExpression("Console", Nothing, Nothing, _ Reflection.MethodAttributes.Public, _ New VBCPP_CallExpression("WriteLine", Nothing, New VBCPP_ArgumentList( _ "VB", Line, FileName)), _ New VBCPP_Argument(New VBCPP_Literal("FizzBuzz", VBCPP_LiteralType.VBCPP_STRING), Nothing, _ Line) _ New VBCPP_ImportList(New VBCPP_Import(New NameList("System")))) ), Nothing)), Line))), _ Gen.Generate("SampleApp", Program, Nothing, Nothing, New NameList("Main"), Path)
  19. 19. VBCPPの使い方(4)-21文ASTプログラミング ~FizzBuzz~  所要時間: 1時間30分程度  IntelliSenseが途中からおかしくなる  1つ間違えると、他にまで影響する→高度な集中力  82行にも及ぶ、1文 (本当はもっと省略できますが…)  動いた時の感動!  疲れました。
  20. 20. よくありそうな質問Q. 簡単なプログラムのAST式を書くのがこんなに大変だったら、パーサー作成は相当大変かと思うのですが…A. (必ずしも) そんなことはありません! VBCPPのAST式は冗長ではありますが、それぞれが独立して存在することができるため、パーツを組み合わせるようにして、木を構築することができます。
  21. 21. よくありそうな質問(2)SimpleVBParserの例(語句解析部分を省略して、Reduction部分の一部のみを表示しています)
  22. 22. VBCPPの今後 ゗ベントやデリゲート等の対応 名前変換テーブルの改善(引数等の対応付け) さらにプラグ゗ン製作者の負担が減るよう(表 現が楽になるよう)ASTのパターンを追加 抽象構文木の対話型による生成&ビルド
  23. 23. VBCPPの今後(2)プラグ゗ンを充実させて、”より実用的な” 環境を作成したプラグ゗ンみんなで共有しあえ る環境を (プラグ゗ンの共有サ゗トとか)
  24. 24. まとめ言語処理系は楽しい!(奥が深い!) プラグ゗ンを書くだけで、手軽にバ゗ナリが 動く喜びを感じられる! プラグ゗ンを制作することで、慣れ親しんだ 言語と向き合えることもできる! 言語特有の特徴/表現を、いかに工夫して統一 された木に表現する(一般化する)か、プラグ ゗ン製作者の力試しにもなる!
  25. 25. プログラミング言語「ICT+R」新幹線の時間を使って(東京~京都間)、パ ーサーを作ってみました! 静岡周辺東京駅発 (富士山が見える所)基本的にはBrainfuckの命令置換です。 Brainfuck命令 ICT+R命令 + ! - ? > C < R , T . + [ I ] .
  26. 26. プログラミング言語「ICT+R」 特徴「!ICT+R.」でプログラム がかける! ICT+R ! I C T + R . Brainfuck + [ > , . < ] ⇒ Echoプログラム直感的ではないため、脳トレに!

×