我是Smalltalk的新手。我已經閱讀了一些關於它的文章和文件,我對它的概念完整性感到驚訝。它提供了一些實時調試。Smalltalk如何處理程序錯誤?
無論如何,對於程序錯誤,錯誤意味着程序邏輯錯誤,程序中累積的所有變化都是無效的。爲了保證完整性,整個程序應該從某個點重新啓動,整個程序狀態應該是回滾的。
Smalltalk如何處理這個問題? (也許這個問題可以應用於所有動態REPL語言......)
我是Smalltalk的新手。我已經閱讀了一些關於它的文章和文件,我對它的概念完整性感到驚訝。它提供了一些實時調試。Smalltalk如何處理程序錯誤?
無論如何,對於程序錯誤,錯誤意味着程序邏輯錯誤,程序中累積的所有變化都是無效的。爲了保證完整性,整個程序應該從某個點重新啓動,整個程序狀態應該是回滾的。
Smalltalk如何處理這個問題? (也許這個問題可以應用於所有動態REPL語言......)
Smalltalk使用Exception對象。我建議你閱讀有關https://gforge.inria.fr/frs/download.php/26600/PBE2-Exceptions-2010-03-02.pdf
它是菲羅按例本書的部分章節:http://pharobyexample.org/
關於突變,調試等,注意Smalltalk的具體化的東西很多的語言。例如,MethodContext類。這些對象表示VM正在執行的方法上下文。所以你可以檢查它們,並像普通物體一樣和它們一起玩。與CompiledMethod相同。只是爲了好玩,檢查「僞」變量'thisContext':)
如果你想自己回答你的答案,請看一下Debugger類。那麼,您是否想知道在調試器中重新啓動該方法時會發生什麼?然後瀏覽方法#restart在調試器,並按照:)
你問,實際上,「這怎麼能整個計算機回滾到已知狀態?」,因爲Smalltalk的形象是一個虛擬機中和VMWare和VirtualBox一樣。
,我們必須撤消任意副作用的能力,最近(不包括明顯的不可能性就像回滾I/O)可能是亞歷山德羅沃斯的世界,在他的博士論文中描述Experimenting with Programming Languages。至少在一般意義上說:當然可以使用諸如Memento和Command模式之類的東西來實現可撤銷操作。
我想你指的是圖像中的很多對象,在開發和調試時可能會進入不一致的狀態。通常的程序是將代碼存儲在軟件包中,例如(Monticello for squeak/pharo)。當你想要重置的東西時,你會從發行版中獲得一個乾淨的映像,並從包中重新加載代碼。除了包中的代碼外,對於已部署的應用程序,通常還需要重新創建以某種外部形式(如存儲在文件中的序列化表單或dql或noSql數據庫中)存儲的數據對象的信息。因此,您的重置過程將採取新的形象,從包中加載代碼,從外部存儲加載您的數據模型對象。
它不!
從smalltalks我知道他們都不支持這種交易。執行過程中累積的所有副作用都已設置。沒有支持的自動回滾。有研究正在進行如何支持,但沒有什麼可以嘗試AFAIK。這是你必須知道的,如果你正在調試,並且你回到堆棧跟蹤中,那麼這些對象不處於執行時的狀態。你只能看到處於最新狀態的物體。
儘管以通用的方式支持這種方法並不容易,但有一些可能性可以通過程序的設計來解決。最突出的方法是: