本節書摘來自華章出版社《資訊實體融合系統(cps)設計、模組化與仿真——基于 ptolemy ii 平台》一書中的第3章,第3.3節,作者:[美]愛德華·阿什福德·李(edward ashford lee),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
資料流是一個簡單和通用的計算模型,其中角色的執行由輸入資料的可用性來驅動。它對流(expressing streaming)應用的表示特别有用,其中長資料值序列通過計算選擇路徑,如常見的信号處理和多媒體應用。
sdf是一個簡單的(盡管是有限制的)資料流形式,它能進行大量的靜态分析和有效的執行。ddf更為靈活,但是對它的控制也更具挑戰性,并且執行開銷更大,因為它在運作時進行排程決策的定制。它們兩者可以整合到一個模型中,因于ddf産生額外的開銷,是以僅應用在非用不可的地方。sdf和ddf在模态模型中的良好運用将在第8章解釋。使用sdf和ddf的模态模型提供一個通用的并發程式模型。
補充閱讀:io角色
以下是在io庫中重要的輸入/輸出角色:

filereader和filewriter通過url或者uri從本地磁盤或從指定的遠端位置讀和寫檔案。對于filereader,在一個單個輸出字元串令牌上産生檔案的全部内容。對于filewriter,将每個輸入字元串令牌寫入一個檔案,重寫之前的檔案内容。在這兩種情況下,可以為每次點火給出新的檔案名。為了從标準輸入讀取,指定system.in為檔案名。為了寫入标準輸出,指定system.out為檔案名。linereader和linewriter類似,除了它們每次讀和寫一行。
csvreader和csvwriter讀和寫csv格式或者逗号分隔值(分隔符可以是任何東西,不一定是逗号)的檔案或url。将csv檔案轉換成記錄令牌,并将記錄(record)令牌轉換為csv檔案。檔案的第一行定義記錄的檔案名。為了使用csvreader,需要幫助類型系統決定輸出類型。其最簡單的實作方法是可以用後向類型推斷(backward type inference)(見14.1.4節)。它設定csvreader角色輸出端口的資料類型為最通用的類型,這個類型能被角色下遊接受。例如,如果角色下遊從記錄中提取字段,類型限制将自動地要求那些字段出現并具有相容的類型。也可以強制輸出類型使用[customize→ports]上下文菜單指令。
在io庫中還包含了下面的角色:
arrowkeysensor對鍵盤的方向鍵做出響應,并産生輸出。
directorylisting輸出指定目錄下與命名某一模式相比對的檔案名數組。
練習
3.1.3節補充閱讀:多速率資料流角色中描述的多速率角色與第2章補充閱讀:數組處理角色和補充閱讀:數組建構與拆分角色中描述的數組角色對用sdf建構集合操作(collectiveoperations)很有用,這些都是對資料數組的操作。這個練習探讨利用sdf實作所謂的多對多分散/收集(all-to-all scatter/gather)。具體地說,就是建構一個模型,使它産生以下所示的4個數組,它們的值如下:
并将它們轉換為具有如下值的數組
請用arraytoelements和elementstoarray,以及arraytosequence和sequenceto array(對于後者,可能需要commutator和distributor)。評論方法的優缺點。提示:可能必須明确地将連接配接的通道寬度設定為1。輕按兩下線路并設定值。可能要嘗試用multiinstancecomposite。
如圖3-15中的模型,在例3.15中有讨論。使用iterateoverarray角色實作這個相同的模型,并且隻用sdf訓示器而不用ddf訓示器(見2.7.2節)。
ptolemy ii中的ddf訓示器支援一個稱為actorrecursion的角色,它是一個對包含它的複合角色的遞歸。例如,圖3-16所示的模型實作eratosthenes篩選法,其用來尋找素數的方法詳見kann和 macqueen(1977)。
使用這個角色實作一個計算斐波那契數的複合角色。即複合角色的一次點火需要實作以下點火函數:
f : n → n,對于所有n ∈ n,
圖3-16 在ddf中使用actorrecursion的eratosthenes篩選法
當actorrecursion點火時,它複制分層結構中上層的複合角色(即它的容器,或者它容器的容器等),層次的名稱與它的recursionactor參數值相同。actorrecursion的執行個體用那些與容器比對的端口來填充。這個角色應該視為對特殊種類高階角色的一個高度的實驗實作(experimental realization)。這是一個高階角色,因為它的參數由一個包含它的角色來指定。然而,它的實作是非常低效的。它每次點火所引用的角色的副本會帶來巨大的時間和空間開銷。一個更好的實作方式是使用類似于面向過程語言中所使用的棧幀的方法(stack frame approach)。而它使用的這個方法更像是在運作時複制源代碼并解釋它。為了提高執行效率,如果角色已經提前建立,那麼要避免建立副本。僅憑圖3-16中的圖像,沒有辦法分辨actorrecursion執行個體引用了哪個複合角色。是以,無法從它的可視化表示中真正地閱讀該程式。