一歩一歩讀著「Guide: PLT Scheme」,讀到 PLT Scheme 的 Contracts。我使用 Eiffel 的 Design by Contract 多年。感到 PLT Scheme 的 Contracts 設計過於瑣碎。缺少 Eiffel 的簡單明瞭容易使用。
但是 PLT Scheme 的支持者說 PLT Scheme 的設計是健全的。我不禁好奇又感到懷疑。Behavioral Contracts and Behavioral Subtyping 嘗試說明 Eiffel 的問題。但顯然文章的作者不瞭解 DbC。DbC 的設計,在繼承的子類別處,precondition 可以放寬, postcondition 則必須更緊縮。這文章不同意 DbC 的看法。舉了以下例子:J 繼承 I。J 和 I 都有一個函式 m (x)。m 的引數 x 在 I 中的要求是 x>0。在 J 中的要求是 x > 10。於是 Eiffel 的 DbC 認為使用 J 的 m 時 x 可以為 5。但這篇文章認為不行,使用 J 的 m 時 x 必須大於 10。我同意 DbC 的作法。J 是 I 的繼承者,必須繼承 I 的責任和義務。在 I 中認為只要 x > 0 就有資格使用 m 這個函式時,J 的函式設計就必須滿足這條件,否則,J 不應該繼承 I。J 中的 m 寫著 x > 10。只是說明 J 中的 m 承諾在 x > 10 時可以使用 m。透過繼承 J 還同時承諾了 x > 0 時也可以使用 m。因此,雖然 x > 10 這條件有點多餘,但不表示它是錯的。
這讓我對 PLT scheme 的 contracts 設計感到失望,也許這就是為何 PLT Scheme 一直無法推出 Class 的 contracts 的原因:他們根本想錯了。
2009年9月17日 星期四
2008年7月7日 星期一
Forth and Eiffel, lua, prototype
=== 2008/07/08 ===
其實,Forth 不必使用 prototype 的概念來實現物件。
如果所有的 Forth 物件都來自 Eiffel,則可以使用 factory.
variable x
geometry_factory.new_circle x !
x.radius
x geometry_factory.recycle_circle
x 是一個很簡單的 forth 變數。
而 geometry_factory.new_circle 會建立一個圓,把 object id 放在 forth 的資料堆疊上。
不必使用物件堆疊。執行 x.radius 時,會將 x 當成一物件 id ,在 Eiffel 側找到那個物件,找到那物件的 feature radius 並執行。geometry_factory.recycle_circle 會回收 x 指向的物件。
在 Forth 側,不提供物件導向。只提供 x.y 這樣的語法。和 Lua 比較,Lua 也沒有物件導向。只有 table 而已。
如果要對在堆疊頂的物件進行操作,可以用 top.radius 。
一個問題是:這樣的方法,執行速度會很差,因為不論是 x.radius 或是 top.radius ,都必須在執行階段去查詢和物件結合的 prototype ,才知道 radius 做的是什麼事。
解決的方法是想法子在編譯時就決定 x 的型別。所以可以考慮修正如下:
variable x
geometry_factory.new_circle x !
x circle.radius
x geometry_factory.recycle_circle
這樣,程式師必須清楚知道 x 的型別。這方法類似 gtk 的作法。
其實,Forth 不必使用 prototype 的概念來實現物件。
如果所有的 Forth 物件都來自 Eiffel,則可以使用 factory.
variable x
geometry_factory.new_circle x !
x.radius
x geometry_factory.recycle_circle
x 是一個很簡單的 forth 變數。
而 geometry_factory.new_circle 會建立一個圓,把 object id 放在 forth 的資料堆疊上。
不必使用物件堆疊。執行 x.radius 時,會將 x 當成一物件 id ,在 Eiffel 側找到那個物件,找到那物件的 feature radius 並執行。geometry_factory.recycle_circle 會回收 x 指向的物件。
在 Forth 側,不提供物件導向。只提供 x.y 這樣的語法。和 Lua 比較,Lua 也沒有物件導向。只有 table 而已。
如果要對在堆疊頂的物件進行操作,可以用 top.radius 。
一個問題是:這樣的方法,執行速度會很差,因為不論是 x.radius 或是 top.radius ,都必須在執行階段去查詢和物件結合的 prototype ,才知道 radius 做的是什麼事。
解決的方法是想法子在編譯時就決定 x 的型別。所以可以考慮修正如下:
variable x
geometry_factory.new_circle x !
x circle.radius
x geometry_factory.recycle_circle
這樣,程式師必須清楚知道 x 的型別。這方法類似 gtk 的作法。
2008年6月12日 星期四
ATLAST and EDP
=== 2008/06/12 ===
Howard Thomson 將推出 EDP,an IDE for Eiffel。IDE 想必需要個 scripting language。起心動念想將自己改過的 ATLAST 和其整合。比較使用 ATLAST 和使用其他 scripting languages 如下:
1. ATLAST 簡單,容易理解。
2. ATLAST 沒有自己的 type system,容易和 Eiffel 本身的 typing system 結合。
3. ATLAST 沒有自己的 object oriented 架構。可修改使用 Eiffel 的 object oriented 架構。我已為 ATLAST 增加了 object stack,使用 Eiffel 的 object。
4. ATLAST 沒有自己的 GC ,可採用 Eiffel 本身的 GC。
5. ATLAST 建立 FORTH 的基礎上,因此可以用各種 FORTH 最佳化的技巧來最佳化 ATLAST。
6. ATLAST 的核心小,未來可將 ATLAST 以 Eiffel 改寫。或使用 LLVM。
7. 單純將 ATLAST 視為 VM,可為 ATLAST 添加類似 Eiffel 的語法。
Dynamic typed scripting languages:
1. 自有一套 type system,和 Eiffel 會有衝突。
2. 自有一套 object oriented 架構,和 Eiffel 的架構會有衝突。
3. 自有一套 GC ,和 Eiffel 的 GC 會有衝突。
4. 自有一群開發者,不可能將以 Eiffel 改寫。
Howard Thomson 將推出 EDP,an IDE for Eiffel。IDE 想必需要個 scripting language。起心動念想將自己改過的 ATLAST 和其整合。比較使用 ATLAST 和使用其他 scripting languages 如下:
1. ATLAST 簡單,容易理解。
2. ATLAST 沒有自己的 type system,容易和 Eiffel 本身的 typing system 結合。
3. ATLAST 沒有自己的 object oriented 架構。可修改使用 Eiffel 的 object oriented 架構。我已為 ATLAST 增加了 object stack,使用 Eiffel 的 object。
4. ATLAST 沒有自己的 GC ,可採用 Eiffel 本身的 GC。
5. ATLAST 建立 FORTH 的基礎上,因此可以用各種 FORTH 最佳化的技巧來最佳化 ATLAST。
6. ATLAST 的核心小,未來可將 ATLAST 以 Eiffel 改寫。或使用 LLVM。
7. 單純將 ATLAST 視為 VM,可為 ATLAST 添加類似 Eiffel 的語法。
Dynamic typed scripting languages:
1. 自有一套 type system,和 Eiffel 會有衝突。
2. 自有一套 object oriented 架構,和 Eiffel 的架構會有衝突。
3. 自有一套 GC ,和 Eiffel 的 GC 會有衝突。
4. 自有一群開發者,不可能將以 Eiffel 改寫。
訂閱:
文章 (Atom)