swarm中文手冊(cè)_第1頁
swarm中文手冊(cè)_第2頁
swarm中文手冊(cè)_第3頁
swarm中文手冊(cè)_第4頁
swarm中文手冊(cè)_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Swarm用戶指南Swarm開發(fā)組Paul Johnson堪薩斯州大學(xué)政治科學(xué)系A(chǔ)lex Lanchaster圣塔菲研究所譯者 柳泉波北京師范大學(xué)信息學(xué)院brookwithySwarm用戶指南Swarm開發(fā)組Paul Hohnson 和 Alex Lancaster2000年4月10日出版Copyright © 1999-2000 Swarm開發(fā)組Swarm仿真系統(tǒng)的用戶指南本文檔是由CASA有限公司的Benedikt Stefansson(以前在UCLA的經(jīng)濟(jì)系工作)在1998和1999年的SwarmFest上發(fā)表的S

2、warm教程材料發(fā)展而來的。分三個(gè)階段逐步深入的討論了Swarm工具:第一部分是Swarm的簡(jiǎn)介;第二部分深入地剖析了Swarm程序;第三部分則詳細(xì)討論了用戶在使用Swarm開發(fā)程序時(shí)可那遇到的種種問題。鼓勵(lì)用戶探索Swarm提供的樣例程序,并訪問Swarm站點(diǎn)()來了解最新消息和加入Swarm郵件列表。Paul Johnson的工作,由國(guó)家科學(xué)基金會(huì)的基金(SBR-9709404)部分支持。Paul是主要的作者,提供了指南的主要材料。Alex Lancaster負(fù)責(zé)有關(guān)SGML的大部分工作即在DocBook(見書末)中的錘煉和標(biāo)記問題,并提供了補(bǔ)充材料和

3、正文。有關(guān)Swarm用戶指南的許可說明復(fù)制本文檔需要預(yù)先獲得版權(quán)持有者(Swarm開發(fā)組)的書面版權(quán)許可,合理的個(gè)人使用或者用于教育目的不在此禁。不允許大量分發(fā)本文的復(fù)制品或者將之用于牟利。生成本文檔的SGML源文件以及相關(guān)程序在文件包userbook-0.9.tar.gz(/pub/swarm/userbook-0.9.tar.gz)。只要遵循GNU一般公共許可(GPL,/copyleft/gnu.html),那么使用、復(fù)制、修改和分發(fā)swarmdocs包及其生成的文檔(包括HTML、TeX、dvi、PostScript和

4、RTF格式)是允許的。目 錄PART I 基本概念4第一章 介紹4第二章 程序設(shè)計(jì)和仿真7第三章 面向?qū)ο蟪绦蛟O(shè)計(jì)詳論11第四章 Swarm的開發(fā)思想19第五章 圖形用戶接口23PARTII Swarm應(yīng)用:樣例演示27第六章 Swarm教程27附錄A. Swarm工具90附錄B Objective C-Swarm風(fēng)格93PART I 基本概念第一章 介紹Swarm項(xiàng)目由Chris Langton于1994年在新墨西哥州的圣塔菲研究所(Santa Fe Institute,,SFI)啟動(dòng)?,F(xiàn)在由圣塔菲研究所的非盈利性組織Swarm開發(fā)組(http:/w

5、)負(fù)責(zé)。目的是為基于多主體仿真模型(即所謂的ABMs,Agent-Based Models的縮寫)的開發(fā)提供一系列標(biāo)準(zhǔn)的計(jì)算機(jī)工具并成為研究者交流的中介。有了Swarm,研究者可以專心于建模任務(wù)的本質(zhì),避免編程的某些復(fù)雜細(xì)節(jié)。有很多程序員對(duì)Swarm項(xiàng)目作出了貢獻(xiàn):Roger Burkhart,Nelson Minar,Manor Askenazi,Glen Ropella,Sven Thommesen,Marcus Daniels,Alex Lancaster,Vladimir Jojic,和Irene Lee。1.1 有關(guān)Swarm的基本事實(shí)Swarm提供了一系列支

6、持仿真程序設(shè)計(jì)的軟件庫。最顯著的特點(diǎn)包括:l Swarm的代碼是面向?qū)ο蟮?。Swarm庫由名為“Objective-C”的計(jì)算機(jī)語言編寫而成,這種語言是C語言的超集。Objective-C提供了創(chuàng)建軟件“類”的能力,進(jìn)而可以創(chuàng)建實(shí)例個(gè)體,實(shí)例是自包含的實(shí)體。面向?qū)ο蟪绦蛟O(shè)計(jì)的術(shù)語非常適合基于主體模型的討論。l Swarm程序是層次結(jié)構(gòu)的。大部分swarm應(yīng)用程序大體具有如下的結(jié)構(gòu)。首先,創(chuàng)建最頂層的一級(jí),通常叫做“observer swarm”?!皁bserver swarm”負(fù)責(zé)屏幕的顯示,以及創(chuàng)建下一層,叫做“model swarm”。然后,“model swarm”創(chuàng)建主體個(gè)體,調(diào)度主體

7、的活動(dòng),搜集有關(guān)主體的信息,并在“observer swarm”需要的時(shí)候提供。l Swarm提供了很多方便的工具。在手冊(cè)的后續(xù)部分不難發(fā)現(xiàn),Swarm庫提供了很多有利于基于主體模型設(shè)計(jì)的代碼。這些工具方便了內(nèi)存的管理,表的維護(hù),活動(dòng)的調(diào)度以及其他很多瑣碎工作。用戶通過將Swarm對(duì)象集成在自己的程序中創(chuàng)建仿真應(yīng)用。建議用戶仔細(xì)研究提供很多的樣例程序,以便充分的利用Swarm庫的功能,充分體會(huì)個(gè)中蘊(yùn)含的建模策略。1.2 Swarm是一個(gè)動(dòng)態(tài)平臺(tái)Swarm是自由軟件(/philosophy/free-sw.html)1 有時(shí)也指“開源”(open source)

8、軟件,有關(guān)開源的定義參看/osd.html。當(dāng)前版本的Swarm,遵循2 Swarm庫的核心遵循LGPL(/copyleft/lgpl.html)許可,但是標(biāo)準(zhǔn)的二進(jìn)制發(fā)布包括了遵守GPL許可的部件,這意味著Swarm是遵守GPL的。GNU General Public License(GPL,/copyleft/gpl.html)許可。無論是從理論或?qū)嶋H方面考慮,軟件開發(fā)的自由軟件模式都對(duì)像Swarm這樣的工具特別有效。l 完全可觀察。由于提供了完全的源代碼,因此在必要時(shí),建模

9、者可以在操作系統(tǒng)級(jí)別上跟蹤方針的執(zhí)行。這對(duì)于可重復(fù)性是很重要的,最終使得建模者可以(在抽象的數(shù)學(xué)意義上)證明仿真的正確性。l 共享開發(fā)者的智慧。更實(shí)際的原因是,由于Swarm是開源的,我們可以利用開發(fā)者的智慧:技術(shù)水平比較高的開發(fā)者能找出Swarm的缺陷,編寫補(bǔ)丁程序,實(shí)現(xiàn)新的特性等。GNU/Linux操作系統(tǒng)能夠快速而健壯的成長(zhǎng)也是由于類似的原因DiBona等,1999。隨著Swarm的發(fā)展,越來越多的程序員和建模者將參與進(jìn)來。Swarm的開發(fā)工作目前由位于新墨西哥州圣塔菲的Swarm開發(fā)組()負(fù)責(zé)。開發(fā)結(jié)果定期發(fā)布在Internet上,用戶可以訪問相應(yīng)

10、的源代碼。Swarm的開發(fā)者們特別希望用戶下載代碼,進(jìn)行試驗(yàn),改進(jìn)和增強(qiáng)Swarm的功能。采取開源策略的目的是能夠綜合整個(gè)研究社區(qū)的貢獻(xiàn)。當(dāng)Swarm的用戶對(duì)庫做了改進(jìn),我們鼓勵(lì)他宣布出來并供他人使用。社區(qū)和Swarm團(tuán)隊(duì)的這種交互,使得Swarm庫可以經(jīng)常被修訂。為了對(duì)此有所了解,簡(jiǎn)要介紹一下本項(xiàng)目的歷史。原先Swarm的目的是用于支持X Windows系統(tǒng)的Unix操作系統(tǒng)的。Swarm的第一個(gè)測(cè)試版發(fā)布于1995年。1997年1月,Swarm 1.0正式發(fā)布,必須運(yùn)行在Solaris和Linux操作系統(tǒng)上。不久,改進(jìn)版的Swarm支持DEC Alpha平臺(tái)以及其他Unix的變體。1998

11、年4月,Swarm 1.1發(fā)布,其應(yīng)用范圍進(jìn)一步擴(kuò)展。在Cygnus Win32軟件包的支持下,Swarm可以在微軟Windows 95/NT(現(xiàn)在是98)上運(yùn)行。1999年下半年,Swarm 2.0和2.0.1發(fā)布,增加了Java層使得Java程序員可以調(diào)用Swarm庫,支持?jǐn)?shù)據(jù)輸出為NSCA HDF51 層次數(shù)據(jù)格式,適用于科學(xué)數(shù)據(jù)的存儲(chǔ),詳情參考/。格式。由于Swarm仍在發(fā)展當(dāng)中,因此很難精確的預(yù)測(cè)它的開發(fā)路徑。目前Swarm開發(fā)組的工作重點(diǎn)是使得Swarm可以工作在更多的平臺(tái)上,有更多的計(jì)算機(jī)語言支持。例如,Swarm的XML和Schem

12、a層原型已經(jīng)通過測(cè)試。1.3 成功使用Swarm的前提Swarm的出發(fā)點(diǎn)是為設(shè)計(jì)多主體模型提供一系列的標(biāo)準(zhǔn)化方法。Swarm庫的用戶并不需要是一個(gè)技術(shù)高超的程序員2 這里的英文原文是“One need not be a highly accomplished computer program to user the Swarm libraries”,疑為“One need not be a highly accomplished programmer to use the Swarm libraries”的誤寫。實(shí)際上,由于Swarm的安裝過程非常的流水線化,因此只要有合適的硬件平臺(tái),任何人都

13、可以輕松的測(cè)試Swarm的樣例應(yīng)用程序。對(duì)于使用Windows 98/NT或Linux操作系統(tǒng)的用戶來說,已經(jīng)有編譯好的Swarm庫可用,安裝就更加輕松了。然而,要?jiǎng)?chuàng)建新的Swarm應(yīng)用并非易事。因?yàn)榇藭r(shí)需要生成一個(gè)計(jì)算機(jī)程序。即使Swarm用戶不是一個(gè)專家級(jí)的程序員,他也必須對(duì)重要的計(jì)算概念有根本的理解。所需要的知識(shí)因要?jiǎng)?chuàng)建的模型而異,但至少,必須具備:l 對(duì)計(jì)算機(jī)程序設(shè)計(jì)的基本理解。l 對(duì)下列兩種面向?qū)ο蟪绦蛟O(shè)計(jì)語言之一有基本的理解:Java或Objective C3 如果要使用Objective C,由于它是C語言的超集,因此具有C語言的經(jīng)驗(yàn)會(huì)很有幫助。Java學(xué)習(xí)起來很簡(jiǎn)單,是一種具有

14、良好的開發(fā)工具和文檔支持的主流語言。Objective-C也是相當(dāng)一流的語言,學(xué)過C的人學(xué)習(xí)起來會(huì)很簡(jiǎn)單。因此,沒有編程經(jīng)驗(yàn)的人在創(chuàng)建基于Swarm的模型之前,需要做一些背景準(zhǔn)備。如果想用Objective-C實(shí)現(xiàn)模型,建議先去找一本有關(guān)C語言的基礎(chǔ)指南,例如“The C Programming Language”Ketnighan & Ritchie,1988。兩位作者是C語言的實(shí)現(xiàn)者,因此本書具有相當(dāng)?shù)目勺x性,是所有人都應(yīng)該拜讀的信息手冊(cè)。如果選擇Java語言實(shí)現(xiàn)模型,市面上有數(shù)以萬計(jì)的Java程序設(shè)計(jì)介紹性材料,包括印刷版的和電子出版物(參看A.1部分)。帶有例子和練習(xí)的手冊(cè)是很

15、重要的,里面解釋了編寫代碼并編譯成可執(zhí)行程序的基礎(chǔ)知識(shí)。Objective-C語言最好是按照在線書籍“Object Oriented Programming and the Objective C Language”NeXT,1993學(xué)習(xí)第二章 程序設(shè)計(jì)和仿真設(shè)計(jì)Swarm的目的是幫助用戶創(chuàng)建低層主體在其中交互的模型(通常稱為“復(fù)雜系統(tǒng)”)。研究者必須對(duì)主體賦以內(nèi)容,例如將主體想象成蜜蜂、投資者、樹木或者臭蟲等。研究目標(biāo)是從個(gè)體水平行為中涌現(xiàn)出的總體模式。圖2-1 基于主體建模面向?qū)ο蟪绦蛟O(shè)計(jì)特別適合表示此類模型。正如我們即將看到的,對(duì)象是自包含的實(shí)體。對(duì)象可傳遞來自于其它對(duì)象的信息,還可以保

16、持、分類和總結(jié)信息。2.1 什么是對(duì)象?想創(chuàng)建具有重要意義Swarm模型,就必須仔細(xì)研究Java和Objective C兩種面向?qū)ο笳Z言的一種。這里的材料只是起總結(jié)和補(bǔ)充的作用,并非完整的教程。對(duì)象有兩部分信息組成:l 變量。系列的變量表示了主體的“狀態(tài)”年齡,財(cái)富,能力,諸如此類。這些變量可以是在C語言中允許的變量類型,如整型(int)、浮點(diǎn)型(float),數(shù)組,指針等。還可以是某種類型標(biāo)識(shí),這意味著該變量是類的實(shí)例。l 方法。方法決定了對(duì)象的行為。通常,要具備從“外部世界”接受信息的方法,向外部發(fā)送消息的方法以及處理信息的方法。變量和方法被賦以有意義的名字,從而提高了代碼的可讀性,例如,

17、goToStore或goHome。對(duì)象通過名為“實(shí)例化”的過程被創(chuàng)建。簡(jiǎn)單地說,代碼被寫成“類”,對(duì)象作為類的實(shí)例被創(chuàng)建。類的實(shí)例或者說是對(duì)象內(nèi)部的變量被稱為“實(shí)例變量”。包含于實(shí)例變量中的信息對(duì)于對(duì)象所有的方法都可用。如果對(duì)象的某個(gè)方法需要具有別的方法不能使用的“私有”信息,此時(shí)需要?jiǎng)?chuàng)建“方法變量”。在Objective-C和Java中,術(shù)語“消息”經(jīng)常代表指示對(duì)象執(zhí)行某個(gè)方法的指令。(對(duì)于那些對(duì)C+比較熟悉的讀者,術(shù)語“成員函數(shù)”與“方法”是同樣的東西)。下面是指示對(duì)象bobDole執(zhí)行方法runForPresident的消息例子。Objective C例子Java例子bobDole ru

18、nForPresident;bobDole.runForPresident();在Objective C中,方法的參數(shù)在方法名字之后用冒號(hào)(:)引入;在Java中,方法的名字完全列在參數(shù)之前。例如,假定方法runForPresident需要一些參數(shù),如參選年份和競(jìng)選伙伴名字等,則對(duì)應(yīng)的消息應(yīng)寫成:Objective CJavabobDole runForPresident:2000 with:bobDole.runForPresident$with (2000,RossPerot);RossPerot;2.2 對(duì)象的種類在Swarm中,有很多類型的主體(見圖2-1)。顯然,如果某個(gè)模型要描述蜜

19、蜂,那么模型中必須包含蜜蜂主體。此外還必須有其他角色的對(duì)象,而且這些對(duì)象并不全都是有生命的。例如,蜜蜂模型中可能有表示其他昆蟲和熊的對(duì)象,還包括表示環(huán)境(樹木,暴風(fēng)雨等)的對(duì)象。通常,模型中還應(yīng)該包含如下功能的對(duì)象:使得建模過程更加方便,搜集有關(guān)仿真的信息并傳遞給研究者。2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的好處面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)特別適合描述自治性主體,因此對(duì)于科學(xué)家和建模者來說,以O(shè)OP作為基礎(chǔ)是再顯然不過的事情。不僅如此,OOP對(duì)于計(jì)算機(jī)程序員也特別重要。Objective C中的OOP與C+或Java中的OOP并非完全一致,但是這些語言具有某些意義重大的相似。這里我們強(qiáng)調(diào)的是封裝和繼承。2.

20、3.1 封裝對(duì)象內(nèi)的變量的值是私有的,只能通過特別編寫的方法將信息傳遞到對(duì)象外部。封裝既具有實(shí)在的意義又具有實(shí)際的意義。實(shí)在的意義是指現(xiàn)在對(duì)單個(gè)角色的表示已經(jīng)假定角色是自包含的實(shí)體,其他角色并不能自動(dòng)訪問該角色內(nèi)部的信息。就像人類之間那樣,對(duì)象之間必須相互傳遞自己內(nèi)部狀態(tài)的信息。封裝的實(shí)際意義也很重要。計(jì)算機(jī)項(xiàng)目可以分解為獨(dú)立的部件(寫成類的代碼),當(dāng)代碼編寫完成以后,每一個(gè)對(duì)象的內(nèi)部細(xì)節(jié)對(duì)于程序員來說有時(shí)并不重要。例如,如果對(duì)象groceryStore能夠?qū)οakeMoney響應(yīng),并完成了被要求的工作,我們可能并不在乎它如何做到的。這通常被稱為“接口”和“實(shí)現(xiàn)”的分離。接口聲明了對(duì)象可以

21、執(zhí)行的方法,而實(shí)現(xiàn)的細(xì)節(jié)則被隱藏起來(見圖 2-2),用戶只需熟悉對(duì)象的接口,而不是它的實(shí)現(xiàn)。2.3.2 繼承每一個(gè)子類都繼承了其超類的變量和方法。繼承能夠發(fā)揮作用,是因?yàn)槊恳粋€(gè)代碼類都被設(shè)計(jì)為某個(gè)超類的子類。例如,在Swarm項(xiàng)目使用的GNU Objective C編譯器中,有一個(gè)最基本的類“object”。Swarm庫在object類的基礎(chǔ)上創(chuàng)建子類,再創(chuàng)建子類的子類,如此反復(fù),直到Swarm項(xiàng)目的程序員可以創(chuàng)建角色的新類為止,新類是SwarmObject的子類。如果程序員需要?jiǎng)?chuàng)建幾種不同的類,并不需要重新編寫每一個(gè)類的。子類可以自動(dòng)擁有父類的所有變量和方法,同時(shí)還可以增加新的方法和變量。

22、已知有一個(gè)名為Store的類,擁有方法takeMoney,創(chuàng)建Store類的子類GroceryStore。那么類GroceryStore的所有實(shí)例都會(huì)對(duì)takeMoney響應(yīng)。如果程序設(shè)計(jì)者想重寫GroceryStore的方法takeMoney,那么需要修訂子類內(nèi)的相關(guān)代碼,這樣,類GroceryStore的所有實(shí)例都將以新的特殊方式對(duì)takeMoney作出反應(yīng)。在子類GroceryStore中的方法將重載超類中對(duì)該方法的定義。2.4 離散事件仿真基于Swarm的仿真是以離散步驟持續(xù)的。對(duì)象被創(chuàng)建出來,然后根據(jù)某種調(diào)度機(jī)制進(jìn)行交互。在仿真運(yùn)行的過程中,主體更新實(shí)例變量的值,并可能被要求向仿真的

23、ObserverSwarm層匯報(bào)自己的狀態(tài)。所以,Swarm中的建模過程與使用非面向?qū)ο笳Z言如Fortran或Pascal的仿真建模具有很大的不同。這些所謂的過程式語言不允許建模者通過繼承復(fù)用類或通過封裝保護(hù)數(shù)據(jù)。下面是用過程語言編寫的仿真樣例:過程語言編寫的仿真樣例 偽代碼1. 獲得參數(shù)2. 初始化 一般是設(shè)置數(shù)據(jù)結(jié)構(gòu)以及對(duì)輸出的支持。3. for 1 to 時(shí)間步驟總數(shù) do :a. for 1 to 主體總數(shù) do :主體i進(jìn)行某些活動(dòng) 這里必須提供保存主體狀態(tài)和實(shí)行行為的數(shù)據(jù)結(jié)構(gòu)。b. 呈現(xiàn)狀態(tài) 輸出的實(shí)現(xiàn)通常留給程序設(shè)計(jì)者自己。4. 退出第三章 面向?qū)ο蟪绦蛟O(shè)計(jì)詳論3.1 Swarm

24、及其多語言支持Swarm不是一個(gè)拿來使用的應(yīng)用程序。Swarm是一系列可以從中選取特性的庫。3.1.1 Objective C一直以來,使用Swarm特性的方法是用Objective C來編寫和編譯程序。用Objective C編寫的模型都具有良好得性能,因?yàn)樗鞘褂帽镜鼗木哂写a優(yōu)化功能編譯器即GCC編譯的。Obective C是Brad Cox設(shè)計(jì)的NeXT,1993,目的是為C語言提供一種優(yōu)雅、面向?qū)ο蟮木哂蠸malltalk語言Goldberg & Robson,1989風(fēng)格的擴(kuò)展。Objective C最主要是用于NeXT計(jì)算機(jī)操作系統(tǒng)的設(shè)計(jì),目前這種系統(tǒng)由Apple公司所

25、擁有,并且是Apple的運(yùn)行時(shí)環(huán)境WebObjects的基礎(chǔ)。3.1.2 Java從Swarm 2.0開始,建模者可以使用Java。Java由Sun Microsystems公司所創(chuàng)建,開始的目的是為嵌入式設(shè)備(如數(shù)字電視的機(jī)頂盒)提供與平臺(tái)無關(guān)的層或接口,原先被稱為Oak。1992年以后隨著WWW的發(fā)展,Oak被重新命名為Java,目標(biāo)也調(diào)整為Web市場(chǎng)?!癢rite once, run anywhere”是Java開始者們的座右銘,其思想是在程序設(shè)計(jì)者和內(nèi)部的芯片體系結(jié)構(gòu)(ix86,Sparc,Alpha)之間增加一個(gè)抽象層,叫做虛擬機(jī)(或解釋器)。Swarm(實(shí)際上,Swarm還可以擴(kuò)展

26、到如Scheme或C+這樣的語言)的Java層將Swarm庫的協(xié)議(protocol)映射為Java接口(interface)。備注:想要了解將Swarm與其他語言和仿真技術(shù)如XML和Scheme集成在一起的最新工作進(jìn)展,參看論文“Integrating Simulation Technologies With Swarm”Daniels,1999。3.1.3 為什么用Objective C編寫Swarm?Objective C并非一種主流程序設(shè)計(jì)語言,因此很自然地要問為什么選擇Objective C來實(shí)現(xiàn)Swarm。原因如下:l Objective C易于學(xué)習(xí)。Objective C在大家都

27、很熟悉的C語言的基礎(chǔ)上增加了一些簡(jiǎn)單的特性。Objective C不允許類重載或者多繼承(雖然使用協(xié)議可以間接達(dá)到這一目的)。l Objective C允許運(yùn)行時(shí)綁定。其他的語言,在程序被編譯的時(shí)候檢查所接受的命令與程序的功能是否匹配;Objective C則將這種檢查推遲到程序運(yùn)行時(shí)。這意味著,例如,可以編寫這樣的程序:首先創(chuàng)建一個(gè)對(duì)象列表,然后給每個(gè)對(duì)象都發(fā)送一條消息。在Objective C中,編譯器不會(huì)理會(huì)列表中對(duì)象的類型。這樣處理的好處是,無需知道命令接收者的詳細(xì)情況,就可以在代碼加入要求接受者執(zhí)行的命令,如此得到的代碼,允許環(huán)境和對(duì)象集合變化和演化。不利之處在于如果對(duì)象接收到消息后

28、要執(zhí)行自己沒有的方法,程序會(huì)崩潰。由于Swarm被組織成協(xié)議的形式,這減少了程序崩潰的可能性,因?yàn)榫幾g器在檢查的時(shí)候發(fā)現(xiàn)聲明某個(gè)協(xié)議的類中并沒有實(shí)現(xiàn)指定的方法,會(huì)提出警告。3.2 Objective C基礎(chǔ)3.2.1 變量類型idObjective C中增加的變量類型是id,這是Objective C中對(duì)象的缺省類型。可將之視為一種特殊的變量類型(實(shí)際上是指向一個(gè)特殊數(shù)據(jù)結(jié)構(gòu)對(duì)象的指針)。所有的對(duì)象都可以用標(biāo)識(shí)self代表自己。如果在代碼中定義了某個(gè)對(duì)象,程序設(shè)計(jì)者想要該對(duì)象執(zhí)行某種方法,標(biāo)識(shí)self就顯得很有必要。例如,假定某個(gè)對(duì)象有一個(gè)名為updateRecords的方法,則當(dāng)接收到命令s

29、elf updateRecords;時(shí),updateRecords命令將被執(zhí)行,從而更新了所有的實(shí)例變量。所有的對(duì)象都可以通過super引用自己的超類。例如:super updateRecords3.2.2 接口文件:類的聲明查看有Objective C代碼的目錄就會(huì)發(fā)現(xiàn),文件總是成對(duì)出現(xiàn)的,如ObserverSwarm.h和ObserverSwarm.m,ModelSwarm.h和ModelSwarm.m等。以“h”為擴(kuò)展名的文件是接口文件(通常被稱為頭文件),以“m”為擴(kuò)展名的文件是實(shí)現(xiàn)文件。圖3.1 Objective C基礎(chǔ)如圖3.1所示,接口聲明了類的名字和超類的名字,然后給出了包含

30、在大括號(hào)內(nèi)的變量列表,然后是該類實(shí)現(xiàn)的方法列表。定義的變量可以在方法中使用(這經(jīng)常被叫做“ivars”,即實(shí)例變量的簡(jiǎn)寫)。樣例3-1 Objective C類(1)interface Bug (2) : SwarmObject (3)int xPos, yPos;int worldXSize, worldYSize; (4)int foodSpace;- set X: (int) x Y: (int) y; (5)- step; (6)- (return_type) look : (direction_type) d; (7)end在上面的代碼中,(1) 實(shí)例變量和方法的聲明(2) 子類(3

31、) 超類(4) 實(shí)例變量(5) 聲明方法set,有兩個(gè)參數(shù)(6) 聲明方法step(7) 聲明方法look,有一個(gè)類型為direction_type的參數(shù),返回值類型為return_type3.2.3 實(shí)現(xiàn)文件:定義一個(gè)類每一個(gè)實(shí)現(xiàn)文件都必須輸入對(duì)應(yīng)的頭文件。以上面定義的頭文件Bug.h為例,對(duì)應(yīng)的實(shí)現(xiàn)文件大體如下所示:#import "Bug.h"implementation Bug- set X: (int) x Y: (int) yxPos = x;yPos = y;return self;- step/bodyreturn self;- (return_type)

32、look : (direction_type) dreturn_type returnval;/body of methodreturn returnval;以上的樣例代碼演示了很多重要的特性。首先,注意方法look指定了返回類型為(return_type)。在本例中,return_type應(yīng)該被某種變量類型所取代,如int,float等。當(dāng)方法look被調(diào)用時(shí),調(diào)用方法的代碼必須能夠接收所返回類型的變量。與之相比,方法step沒有指定返回類型。這意味著將返回缺省類型id。調(diào)用該方法的代碼必須與返回類型一致。命令return self一般用于兩種情況。假定方法的目的不是產(chǎn)生某些輸出而是修改某些

33、實(shí)例變量。例如,假設(shè)某個(gè)程序創(chuàng)建了類Bug的實(shí)例aBug。然后發(fā)送了如下的消息:aBug step此時(shí),調(diào)用方法的代碼不應(yīng)該預(yù)期從代碼中返回任何東西。不像在C語言中一般返回void,程序員可以返回self。在另外一種情況,程序員可能確實(shí)想要返回對(duì)象到一個(gè)列表或另外一個(gè)對(duì)象中,此時(shí)也要返回self。例如下面的代碼:collectBugs addLast: aBug look: aDirection ;3.2.4 C函數(shù) vs. Objective C方法由于Objective C是C語言的超集,因此Objective C方法可以包含任何合法的C命令。一種方法可以返回C函數(shù)可以返回的任何類型,此外

34、,方法還可以返回id(嚴(yán)格地說,是對(duì)象的指針)。在Objective C中方法具有如下的結(jié)構(gòu):- (type) name: (type) arg1 argName2: (type) arg2(body)return returnval;與之相比,C函數(shù)一般如下所示:(type) name ( (type) arg1, (type) arg2) )(body)return returnval;看下面的比較代碼:代碼樣例3_2 C vs Objective CCObjective Cvoid rnd_move(int i) int tmp_loc; do - rand_move: p id loc

35、; do loc = self tmp_loc = get_rand_loc(); getRandLoc; while ( world at: loc!=nil); pwhile (valtmp_loc!=0) ; va;locationi=0;moveTo: loc; return self; valtmp_loc=i;3.3 Java基礎(chǔ)Objective C和Java之間的最主要區(qū)別是Java并不類分成“聲明”(頭文件)和“實(shí)現(xiàn)”(實(shí)現(xiàn)文件)兩部分。一個(gè)Java類的所有信息都包含在同一個(gè).java文件中。下面的Java代碼等同于樣例3-1中的Objective C代碼。樣例3_3 Jav

36、a類(1)public class Bug(2) extends SwarmObject(3)int xPos, yPos;int worldXsize, worldYSize;(4)FoodSpace foodSpace;public Object setX$Y (int x,int y) (5)xPos = x;yPos = y;return this;public Object step()(6)/ body of step() codereturn this;public return_type look(direction_type d) (7)return_type returnv

37、al;/ body of look() codereturn returnval;(1) 完整的類定義(2) 子類(3) 超類(4) 實(shí)例變量(5) 聲明方法setX$Y(),有兩個(gè)參數(shù)(6) 聲明方法step(),無參數(shù)(7) 聲明方法look(),有一個(gè)類型為direction_type的參數(shù),返回值類型為return_type注意在Java中并沒有id這種類型或其他一般的數(shù)據(jù)類型。所有的變量都必須被分配一種類型,在上例中,實(shí)例變量foodSpace被聲明為FoodSpace。這是由于Java語言是強(qiáng)類型語言。編譯器會(huì)檢查所有變量的所有類型,以確保所有的接收代碼能夠?qū)Φ玫降南⑦M(jìn)行響應(yīng)。除

38、此之外,Objective C和Java代碼之間的最主要區(qū)別純粹是因?yàn)檎Z法的不同。例如,l 在Objective C中,方法名字和參數(shù)是散布的;在Java中完整的方法名字必須列在參數(shù)之前。l 在Java中,使用this而不是self(super在兩種語言中的含義和語法都是相同的)。3.4 類的實(shí)例化實(shí)現(xiàn)類的代碼(也就是Objective C的.h和.m文件,Java的.java文件)后,還要做的工作就是創(chuàng)建類的實(shí)例。3.4.1 實(shí)例化:Objective C風(fēng)格仿真中的角色對(duì)象通常是SwarmObject類的子類。通常使用一對(duì)命令來創(chuàng)建對(duì)象:createBegin和createEnd,這不屬于

39、Objective C語法,是Swarm特有的。假定已經(jīng)存在Bug.h和Bug.m,現(xiàn)在想創(chuàng)建類的實(shí)例。在文件ModelSwarm.m中,建立一個(gè)典型的方法buildObjects,在其中完成所有的對(duì)象創(chuàng)建。例如:/ 摘自ModelSwarm.m,創(chuàng)建Bug的實(shí)例#import "Bug.h"/ 其它的輸入和代碼- buildObjectsid aBug;bug = Bug createBegin: self;/ 設(shè)置主體的永久特性的代碼bug = Bug createEnd;類工廠對(duì)象Bug被告知在ModelSwarm提供的內(nèi)存區(qū)中創(chuàng)建一個(gè)對(duì)象(ModelSwarm就是s

40、elf)。然后對(duì)象aBug被創(chuàng)建,可選的屬性被加入。在后面的部分將深入討論上述細(xì)節(jié)(也可參考附錄B)。創(chuàng)建對(duì)象的實(shí)例不一定要用createBegin/createEnd對(duì),可以簡(jiǎn)單地處理為:aBug = Bug crate: self在基于老版本的Swarm的代碼中,語法有所不同:aBug = Bug create: self getZone;在Objective C中,這種用法仍然是有效的,但是不鼓勵(lì)這么做。由于現(xiàn)在屬于Swarm類型的對(duì)象,跟ModelSwarm一樣,都是內(nèi)存區(qū)域,因此無需再申請(qǐng)一個(gè)放置Bug對(duì)象的區(qū)域了。3.4.2 實(shí)例化:Java風(fēng)格Java使用構(gòu)造函數(shù)來創(chuàng)建類的實(shí)例。

41、創(chuàng)建Java對(duì)象Bug的最簡(jiǎn)單方法如下所示:aBug = Bug (this.getZone();這等價(jià)于前面所述的Objective C樣例。Objective CJavaaBug = Bug create: self getZone;aBug = Bug (this.getZone();注意在Objective C需要明確指出的create:方法在Java中是隱含的。備注:在Java中仍然可能使用create和createBegin/createEnd這種模式,但由于Java是強(qiáng)類型的語言,因而需要更多的工作才能使用上述模式。詳細(xì)情況將在后續(xù)版本的指南中討論。3.5 簡(jiǎn)要的澄清:Objec

42、tive C中的類和協(xié)議讀者需要仔細(xì)研究的一點(diǎn),是Objective C允許創(chuàng)建叫做協(xié)議的實(shí)體。協(xié)議,是一個(gè)對(duì)象可以執(zhí)行的方法列表。Swarm的結(jié)構(gòu)由協(xié)議組成,因此在Swarm的參考材料中,將庫看作是類的集合,每一個(gè)類又與給定的協(xié)議集保持一致。對(duì)Swarm用戶來說,很多情況下都不必區(qū)分類和協(xié)議。最重要的Swarm協(xié)議,如類型Swarm(來自objectbase/Swarm.h)或Swarmobject(來自objectbase/SwarmObject.h),可以將之當(dāng)作類一樣的使用。在Swarm的參考指南中,有所有的協(xié)議的列表。采用CREATABLE協(xié)議的協(xié)議,可以將之視為類工廠對(duì)象。例如,E

43、ZGraph協(xié)議采用了CREATABLE協(xié)議,因此當(dāng)用戶要?jiǎng)?chuàng)建該協(xié)議的實(shí)例時(shí),就可以直接使用。這樣,observer swarm文件就可以用EZGraph創(chuàng)建圖。幾乎所有的Swarm協(xié)議都采用了CREATABLE協(xié)議,因此可以將之視為類一樣的使用。例如協(xié)議SwarmObject,采用的協(xié)議包括Create,Drop和CREATABLE。這意味著SwarmObject可以被視為一個(gè)類,SwarmObject將響應(yīng)createBegin消息,SwarmObject創(chuàng)建的實(shí)例對(duì)象將能響應(yīng)createEnd,drop以及協(xié)議中列出的其他方法。使用協(xié)議的一個(gè)原則性好處是在編譯的過程中,如果用戶代碼試圖向

44、對(duì)象發(fā)送非法的消息,編譯器將發(fā)揮警告信息。例如,有消息通知對(duì)象執(zhí)行方法goOutside,但是主體所采用的所有協(xié)議中都沒有該方法,此時(shí)編譯器將對(duì)此給出警告。粗略地說,采用協(xié)議就好比廣而告之了某個(gè)類所能完成的功能,隨后編譯器確保了個(gè)中的“誠(chéng)信”。如果編譯的標(biāo)志中包含-WERROR,也就是將警告視為錯(cuò)誤,那么出現(xiàn)的警告信息將停止編譯過程。事實(shí)上,Swarm庫的很多重要部件都組織為協(xié)議,但是早期版本的Swarm不如當(dāng)前版本在這方面那么突出。由于協(xié)議的引入,使用約定發(fā)生了改變。在Swarm中,有一個(gè)可用于創(chuàng)建集合的類List。使用老版本的Swarm,程序設(shè)計(jì)者可以創(chuàng)建屬于List類的靜態(tài)類型對(duì)象,如下

45、的代碼所示:List * listofPuppies;lisofPuppies = List create: self getZone;Swarm已經(jīng)不允許用戶采用上述方式靜態(tài)的定位對(duì)象。這樣的代碼將使得編譯器崩潰,因?yàn)樵赟warm中沒有名為L(zhǎng)ist的類,只有上述命名的協(xié)議。從Swarm參考指南中我們知道協(xié)議List采用了CREATABLE協(xié)議,因此錯(cuò)誤不是由于使用List創(chuàng)建listOfPuppies引起的。實(shí)際上,錯(cuò)誤源自listOfPuppies的聲明本身。如果需要定義的變量listOfPuppies由List類項(xiàng)目組成,推薦的方法是創(chuàng)建一個(gè)類型為id的變量,然后用尖括號(hào)指明對(duì)象所采用的

46、協(xié)議:id <List> listOfPuppies;listOfPuppies=List create: self getZone;將listOfPuppies定義為為一般對(duì)象也是合法的:id <List> listOfPuppies;listOfPuppies=List create: self getZone;這種用法是合法的,編譯也不會(huì)存在任何問題。唯一的缺點(diǎn)是如果往listOfPuppies中的對(duì)象發(fā)送了任何不正確的消息都不會(huì)得到警告。由于幾乎所有的Swarm庫重要功能都以協(xié)議的形式實(shí)現(xiàn)并且采用了CREATABLE,因此了解上述細(xì)節(jié)就顯得尤其重要。但是,這并沒

47、有對(duì)程序設(shè)計(jì)的方法進(jìn)行大的改變。Swarm的實(shí)體仍然可以被視為類。第四章 Swarm的開發(fā)思想如前所述,設(shè)計(jì)Swarm的目的是創(chuàng)建層次化的計(jì)算機(jī)對(duì)象。首先,observer類的swarm被創(chuàng)建,從而創(chuàng)建了用戶接口并實(shí)例化model類swarrn,后者創(chuàng)建了后續(xù)層次的對(duì)象,并對(duì)主體的活動(dòng)進(jìn)行調(diào)度。Swarm項(xiàng)目的初始目的之一就是幫助用戶方便地創(chuàng)建高質(zhì)量的代碼。Swarm庫提供了一系列的類:創(chuàng)建仿真對(duì)象,管理內(nèi)存以及調(diào)度主體的活動(dòng)。4.1 主要主體和輔助主體由于計(jì)算機(jī)程序員使用“主體”的方式與科學(xué)家不一樣,因此需要對(duì)術(shù)語的含義進(jìn)行澄清。對(duì)于科學(xué)家來說,主體是指仿真中被建模的具有重要理論意義的實(shí)體;

48、對(duì)于程序員來說,主體的用法就比較廣泛了,有時(shí)候含義等同于對(duì)象。這樣,在對(duì)“基于主體建?!钡挠懻撝杏袝r(shí)會(huì)發(fā)生錯(cuò)位的現(xiàn)象,因此大家對(duì)術(shù)語“主體”的理解不一樣。為此,我們定義類兩類主體:主要主體和輔助主體,以有利于進(jìn)行相關(guān)的討論。所謂的主要主體是指研究中首先要建模的東西,在理論中得到了描述,并具有實(shí)在的重要性。通常在這個(gè)意義上,可以對(duì)重要的“角色”以及角色之間在其中進(jìn)行交互的世界進(jìn)行表示。讓很多新手感到驚訝的是,為了方便主要主體的工作,還需要?jiǎng)?chuàng)建輔助主體。例如,在一個(gè)遵守多數(shù)票當(dāng)選的選舉模型中,可以有像投票者和候選人這樣的主要主體,還可能需要名為計(jì)票員的輔助主體,以便對(duì)選票進(jìn)行計(jì)數(shù)。在大多數(shù)情況下,

49、我們提到多主體系統(tǒng)時(shí),是指主要主體。4.2 (Swarm)面向?qū)ο蟪绦蛟O(shè)計(jì)方式在Swarm中,ObserverSwarm和ModelSwarm的設(shè)計(jì)方式大致一樣。在大多數(shù)類中都會(huì)出現(xiàn)的方法,包括:Objective C Java- createBegin; - createEnd; - buildObjects;createBegin(); createEnd(); buildObjects();- buildActions; -activateIn;buildActions(); activateIn();此外還有涉及對(duì)象的信息的輸入/輸出的方法。習(xí)慣上,這些方法的名字都有前綴get或set

50、。例如:Objective C Java-setParameterValue: (int) value; - (int)Object setParameterValue (int value); intgetParameterValue;getParameterValue();方法setParameterValue能夠?qū)?duì)象的內(nèi)部參數(shù)進(jìn)行賦值;而getParameterValue則使得主體匯報(bào)自己的參數(shù)值。除此之外,還應(yīng)該有針對(duì)于研究問題本質(zhì)的方法。ModelSwarm對(duì)象通常直接子類化于Swarm,是負(fù)責(zé)創(chuàng)建主體的主要對(duì)象,還給主體提供了內(nèi)存區(qū)域,嗯并能對(duì)主體的活動(dòng)進(jìn)行調(diào)度。4.3 Swar

51、m中的內(nèi)存管理在任何仿真項(xiàng)目中,內(nèi)存的申請(qǐng)和釋放都是必需的特性,也是軟件設(shè)計(jì)中最容易出問題的地方。Swarm在內(nèi)存管理方面性能比較卓越,提供了對(duì)用戶透明的相關(guān)庫。在Swarm中,對(duì)象的創(chuàng)建和銷毀涉及一個(gè)概念是內(nèi)存區(qū)域,申請(qǐng)內(nèi)存的“臟活”由庫來處理。在下一部分中,我們將討論對(duì)象的創(chuàng)建方式以及對(duì)存儲(chǔ)區(qū)域的占用。當(dāng)不再需要這些對(duì)象時(shí),程序可以對(duì)對(duì)象發(fā)送drop消息,將之從內(nèi)存中卸載。4.4 buildObjects方法中要做些什么?用戶只須查看幾個(gè)Swarm樣例程序,就會(huì)清楚地發(fā)現(xiàn)創(chuàng)建對(duì)象的重要性。在buildObjects方法中,人們可以發(fā)現(xiàn)不僅有創(chuàng)建在當(dāng)前類中使用的對(duì)象的命令,還有指示下一層主體

52、創(chuàng)建其對(duì)象的命令。以Arborgames模型為例,在其ObserverSwarm的buildObjects方法中,首先是很多用于創(chuàng)建圖形顯示對(duì)象的命令,接著是創(chuàng)建仿真控制面板的命令,仿真控制面板呈現(xiàn)在屏幕上,為用戶提供了開始和停止仿真的能力。需要特別指出的是,在ObserverSwarm的buildObjects方法還觸發(fā)了下一層主體的創(chuàng)建創(chuàng)建了一個(gè)內(nèi)存區(qū)域,并在區(qū)域中創(chuàng)建了一個(gè)ModelSwarm。代碼的樣子大體如下:Objective C JavaforestModelSwarm = ForestModelSwarm create: self;forestModelSwarm = Fore

53、stModelSwarm forestModelSwarm buildObjects;( this.getZone () );forestModelSwarm.buildObjects();在Objective C中,用戶可以發(fā)現(xiàn)舊風(fēng)格的代碼,沒有考慮ObserverSwarm本身就是一個(gè)內(nèi)存區(qū)域的事實(shí)。modelZone = Zone create: self getZone;forestModelSwarm = ForestModelSwarm create: modelZone;forestModelSwarm buildObjects;注意上述代碼最后一行的重要性。第一行代碼創(chuàng)建了Mo

54、delSwarm對(duì)象(即forestModelSwarm),最后一行代碼則通知forestModelSwarm執(zhí)行其buildObjects方法。4.5 在buildActions方法中要做些什么?在標(biāo)準(zhǔn)情況下,buildActions有兩個(gè)重要的部件,創(chuàng)建了兩類對(duì)象:l ActionGroup:“刺激”事件序列l(wèi) Schedule:決定了如何執(zhí)行在ActionGroup中的事件在Arborgames模型的buildActions方法中,有很多有趣的例子。例如,在ObserverSwarm中,有刷新圖形顯示的命令,也有命令指示下一級(jí)的主體執(zhí)行其自己的buildActions方法。在ModelS

55、warm的buildActions中,通常可以發(fā)現(xiàn)仿真的本質(zhì)性動(dòng)作。通知主體或系列主體執(zhí)行各自方法的命令被放在ActionGroup類對(duì)象中,這意味著只要重復(fù)動(dòng)作組,這些命令就會(huì)被重復(fù)執(zhí)行。這種重復(fù)是由創(chuàng)建調(diào)度以及指定重復(fù)次數(shù)的命令控制的。4.6 調(diào)度的合并如上所提到的,在很多不同的類中都可以有buildActions方法。由于在每一個(gè)buildActions方法中都可以創(chuàng)建動(dòng)作組和調(diào)度,因此如何以一種合乎邏輯的方式協(xié)調(diào)這些活動(dòng)就顯得尤為重要。Swarm的一個(gè)優(yōu)點(diǎn)就是維護(hù)了一個(gè)一致的主調(diào)度。每一個(gè)子swarm的調(diào)度都被合并到高一層的調(diào)度中。最后所有的調(diào)度都被合并到最頂層的Swarm。當(dāng)每一層swarm的activateIn方法被調(diào)用時(shí),活動(dòng)的同步是由Swarm Activity庫管理的。調(diào)度的多級(jí)合并意味著模型實(shí)際上可以被視為多級(jí)模型的嵌套。圖4-1 swarm的嵌套體系結(jié)構(gòu)將Swarm視為一個(gè)虛擬計(jì)算機(jī)圖4-2 Swarm虛擬計(jì)算機(jī)在更抽象的層次上講,Swarm庫可以被看作是在操作系統(tǒng)內(nèi)核之上的一層。這種觀點(diǎn)在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論