WEBVTT

00:00:01.540 --> 00:00:03.650 align:middle
このビデオでは
インスペクターを使って

00:00:03.817 --> 00:00:08.710 align:middle
システムの内部を掘り進めていきながら
理解していくための

00:00:08.877 --> 00:00:09.620 align:middle
方法をお見せします。

00:00:10.880 --> 00:00:15.020 align:middle
インスペクターは
いわば顕微鏡のようなもので

00:00:15.187 --> 00:00:17.910 align:middle
システムの内部に行って
探検することができます。

00:00:18.077 --> 00:00:21.190 align:middle
また、システムを修正していくための

00:00:21.357 --> 00:00:22.860 align:middle
プローブのようでもあります。

00:00:23.027 --> 00:00:26.940 align:middle
バクテリアを操って反応させる
生物学者になったかのようです。

00:00:27.800 --> 00:00:32.240 align:middle
Smalltalk globals の探検を
楽しんでいきましょう。

00:00:34.910 --> 00:00:37.470 align:middle
これは実際には名前空間です。
Pharo の全てのクラスが

00:00:37.637 --> 00:00:40.050 align:middle
格納された場所です。

00:00:41.770 --> 00:00:44.000 align:middle
つまり辞書です。
SystemDictionary は辞書です。

00:00:44.167 --> 00:00:48.180 align:middle
興味深いことに

00:00:48.630 --> 00:00:53.540 align:middle
インスペクターを使って見ると

00:00:53.707 --> 00:00:56.240 align:middle
値が埋め込まれた

00:01:00.080 --> 00:01:00.860 align:middle
大きなテーブルに見えます。

00:01:01.027 --> 00:01:02.410 align:middle
例えば、そうですね…

00:01:02.577 --> 00:01:06.770 align:middle
Breakpoint を見てみると

00:01:07.680 --> 00:01:11.840 align:middle
ここにオブジェクトがあって

00:01:12.710 --> 00:01:14.350 align:middle
キーと値があります。

00:01:14.517 --> 00:01:16.190 align:middle
インスペクターで

00:01:16.357 --> 00:01:20.390 align:middle
例えばこの テーブルの

00:01:20.557 --> 00:01:22.370 align:middle
2 の要素をみると

00:01:22.537 --> 00:01:24.150 align:middle
グローバル変数と呼ばれるものを
捕まえることができます。

00:01:24.317 --> 00:01:26.150 align:middle
グローバル変数というのは

00:01:26.317 --> 00:01:28.350 align:middle
キーと値からなるオブジェクトで

00:01:29.220 --> 00:01:33.040 align:middle
キーはというと、クリックしてみると

00:01:33.207 --> 00:01:37.870 align:middle
ByteSymbol になっています。
これが名前です。

00:01:38.037 --> 00:01:42.720 align:middle
一旦戻って、値を見てみると

00:01:42.887 --> 00:01:44.820 align:middle
クラスが得られます。

00:01:45.000 --> 00:01:47.520 align:middle
ではクラスの内部に進んでいきましょう。

00:01:48.000 --> 00:01:49.230 align:middle
ここでスタート地点に戻ります。

00:01:50.460 --> 00:01:54.790 align:middle
Pharo の新しいインスペクターは

00:01:55.670 --> 00:01:59.440 align:middle
開発したチームに因んで
GT Inspector と呼ばれていますが

00:01:59.607 --> 00:02:03.380 align:middle
対象ごとに専用のタブを

00:02:03.547 --> 00:02:05.220 align:middle
提供してくれます。

00:02:06.610 --> 00:02:08.570 align:middle
SystemDictionary に対しては
どんな専用タブがあるかというと

00:02:08.737 --> 00:02:12.210 align:middle
キーと値のペアを

00:02:12.377 --> 00:02:17.240 align:middle
表示するタブや

00:02:17.407 --> 00:02:18.220 align:middle
キーのみを表示するタブがあります。

00:02:18.387 --> 00:02:20.340 align:middle
キーのみのほうは

00:02:20.507 --> 00:02:25.270 align:middle
クラス名を表示するだけになるので

00:02:25.437 --> 00:02:26.070 align:middle
今回はあまり面白くないです。

00:02:26.237 --> 00:02:28.720 align:middle
このインスペクターの

00:02:28.887 --> 00:02:33.170 align:middle
ブラウズの仕方を

00:02:33.337 --> 00:02:34.730 align:middle
例で説明しましょう。

00:02:35.270 --> 00:02:39.410 align:middle
オブジェクトから別のオブジェクトに

00:02:39.620 --> 00:02:42.390 align:middle
対象の構造からパスを選択して
ブラウズしています。

00:02:42.940 --> 00:02:44.900 align:middle
キーのことを知りたい場合には、こう。

00:02:45.067 --> 00:02:47.600 align:middle
値について知りたい時は、こうして
クラスを掴んで

00:02:47.767 --> 00:02:49.420 align:middle
さらにこのクラスのメソッド辞書に
進んでいくことができます。

00:02:49.790 --> 00:02:53.730 align:middle
メソッド辞書から

00:02:53.897 --> 00:02:54.840 align:middle
コンパイル済みメソッド(CompiledMethod)
等に進んでいくことができます。

00:02:55.007 --> 00:02:58.960 align:middle
このツールでブラウズしていく過程のうち

00:02:59.127 --> 00:03:03.810 align:middle
表示する部分を変えて
フロー全体を見ることもできます。

00:03:04.510 --> 00:03:08.540 align:middle
さらに良いことに

00:03:08.940 --> 00:03:11.530 align:middle
フローの中で分岐を作ることもできます。

00:03:12.130 --> 00:03:14.570 align:middle
ここでやってみましょう。

00:03:14.737 --> 00:03:16.300 align:middle
スタート地点に戻ります。

00:03:18.070 --> 00:03:22.560 align:middle
さて、ではここで

00:03:22.727 --> 00:03:24.530 align:middle
Point クラスに興味があるとします。

00:03:24.920 --> 00:03:26.600 align:middle
通常、Point クラスに
アクセスするためには

00:03:26.767 --> 00:03:29.050 align:middle
Smalltalk globals at: #Point
とすれば良いことは分かっています。

00:03:29.217 --> 00:03:31.890 align:middle
さてここで、それを実行して

00:03:32.057 --> 00:03:36.670 align:middle
インスペクターで開くように

00:03:36.837 --> 00:03:39.280 align:middle
インスペクターの内部でやってみましょう。

00:03:41.340 --> 00:03:45.270 align:middle
すると突然

00:03:45.437 --> 00:03:50.230 align:middle
元のナビゲーションから

00:03:50.580 --> 00:03:52.230 align:middle
これから進んでいくナビゲーションが
分岐します。

00:03:54.440 --> 00:03:56.380 align:middle
こうすることで

00:03:56.547 --> 00:03:59.330 align:middle
いくつも表現式を入力して
ナビゲーションを開始することができます。

00:04:00.760 --> 00:04:01.750 align:middle
ここでは

00:04:02.120 --> 00:04:04.520 align:middle
Point クラスを見ています。

00:04:04.760 --> 00:04:09.000 align:middle
インスペクターは

00:04:09.167 --> 00:04:12.400 align:middle
クラスを見る専用のタブを
表示しています。

00:04:12.860 --> 00:04:17.490 align:middle
ここでは、Raw タブは

00:04:17.657 --> 00:04:20.030 align:middle
Point クラスは

00:04:20.197 --> 00:04:23.760 align:middle
Kernel カテゴリーで定義されていて
environment は同じ空間を指していて

00:04:24.010 --> 00:04:28.960 align:middle
インスタンスのフォーマットや

00:04:29.127 --> 00:04:30.470 align:middle
layout があります。

00:04:30.637 --> 00:04:35.520 align:middle
端的に言えば、これがクラスというものの
Pharo での実装です。

00:04:36.220 --> 00:04:38.920 align:middle
このインスペクターを使って

00:04:39.087 --> 00:04:41.810 align:middle
例えば定義や

00:04:42.000 --> 00:04:46.790 align:middle
コメントを見ることができます。
参照(All Ref)などの他のタブもあります。

00:04:46.957 --> 00:04:49.550 align:middle
All Ref をクリックすると

00:04:49.717 --> 00:04:54.610 align:middle
Point は　@ メソッドで

00:04:54.777 --> 00:04:56.000 align:middle
使われていることがわかります。

00:04:57.200 --> 00:04:59.540 align:middle
さらに見てみると

00:04:59.920 --> 00:05:02.500 align:middle
これがメソッドを表現するオブジェクトの

00:05:02.667 --> 00:05:05.630 align:middle
生(Raw)の情報です。
ここにソース(Source)があります。

00:05:05.797 --> 00:05:07.790 align:middle
使う状況にあわせて

00:05:07.957 --> 00:05:09.770 align:middle
タスクに最適な表現を
選ぶことができます。

00:05:10.440 --> 00:05:11.700 align:middle
では戻ってみましょう。

00:05:13.440 --> 00:05:16.810 align:middle
クラスを見て

00:05:18.740 --> 00:05:21.950 align:middle
メソッド辞書に行きたくなったとします。

00:05:22.117 --> 00:05:25.660 align:middle
メソッド辞書というのは

00:05:25.827 --> 00:05:27.930 align:middle
メソッドの名前がキーで

00:05:28.097 --> 00:05:31.870 align:middle
コンパイル済みメソッドが値となっている
辞書です。

00:05:32.037 --> 00:05:35.490 align:middle
コンパイル済みメソッドのインスタンスを

00:05:35.657 --> 00:05:37.730 align:middle
生(Raw)で見てみると
ちょっと厄介な感じです。

00:05:38.680 --> 00:05:43.540 align:middle
対話するためには

00:05:43.707 --> 00:05:45.820 align:middle
メソッド辞書が
どう実装されているのかを

00:05:46.000 --> 00:05:47.940 align:middle
理解していなければなりません。
しかし実装には興味ありません。

00:05:48.107 --> 00:05:49.420 align:middle
コンパイル済みメソッドを
見たいだけなのです。

00:05:49.930 --> 00:05:51.460 align:middle
コンパイル済みメソッドを見るためには

00:05:51.627 --> 00:05:54.670 align:middle
例えば degrees を選びます。

00:05:54.837 --> 00:05:57.570 align:middle
これでコンパイル済みメソッドを
掴むことができます。

00:05:58.270 --> 00:06:01.280 align:middle
コンパイル済みメソッドは

00:06:01.447 --> 00:06:05.610 align:middle
これまた専用のインスペクター上の
表示を提供しています。

00:06:06.810 --> 00:06:10.300 align:middle
コンパイル済みメソッドを見ると

00:06:10.467 --> 00:06:13.700 align:middle
これは実際にはデータのフレームワークで

00:06:13.867 --> 00:06:17.570 align:middle
テーブルになっています。

00:06:17.737 --> 00:06:19.810 align:middle
具体的にはバイトコードとリテラルを
持っています。

00:06:20.100 --> 00:06:21.790 align:middle
リテラルというのは

00:06:21.957 --> 00:06:25.620 align:middle
コード中に asFloat や arcTan や
degrees や radianToDegrees がありますが

00:06:27.900 --> 00:06:30.100 align:middle
これらのメッセージ名がどこかに
格納されていなければなりませんが

00:06:31.000 --> 00:06:33.820 align:middle
それがリテラルとしてここに格納されています

00:06:37.780 --> 00:06:38.413 align:middle
コンパイル済みメソッドの
最初のほうに見えます。

00:06:38.580 --> 00:06:39.213 align:middle
バイトコードは何をするのかというと

00:06:39.380 --> 00:06:41.880 align:middle
スタックにオブジェクトを入れて

00:06:42.047 --> 00:06:43.830 align:middle
メソッドを起動したりします。

00:06:44.000 --> 00:06:45.860 align:middle
ここでは例えば

00:06:46.027 --> 00:06:49.810 align:middle
ビューを最小化しますが
Bytecode ビューを見ると

00:06:50.000 --> 00:06:51.400 align:middle
そこでは

00:06:51.567 --> 00:06:55.470 align:middle
PushRcvr してからスタックに 0 を入れて
それから = をしています。

00:06:55.637 --> 00:06:56.900 align:middle
これと対応しているのは何でしょう？

00:06:57.240 --> 00:06:58.870 align:middle
よく見てみます。

00:07:03.330 --> 00:07:06.700 align:middle
表示モードは本当にとても便利です。

00:07:06.867 --> 00:07:08.690 align:middle
何ができるのかというと

00:07:08.857 --> 00:07:11.910 align:middle
こうしてソースコードを見る時

00:07:12.077 --> 00:07:16.880 align:middle
あちらで Bytecode を選んで

00:07:17.047 --> 00:07:20.350 align:middle
こちらで Source を選ぶと
対応するもの同士が

00:07:20.517 --> 00:07:21.900 align:middle
表示されます。

00:07:22.690 --> 00:07:23.480 align:middle
すごいですね。

00:07:23.890 --> 00:07:27.260 align:middle
つまりレシーバーの
インスタンス変数 0 番をプッシュして

00:07:27.427 --> 00:07:30.920 align:middle
0 をスタックに置いて

00:07:31.087 --> 00:07:33.700 align:middle
そして = メッセージを送ります。

00:07:34.560 --> 00:07:36.390 align:middle
つまりコンパイラを開発する人は

00:07:36.557 --> 00:07:38.670 align:middle
生成されたバイトコードを

00:07:38.837 --> 00:07:42.230 align:middle
コードの構造に対応付けて

00:07:42.397 --> 00:07:45.740 align:middle
見ることができるのです。

00:07:45.940 --> 00:07:50.220 align:middle
同様に

00:07:50.387 --> 00:07:54.780 align:middle
戻って

00:07:58.320 --> 00:08:00.590 align:middle
self をクリックすると

00:08:04.900 --> 00:08:07.700 align:middle
ここにコンパイル済みメソッドの
表示が 2 つあります。

00:08:10.930 --> 00:08:13.000 align:middle
ここにコンパイル済みメソッドの
表示が 2 つあって、これで

00:08:13.167 --> 00:08:16.920 align:middle
AST（抽象構文木）を見ます。

00:08:18.680 --> 00:08:20.510 align:middle
これとソースを見ます。

00:08:20.677 --> 00:08:23.490 align:middle
これで内部をブラウズすることもできます。

00:08:23.657 --> 00:08:26.630 align:middle
例えば、抽象構文木は

00:08:26.797 --> 00:08:31.420 align:middle
このメソッドのものは複雑ですが
表示を開いていって

00:08:31.587 --> 00:08:35.270 align:middle
一時変数 tan を選択すると

00:08:36.780 --> 00:08:41.610 align:middle
それと対応する

00:08:42.410 --> 00:08:44.030 align:middle
コード片が選択されます。

00:08:44.197 --> 00:08:46.510 align:middle
これもすごいですね。
さらに

00:08:46.677 --> 00:08:50.760 align:middle
x に 0 を引数として送るメッセージは

00:08:50.927 --> 00:08:54.000 align:middle
この抽象構文木のこの部分ですが

00:08:54.440 --> 00:08:55.820 align:middle
この部分に対応しています。

00:08:57.530 --> 00:09:01.860 align:middle
インスペクターを使って

00:09:02.027 --> 00:09:04.670 align:middle
木のノードを選択することで

00:09:04.837 --> 00:09:06.880 align:middle
テキストの選択部分を
管理することができます。

00:09:08.000 --> 00:09:12.120 align:middle
Pharo のコンパイラを開発する
人たちにとって

00:09:12.287 --> 00:09:13.400 align:middle
とても素晴らしいツールになります。

00:09:14.080 --> 00:09:16.220 align:middle
このアプローチを使って

00:09:16.387 --> 00:09:20.460 align:middle
様々なドメイン、つまりあなたの
ドメインオブジェクトに対しても

00:09:20.627 --> 00:09:24.060 align:middle
意味が解りやすいような表示を
提案するように

00:09:24.420 --> 00:09:27.680 align:middle
インスペクターを拡張することが
できるのです。

