1 00:00:00,440 --> 00:00:01,520 みなさん こんにちは。 2 00:00:01,680 --> 00:00:06,040 このクラスでは 3 00:00:06,200 --> 00:00:11,880 Pharo を別の OOP 言語である Java と 対比します。 4 00:00:12,520 --> 00:00:16,040 Pharo では オブジェクトのみを操作します。 5 00:00:16,200 --> 00:00:20,200 メッセージと 6 00:00:20,360 --> 00:00:22,640 変数への代入だけを行います。 7 00:00:23,280 --> 00:00:27,440 これからお見せするスライドでは Java と Pharo の等価なものをいくつか見せします。 8 00:00:27,600 --> 00:00:30,720 そこから違いと類似点を理解していただきます。 9 00:00:30,880 --> 00:00:32,360 そこでは 10 00:00:33,080 --> 00:00:35,840 Java で文字列を格納したコレクションを 11 00:00:36,000 --> 00:00:38,840 つくります。 12 00:00:39,000 --> 00:00:43,560 このコレクションは stringsと呼ばれる変数に代入されます。 13 00:00:44,920 --> 00:00:46,560 Pharo も同じです。 14 00:00:46,720 --> 00:00:49,240 コレクションを管理するクラスは 15 00:00:49,400 --> 00:00:52,120 OrderedCollection と呼ばれるもので ArrayList ではありません。 16 00:00:52,280 --> 00:00:54,240 しかし振る舞いは同じです。 17 00:00:54,400 --> 00:00:56,640 幾つか気付くべき点を挙げます。 18 00:00:57,560 --> 00:01:02,960 第1に Pharo では new はクラスに送られるメッセージです。 19 00:01:03,120 --> 00:01:06,280 new メッセージが OrderedCollection クラスに送られ 20 00:01:06,440 --> 00:01:09,000 そのコレクションの 新しいインスタンスが生成されます。 21 00:01:09,160 --> 00:01:11,440 Java では先に new が現れます。 22 00:01:11,600 --> 00:01:14,320 この構文は Java での 23 00:01:15,280 --> 00:01:18,360 オブジェクト生成に特有のものです。 24 00:01:18,520 --> 00:01:21,640 一方で Pharo では 標準的なメッセージ送信で行われます。 25 00:01:22,920 --> 00:01:26,960 Pharo には静的型付けがありません。 26 00:01:27,120 --> 00:01:31,840 Java で必要とされる多くのことが Pharo では使われません。 27 00:01:32,000 --> 00:01:36,280 コレクションが格納するのが文字列であることを 指定する必要はありません。 28 00:01:36,440 --> 00:01:40,360 そして strings はコレクションではありません。 29 00:01:41,120 --> 00:01:46,480 もう1つ等価な式があります。 子プロセスの生成です。 30 00:01:47,080 --> 00:01:50,960 このコード片を別のプロセスで 31 00:01:51,120 --> 00:01:52,720 実行します。 32 00:01:52,880 --> 00:01:56,000 Java では Thread クラスの新しいインスタンスを 33 00:01:56,160 --> 00:01:59,400 生成する必要があります。 34 00:01:59,560 --> 00:02:01,920 Runnable()を引数として与えて。 35 00:02:02,760 --> 00:02:04,680 new Runnable()と書きます。 36 00:02:04,840 --> 00:02:09,960 Runnable() は抽象クラスなので 未実装のメソッドを定義しなければなりません。 37 00:02:10,800 --> 00:02:13,160 このメソッドは run() と呼ばれます。 38 00:02:13,320 --> 00:02:17,440 そのメソッドが 子プロセスとして実行したいコードを保持します。 39 00:02:17,600 --> 00:02:19,640 this.doSomething() です。 40 00:02:20,960 --> 00:02:25,520 doSomething メソッドはそのコードと 41 00:02:25,680 --> 00:02:27,680 同じクラスに属します。 42 00:02:28,400 --> 00:02:31,520 Pharo では ずっと簡単な構文です。 43 00:02:32,680 --> 00:02:37,720 同じことをするコードがこれです。 44 00:02:39,160 --> 00:02:41,440 末尾の 45 00:02:42,360 --> 00:02:46,880 この start で子プロセスを立ち上げます。 46 00:02:47,040 --> 00:02:50,680 これを fork というメッセージを 47 00:02:50,840 --> 00:02:53,440 このブロックに送ることで実行します。 48 00:02:54,320 --> 00:02:58,760 Java の最新版である Java 8 からは 49 00:02:58,920 --> 00:03:02,080 Java の構文がずいぶんと改善されました。 50 00:03:02,240 --> 00:03:05,480 見ての通り Java のコードがずいぶん明瞭になりました。 51 00:03:06,280 --> 00:03:10,200 このブロックと等価なのが 52 00:03:10,360 --> 00:03:14,280 ここにあるレキシカルクロージャです。 53 00:03:15,200 --> 00:03:19,080 残りは前のスライドと同じです。 54 00:03:19,240 --> 00:03:22,080 Pharo では 3種類のメッセージがあります。 55 00:03:22,240 --> 00:03:23,760 単項メッセージは 56 00:03:23,920 --> 00:03:27,840 引数なしでレシーバーに適用されます。 57 00:03:28,000 --> 00:03:32,040 前に出た factorial メソッドや 58 00:03:32,800 --> 00:03:35,880 コンソールに空行を表示する 59 00:03:36,040 --> 00:03:40,160 cr 等です。 60 00:03:41,120 --> 00:03:45,400 二項メッセージは 1つの値を引数として 61 00:03:45,560 --> 00:03:48,240 レシーバーに適用されます。 62 00:03:48,400 --> 00:03:51,600 例えば 演算子です。 63 00:03:51,760 --> 00:03:54,320 3と4を足す「+」のような。 64 00:03:54,480 --> 00:03:58,560 -> はキーと値のペアを生成する ために使われます。 65 00:03:58,720 --> 00:04:02,560 5->10 は 5 と 10 のペアを作ります。 66 00:04:04,200 --> 00:04:06,840 3種類目のメッセージは キーワードです。 67 00:04:07,000 --> 00:04:10,520 キーワードメッセージは1つ、2つ、3つ あるいはそれ以上の数の引数を取ります。 68 00:04:11,160 --> 00:04:13,320 キーワードはコロンで区切られます。 69 00:04:14,600 --> 00:04:18,920 ここにキーワードメッセージ show: があります。 Transcript オブジェクトに送られて 70 00:04:19,080 --> 00:04:22,240 コンソールに表示する文字列を 引数として取ります。 71 00:04:22,800 --> 00:04:26,240 2つ目の例は between:and: メッセージです。 72 00:04:26,400 --> 00:04:29,360 これは2つのキーワードに分けられた 1つのメッセージです。 73 00:04:29,520 --> 00:04:34,000 2つの引数を取って 1つのレシーバーに適用されます。 74 00:04:34,160 --> 00:04:38,520 between:and: メッセージは オブジェクト「2」に適用されます。 75 00:04:38,680 --> 00:04:40,920 そして0と5を引数として取ります。 76 00:04:41,960 --> 00:04:44,320 Java と比較すると 77 00:04:44,480 --> 00:04:48,120 特にキーワードメッセージについては 78 00:04:48,280 --> 00:04:51,840 Java とはとても違っています。 79 00:04:52,800 --> 00:04:56,960 Java では1つのレシーバーがあり、 1つのピリオドがあり 80 00:04:57,720 --> 00:05:00,560 オブジェクトに送られるメッセージ の名前があり 81 00:05:00,720 --> 00:05:04,200 そして括弧に囲まれてコンマで区切られた 引数があります。 82 00:05:05,440 --> 00:05:07,800 Pharoでは同じことを表現するために 83 00:05:09,560 --> 00:05:14,120 メソッドの名前から キーワードを区切って 84 00:05:14,280 --> 00:05:16,720 引数をその中に置きます。 85 00:05:16,880 --> 00:05:18,520 例えば 86 00:05:19,600 --> 00:05:24,040 手紙(mail)を受取人(recipient)へ送るために 87 00:05:24,200 --> 00:05:27,840 郵便屋さん(postman)に send メッセージを送ります。 88 00:05:28,000 --> 00:05:30,200 これが Java の構文です。 89 00:05:30,360 --> 00:05:34,040 これを徐々に分解していって 最終的に Pharo の構文にします。 90 00:05:34,200 --> 00:05:35,640 1ステップ目: 91 00:05:35,800 --> 00:05:40,320 Java 構文に属する部分を抽出します。 92 00:05:41,120 --> 00:05:45,320 ピリオド、括弧、コンマ そしてセミコロンです。 93 00:05:46,680 --> 00:05:48,000 それらを取り払いましょう。 94 00:05:48,160 --> 00:05:51,360 するとこうなります。 postman send mail recipient 95 00:05:51,520 --> 00:05:54,600 これを読みやすいように 1つの英文にします。 96 00:05:54,760 --> 00:05:59,120 postman send mail to recipient 読みやすくなりました。 97 00:05:59,280 --> 00:06:02,440 Pharo の構文として正しくなるように コロンを追加します。 98 00:06:04,640 --> 00:06:08,680 メッセージは1つ。 send:to: で、postmanに適用されます。 99 00:06:08,840 --> 00:06:14,320 このメッセージは引数を2つ取ります。 mail と recipient です。 100 00:06:14,480 --> 00:06:18,560 if や else などの条件分岐や 101 00:06:18,720 --> 00:06:22,280 do や for 等のループは 102 00:06:22,440 --> 00:06:26,560 Java ではキーワードです。 Pharo ではそうではありません。 103 00:06:26,720 --> 00:06:31,800 それらは言語やコンパイラが定義する 特定の単語ではありません。 104 00:06:31,960 --> 00:06:36,760 それらは単にメソッドであり ある種のオブジェクトに送られるメッセージです。 105 00:06:36,920 --> 00:06:41,240 Pharo では、例えば if を実行するためには 106 00:06:41,880 --> 00:06:44,160 ifTrue:ifFalse: メッセージを送ります。 107 00:06:44,320 --> 00:06:47,600 これは1つの真偽値(Boolean)に 送られるメッセージです。 108 00:06:47,760 --> 00:06:51,840 2つのブロックを引数として取ります。 1つはもし真偽値がtrueの時に実行されて 109 00:06:52,000 --> 00:06:54,320 もう1つは真偽値がfalseの時に実行されます。 110 00:06:54,920 --> 00:06:58,800 同様に、ループは単にある種のオブジェクトに 送られるメソッドに過ぎません。 111 00:06:58,960 --> 00:07:00,640 1つ目の例では 112 00:07:02,080 --> 00:07:03,560 4 は数値オブジェクトです。 113 00:07:03,720 --> 00:07:07,320 timesRepeat:メッセージを ブロックを引数として送ることができます。 114 00:07:08,040 --> 00:07:12,520 対応するメソッドがブロックを 115 00:07:13,920 --> 00:07:17,280 レシーバが表す通りの回数だけ実行します。 116 00:07:17,840 --> 00:07:22,200 4 timesRepeat: は 何かを4回実行します。 117 00:07:23,320 --> 00:07:27,280 同様に、to:do: は 数に送られるメッセージです。 118 00:07:27,440 --> 00:07:29,960 1つの数と1つのブロックを 引数として取ります。 119 00:07:30,120 --> 00:07:34,760 ブロックの引数である i は 120 00:07:34,920 --> 00:07:37,440 0から100までの各値を取ります。 121 00:07:38,840 --> 00:07:40,080 同様に 122 00:07:41,120 --> 00:07:43,000 to:by:do: メッセージは 123 00:07:44,320 --> 00:07:49,120 0から100までの3の倍数を 124 00:07:49,280 --> 00:07:53,080 値として選びます。 0、3、6、9、等。 125 00:07:55,480 --> 00:07:58,600 最後に do: はコレクションに送られるメッセージで 126 00:07:58,760 --> 00:08:02,160 Java の foreachループと同じです。 127 00:08:02,320 --> 00:08:06,760 do: メッセージはコレクションの 各要素についてブロックを実行します。 128 00:08:07,680 --> 00:08:10,920 変数 each は 129 00:08:11,080 --> 00:08:14,480 最初にコレクションの 130 00:08:14,640 --> 00:08:16,320 1番目の値を取ります。 131 00:08:16,480 --> 00:08:19,640 ブロックが このeachの値を使って実行されて 132 00:08:19,800 --> 00:08:23,360 それから each は コレクションの2番目の要素を取ります。 133 00:08:23,520 --> 00:08:27,880 この値でブロックが実行されて コレクションの最後まで繰り返されます。 134 00:08:28,480 --> 00:08:31,560 まとめると 3種類のメッセージがあります。 135 00:08:31,720 --> 00:08:34,600 単項メッセージ、二項メッセージ そしてキーワードメッセージ。 136 00:08:35,160 --> 00:08:37,400 優先順位は 137 00:08:37,560 --> 00:08:40,280 最初に括弧の中が実行されます。 138 00:08:40,440 --> 00:08:44,800 そして単項メッセージ そして二項メッセージ、そしてキーワード。 139 00:08:45,840 --> 00:08:47,600 条件分岐やループは 140 00:08:47,760 --> 00:08:51,200 ある種のオブジェクトへのメッセージです。 141 00:08:51,360 --> 00:08:54,240 Java 等の他の言語では 142 00:08:54,400 --> 00:08:56,800 それらは言語の特殊なキーワードで 143 00:08:56,960 --> 00:09:00,480 コンパイラへの特定の指示ですが 144 00:09:00,640 --> 00:09:03,760 Pharo では、それらは 特定のオブジェクトへのメッセージです。