18. Case Study : Imperative Objects

Slides:



Advertisements
Similar presentations
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
Advertisements

Scala + Liftフレームワーク その2.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
Javaのための暗黙的に型定義される構造体
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アルゴリズムとプログラミング (Algorithms and Programming)
条件式 (Conditional Expressions)
プログラミング言語論 第10回 オブジェクト指向 情報工学科 篠埜 功.
AspectScope によるアスペクトとクラスのつながりの視覚化
プログラム理論特論 第8回 亀山幸義
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
C#とC++とオブジェクト指向 上甲 健史.
米澤研究室 全体ミーティング 2010/12/22 M2 渡邊裕貴.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
オブジェクト指向入門.
ピカチュウによる オブジェクト指向入門 (新版)
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
プログラミング言語入門.
第11週:super/subクラス、継承性、メソッド再定義
コンパイラ 2012年11月15日
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Java8について 2014/03/07.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
 型推論3(MLの多相型).
Type Systems and Programming Languages
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
Type Systems and Programming Languages ; chapter 13 “Reference”
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
クラスの追加 メソッドの追加 TestCaseの追加 Test Methodの追加.
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
全体ミーティング(9/15) 村田雅之.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

18. Case Study : Imperative Objects Mizukami Tatsuo 2001/06/18

概要 オブジェクト指向の言語をこれまでに学んだ概念を使用して考察する。 Functions Records General recursion Mutable references Subtyping

オブジェクト指向とは? いくつかの一般的な特徴 Multiple representations Encapsulation Subtyping Inheritance Open recursion

簡単なObjectを作成してみる Instance variableのカプセル化し、オブジェクトを操作するためのインターフェース(Method)を定義する。 c = let r = {x=ref 1} in {get = λ_:Unit. !(r.x), inc = λ_:Unit. (r.x) := succ(!(r.x))};

Objectの型 Objectの型とは、メソッドの名前とその型のレコード 型の省略形 c : {get:Unit -> Nat, inc:Unit->Unit}; 型の省略形 Counter = {get:Unit -> Nat, inc:Unit->Unit}; 上のcの型をCounterと表示するには、ascriptionが必要。(ここでは省略)

Representation Type Objectのinstance variables recordの型をRepresentation typeと呼ぶ。 CounterRep = {x: Ref Nat};

Objectを操作してみる Method Invocationとか、メッセージが投げられると言う。 c.inc unit; > unit : Unit c.get unit; > 2 : Nat (c.inc unit; c.inc unit; c.get unit); > 4 : Nat

コンストラクタ オブジェクトを作成に、毎度関数を定義するのは煩雑。コンストラクタ(Object generators)を使用する。 newCounter = λ_:Unit. let r = {x=ref 1} in {get = λ_:Unit. !(r.x), inc = λ_:Unit, (r.x) := succ(!(r.x))}; > newCounter : Unit -> Counter

Subtyping オブジェクトの型にSubtypingを導入。 ResetCounter = { get:Unit -> Nat, inc:Unit -> Unit, reset:Unit -> Unit}; ResetCounter <: Counter RecordのSubtypingと同じ

Basic class Subtypingの導入により、コードの共通部分を1個所にまとめたくなる (Class) 考慮する特徴 継承によるコードの再利用 late binding of self とりあえず無視 visibility annotations, static fields and method, inner class, friend class, et al.

継承を行うための問題点 以前の定義だと、instance variableが子クラスからも全く使用できない。 Instance variable recordを分離する。 以前のクラス用関数はそのrecordを引数に受け取る。

新しいObjectの作り方 counterClass = λr:CounterRep. {get = .. , inc = ..}; > counterClass : CounterRep -> Counter newCounter = λ_:Unit. let r = {x=ref 1} in counterClass r; > newCounter : Unit -> Counter

子クラスの作り方 親クラスのメソッドを定義してから、子クラスのメソッドを再定義する。 resetCounterClass = λr:ResetCounterRep. let super = counterClass r in {get = super.get, inc = super.inc, reset = λ_:Unit. r.x := 1};

同一クラス内のメソッド呼び出しを導入 本質的には関数の相互再帰と同じ。 11章11節のGeneral Recursionの例 ff = λieio:{iseven:Nat -> Bool, isodd:Nat > Bool} {iseven = λx:Nat if iszero x then true else ieio.isodd (pred x), isodd = ... }; r = fix ff; > r : {iseven:Nat -> Bool, isodd:Nat -> Bool}

Class with Self setCounterClass = λr:SetCounterRep λself: SetCounter {get = .., set = .., inc = λ_:Unit. self.set (succ (self.get unit))}; newSetCounter = λ_:Unit. let r = {x=ref 1} in fix (setCounterClass r);

→ [x -> (fix (λx:T1. t2))]t2 Evaluation rules fix(λx:T1. t2) → [x -> (fix (λx:T1. t2))]t2 t1 → t1’ fix t1 → fix t1’ Typing rules Γ├ t1 : T1 → T1 Γ├ fix t1 : T1

使用例 クラスのインスタンスを作成してみるnewSetCounter unit = fix (setCounterClass r1) ;r1= {x=ref 1} = fix (λself. [r -> r1]F) ;F = {get..,set..,..} = fix (λself. F’) ;F’ = [r -> r1]F = [self -> fix (λself. F’)]F’ ;value

子クラスの再考 以前と同様に実装すると childClass = λr : childRep λself : child let super = parentClass r self in { ... <methods> ... }; > childClass : childRep → child → child コンストラクタでselfにはfix tが代入される。 上の定義ではself (fix t)の評価順序が早すぎて、評価が発散してしまう。 (別紙参照)

継承と相互再帰を可能にするには 解決方法 dummy lambda-abstraction reference new primitive

Dummy lambda-abstraction fix tをλ抽象化し、評価を先送りする selfの型(e.g. child)をthunk(Unit → child)に変更する。 methodのレコードをUnitで抽象化する Method Recordのselfの使用個所を(self unit)に変更する 抽象化により、発散しない。(別紙参照) 実行効率が非常に悪い

サンプルクラス setCounterClass = λr:CounterRep. λself: Unit -> SetCounter {get = λ_:Unit. !(r.x), set = λi:Nat. r.x := i, inc = λ_:Unit. (self unit).set (succ((self unit).get unit))};

Reference fixを使用せずに参照を使用する。 selfをmethods recordへの参照。 コンストラクタの最初ではdummy recordを使用し、コンストラクタの最後でdummy recordを本当のMethodが入ったrecordで上書きする。 fixなしより、評価は発散しない。 詳細は別紙参照

サンプルクラス setCounterClass = λr:CounterRep. λself. Source SetCounter. {get = λ_:Unit. !(r.x), set = λi:Nat. r.x = i, inc = λ_:Unit. (!self).set (succ ((!self).get unit))};

Open Recursion selfを利用した場合、親クラスでのMethod呼び出しが、子クラスの呼び出しに変わる場合がある。