WEBVTT

00:00:00.280 --> 00:00:02.400 align:middle
こんにちは。この講義では

00:00:02.560 --> 00:00:06.920 align:middle
Pharo の実行メカニズムや
どのような種類のファイルが

00:00:07.080 --> 00:00:10.840 align:middle
いつどこで使われているのかを
見ていきましょう。

00:00:11.000 --> 00:00:13.040 align:middle
今までイメージファイルや
ソースファイルや

00:00:13.200 --> 00:00:15.640 align:middle
チェンジファイルを使ってきました。

00:00:15.800 --> 00:00:18.120 align:middle
しかし、使ってはいましたが

00:00:18.280 --> 00:00:22.080 align:middle
それらがそれぞれ何をするのか
正確に説明しませんでした。

00:00:22.240 --> 00:00:26.400 align:middle
これを知ることで、間違えなしに
きちんとシステムを操ることができます。

00:00:27.080 --> 00:00:30.240 align:middle
一言で言えば
Pharo の実行メカニズムは

00:00:30.400 --> 00:00:33.200 align:middle
コンパイルされたコードを実行する
仮想機械（バーチャルマシン）です。

00:00:33.360 --> 00:00:36.920 align:middle
この仮想機械は
プラットフォーム毎に用意されていて

00:00:37.080 --> 00:00:42.680 align:middle
MacOS や Windows や Linux や
iOS や ARM や Android の

00:00:42.840 --> 00:00:44.600 align:middle
それぞれのバージョン用の
VM があります。

00:00:44.760 --> 00:00:49.400 align:middle
C# や Java と同じ実行モデルです。

00:00:49.560 --> 00:00:51.560 align:middle
Pharo でも全く同じです。

00:00:52.040 --> 00:00:55.200 align:middle
多ステージコンパイルと呼ばれる方法を
使います。

00:00:55.360 --> 00:01:00.080 align:middle
プログラムをまず

00:01:00.240 --> 00:01:03.520 align:middle
プラットフォーム中立な命令である
バイトコードにコンパイルし

00:01:03.680 --> 00:01:09.160 align:middle
仮想機械がバイトコードを
アセンブリコードに変換します。

00:01:09.480 --> 00:01:11.000 align:middle
Pharo はこうして動いています。

00:01:11.160 --> 00:01:14.600 align:middle
他のオブジェクト指向言語も同様です。

00:01:15.560 --> 00:01:17.880 align:middle
仮想機械はファイルです。

00:01:18.040 --> 00:01:22.120 align:middle
OSによって .exe や .app
になっていますが

00:01:22.280 --> 00:01:23.760 align:middle
それらが仮想機械です。

00:01:23.920 --> 00:01:26.840 align:middle
仮想機械は 2 つのモードで実行されます。

00:01:27.000 --> 00:01:30.280 align:middle
コマンドラインか、もしくは

00:01:30.440 --> 00:01:34.200 align:middle
GUI付きのインタラクティブモードです。

00:01:34.360 --> 00:01:38.200 align:middle
例えば、Linux サーバ上で
Pharo を使う場合には

00:01:38.360 --> 00:01:40.440 align:middle
コマンドラインを使います。

00:01:40.920 --> 00:01:43.720 align:middle
仮想機械は
コンパイルされたコードを実行して

00:01:43.880 --> 00:01:46.040 align:middle
同時にアセンブリを生成します。

00:01:46.200 --> 00:01:48.240 align:middle
このコンパイルされたコードは

00:01:48.400 --> 00:01:51.960 align:middle
イメージ中にパッケージされ
保存されます。

00:01:52.200 --> 00:01:53.960 align:middle
イメージはメモリのスナップショットで

00:01:54.120 --> 00:01:58.960 align:middle
Pharo の仮想的なオブジェクトシステムを
表しています。

00:01:59.120 --> 00:02:00.720 align:middle
これについては次回詳しく見ていきます。

00:02:01.000 --> 00:02:04.880 align:middle
仮想機械がプログラムを実行するために
必要なのはイメージだけです。

00:02:05.040 --> 00:02:10.240 align:middle
コードはイメージ中にコンパイルされ、また
オブジェクトはイメージ中に存在するからです。

00:02:10.640 --> 00:02:13.200 align:middle
加えて、あと 3 つのファイルがあります。

00:02:13.360 --> 00:02:16.320 align:middle
イメージファイルとチェンジファイルと
ソースファイルです。

00:02:16.480 --> 00:02:19.560 align:middle
これから、それぞれのファイルと
その役割を説明していきます。

00:02:19.840 --> 00:02:25.120 align:middle
イメージファイルはオブジェクトを格納した
メモリのスナップショットです。

00:02:25.280 --> 00:02:29.120 align:middle
Point や 文字列などのオブジェクトが
格納されています。

00:02:29.440 --> 00:02:30.800 align:middle
我々が使う、全てです。

00:02:30.960 --> 00:02:34.200 align:middle
さらに、コンパイル済みのメソッドや

00:02:34.360 --> 00:02:37.120 align:middle
コンパイル済みのクラスも
格納されています。

00:02:37.560 --> 00:02:41.920 align:middle
つまり、イメージを保存するたびに
全てのオブジェクトがディスクに保存されます。

00:02:42.080 --> 00:02:46.560 align:middle
イメージは本当に当時の時代の先を行く
仮想化システムです。

00:02:47.280 --> 00:02:49.440 align:middle
スタートアップ時には

00:02:49.600 --> 00:02:53.400 align:middle
保存されたオブジェクトが復元されます。

00:02:53.560 --> 00:02:55.440 align:middle
プログラムカウンタも

00:02:55.600 --> 00:02:58.880 align:middle
イメージに保存され

00:02:59.040 --> 00:03:02.680 align:middle
保存されたそのままに復元されます。

00:03:03.480 --> 00:03:07.800 align:middle
重要なことは
OS と 仮想機械があり

00:03:07.960 --> 00:03:11.720 align:middle
仮想機械の上に

00:03:11.880 --> 00:03:15.240 align:middle
オブジェクトがいるメモリ空間である
イメージがあり

00:03:15.400 --> 00:03:18.040 align:middle
イメージをディスクに保存し
復元できるということです。

00:03:18.560 --> 00:03:21.440 align:middle
そしてそのイメージにはコンパイル
されたオブジェクトが詰まっています。

00:03:21.600 --> 00:03:24.360 align:middle
ここに 1 や 0 を書き込んだのは
そういうことです。

00:03:25.200 --> 00:03:27.440 align:middle
さらに、チェンジファイルがあります。

00:03:27.600 --> 00:03:31.440 align:middle
チェンジファイルは、バックアップを
格納するファイルです。

00:03:31.840 --> 00:03:34.600 align:middle
Pharo 上で行った全てのことを記録し

00:03:34.760 --> 00:03:38.080 align:middle
ある種の巨大なテープのようなものに
書き込んでいきます。

00:03:38.240 --> 00:03:41.800 align:middle
そこには全てのコード追加や修正が
含まれています。

00:03:41.960 --> 00:03:44.480 align:middle
なんだか監視盗聴みたいな話ですが
Pharo の内部的なことだけです。

00:03:44.640 --> 00:03:48.880 align:middle
これを使って、過去おこなった
一連の作業を再実行することもできます。

00:03:49.040 --> 00:03:50.680 align:middle
チェンジファイルは

00:03:51.080 --> 00:03:54.640 align:middle
Pharo への修正をおこなう全てのアクション
を格納するバックアップテープなのです。

00:03:55.120 --> 00:04:00.080 align:middle
チェンジファイルはイメージファイルと
組みにして使います。

00:04:00.600 --> 00:04:02.160 align:middle
それはどうしてかというと

00:04:02.320 --> 00:04:04.400 align:middle
新しいクラスを定義すると

00:04:04.560 --> 00:04:08.280 align:middle
そのクラス定義は
イメージファイルではなく

00:04:08.440 --> 00:04:11.160 align:middle
チェンジファイルに記録されます。

00:04:12.960 --> 00:04:16.920 align:middle
イメージファイルとチェンジファイルを
バラバラにしてしまうと、コードを失います。

00:04:17.080 --> 00:04:19.000 align:middle
プログラムは実行し続けることができますが

00:04:19.160 --> 00:04:22.760 align:middle
ソースコードを失ってしまいます。

00:04:23.040 --> 00:04:24.440 align:middle
掘り下げて説明すると

00:04:24.600 --> 00:04:26.760 align:middle
イメージファイルにはバイトコードや

00:04:27.160 --> 00:04:31.040 align:middle
コンパイル済みのオブジェクトが
バイナリ形式で格納されています。

00:04:31.200 --> 00:04:35.880 align:middle
それと平行して、チェンジファイルには
一連の修正が格納されています。

00:04:36.040 --> 00:04:39.800 align:middle
例えば、ここでカウンタに
increase と decrease を追加しました。

00:04:40.720 --> 00:04:42.680 align:middle
他のクラスについても同様です。

00:04:42.840 --> 00:04:46.760 align:middle
そしてこれらの修正を再実行するための
ツールが用意されています。

00:04:46.920 --> 00:04:50.960 align:middle
Pharo では、メソッドについて
バージョンをブラウズすることができます。

00:04:51.120 --> 00:04:54.920 align:middle
このバージョンをブラウズするツールは
チェンジファイルを使っています。

00:04:55.080 --> 00:04:59.800 align:middle
このペアを点線で囲っていますが

00:04:59.960 --> 00:05:04.200 align:middle
チェンジファイルとイメージファイルを
同期させることはとても重要です。

00:05:04.360 --> 00:05:07.840 align:middle
チェンジファイルの中身を
emacs で編集したりしないでください。

00:05:08.000 --> 00:05:10.480 align:middle
やろうと思えばできるわけですが
良いことは何一つありません。

00:05:10.640 --> 00:05:12.960 align:middle
チェンジファイルを壊してしまうだけです。

00:05:13.400 --> 00:05:15.760 align:middle
イメージファイルは
一応はちゃんと動作し続けます。

00:05:15.920 --> 00:05:19.360 align:middle
チェンジファイルはプログラミング時に
必要なデータを見せるためのものなので。

00:05:19.520 --> 00:05:20.960 align:middle
しかし、やらないほうが良いです。

00:05:21.480 --> 00:05:23.760 align:middle
一般的に言って

00:05:23.920 --> 00:05:26.880 align:middle
イメージを使うと開発を身軽にできます。

00:05:27.040 --> 00:05:29.520 align:middle
何か作業をしている時に
誰かが割り込んできても

00:05:29.680 --> 00:05:32.040 align:middle
イメージを保存して
ちょっと中断することができます。

00:05:32.200 --> 00:05:36.240 align:middle
作業に戻る時には
全く同じ状態から再開できます。

00:05:36.400 --> 00:05:40.840 align:middle
システムの状態の全てが
ディスクに保存されるからです。

00:05:41.000 --> 00:05:43.160 align:middle
3 年後に作業を再開しても

00:05:43.320 --> 00:05:46.480 align:middle
ちゃんと 3 年前と全く同じ状態を
復元できます。

00:05:46.760 --> 00:05:50.400 align:middle
ただ、これは工学的な開発としては
良い実践習慣とは言えません。

00:05:50.560 --> 00:05:53.560 align:middle
プロトタイプ的な開発には良いですが。

00:05:53.720 --> 00:05:56.640 align:middle
工学的な開発では、かわりに
バージョン管理システムを使ってください。

00:05:56.800 --> 00:05:58.320 align:middle
monticello という

00:05:58.480 --> 00:06:00.720 align:middle
Pharo で書かれた
バージョン管理システムがあります。

00:06:00.880 --> 00:06:02.560 align:middle
Git バックエンドもあります。

00:06:02.720 --> 00:06:07.400 align:middle
コードをバージョン管理システムに保存して

00:06:07.560 --> 00:06:12.280 align:middle
Jenkins や Travis のような
CI サーバを使って

00:06:12.440 --> 00:06:15.560 align:middle
作業開始ごとにイメージを構築しましょう。

00:06:15.720 --> 00:06:19.480 align:middle
Pharo を始める最初の時には
これら 2 つのことを混同しがちです。

00:06:19.640 --> 00:06:22.600 align:middle
イメージは素早い開発には
極めて実践的な仕組みです。

00:06:22.760 --> 00:06:24.680 align:middle
しかし、より組織的で

00:06:24.840 --> 00:06:27.800 align:middle
大規模な統制的な開発では

00:06:27.960 --> 00:06:30.960 align:middle
古臭く見えてもそういったツールを
使うべきです。

00:06:31.320 --> 00:06:32.480 align:middle
実際に有用です。

00:06:32.640 --> 00:06:34.280 align:middle
プロトタイピングで
進める時期もありますが

00:06:34.440 --> 00:06:38.560 align:middle
いつかの時点で
バージョン管理システムに保存して

119 align:middle
00:06:38,720 --> 00:06:42,200
環境から全てのバージョンに
アクセスできるようにします。

00:06:42.360 --> 00:06:46.480 align:middle
例えば、Counter クラスを説明する
一連のビデオを参考にしてください。

00:06:46.640 --> 00:06:49.800 align:middle
3 つ目のファイルについてお話します。

00:06:49.960 --> 00:06:51.680 align:middle
ソースファイルです。

00:06:51.960 --> 00:06:55.400 align:middle
ソースファイルは
ある種の特殊なチェンジファイルで

00:06:55.560 --> 00:06:59.840 align:middle
システムのリリース時の全ての定義を
テキストとして格納しています。

00:07:00.000 --> 00:07:04.000 align:middle
Pharo の新しいバージョンごとに
それぞれソースファイルがあり

00:07:04.160 --> 00:07:09.360 align:middle
このソースファイルには
Array や Set 等の定義などの

00:07:09.520 --> 00:07:12.240 align:middle
Pharo のコアライブラリで定義された

00:07:12.400 --> 00:07:16.000 align:middle
全てのメソッドの定義が
格納されています。

00:07:16.680 --> 00:07:20.520 align:middle
一般にソースファイルは

00:07:20.800 --> 00:07:22.160 align:middle
リードオンリーで共有するのが良いです。

00:07:22.360 --> 00:07:26.080 align:middle
チェンジファイルは書き込み可で
イメージごとに作られます。

00:07:26.240 --> 00:07:28.400 align:middle
これを見てください。

00:07:28.560 --> 00:07:31.640 align:middle
Pharo 4.0 いわば、この宇宙の

00:07:31.800 --> 00:07:34.720 align:middle
開始時の

00:07:34.880 --> 00:07:37.880 align:middle
システム状態のスナップショットです。

00:07:39.040 --> 00:07:43.080 align:middle
ここで新しいクラスを定義しました。
Node クラスを定義しました。

00:07:43.240 --> 00:07:47.520 align:middle
新しいオブジェクトのバイナリを
生成しました。

00:07:47.680 --> 00:07:51.640 align:middle
そのイメージと関連付けられた
チェンジファイルには

00:07:51.800 --> 00:07:55.560 align:middle
新しい定義が追加されていきます。
ここに書かれています。

00:07:55.960 --> 00:07:59.440 align:middle
このファイルはリードオンリーです。

00:08:00.520 --> 00:08:02.440 align:middle
こちらは書き込みモードです。

00:08:02.800 --> 00:08:06.760 align:middle
もう一度言いますが
概念として

00:08:06.920 --> 00:08:10.120 align:middle
イメージファイルとチェンジファイルは
一緒になって機能を果たします。

00:08:10.280 --> 00:08:13.920 align:middle
これで 3 つのファイルの役割が
明確になったと思います。

00:08:14.080 --> 00:08:18.400 align:middle
理解しておくべきことは

00:08:18.560 --> 00:08:21.840 align:middle
チェンジについて管理するシステムで

00:08:22.000 --> 00:08:25.280 align:middle
さまざまなバージョンの復元や再実行を

00:08:25.440 --> 00:08:28.360 align:middle
簡単にできるようにしようとしています。

00:08:28.520 --> 00:08:32.160 align:middle
将来的には、Git との統合を改善して

00:08:32.720 --> 00:08:36.880 align:middle
実開発でのイメージ構築をするための
新しい手法を提案しようとしています。

