﻿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
実開発でのイメージ構築をするための
新しい手法を提案しようとしています。
