Squirrel

8,224 views

Published on

  • Be the first to comment

Squirrel

  1. 1. Squirrelと変人の神隠し
  2. 2. ・めるぽんについて
  3. 3. ・めるぽんについて ぽんぽん
  4. 4. ・めるぽんについて ぽんぽん めるめる
  5. 5. ・めるぽんについて ぽんぽん めるめる 猫好き
  6. 6. ・めるぽんについて ぽんぽん めるめる Twitter: melponn Blog: id:melpon 猫好き
  7. 7. ・タイトルについて
  8. 8. ・タイトルについて
  9. 9. ・タイトルについて Squirrelと変人の神隠し
  10. 10. ・Squirrelとは
  11. 11. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語
  12. 12. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語 Lua を強く意識して作られている
  13. 13. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語 Lua を強く意識して作られている Lua 知りません
  14. 14. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語 Lua を強く意識して作られている Lua 知りません スクイレル vs スクワール
  15. 15. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語 Lua を強く意識して作られている Lua 知りません スクイレル vs スクワール 英和: スクイレル Wikipedia: スクワール
  16. 16. ・Squirrelとは Alberto Demichelis が開発した組み込みスクリプト言語 Lua を強く意識して作られている Lua 知りません スクイレル vs スクワール 英和: スクイレル Wikipedia: スクワール →どっちでもいいっぽい
  17. 17. ・Squirrelの特徴
  18. 18. ・Squirrelの特徴 動的型付け
  19. 19. ・Squirrelの特徴 動的型付け 組み込み言語
  20. 20. ・Squirrelの特徴 動的型付け 組み込み言語 システム関数未使用 (fopen, fprintf 等)
  21. 21. ・Squirrelの特徴 動的型付け 組み込み言語 システム関数未使用 (fopen, fprintf 等) STL 未使用
  22. 22. ・Squirrelの特徴 動的型付け 組み込み言語 システム関数未使用 (fopen, fprintf 等) STL 未使用 malloc,free カスタマイズ可能 (sq_vm_malloc)
  23. 23. ・Squirrelの特徴 動的型付け 組み込み言語 システム関数未使用 (fopen, fprintf 等) STL 未使用 malloc,free カスタマイズ可能 (sq_vm_malloc) new 未使用 (placement new のみ)
  24. 24. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC
  25. 25. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する
  26. 26. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する M&S を切ることも可能 (NO_GARBAGE_COLLECTOR)
  27. 27. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する M&S を切ることも可能 (NO_GARBAGE_COLLECTOR) 循環参照したらアウト
  28. 28. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する M&S を切ることも可能 (NO_GARBAGE_COLLECTOR) 循環参照したらアウト weakref があるので結構頑張れる
  29. 29. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する M&S を切ることも可能 (NO_GARBAGE_COLLECTOR) 循環参照したらアウト weakref があるので結構頑張れる gc_collectgarbage の戻り値で回収された数が分かる
  30. 30. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC M&S は手動で gc_collectgarbage() する M&S を切ることも可能 (NO_GARBAGE_COLLECTOR) 循環参照したらアウト weakref があるので結構頑張れる gc_collectgarbage の戻り値で回収された数が分かる → デバッグ時のみ有効にして戻り値を監視する
  31. 31. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている
  32. 32. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている 約 10000 行
  33. 33. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている 約 10000 行 頑張れば読み下せる
  34. 34. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス
  35. 35. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス 昔は zlib/libpng ライセンス
  36. 36. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス 遅い
  37. 37. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス 遅い Lua の半分ぐらい (参考: Game Scripting Languages)
  38. 38. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス 遅い Lua の半分ぐらい (参考: Game Scripting Languages) Squirrel JIT → 行方不明
  39. 39. ・Squirrelの特徴 動的型付け 組み込み言語 参照カウント+マーク&スイープなGC C++ で書かれている MITライセンス 遅い VC6(仮想コンパイラ)でコンパイル可能
  40. 40. Squirrel Language
  41. 41. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  42. 42. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  43. 43. ・基本的な構文 local x;
  44. 44. ・基本的な構文 local x; x = 10;
  45. 45. ・基本的な構文 local x; x = 10; if (x == 10) { }
  46. 46. ・基本的な構文 local x; x = 10; if (x == 10) { } for (local i = 0; i < x; i++) { }
  47. 47. ・基本的な構文 local x; x = 10; if (x == 10) { } for (local i = 0; i < x; i++) { } local f = function(x) { return x + 10; }
  48. 48. ・基本的な構文 local x; x = 10; if (x == 10) { } for (local i = 0; i < x; i++) { } local f = function(x) { return x + 10; } local y = f(20); // y == 30
  49. 49. ・基本的な構文 local x; x = 10; if (x == 10) { } for (local i = 0; i < x; i++) { } local f = function(x) { return x + 10; } local y = f(20); // y == 30 local f2 = @(x) x + 10;
  50. 50. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  51. 51. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  52. 52. ・テーブル
  53. 53. ・テーブル キーから値を取り出すアレ
  54. 54. ・テーブル キーから値を取り出すアレ 要するに map<id, any>
  55. 55. ・テーブル キーから値を取り出すアレ 要するに map<id, any> 超重要
  56. 56. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  57. 57. ・基本的な構文 ・テーブル ・テーブルの作成 ・スロットの設定・破棄 ・テーブル委譲 ・キーの存在確認 ・浅いコピー ・メタメソッド
  58. 58. ・テーブルの作成 local a = b = [1] } x = { 10, function() { return 20; }, = 30,
  59. 59. ・テーブルの作成 local x = { a = 10, b = function() { return 20; }, [1] = 30, } print(x["a"]); // 10
  60. 60. ・テーブルの作成 local x = { a = 10, b = function() { return 20; }, [1] = 30, } print(x["a"]); // 10 print(x.a); // 10
  61. 61. ・テーブルの作成 local x = { a = 10, b = function() { return 20; }, [1] = 30, } print(x["a"]); // 10 print(x.a); // 10 print(x.b()); // 20
  62. 62. ・テーブルの作成 local x = { a = 10, b = function() { return 20; }, [1] = 30, } print(x["a"]); // 10 print(x.a); // 10 print(x.b()); // 20 print(x[1]); // 30
  63. 63. ・テーブルの作成 local x = { a = 10, b = function() { return 20; }, [1] = 30, } print(x["a"]); // 10 print(x.a); // 10 print(x.b()); // 20 print(x[1]); // 30 print(x.1); // エラー
  64. 64. ・基本的な構文 ・テーブル ・テーブルの作成 ・スロットの設定・破棄 ・テーブル委譲 ・キーの存在確認 ・浅いコピー ・メタメソッド
  65. 65. ・スロットの設定・破棄 local x = { }
  66. 66. ・スロットの設定・破棄 local x = { } x.v = 10; // エラー
  67. 67. ・スロットの設定・破棄 local x = { } x.v = 10; // エラー x.v <- 10; // OK
  68. 68. ・スロットの設定・破棄 local x = { } x.v = 10; // エラー x.v <- 10; // OK x.v = 10; // OK
  69. 69. ・スロットの設定・破棄 local x = { } x.v = 10; // エラー x.v <- 10; // OK x.v = 10; // OK delete x.v;
  70. 70. ・スロットの設定・破棄 local x = { } x.v = 10; // エラー x.v <- 10; // OK x.v = 10; // OK delete x.v; x.v = 10; // エラー
  71. 71. ・基本的な構文 ・テーブル ・テーブルの作成 ・スロットの設定・破棄 ・テーブル委譲 ・キーの存在確認 ・浅いコピー ・メタメソッド
  72. 72. ・テーブル委譲 local a = b = } local b = } x = { function() { return 10; }, function() { return 20; }, y = { function() { return 30; },
  73. 73. ・テーブル委譲 local x = { a = function() { return 10; }, b = function() { return 20; }, } local y = { b = function() { return 30; }, } y.setdelegate(x);
  74. 74. ・テーブル委譲 local x = { a = function() { return 10; }, b = function() { return 20; }, } local y = { b = function() { return 30; }, } y.setdelegate(x); print(y.a()); // 10
  75. 75. ・テーブル委譲 local x = { a = function() { return 10; }, b = function() { return 20; }, } local y = { b = function() { return 30; }, } y.setdelegate(x); print(y.a()); // 10 print(y.b()); // 30
  76. 76. ・基本的な構文 ・テーブル ・テーブルの作成 ・スロットの設定・破棄 ・テーブル委譲 ・キーの存在確認 ・浅いコピー ・メタメソッド
  77. 77. ・キーの存在確認 if ("v" in x) { } ・浅いコピー local x = { v = 10, }; local y = clone x;
  78. 78. ・基本的な構文 ・テーブル ・テーブルの作成 ・スロットの設定・破棄 ・テーブル委譲 ・キーの存在確認 ・浅いコピー ・メタメソッド
  79. 79. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm
  80. 80. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm local x = { v = 10, _add = function(rhs) { this.v + rhs; }, }
  81. 81. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm local x = { v = 10, _add = function(rhs) { this.v + rhs; }, } print(x + 10); // x._add(10)
  82. 82. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm ・_set, _get
  83. 83. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm ・_set, _get local x = { _get = function(key) { if (key == "hoge") return 10; throw null; } }
  84. 84. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm ・_set, _get local x = { _get = function(key) { if (key == "hoge") return 10; throw null; } } print(x.hoge); // x._get("hoge")
  85. 85. ・メタメソッド ・_add, _sub, _mul, _div, _modulo, _unm ・_set, _get local x = { _get = function(key) { if (key == "hoge") return 10; throw null; } } print(x.hoge); // x._get("hoge") x.hoge <- 20; print(x.hoge); // 20
  86. 86. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  87. 87. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  88. 88. ・クラス
  89. 89. ・クラス テーブルとほとんど同じ
  90. 90. ・クラス テーブルとほとんど同じ 無くても困らないけどあると便利
  91. 91. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  92. 92. ・基本的な構文 ・テーブル ・クラス ・クラス定義 ・継承 ・テーブルとの違い
  93. 93. ・基本的な構文 ・テーブル ・クラス ・クラス定義 ・継承 ・テーブルとの違い
  94. 94. ・クラス定義 class hoge { constructor() { } function foo() { } }
  95. 95. ・クラス定義 class hoge { constructor() { } function foo() { } } local h = hoge(); h.foo();
  96. 96. ・クラス定義 this.hoge <- class { constructor() { } function foo() { } } local h = hoge(); h.foo();
  97. 97. ・クラス定義 this.hoge <- class { constructor() { } foo <- function() { } } local h = hoge(); h.foo();
  98. 98. ・基本的な構文 ・テーブル ・クラス ・クラス定義 ・継承 ・テーブルとの違い
  99. 99. ・継承 ・テーブル版
  100. 100. ・継承 ・テーブル版 this.x <- { a = function() { return 10; }, b = function() { return 20; }, } this.y <- { b = function() { return 30; }, } y.setdelegate(x); print(y.a()); // 10 print(y.b()); // 30
  101. 101. ・継承 ・クラス版 class X { a <- function() { return 10; } b <- function() { return 20; } } class Y extends X { b <- function() { return 30; } } local y = Y(); print(y.a()); // 10 print(y.b()); // 30
  102. 102. ・継承 ・クラス版 class X { a <- function() { return 10; } b <- function() { return 20; } } class Y extends X { b <- function() { return 30; } } local y = Y(); print(y.a()); // 10 print(y.b()); // 30
  103. 103. ・基本的な構文 ・テーブル ・クラス ・クラス定義 ・継承 ・テーブルとの違い
  104. 104. ・テーブルとの違い クラス テーブル
  105. 105. ・テーブルとの違い クラス local x = X() テーブル
  106. 106. ・テーブルとの違い クラス local x = X() テーブル local x = clone X; x.constructor();
  107. 107. ・テーブルとの違い クラス local x = X() X は OT_CLASS x は OT_INSTANCE テーブル local x = clone X; x.constructor();
  108. 108. ・テーブルとの違い クラス テーブル local x = X() local x = clone X; x.constructor(); X は OT_CLASS X も x も OT_TABLE x は OT_INSTANCE
  109. 109. ・テーブルとの違い クラス テーブル local x = X() local x = clone X; x.constructor(); X は OT_CLASS X も x も OT_TABLE x は OT_INSTANCE if (x instanceof X) { }
  110. 110. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  111. 111. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  112. 112. ・ジェネレータ
  113. 113. ・ジェネレータ 要するにコルーチン
  114. 114. ・ジェネレータ 要するにコルーチン 関数の途中で中断→再開できる関数
  115. 115. ・ジェネレータ 要するにコルーチン 関数の途中で中断→再開できる関数 yield を使った function を作るとジェネレータになる
  116. 116. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } }
  117. 117. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } }
  118. 118. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } } local g = f(1,1); // まだ f は実行されない
  119. 119. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+",");
  120. 120. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,
  121. 121. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,1,
  122. 122. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,1,2,
  123. 123. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; // x=1, y=2 } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,1,2,
  124. 124. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; // x=1, y=2 } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,1,2,3,
  125. 125. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; // x=1, y=2 } } local g = f(1,1); // まだ f は実行されない foreach (x in g) print(x+","); // 1,1,2,3,5,8...
  126. 126. ・ジェネレータ(コルーチン) local f = function(x, y) { yield x; yield y; while (true) { local z = x + y; yield z; x = y; y = z; // x=1, y=2 } } local g = f(1,1); // まだ f は実行されない local x; while (x = resume g) print(x+","); // 1,1,2,3,5,8,...
  127. 127. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  128. 128. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  129. 129. ・配列
  130. 130. ・配列 local xs = [1,"2",@()3,4];
  131. 131. ・配列 local xs = [1,"2",function(){return 3;},4];
  132. 132. ・配列 local xs = [1,"2",@()3,4];
  133. 133. ・配列 local xs = [1,"2",@()3,4]; それテーブルでできるよ!
  134. 134. ・配列 local xs = [1,"2",@()3,4]; それテーブルでできるよ! local ys = { [0] = 1, [1] = "2", [2] = @()3, [3] = 4, }
  135. 135. ・配列 local xs = [1,"2",@()3,4]; それテーブルでできるよ! local ys = { [0] = 1, [1] = "2", [2] = @()3, [3] = 4, } テーブルより配列の方が高速
  136. 136. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  137. 137. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  138. 138. ・foreach テーブル・クラス foreach (value in array) { } foreach (key,value in array) { }
  139. 139. ・foreach テーブル・クラス 文字列 foreach (char in "hoge") { } foreach (index,char in "hoge") { }
  140. 140. ・foreach テーブル・クラス 文字列 配列 foreach (value in array) { } foreach (index,value in array) { }
  141. 141. ・foreach テーブル・クラス 文字列 配列 ジェネレータ foreach (value in gen) { }
  142. 142. ・foreach テーブル・クラス 文字列 配列 ジェネレータ _nexti メタメソッド
  143. 143. ・foreach _nexti メタメソッド class X { _nexti = function(v) { return v == null ? 0 : v+1; } } local x = X(); foreach (v in x) { }
  144. 144. ・foreach テーブル・クラス 文字列 配列 ジェネレータ _nexti メタメソッド
  145. 145. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  146. 146. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  147. 147. ・束縛
  148. 148. ・束縛 local x = 10; local f = function(y) { return x + y; }
  149. 149. ・束縛 local x = 10; local f = function(y) { return x + y; }
  150. 150. ・束縛 local x = 10; local f = function(y) { return x + y; } // x を束縛
  151. 151. ・束縛 local x = 10; local f = function(y) { return x + y; } // x を束縛 f(20); // 30
  152. 152. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, }
  153. 153. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); } }
  154. 154. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); } } y.apply(x.foo);
  155. 155. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // エラー(hoge が見つからない) } } y.apply(x.foo);
  156. 156. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // x.f(20); × } } y.apply(x.foo);
  157. 157. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // this.f(20); } } y.apply(x.foo);
  158. 158. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // エラー(hoge が見つからない) } } y.apply(x.foo);
  159. 159. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // エラー(hoge が見つからない) } } y.apply(x.foo); →this を勝手に束縛しない
  160. 160. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); } } y.apply(x.foo.bindenv(x));
  161. 161. ・束縛 local x = { hoge = 10, foo = function(fuga) { return hoge + fuga; }, } local y = { apply = function(f) { f(20); // x.f(20); } } y.apply(x.foo.bindenv(x));
  162. 162. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛
  163. 163. ・基本的な構文 ・テーブル ・クラス ・ジェネレータ ・配列 ・foreach ・束縛 ・標準ライブラリ
  164. 164. ・標準ライブラリ
  165. 165. ・標準ライブラリ Squirrel本体とは別プロジェクト
  166. 166. ・標準ライブラリ Squirrel本体とは別プロジェクト 時間の取得
  167. 167. ・標準ライブラリ Squirrel本体とは別プロジェクト 時間の取得 I/O
  168. 168. ・標準ライブラリ Squirrel本体とは別プロジェクト 時間の取得 I/O 数学関数
  169. 169. ・標準ライブラリ Squirrel本体とは別プロジェクト 時間の取得 I/O 数学関数 正規表現
  170. 170. ・標準ライブラリ Squirrel本体とは別プロジェクト 時間の取得 I/O 数学関数 正規表現 →C標準関数を使用
  171. 171. 組み込み
  172. 172. ・実行環境
  173. 173. ・実行環境 仮想マシン(SquirrelVM)上で動作する
  174. 174. ・実行環境 仮想マシン(SquirrelVM)上で動作する 各命令は 64bit 固定
  175. 175. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換
  176. 176. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う
  177. 177. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う Squirrelソース local x=10; y <- function(){} ...
  178. 178. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う Squirrelソース local x=10; compile y <- function(){} ...
  179. 179. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う Squirrelソース local x=10; compile _OP_ADD _OP_JMP y <- function(){} _OP_CALL ... ...
  180. 180. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う Squirrelソース local x=10; compile _OP_ADD run _OP_JMP y <- function(){} _OP_CALL ... ... SquirrelVM
  181. 181. ・実行環境 仮想マシン(SquirrelVM)上で動作する Squirrel ソースをコンパイル→VM 用命令に変換 C++とのインターフェースにはスタックを使う Squirrelソース local x=10; compile _OP_ADD run _OP_JMP y <- function(){} _OP_CALL ... ... SquirrelVM C++ VMスタック OT_BOOL OT_TABLE OT_ARRAY ...
  182. 182. ・sq_call SquirrelVM C++ VMスタック
  183. 183. ・sq_call SquirrelVM C++ sq_compile VMスタック OT_CLOSURE
  184. 184. ・sq_call SquirrelVM C++ sq_pushroottable VMスタック OT_CLOSURE OT_TABLE
  185. 185. ・sq_call SquirrelVM C++ sq_pushinteger VMスタック OT_CLOSURE OT_TABLE OT_INTEGER
  186. 186. ・sq_call SquirrelVM C++ sq_call(vm, 2, SQTrue, SQFalse); VMスタック OT_CLOSURE OT_TABLE OT_INTEGER
  187. 187. ・sq_call 引数の数 SquirrelVM C++ sq_call(vm, 2, SQTrue, SQFalse); VMスタック OT_CLOSURE OT_TABLE OT_INTEGER
  188. 188. ・sq_call 戻り値の有無 SquirrelVM C++ sq_call(vm, 2, SQTrue, SQFalse); VMスタック OT_CLOSURE OT_TABLE OT_INTEGER
  189. 189. ・sq_call エラーハンドリングの有無 SquirrelVM C++ sq_call(vm, 2, SQTrue, SQFalse); VMスタック OT_CLOSURE OT_TABLE OT_INTEGER
  190. 190. ・sq_call SquirrelVM C++ VMスタック OT_CLOSURE OT_INSTANCE
  191. 191. ・sq_call SquirrelVM C++ sq_pop(vm, 2); VMスタック OT_CLOSURE OT_INSTANCE
  192. 192. ・sq_call SquirrelVM C++ VMスタック
  193. 193. ・sq_call SquirrelVM C++ VMスタック →めんどい
  194. 194. ・組み込み // Squirrel 実行環境作成 SQUIRRELVM vm = sq_open(1024);
  195. 195. ・組み込み // Squirrel 実行環境作成 SQUIRRELVM vm = sq_open(1024); // print 用の関数を登録 sq_setprintfunc(vm, &print_func, &error_print_func);
  196. 196. ・組み込み // Squirrel 実行環境作成 SQUIRRELVM vm = sq_open(1024); // print 用の関数を登録 sq_setprintfunc(vm, &print_func, &error_print_func); // コンパイルエラー用の関数を登録 sq_setcompilererrorhandler(vm_, &compiler_error_func);
  197. 197. ・組み込み // Squirrel 実行環境作成 SQUIRRELVM vm = sq_open(1024); // print 用の関数を登録 sq_setprintfunc(vm, &print_func, &error_print_func); // コンパイルエラー用の関数を登録 sq_setcompilererrorhandler(vm_, &compiler_error_func); // 実行時エラー用の関数を登録 sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm);
  198. 198. ・組み込み // Squirrel 実行環境作成 SQUIRRELVM vm = sq_open(1024); // print 用の関数を登録 sq_setprintfunc(vm, &print_func, &error_print_func); // コンパイルエラー用の関数を登録 sq_setcompilererrorhandler(vm_, &compiler_error_func); // 実行時エラー用の関数を登録 sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb");
  199. 199. ・組み込み // print 用の関数を登録 sq_setprintfunc(vm, &print_func, &error_print_func); // コンパイルエラー用の関数を登録 sq_setcompilererrorhandler(vm_, &compiler_error_func); // 実行時エラー用の関数を登録 sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue);
  200. 200. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); SQInteger file_reader(SQUserPointer file) { char c = 0; std::fread(&c,sizeof(c),1,static_cast<FILE*>(file)); return c; } // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue);
  201. 201. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue); OT_CLOSURE
  202. 202. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue); // this を push OT_CLOSURE sq_pushroottable(vm); OT_TABLE
  203. 203. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue); // this を push して呼び出し OT_CLOSURE sq_pushroottable(vm); sq_call(vm, 1, SQFalse, SQTrue);
  204. 204. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue); // this を push して呼び出し sq_pushroottable(vm); sq_call(vm, 1, SQFalse, SQTrue); // 後片付け sq_pop(vm, 1);
  205. 205. ・組み込み sq_newclosure(vm, &error_func, 0); sq_seterrorhandler(vm); FILE* fp = std::fopen("main.nut", "rb"); // コンパイル sq_compile(vm, &file_reader, fp, "main.nut", SQTrue); // this を push して呼び出し sq_pushroottable(vm); sq_call(vm, 1, SQFalse, SQTrue); // 後片付け sq_pop(vm, 1); // VM 終了 sq_close(vm);
  206. 206. ・C++ → Squirrel 関数の呼び出し
  207. 207. ・C++ → Squirrel 関数の呼び出し →めんどい
  208. 208. ・C++ → Squirrel 関数の呼び出し →めんどい ・Squirrel → C++ 関数の呼び出し
  209. 209. ・C++ → Squirrel 関数の呼び出し →めんどい ・Squirrel → C++ 関数の呼び出し SQInteger func(HSQUIRRELVM vm) { SQInteger v; // 引数 sq_getinteger(vm, -2, &v); ... } sq_newclosure(vm, &func, 0); sq_newslot(vm, ...);
  210. 210. ・C++ → Squirrel 関数の呼び出し →めんどい ・Squirrel → C++ 関数の呼び出し →めんどい
  211. 211. ・C++ → Squirrel 関数の呼び出し →めんどい ・Squirrel → C++ 関数の呼び出し →めんどい ・バインダを使おう
  212. 212. ・バインダ
  213. 213. ・バインダ class image { void load(const char* str); int width() const; int height() const; };
  214. 214. ・バインダ class image { void load(const char* str); int width() const; int height() const; }; root.Bind("image", Sqrat::Class<image>(vm) .Func("load", &image::load) .Func("width", &image::width) .Func("height", &image::height));
  215. 215. ・バインダ Sqrat
  216. 216. ・バインダ Sqrat SqPlus
  217. 217. ・バインダ Sqrat SqPlus Squadd
  218. 218. ・バインダ Sqrat SqPlus Squadd jkBind
  219. 219. ・バインダ Sqrat SqPlus Squadd jkBind lazuli
  220. 220. ・適当に作ってみた
  221. 221. ・適当に作ってみた 結論:
  222. 222. ・適当に作ってみた 結論: 既存ライブラリはバインダを使ってもめんどい
  223. 223. ・適当に作ってみた 結論: 既存ライブラリはバインダを使ってもめんどい 自作クラスならすごく幸せになれる
  224. 224. ・デバッガ
  225. 225. ・デバッガ SQDBG
  226. 226. ・デバッガ SQDBG SQDEV
  227. 227. ・デバッガ SQDBG SQDEV Visual Studio Integration
  228. 228. ・デバッガ SQDBG SQDEV Visual Studio Integration 使うと楽に開発できる
  229. 229. ・デバッガ SQDBG SQDEV Visual Studio Integration 使うと楽に開発できる しかしデバッガ自体に問題があることも
  230. 230. SQDEV (Eclipse) or VS Integration program SQDBG
  231. 231. program SQDEV (Eclipse) or VS Integration SQDBG
  232. 232. program SQDEV (Eclipse) or VS Integration SQDBG sq_rdbg_waitforconnection
  233. 233. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection
  234. 234. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) ab 10 main.nut sq_rdbg_waitforconnection
  235. 235. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut")
  236. 236. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") debughook('l',10,"main.nut")
  237. 237. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") <break line="10" src="main.nut" ...> ... </break> debughook('l',10,"main.nut")
  238. 238. program SQDEV (Eclipse) or VS Integration SQDBG sq_rdbg_waitforconnection <break line="10" src="main.nut" type="breakpoint"> connect (port:1234) <objs> <o type="x" ref="2"> <e kt="s" kv="ratio" vt="f" v="0.00208333"/> ab 10 main.nut <e kt="s" kv="gen_" vt="g" v="g"/> debughook('l',9,"main.nut") <e kt="s" kv="rratio" vt="i" v="480"/> </o> <o type="x" ref="1"> debughook('l',10,"main.nut") <e kt="s" kv="scene" vt="x" v="2"/> </o> <o type="a" ref="3"/> <o type="r" ref="0"/> </objs> <calls> <call fnc="unknown" src="sqript/main.nut" line="16"> <l name="this" type="x" val="1"/> </call> <call fnc="main" src="eval" line="1"> <l name="vargv" type="a" val="3"/> <l name="this" type="t" val="0"/> </call> </calls> </break>
  239. 239. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") <break line="10" src="main.nut" ...> ... </break> debughook('l',10,"main.nut")
  240. 240. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") <break line="10" src="main.nut" ...> ... </break> so debughook('l',10,"main.nut")
  241. 241. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") <break line="10" src="main.nut" ...> ... </break> debughook('l',10,"main.nut") so debughook('l',11,"main.nut")
  242. 242. program SQDEV (Eclipse) or VS Integration SQDBG connect (port:1234) sq_rdbg_waitforconnection ab 10 main.nut debughook('l',9,"main.nut") <break line="10" src="main.nut" ...> ... </break> debughook('l',10,"main.nut") so debughook('l',11,"main.nut") <break ...>...</break>
  243. 243. ・終わりに
  244. 244. ・終わりに Squirrel を使うにあたっての心構え
  245. 245. ・終わりに Squirrel を使うにあたっての心構え ・バグが起きても言語を信じろ
  246. 246. ・終わりに Squirrel を使うにあたっての心構え ・バグが起きても言語を信じろ ・デバッガがおかしくなったら自分で直せ
  247. 247. ・終わりに Squirrel を使うにあたっての心構え ・バグが起きても言語を信じろ ・デバッガがおかしくなったら自分で直せ ・どんな困難に遭遇しても挫けるな
  248. 248. ・終わりに Squirrel を使うにあたっての心構え ・バグが起きても言語を信じろ ・デバッガがおかしくなったら自分で直せ ・どんな困難に遭遇しても挫けるな ・めるめるかわいい
  249. 249. おわり

×