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.
Upcoming SlideShare
Introduction to VSCode
Next
Download to read offline and view in fullscreen.

0

Share

VBCPP - ICT+R 2012

Download to read offline

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

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • 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(“Let's 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 出力例) Next 1, 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プログラム 直感的ではないため、脳トレに!

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

Views

Total views

1,656

On Slideshare

0

From embeds

0

Number of embeds

235

Actions

Downloads

2

Shares

0

Comments

0

Likes

0

×