Advertisement
Guest User

Untitled

a guest
Jul 1st, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.42 KB | None | 0 0
  1. # 35章 SimulaからJavaへ、そしてその先へ: 主なオブジェクト指向言語とその環境
  2.  
  3. * 1967年Simulaを皮切りに多くのオブジェクト指向言語が生まれた
  4. * Simula、Smalltalk、C++と他のC拡張、Javaを調査する
  5. * この章では、言語に関する詳細な比較評価はせず、**問題** と **概念** について学ぶことである
  6.  
  7. # 35.1 Simura
  8.  
  9. * クラス家の創立者
  10. * 1967年に完成
  11. - 構造化プログラミングや、情報隠蔽、抽象データ型といった技術が話題になる前に誕生した
  12.  
  13. ## 35.1.1 背景
  14.  
  15. * Simulaは二度の設計を経ている
  16. - 60年代の初期に「Simula1」が離散的イベントシミュレーションプログラミングを支援するために開発された
  17. - 本来のSimulaは1967年に設計された「Simula67」である
  18. * Simulaという名前は多くの人に離散的イベントシミュレーションのためだけの言語であるというイメージを喚起させてしまった
  19. - シミュレーションを担うのは一握りの命令とSIMULATIONライブラリクラスだけであった
  20. * 1986年に単なるSimulaに短縮され、1987年に標準化された
  21.  
  22. ## 35.1.2 可用性
  23.  
  24. * Simulaは尊敬すべきではあるが廃れた先祖として扱われるが、まだ、小さいが熱心なコミュニティの支援を受けている(この本の執筆時なので現在はさらにそれより小さそう)
  25.  
  26. ## 35.1.3 主な言語特性
  27.  
  28. * SimulaはAlgol60のオブジェクト指向拡張である
  29. - 基本的な制御構造はAlgolのそのままである
  30. * メインプログラムの概念
  31. - クラス単位でコンパイル可能
  32. * 自動ガーベジコレクションのサポート
  33. * Simulaは単一継承をサポートする
  34.  
  35. ```simula
  36. A class B;
  37. begin ... end
  38. ```
  39.  
  40. * 子クラスにおけるクラスの再定義は、新しい宣言を子クラスでするだけで良い
  41. - `redefine` 句に対応するものはない
  42. * Simura67のオリジナルでは、情報隠蔽機構はなかったが、最近の版では
  43. - `protected`: 顧客に利用させたくない場合に宣言する
  44. - `hidden`: ある子孫に対してその機能を利用不可能にできる
  45. * `virtual` で仮想ルーチンを提供する
  46.  
  47. ```simula
  48. class POLYGON;
  49. virtual: procedure set_vertices
  50. ```
  51.  
  52. * POLYGONを継承するTRIANGLEやQUADRANGLEで、`set_vertices` の引数を変更可能にする
  53. - 型チェックが実行時に行われる
  54. * 多相性を提供する
  55. - `qua` を使うことで、動的束縛を可能にする
  56.  
  57. ```simula
  58. ref(A) a1;
  59. ref(B) b1;
  60. ...
  61. a1 :- b1;
  62. a1.f //=> Aのf
  63. (a1 qua B).f //=> Bのf
  64. ```
  65.  
  66. * `inspect` 命令でインスタンス `a1` のクラスに応じて処理を分けることが可能
  67.  
  68. ```simula
  69. inspect a1
  70. when A do ...;
  71. when B do ...;
  72. ```
  73.  
  74. ## 35.1.4 例
  75.  
  76. XXX: 本文参照
  77.  
  78. ## 35.1.5 コルーチンの概念
  79.  
  80. * Simulaはコルーチンを提供する
  81. * 単一のスレッドで動作する擬似的な並列処理
  82. * `resume` と `detach` 命令でコルーチンを操作する
  83. * 各機能がシーケンシャルなプロセスで記述され、主従関係が適切でないときに有用
  84. - 入力と出力のファイルの構造に異なる制約が置かれる場合の、入力から出力への変形
  85. * Simulaのクラスは本体(body)を持っており、通常インスタンスの初期化に使われるが、コルーチンではそれがプロセスに当たる。
  86.  
  87. ```
  88. while continuation_condition do begin
  89. ...Actions...
  90. resume other_coroutine;
  91. ...Actions...
  92. end
  93. ```
  94.  
  95. * コルーチンオブジェクトを作成するメインプログラムを生成し、それらのうちの一つを再開する
  96.  
  97. ```
  98. corout1 :- new C1; corout2 :- new C2,...
  99. resume corout1
  100. ```
  101.  
  102. * `C1` を生成したあとにC1のプロセスが開始されるとメインスレッドが制御を取り戻せず `C2` を生成できなくなる
  103. * `detach` 命令を通して制御を取り戻す
  104. - コルーチン本体はたいていdetachから始まり、その後にループが続き、メインプログラムまたは他のコルーチンが `resume` するまで保留される
  105.  
  106. ## 35.1.6 コルーチンの例
  107.  
  108. * 与えられた実数のシーケンスを印刷する。ただし、
  109. - 8の倍数の番の数値はスキップすること
  110. - 6個出力したら改行すること
  111. - 与えられた数のうち最初の1000個のみ含めること
  112. * この問題は、限定されたロジックを持つ3つのプロセスを含んでいるのでコルーチンを使用する代表的な例
  113. * 3つのコルーチン
  114. - プロデューサー(入力)
  115. - プリンタ(出力)
  116. - コントローラ
  117.  
  118. ## 35.1.7 順次実行と継承
  119.  
  120. * クラスCが親Aを持っている場合、本体の実行順序は、
  121.  
  122. ```
  123. actual_bodyA; bodyC
  124. ```
  125.  
  126. になる
  127.  
  128. * この実行順序が望むものでないとき、 `inner` 命令を使って変更可能
  129. * Aの本体を次のように書けば、
  130.  
  131. ```
  132. instructions1; inner; instructions2
  133. ```
  134.  
  135. Cのbodyの実行順序は、
  136.  
  137. ```
  138. installation1; bodyC; installation2
  139. ```
  140.  
  141. になる。
  142. が、不便である
  143.  
  144. * 基本的にインスタンスを作る必要あることが多い
  145. * Cのような子孫の本体は複雑になっていく
  146.  
  147. ## 35.1.8 シミュレーション
  148.  
  149. * Simulaは離散的イベントシミュレーション用として1セットのプリミティブを持っている
  150. * シミュレーションのソフトウェアシステムは、外部システムの振る舞いを分析し、予測する
  151. * 離散的イベントシミュレーションのソフトウェアシステムは、任意の時点で、不連続の瞬間で生じるイベントに応じて変わる状態を持つ外部システムをシミュレートする
  152. * 分析的なモデリングは、外部システムを数学的なモデルを構築し、その方程式を解決するアプローチ
  153. * 離散的イベントシミュレーションは長時間にわたって外部システムをシミュレートしなければならないので、分析的なモデルは効率的である
  154. * しかし、多くの物理的なシステムは複雑すぎるので現実的で制御しやすい数学的なモデルを導くことができない
  155. * 多くの外部システムは、離散的イベントがシミュレーションに本質的に向いている
  156. * 離散的イベントモデルは、外部システム時間、またはシミュレート時間と呼ばれる時間をトラッキングしなければならない
  157. * こういったシミュレーション独特の機能は、ライブラリクラス`SIMULATION`で提供される
  158. * SIMULATIONはクラスPROCESSの宣言を含んでいる
  159. * プロセスは次の4状態のうち一つになる
  160. - 活動中(active)
  161. - 保留された(suspended)
  162. - アイドル中(idle)
  163. - 修了した(terminated)
  164.  
  165. ## 35.1.9 シミュレーション例
  166.  
  167. XXX: 本文参照
  168.  
  169. ## 35.1.10 Simula: その評価
  170.  
  171. * Algol60同様商用的成功には恵まれなかったが、多くの知的影響を後続の言語に与えた。
  172. * 商用的失敗の重要な原因は、「早く来すぎた」こと
  173.  
  174. # 35.2 Smalltalk
  175.  
  176. * Smalltalkに対するアイデアはAlan Kayとグラフィックスの分野において活動中だったグループにおいてユタ大学で1970年頃に固められた
  177.  
  178. ## 35.2.1 言語スタイル
  179.  
  180. * Smalltalkは型がないスタイルのLispとSimulaの影響を組み合わせている
  181. * 動的束縛を採用し型チェックは実行しない
  182. * オブジェクトに対して「メソッドを送る」
  183. * 特徴として、クラスとオブジェクトの明確な区別が欠如している
  184. - Smalltalkシステムの中のすべては、クラス自身を含めてオブジェクト
  185. - クラスは、メタクラスと呼ばれるより高いレベルのクラスのインスタンスとして見られる
  186. - クラス階層がシステムの中の要素すべて包含することを可能にする
  187. - 階層のルートにはobjectと呼ばれるもっとも高いレベルのクラスがある
  188.  
  189. * このアプローチは
  190. - 一貫性: すべてオブジェクトに従う
  191. - 環境有効性: シンボリックデバッガが作りやすくなる
  192. - クラスメソッド: インスタンスに対するだけでなく、クラスに対してもメソッドを定義できる
  193.  
  194. ## 35.2.2 メッセージ
  195.  
  196. * Smalltalkは、単項演算子、キーワード、二項演算子の3つの形式のメッセージを定義する
  197. * 単項メッセージ: パラメータのないメソッド呼び出し
  198.  
  199. ```smalltalk
  200. acc1 balance
  201. ```
  202.  
  203. * キーワードメッセージ: 引数をもったメソッド呼び出し
  204.  
  205. ```smalltalk
  206. point1 translateBy: vector1
  207. window1 moveHor:5 Vert:3
  208. ```
  209.  
  210. * 二項演算子: 算術演算する。が、優先順位はないため括弧を用いて演算順位をプログラマが細かく制御する必要がある
  211. * Smalltalkのクラスはメソッドだけを公開する。属性を公開するためには、その値に対して、アクセスするメソッドを定義する必要がある
  212. * 継承は、単一継承に制限されている
  213. - 再定義されたメソッドからオリジナルの呼べるように、`super`が提供されている
  214. * 束縛はすべて動的である
  215. * 暫定ルーチンはないが、有効な定義がCの適切な子孫にだけ現れるメソッドに対応するメッセージをクラスCが受け取った時にエラーを起こすための実行時メカニズルムを提供している(Rubyでもよく書く)
  216.  
  217. ```
  218. rotate: anAngle around:a Point ||
  219. self shouldNotImplement
  220. ```
  221.  
  222. ## 35.2.3 環境とパフォーマンス
  223.  
  224. * Smalltalkの魅力は、プログラミングを支援する環境にある
  225. * ガーベジコレクションのサポート
  226. * コレクション、辞書といったライブラリの提供
  227. * 静的片付けの欠如は、Smalltalkで開発されたソフトウェアシステムの効率に恐ろしい障害を証明した
  228.  
  229. ## 35.2.4 Smalltalk: その評価
  230.  
  231. * Smalltalkはオブジェクト技術の概念に対話型の技術を関連させることにより、Simulaの抽象オブジェクトを理解可能な視覚的なオブジェクトに変え、大観衆に訴えるのに役にたった
  232. * CあるいはC的な開発にノーという人が惹きつけられた
  233. * Lispの衰退によってSmalltalkに流れた
  234. * Smalltalkはプロトタイプを作り実験するために優れたツールである
  235. * 企業がSmalltalkに重要な生産開発を任せることは合理的ではない
  236.  
  237. # 35.3 Lispの拡張
  238.  
  239. * Lispは、備えている言語機能の特性からいくつかのオブジェクト指向の拡張の基礎として役立った
  240. - オブジェクト生成への高度に動的なアプローチ
  241. - ガーベジコレクションをもった自動的なメモリ管理
  242. - 木のようなデータ構造の簡単な表現
  243. - 豊富な開発環境
  244. - 動的束縛の実装を促進する操作の実行時選択
  245.  
  246. # 35.4 Cの拡張
  247.  
  248. * 1980年代終わりの近く、非オブジェクト指向であるCに対してオブジェクト指向拡張を追加した言語、Objective-cやC++が商業的成功に起因した
  249. * Objective-cは **直交** のアプローチ
  250. - 予期しない衝突を回避して移行をより容易にするもの
  251. * C++は **合併** のアプローチ
  252. - より一貫して言語に結びつくもの
  253.  
  254. ## 35.4.1 Objective-C
  255.  
  256. * Brad CoxによってStepstone Corporationで設計された
  257. * CにSmalltalkの概念を直交させたもの
  258. * NEXTSTEPワークステーションとOS用の基本言語
  259. * 重点は多相性と動的束縛にあるが、静的な型付けを提供することによりSmalltalkモデルから離れた
  260.  
  261. ```objective-c
  262. Proceedings: Publication {id date, place; id articles;}
  263. + new { return [[super new] initialize]}
  264. - initialize { articles = [OrderedCollection new]; return self;}
  265. - add: anArticle { return [contents add: anArticle]; }
  266. - remove: anArticle { return [contents remove: anArticle]; }
  267. - (int) size { return [contents size]; }
  268. ```
  269.  
  270. ## 35.4.2 C++
  271.  
  272. * 1986年頃AT&Tベル研究所において、Bjarne Stroustrupによって設計された
  273. * 産業的開発の首位を素早く獲得
  274. * Cとほとんど完全に上位互換性を保つ
  275. * 情報隠蔽
  276. * 継承の支援。オリジナルのバージョンは単一継承のみだったが、現在は多重継承を提供している
  277. * 静的束縛。仮想関数による動的束縛もサポート
  278. * 純粋仮想関数は暫定の機能に似ている
  279. * Cよりも厳密な型付け
  280. * GCはない
  281. * デストラクタの概念
  282. * 例外処理
  283. * 試行代入の形式。ダウンキャスト
  284. * 総称性の形式。テンプレート
  285. * 演算子オーバーロード
  286. * assert命令(前提条件、終了条件、クラス不変式といった契約の支援ではない)。
  287. * さまざまな供給者から入手可能なライブラリ
  288.  
  289. ## 35.4.3 複雑さ
  290.  
  291. * C++のサイズは初期の版から相当に増大した
  292. * C++の提案者自身がその機能について必要性があるのかどうか疑問視しているものもある
  293. * プログラミング言語は、堅固で、強力で完全に理解される合理的な個数の概念に基づくべきである
  294.  
  295. ## 35.4.4 その評価
  296.  
  297. * それほど習慣的でなかったオブジェクト技術の開発を後押ししたことが、C++の最大の長所である
  298.  
  299. # 35.5 Java
  300.  
  301. * バイトコードとバイトコードプログラムを解釈実行するバーチャルマシンという実装技術が言語としての成果
  302. * 再コンパイルが不要というアドバンテージ
  303. * (総称性がないという話だがJava 5で導入された)
  304. * 問題:
  305. - 表明支援がない
  306. - 実行時型チェックに対する部分的な信頼
  307. - 複雑なモジュールの構造(クラス、パッケージ、ソースファイル)
  308. - Cから残された不可解な構文
  309. * 問題はあるが、ポータブルソフトウェアの開発に対して作った貢献を減じるものではない
  310.  
  311. # 35.6 他のオブジェクト指向言語
  312.  
  313. * Oberon
  314. - Modula-2の後継者でプログラミング、ハードウェア支援も含んでいるより一般的なプロジェクトの一部
  315. * Modula-3
  316. - Modula-2を基とするクラス状のレコード型をもったモジュール言語
  317. * Trellis
  318. * Sather
  319. * Beta
  320. * Self
  321. - クラスはなく、型の間ではなくオブジェクト間の関係として継承を支援する「プロトタイプ」に基づく
  322. * Ada 95
  323. * Borland Pascal
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement