SlideShare a Scribd company logo
VBCPP
    (ぶいびーしーぷらすぷらす)




(slideshare用の修正版)
はじめに
鈴木さんと一緒に「HTML5で音ゲー」企
 画を進めています。(去年の10月頃~)
   譜面制作用のエデゖタ、”dosStudio”
  を制作しています!



  HTML5Step公式サ゗ト:
  http://html5step.bonprosoft.com/
VBCPPとは
 パーサーをプラグ゗ンとして追加することで、
  対応できる言語を増やすことができるコンパ゗
  ラ(のようなもの)
 VBCPPが定義する抽象構文木を利用し、パーサ
  ーから返ってきたデータを一括管理することで
  、他の言語で書いた関数、変数、クラス他を利
  用することもできる
 .NETを参照できる為、ラ゗ブラリは豊富!
もうちょっと具体的にわかりやすく…



ゕニメーションを
 使った説明が
  あります
 普通のコンパ゗ラ   VBCPP
もう少し詳しく…



ゕニメーションを
 AST構築   AST修正   バイナリ生成




 使った説明が
  あります
制作のきっかけ
「この部分を他の言語で記述できたらど
 うなるのだろう…」という好奇心!
DSLとかを混ぜることができると楽そう!
 言語だってプラグ゗ンにすれば面白そう!
プラグ゗ンなら1人ですべての言語を制
 作する必要もないため、楽!(共有できる)
もっと気軽に言語処理系を作りたい!
VBCPPの4つの特徴
複数の言語間でデータをやり取りできる

.NET Frameworkを参照できる

   名前変換テーブル/ラ゗ブラリ機能によって、よりオリジ
    ナルの操作感に近づけることができる


   2つの型決定方法によりパーサーの負担を減らすことができる
VBCPPの特徴(1)
パーサーから受け取ったデータをVBCPP
 が一括管理する
  →他の言語で書いたクラスや変数、関
   数を利用することができます
   ex.) VBとC#で共同FizzBuzz等
       (お互いが順番にデータを処理し
        ていく、等)
VBCPPの特徴(2)
.NET Frameworkを参照できる
   →ストリーム操作(ex.StreamReader)
    からフゔ゗ル入出力ダ゗ゕログ
    (ex.OpenFileDialog)まで使用するこ
    とができるため、より高度なゕプリケ
    ーションを作成することができます。
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”);
 }
VBCPPの特徴(4)
2つの型決定システムがあり、パーサー
 の決定を尊重することができる
             • 抽象構文木に名前のみを
   プラグインが      指定し、実行時にVBCPP
  型決定を行わない     が自動評価します。



             • 抽象構文木に型を指定し、
   プラグインが      実行時にはそのままその
   型決定を行う      型が採用されます。

  →パーサーが必要に応じて、IntegerやString等のデータ
    型の確定を行うことができます
  (もちろんVBCPPに任せることもできます)
VBCPPの使い方
 VBCPPのバ゗ナリ生成方法は以下の3通り
 1. VBCPP標準ビルダを使用してコマンドプロンプト等
    から利用する方法
 2. あるプログラムからGenerator(Core内)をロードし
    、ASTを渡す方法
 3. あるプログラムからCompiler(Core内)をロードし
    、プラグ゗ンの゗ンスタンスとコードを渡す方法
     (2と3はVBCPP標準ビルダの文法に縛られる必要もありません。)
  &&entry = “エントリポイント名"
  &&<code language=“言語名“ methodName=“関数名(必要なら)”>
   ~~コード部分~~
  &&</code>


 <参考:VBCPP標準ビルダの構文>
VBCPPの使い方(2)
そのまま使う。
     VBCPP.exeをそのまま実行します。
  ソースコードの識別にはVBCPP標準ビルダ用の構文
  を使用します。

  &&entry = “エントリポイント名"
  &&<code language=“言語名“ methodName=“関数名(必要なら)”>
   ~~コード部分~~
  &&</code>


 VBCPP標準ビルダの構文
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コードを標準ビルダの構文によって関数化している
VBCPPの使い方(3)
  自作言語のバ゗ナリ生成ラ゗ブラリとし
   て使う。
          VBCPP Coreをロードし、自作言語のパーサーで
         生成したASTをジェネレータに直接渡すことで、バ
         ゗ナリを生成することができます。

                 • コードを解析する
                  • ASTを構築する

自作コンパ゗ラ
                         直接ASTを渡す

             •   ASTを元にバ゗ナリを生成

Generator(VBCPP Core内)
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)
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, …
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)
VBCPPの使い方(4)-2
1文ASTプログラミング        ~FizzBuzz~
  所要時間: 1時間30分程度
  IntelliSenseが途中からおかしくなる
  1つ間違えると、他にまで影響する→高度な集中力
  82行にも及ぶ、1文
  (本当はもっと省略できますが…)

  動いた時の感動!
  疲れました。
よくありそうな質問
Q. 簡単なプログラムのAST式を書くのがこんなに
大変だったら、パーサー作成は相当大変かと思う
のですが…


A.   (必ずしも)   そんなことはありません!
 VBCPPのAST式は冗長ではありますが、それぞれ
が独立して存在することができるため、
パーツを組み合わせるようにして、木を構築す
ることができます。
よくありそうな質問(2)
SimpleVBParserの例




(語句解析部分を省略して、Reduction部分の一部のみを表示しています)
VBCPPの今後
 ゗ベントやデリゲート等の対応
 名前変換テーブルの改善(引数等の対応付け)
 さらにプラグ゗ン製作者の負担が減るよう(表
 現が楽になるよう)ASTのパターンを追加
 抽象構文木の対話型による生成&ビルド
VBCPPの今後(2)
プラグ゗ンを充実させて、”より実用的な”
 環境を
作成したプラグ゗ンみんなで共有しあえ
 る環境を (プラグ゗ンの共有サ゗トとか)
まとめ
言語処理系は楽しい!(奥が深い!)
 プラグ゗ンを書くだけで、手軽にバ゗ナリが
  動く喜びを感じられる!
 プラグ゗ンを制作することで、慣れ親しんだ
  言語と向き合えることもできる!
 言語特有の特徴/表現を、いかに工夫して統一
  された木に表現する(一般化する)か、プラグ
  ゗ン製作者の力試しにもなる!
プログラミング言語「ICT+R」
新幹線の時間を使って(東京~京都間)、パ
 ーサーを作ってみました!
                           静岡周辺
東京駅発                       (富士山が見える所)

基本的にはBrainfuckの命令置換です。
   Brainfuck命令   ICT+R命令
   +             !
   -             ?
   >             C
   <             R
   ,             T
   .             +
   [             I
   ]             .
プログラミング言語「ICT+R」 特徴

「!ICT+R.」でプログラム
 がかける!
 ICT+R       !   I   C   T   +   R   .

 Brainfuck   +   [   >   ,   .   <   ]

    ⇒ Echoプログラム
直感的ではないため、脳トレに!
VBCPP - ICT+R 2012

More Related Content

What's hot

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
Atsuo Ishimoto
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
ina job
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
Rui Hirokawa
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To Clojure
Kent Ohashi
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
 
Erlangご紹介 websocket編
Erlangご紹介 websocket編Erlangご紹介 websocket編
Erlangご紹介 websocket編
Masatoshi Itoh
 
Functional Way
Functional WayFunctional Way
Functional Way
Kent Ohashi
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
Kent Ohashi
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
Kota Mizushima
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
Yuto Matsukubo
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】株式会社ランチェスター
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
 

What's hot (20)

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To Clojure
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
Erlangご紹介 websocket編
Erlangご紹介 websocket編Erlangご紹介 websocket編
Erlangご紹介 websocket編
 
Functional Way
Functional WayFunctional Way
Functional Way
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 

Viewers also liked

君も今日からWebMatrixMan(仮)
君も今日からWebMatrixMan(仮)君も今日からWebMatrixMan(仮)
君も今日からWebMatrixMan(仮)
Yuki Igarashi
 
//publish/ MSPTutorial 応用編
//publish/ MSPTutorial 応用編//publish/ MSPTutorial 応用編
//publish/ MSPTutorial 応用編
Yuki Igarashi
 
EXTREME AZURE 2
EXTREME AZURE 2EXTREME AZURE 2
EXTREME AZURE 2
Yuki Igarashi
 
Introduction to VSCode
Introduction to VSCodeIntroduction to VSCode
Introduction to VSCode
Yuki Igarashi
 
Visual Studio付きWindowsインスタンスの利用方法
Visual Studio付きWindowsインスタンスの利用方法Visual Studio付きWindowsインスタンスの利用方法
Visual Studio付きWindowsインスタンスの利用方法
Yuki Igarashi
 
Kinect v2を通してMicrosoft技術を考える
Kinect v2を通してMicrosoft技術を考えるKinect v2を通してMicrosoft技術を考える
Kinect v2を通してMicrosoft技術を考える
Yuki Igarashi
 
論文紹介:The wavelet matrix
論文紹介:The wavelet matrix論文紹介:The wavelet matrix
論文紹介:The wavelet matrix
Yuki Igarashi
 
続・Kinect v2を通してMicrosoft技術を考える
続・Kinect v2を通してMicrosoft技術を考える続・Kinect v2を通してMicrosoft技術を考える
続・Kinect v2を通してMicrosoft技術を考える
Yuki Igarashi
 
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
Toshinori Sato
 
Visual Studio 拡張機能の作り方
Visual Studio 拡張機能の作り方Visual Studio 拡張機能の作り方
Visual Studio 拡張機能の作り方
Yuki Igarashi
 
大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと
Toshinori Sato
 
Microsoft Azure 概要
Microsoft Azure 概要Microsoft Azure 概要
Microsoft Azure 概要
Yuki Igarashi
 
Azure MLで何かやる
Azure MLで何かやるAzure MLで何かやる
Azure MLで何かやる
Yuki Igarashi
 
それっぽく感じる機械学習
それっぽく感じる機械学習それっぽく感じる機械学習
それっぽく感じる機械学習
Yuki Igarashi
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
Yuki Igarashi
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
SlideShare
 

Viewers also liked (17)

君も今日からWebMatrixMan(仮)
君も今日からWebMatrixMan(仮)君も今日からWebMatrixMan(仮)
君も今日からWebMatrixMan(仮)
 
//publish/ MSPTutorial 応用編
//publish/ MSPTutorial 応用編//publish/ MSPTutorial 応用編
//publish/ MSPTutorial 応用編
 
EXTREME AZURE 2
EXTREME AZURE 2EXTREME AZURE 2
EXTREME AZURE 2
 
Introduction to VSCode
Introduction to VSCodeIntroduction to VSCode
Introduction to VSCode
 
Visual Studio付きWindowsインスタンスの利用方法
Visual Studio付きWindowsインスタンスの利用方法Visual Studio付きWindowsインスタンスの利用方法
Visual Studio付きWindowsインスタンスの利用方法
 
Kinect v2を通してMicrosoft技術を考える
Kinect v2を通してMicrosoft技術を考えるKinect v2を通してMicrosoft技術を考える
Kinect v2を通してMicrosoft技術を考える
 
論文紹介:The wavelet matrix
論文紹介:The wavelet matrix論文紹介:The wavelet matrix
論文紹介:The wavelet matrix
 
続・Kinect v2を通してMicrosoft技術を考える
続・Kinect v2を通してMicrosoft技術を考える続・Kinect v2を通してMicrosoft技術を考える
続・Kinect v2を通してMicrosoft技術を考える
 
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
🍻(Beer Mug)の読み方を考える(mecab-ipadic-NEologdのUnicode 絵文字対応)
 
Visual Studio 拡張機能の作り方
Visual Studio 拡張機能の作り方Visual Studio 拡張機能の作り方
Visual Studio 拡張機能の作り方
 
大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと
 
Microsoft Azure 概要
Microsoft Azure 概要Microsoft Azure 概要
Microsoft Azure 概要
 
Azure MLで何かやる
Azure MLで何かやるAzure MLで何かやる
Azure MLで何かやる
 
それっぽく感じる機械学習
それっぽく感じる機械学習それっぽく感じる機械学習
それっぽく感じる機械学習
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Similar to VBCPP - ICT+R 2012

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
kamukiriri
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
Noboru Irieda
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
Yu Nobuoka
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
Tomoya Nakayama
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Noritada Shimizu
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
Shinichi Kozake
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
Shinsuke Sugaya
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 
Elmでjavascript
ElmでjavascriptElmでjavascript
Elmでjavascript
karky7
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
コードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレートコードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレート
Akira Maruyama
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
Koichi Fujikawa
 

Similar to VBCPP - ICT+R 2012 (20)

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
Elmでjavascript
ElmでjavascriptElmでjavascript
Elmでjavascript
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
コードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレートコードビュー中心で開発するDreamweaverテンプレート
コードビュー中心で開発するDreamweaverテンプレート
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
 

Recently uploaded

TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 

Recently uploaded (15)

TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 

VBCPP - ICT+R 2012

  • 1. VBCPP (ぶいびーしーぷらすぷらす) (slideshare用の修正版)
  • 2. はじめに 鈴木さんと一緒に「HTML5で音ゲー」企 画を進めています。(去年の10月頃~) 譜面制作用のエデゖタ、”dosStudio” を制作しています! HTML5Step公式サ゗ト: http://html5step.bonprosoft.com/
  • 3. VBCPPとは  パーサーをプラグ゗ンとして追加することで、 対応できる言語を増やすことができるコンパ゗ ラ(のようなもの)  VBCPPが定義する抽象構文木を利用し、パーサ ーから返ってきたデータを一括管理することで 、他の言語で書いた関数、変数、クラス他を利 用することもできる  .NETを参照できる為、ラ゗ブラリは豊富!
  • 5. もう少し詳しく… ゕニメーションを AST構築 AST修正 バイナリ生成 使った説明が あります
  • 7. VBCPPの4つの特徴 複数の言語間でデータをやり取りできる .NET Frameworkを参照できる  名前変換テーブル/ラ゗ブラリ機能によって、よりオリジ ナルの操作感に近づけることができる  2つの型決定方法によりパーサーの負担を減らすことができる
  • 8. VBCPPの特徴(1) パーサーから受け取ったデータをVBCPP が一括管理する →他の言語で書いたクラスや変数、関 数を利用することができます ex.) VBとC#で共同FizzBuzz等 (お互いが順番にデータを処理し ていく、等)
  • 9. VBCPPの特徴(2) .NET Frameworkを参照できる →ストリーム操作(ex.StreamReader) からフゔ゗ル入出力ダ゗ゕログ (ex.OpenFileDialog)まで使用するこ とができるため、より高度なゕプリケ ーションを作成することができます。
  • 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. VBCPPの特徴(4) 2つの型決定システムがあり、パーサー の決定を尊重することができる • 抽象構文木に名前のみを プラグインが 指定し、実行時にVBCPP 型決定を行わない が自動評価します。 • 抽象構文木に型を指定し、 プラグインが 実行時にはそのままその 型決定を行う 型が採用されます。 →パーサーが必要に応じて、IntegerやString等のデータ 型の確定を行うことができます (もちろんVBCPPに任せることもできます)
  • 12. VBCPPの使い方  VBCPPのバ゗ナリ生成方法は以下の3通り 1. VBCPP標準ビルダを使用してコマンドプロンプト等 から利用する方法 2. あるプログラムからGenerator(Core内)をロードし 、ASTを渡す方法 3. あるプログラムからCompiler(Core内)をロードし 、プラグ゗ンの゗ンスタンスとコードを渡す方法 (2と3はVBCPP標準ビルダの文法に縛られる必要もありません。) &&entry = “エントリポイント名" &&<code language=“言語名“ methodName=“関数名(必要なら)”> ~~コード部分~~ &&</code> <参考:VBCPP標準ビルダの構文>
  • 13. VBCPPの使い方(2) そのまま使う。 VBCPP.exeをそのまま実行します。 ソースコードの識別にはVBCPP標準ビルダ用の構文 を使用します。 &&entry = “エントリポイント名" &&<code language=“言語名“ methodName=“関数名(必要なら)”> ~~コード部分~~ &&</code> VBCPP標準ビルダの構文
  • 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. VBCPPの使い方(3) 自作言語のバ゗ナリ生成ラ゗ブラリとし て使う。 VBCPP Coreをロードし、自作言語のパーサーで 生成したASTをジェネレータに直接渡すことで、バ ゗ナリを生成することができます。 • コードを解析する • ASTを構築する 自作コンパ゗ラ 直接ASTを渡す • ASTを元にバ゗ナリを生成 Generator(VBCPP Core内)
  • 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. 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. 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. VBCPPの使い方(4)-2 1文ASTプログラミング ~FizzBuzz~  所要時間: 1時間30分程度  IntelliSenseが途中からおかしくなる  1つ間違えると、他にまで影響する→高度な集中力  82行にも及ぶ、1文 (本当はもっと省略できますが…)  動いた時の感動!  疲れました。
  • 20. よくありそうな質問 Q. 簡単なプログラムのAST式を書くのがこんなに 大変だったら、パーサー作成は相当大変かと思う のですが… A. (必ずしも) そんなことはありません! VBCPPのAST式は冗長ではありますが、それぞれ が独立して存在することができるため、 パーツを組み合わせるようにして、木を構築す ることができます。
  • 22. VBCPPの今後  ゗ベントやデリゲート等の対応  名前変換テーブルの改善(引数等の対応付け)  さらにプラグ゗ン製作者の負担が減るよう(表 現が楽になるよう)ASTのパターンを追加  抽象構文木の対話型による生成&ビルド
  • 24. まとめ 言語処理系は楽しい!(奥が深い!) プラグ゗ンを書くだけで、手軽にバ゗ナリが 動く喜びを感じられる! プラグ゗ンを制作することで、慣れ親しんだ 言語と向き合えることもできる! 言語特有の特徴/表現を、いかに工夫して統一 された木に表現する(一般化する)か、プラグ ゗ン製作者の力試しにもなる!
  • 25. プログラミング言語「ICT+R」 新幹線の時間を使って(東京~京都間)、パ ーサーを作ってみました! 静岡周辺 東京駅発 (富士山が見える所) 基本的にはBrainfuckの命令置換です。 Brainfuck命令 ICT+R命令 + ! - ? > C < R , T . + [ I ] .
  • 26. プログラミング言語「ICT+R」 特徴 「!ICT+R.」でプログラム がかける! ICT+R ! I C T + R . Brainfuck + [ > , . < ] ⇒ Echoプログラム 直感的ではないため、脳トレに!