1 00:00:00,280 --> 00:00:02,400 こんにちは。この講義では 2 00:00:02,560 --> 00:00:06,920 Pharo の実行メカニズムや どのような種類のファイルが 3 00:00:07,080 --> 00:00:10,840 いつどこで使われているのかを 見ていきましょう。 4 00:00:11,000 --> 00:00:13,040 今までイメージファイルや ソースファイルや 5 00:00:13,200 --> 00:00:15,640 チェンジファイルを使ってきました。 6 00:00:15,800 --> 00:00:18,120 しかし、使ってはいましたが 7 00:00:18,280 --> 00:00:22,080 それらがそれぞれ何をするのか 正確に説明しませんでした。 8 00:00:22,240 --> 00:00:26,400 これを知ることで、間違えなしに きちんとシステムを操ることができます。 9 00:00:27,080 --> 00:00:30,240 一言で言えば Pharo の実行メカニズムは 10 00:00:30,400 --> 00:00:33,200 コンパイルされたコードを実行する 仮想機械(バーチャルマシン)です。 11 00:00:33,360 --> 00:00:36,920 この仮想機械は プラットフォーム毎に用意されていて 12 00:00:37,080 --> 00:00:42,680 MacOS や Windows や Linux や iOS や ARM や Android の 13 00:00:42,840 --> 00:00:44,600 それぞれのバージョン用の VM があります。 14 00:00:44,760 --> 00:00:49,400 C# や Java と同じ実行モデルです。 15 00:00:49,560 --> 00:00:51,560 Pharo でも全く同じです。 16 00:00:52,040 --> 00:00:55,200 多ステージコンパイルと呼ばれる方法を 使います。 17 00:00:55,360 --> 00:01:00,080 プログラムをまず 18 00:01:00,240 --> 00:01:03,520 プラットフォーム中立な命令である バイトコードにコンパイルし 19 00:01:03,680 --> 00:01:09,160 仮想機械がバイトコードを アセンブリコードに変換します。 20 00:01:09,480 --> 00:01:11,000 Pharo はこうして動いています。 21 00:01:11,160 --> 00:01:14,600 他のオブジェクト指向言語も同様です。 22 00:01:15,560 --> 00:01:17,880 仮想機械はファイルです。 23 00:01:18,040 --> 00:01:22,120 OSによって .exe や .app になっていますが 24 00:01:22,280 --> 00:01:23,760 それらが仮想機械です。 25 00:01:23,920 --> 00:01:26,840 仮想機械は 2 つのモードで実行されます。 26 00:01:27,000 --> 00:01:30,280 コマンドラインか、もしくは 27 00:01:30,440 --> 00:01:34,200 GUI付きのインタラクティブモードです。 28 00:01:34,360 --> 00:01:38,200 例えば、Linux サーバ上で Pharo を使う場合には 29 00:01:38,360 --> 00:01:40,440 コマンドラインを使います。 30 00:01:40,920 --> 00:01:43,720 仮想機械は コンパイルされたコードを実行して 31 00:01:43,880 --> 00:01:46,040 同時にアセンブリを生成します。 32 00:01:46,200 --> 00:01:48,240 このコンパイルされたコードは 33 00:01:48,400 --> 00:01:51,960 イメージ中にパッケージされ 保存されます。 34 00:01:52,200 --> 00:01:53,960 イメージはメモリのスナップショットで 35 00:01:54,120 --> 00:01:58,960 Pharo の仮想的なオブジェクトシステムを 表しています。 36 00:01:59,120 --> 00:02:00,720 これについては次回詳しく見ていきます。 37 00:02:01,000 --> 00:02:04,880 仮想機械がプログラムを実行するために 必要なのはイメージだけです。 38 00:02:05,040 --> 00:02:10,240 コードはイメージ中にコンパイルされ、また オブジェクトはイメージ中に存在するからです。 39 00:02:10,640 --> 00:02:13,200 加えて、あと 3 つのファイルがあります。 40 00:02:13,360 --> 00:02:16,320 イメージファイルとチェンジファイルと ソースファイルです。 41 00:02:16,480 --> 00:02:19,560 これから、それぞれのファイルと その役割を説明していきます。 42 00:02:19,840 --> 00:02:25,120 イメージファイルはオブジェクトを格納した メモリのスナップショットです。 43 00:02:25,280 --> 00:02:29,120 Point や 文字列などのオブジェクトが 格納されています。 44 00:02:29,440 --> 00:02:30,800 我々が使う、全てです。 45 00:02:30,960 --> 00:02:34,200 さらに、コンパイル済みのメソッドや 46 00:02:34,360 --> 00:02:37,120 コンパイル済みのクラスも 格納されています。 47 00:02:37,560 --> 00:02:41,920 つまり、イメージを保存するたびに 全てのオブジェクトがディスクに保存されます。 48 00:02:42,080 --> 00:02:46,560 イメージは本当に当時の時代の先を行く 仮想化システムです。 49 00:02:47,280 --> 00:02:49,440 スタートアップ時には 50 00:02:49,600 --> 00:02:53,400 保存されたオブジェクトが復元されます。 51 00:02:53,560 --> 00:02:55,440 プログラムカウンタも 52 00:02:55,600 --> 00:02:58,880 イメージに保存され 53 00:02:59,040 --> 00:03:02,680 保存されたそのままに復元されます。 54 00:03:03,480 --> 00:03:07,800 重要なことは OS と 仮想機械があり 55 00:03:07,960 --> 00:03:11,720 仮想機械の上に 56 00:03:11,880 --> 00:03:15,240 オブジェクトがいるメモリ空間である イメージがあり 57 00:03:15,400 --> 00:03:18,040 イメージをディスクに保存し 復元できるということです。 58 00:03:18,560 --> 00:03:21,440 そしてそのイメージにはコンパイル されたオブジェクトが詰まっています。 59 00:03:21,600 --> 00:03:24,360 ここに 1 や 0 を書き込んだのは そういうことです。 60 00:03:25,200 --> 00:03:27,440 さらに、チェンジファイルがあります。 61 00:03:27,600 --> 00:03:31,440 チェンジファイルは、バックアップを 格納するファイルです。 62 00:03:31,840 --> 00:03:34,600 Pharo 上で行った全てのことを記録し 63 00:03:34,760 --> 00:03:38,080 ある種の巨大なテープのようなものに 書き込んでいきます。 64 00:03:38,240 --> 00:03:41,800 そこには全てのコード追加や修正が 含まれています。 65 00:03:41,960 --> 00:03:44,480 なんだか監視盗聴みたいな話ですが Pharo の内部的なことだけです。 66 00:03:44,640 --> 00:03:48,880 これを使って、過去おこなった 一連の作業を再実行することもできます。 67 00:03:49,040 --> 00:03:50,680 チェンジファイルは 68 00:03:51,080 --> 00:03:54,640 Pharo への修正をおこなう全てのアクション を格納するバックアップテープなのです。 69 00:03:55,120 --> 00:04:00,080 チェンジファイルはイメージファイルと 組みにして使います。 70 00:04:00,600 --> 00:04:02,160 それはどうしてかというと 71 00:04:02,320 --> 00:04:04,400 新しいクラスを定義すると 72 00:04:04,560 --> 00:04:08,280 そのクラス定義は イメージファイルではなく 73 00:04:08,440 --> 00:04:11,160 チェンジファイルに記録されます。 74 00:04:12,960 --> 00:04:16,920 イメージファイルとチェンジファイルを バラバラにしてしまうと、コードを失います。 75 00:04:17,080 --> 00:04:19,000 プログラムは実行し続けることができますが 76 00:04:19,160 --> 00:04:22,760 ソースコードを失ってしまいます。 77 00:04:23,040 --> 00:04:24,440 掘り下げて説明すると 78 00:04:24,600 --> 00:04:26,760 イメージファイルにはバイトコードや 79 00:04:27,160 --> 00:04:31,040 コンパイル済みのオブジェクトが バイナリ形式で格納されています。 80 00:04:31,200 --> 00:04:35,880 それと平行して、チェンジファイルには 一連の修正が格納されています。 81 00:04:36,040 --> 00:04:39,800 例えば、ここでカウンタに increase と decrease を追加しました。 82 00:04:40,720 --> 00:04:42,680 他のクラスについても同様です。 83 00:04:42,840 --> 00:04:46,760 そしてこれらの修正を再実行するための ツールが用意されています。 84 00:04:46,920 --> 00:04:50,960 Pharo では、メソッドについて バージョンをブラウズすることができます。 85 00:04:51,120 --> 00:04:54,920 このバージョンをブラウズするツールは チェンジファイルを使っています。 86 00:04:55,080 --> 00:04:59,800 このペアを点線で囲っていますが 87 00:04:59,960 --> 00:05:04,200 チェンジファイルとイメージファイルを 同期させることはとても重要です。 88 00:05:04,360 --> 00:05:07,840 チェンジファイルの中身を emacs で編集したりしないでください。 89 00:05:08,000 --> 00:05:10,480 やろうと思えばできるわけですが 良いことは何一つありません。 90 00:05:10,640 --> 00:05:12,960 チェンジファイルを壊してしまうだけです。 91 00:05:13,400 --> 00:05:15,760 イメージファイルは 一応はちゃんと動作し続けます。 92 00:05:15,920 --> 00:05:19,360 チェンジファイルはプログラミング時に 必要なデータを見せるためのものなので。 93 00:05:19,520 --> 00:05:20,960 しかし、やらないほうが良いです。 94 00:05:21,480 --> 00:05:23,760 一般的に言って 95 00:05:23,920 --> 00:05:26,880 イメージを使うと開発を身軽にできます。 96 00:05:27,040 --> 00:05:29,520 何か作業をしている時に 誰かが割り込んできても 97 00:05:29,680 --> 00:05:32,040 イメージを保存して ちょっと中断することができます。 98 00:05:32,200 --> 00:05:36,240 作業に戻る時には 全く同じ状態から再開できます。 99 00:05:36,400 --> 00:05:40,840 システムの状態の全てが ディスクに保存されるからです。 100 00:05:41,000 --> 00:05:43,160 3 年後に作業を再開しても 101 00:05:43,320 --> 00:05:46,480 ちゃんと 3 年前と全く同じ状態を 復元できます。 102 00:05:46,760 --> 00:05:50,400 ただ、これは工学的な開発としては 良い実践習慣とは言えません。 103 00:05:50,560 --> 00:05:53,560 プロトタイプ的な開発には良いですが。 104 00:05:53,720 --> 00:05:56,640 工学的な開発では、かわりに バージョン管理システムを使ってください。 105 00:05:56,800 --> 00:05:58,320 monticello という 106 00:05:58,480 --> 00:06:00,720 Pharo で書かれた バージョン管理システムがあります。 107 00:06:00,880 --> 00:06:02,560 Git バックエンドもあります。 108 00:06:02,720 --> 00:06:07,400 コードをバージョン管理システムに保存して 109 00:06:07,560 --> 00:06:12,280 Jenkins や Travis のような CI サーバを使って 110 00:06:12,440 --> 00:06:15,560 作業開始ごとにイメージを構築しましょう。 111 00:06:15,720 --> 00:06:19,480 Pharo を始める最初の時には これら 2 つのことを混同しがちです。 112 00:06:19,640 --> 00:06:22,600 イメージは素早い開発には 極めて実践的な仕組みです。 113 00:06:22,760 --> 00:06:24,680 しかし、より組織的で 114 00:06:24,840 --> 00:06:27,800 大規模な統制的な開発では 115 00:06:27,960 --> 00:06:30,960 古臭く見えてもそういったツールを 使うべきです。 116 00:06:31,320 --> 00:06:32,480 実際に有用です。 117 00:06:32,640 --> 00:06:34,280 プロトタイピングで 進める時期もありますが 118 00:06:34,440 --> 00:06:38,560 いつかの時点で バージョン管理システムに保存して 119 00:06:38,720 --> 00:06:42,200 環境から全てのバージョンに アクセスできるようにします。 120 00:06:42,360 --> 00:06:46,480 例えば、Counter クラスを説明する 一連のビデオを参考にしてください。 121 00:06:46,640 --> 00:06:49,800 3 つ目のファイルについてお話します。 122 00:06:49,960 --> 00:06:51,680 ソースファイルです。 123 00:06:51,960 --> 00:06:55,400 ソースファイルは ある種の特殊なチェンジファイルで 124 00:06:55,560 --> 00:06:59,840 システムのリリース時の全ての定義を テキストとして格納しています。 125 00:07:00,000 --> 00:07:04,000 Pharo の新しいバージョンごとに それぞれソースファイルがあり 126 00:07:04,160 --> 00:07:09,360 このソースファイルには Array や Set 等の定義などの 127 00:07:09,520 --> 00:07:12,240 Pharo のコアライブラリで定義された 128 00:07:12,400 --> 00:07:16,000 全てのメソッドの定義が 格納されています。 129 00:07:16,680 --> 00:07:20,520 一般にソースファイルは 130 00:07:20,800 --> 00:07:22,160 リードオンリーで共有するのが良いです。 131 00:07:22,360 --> 00:07:26,080 チェンジファイルは書き込み可で イメージごとに作られます。 132 00:07:26,240 --> 00:07:28,400 これを見てください。 133 00:07:28,560 --> 00:07:31,640 Pharo 4.0 いわば、この宇宙の 134 00:07:31,800 --> 00:07:34,720 開始時の 135 00:07:34,880 --> 00:07:37,880 システム状態のスナップショットです。 136 00:07:39,040 --> 00:07:43,080 ここで新しいクラスを定義しました。 Node クラスを定義しました。 137 00:07:43,240 --> 00:07:47,520 新しいオブジェクトのバイナリを 生成しました。 138 00:07:47,680 --> 00:07:51,640 そのイメージと関連付けられた チェンジファイルには 139 00:07:51,800 --> 00:07:55,560 新しい定義が追加されていきます。 ここに書かれています。 140 00:07:55,960 --> 00:07:59,440 このファイルはリードオンリーです。 141 00:08:00,520 --> 00:08:02,440 こちらは書き込みモードです。 142 00:08:02,800 --> 00:08:06,760 もう一度言いますが 概念として 143 00:08:06,920 --> 00:08:10,120 イメージファイルとチェンジファイルは 一緒になって機能を果たします。 144 00:08:10,280 --> 00:08:13,920 これで 3 つのファイルの役割が 明確になったと思います。 145 00:08:14,080 --> 00:08:18,400 理解しておくべきことは 146 00:08:18,560 --> 00:08:21,840 チェンジについて管理するシステムで 147 00:08:22,000 --> 00:08:25,280 さまざまなバージョンの復元や再実行を 148 00:08:25,440 --> 00:08:28,360 簡単にできるようにしようとしています。 149 00:08:28,520 --> 00:08:32,160 将来的には、Git との統合を改善して 150 00:08:32,720 --> 00:08:36,880 実開発でのイメージ構築をするための 新しい手法を提案しようとしています。