• 沒有找到結果。

以Scala研發函數反應式之智慧環境領域專屬語言

N/A
N/A
Protected

Academic year: 2021

Share "以Scala研發函數反應式之智慧環境領域專屬語言"

Copied!
19
0
0

加載中.... (立即查看全文)

全文

(1)

科技部補助專題研究計畫成果報告

期末報告

以Scala研發函數反應式之智慧環境領域專屬語言

計 畫 類 別 : 個別型計畫 計 畫 編 號 : MOST 104-2221-E-004-002-執 行 期 間 : 104年08月01日至105年10月31日 執 行 單 位 : 國立政治大學資訊科學系 計 畫 主 持 人 : 陳恭 共 同 主 持 人 : 廖峻鋒

中 華 民 國 106 年 01 月 22 日

(2)

中 文 摘 要 : 近年來,隨著資通訊科技的快速發展,各式嵌入式計算與感測裝置 (sensor)微型化,我們得以 將具備計算能力的裝置嵌入至各式日常生活的物品、傢俱與家電中 。這些微型感測裝置能夠感知環 境及使用者的相關資訊,再藉由軟體應用程式整合協調,得以推測 使用者意圖並提供適當的服務, 形成所謂具情境感知能力的智慧環境。 智慧環境中要控制分散在環境中的感測設備,應用程式會有一定 的複雜度;再加上為了具備情 境感知的能力,軟體應用程式邏輯通常由外在的情境資訊 (Contexts)觸發,再據以提供特定的計算 服務,因此具有「反應式(Reactive)」的特性,造成傳統程序式 (imperative)的編程思維無法妥善 應用在智慧環境中軟體開發。本計劃以反應式系統為基礎,發展一 套可用於智慧環境應用程式,比 較高階抽象的程式語言工具,旨在透過提供邏輯上較為清淅,可維 護性較高的程式語言工具,以簡 化程式開發的工作,降低開發者的負擔。 具體而言,我們參照了函數式反應程式(functional reactive programming)的概念與原理,定義適合智慧環境應用程式的各種領 域專屬抽象。再以Scala 語言為基礎,發展一函數反應程式嵌入式 領域專屬語言(domain-specific embedded language)以支援這些 領域抽象。並搭配Scala 程式庫工具—Akka,開發支援此程式語言 的中介層服務,建構一個模擬環境與開發工具,以展示我們所支援 的智慧環境應用程式。我們實際開發了數個展示程式來評估本計劃 之成效,此外,我們也特別針對數位互動展演的穿戴式裝置應用 ,進行了實測。 中 文 關 鍵 詞 : 智慧環境,嵌入式領域專屬語言,函數式反應程式

英 文 摘 要 : In recent years, with the rapid development of ICT technology, all kinds of embedded computing and sensing device miniaturization, we were able to have the device of a variety of embedded computing power in everyday items, furniture and household appliances. These miniature-sensing devices can sense the environment and user-related

information to form the so-called context. With the context information, we can develop application systems that will infer from the context the presumed intention of the user to provide

appropriate services, thus forming the so-called context-aware smart environment.

However, due to the distributed and concurrent nature of the devices operating in a smart environment, it is not easy to develop such context-aware applications using

(3)

traditional imperative programming. Developers have to deal with many complex issues such as asynchronous events and temporal requirements, which are tedious and error-prone. Indeed, many researchers have proposed to follow the reactive programming style to develop applications for smart environments.

This project developed a Scala-based domain-specific reactive language for programming smart environments that supports functional reactive programming. Specifically, we first formulate the domain-specific abstractions

appropriate for programming smart environments based on functional reactive programming. Then we implement these domain abstractions and their associated operations into Scala using language-embedding techniques, thus resulting in a domain-specific embedding language (DSEL) in Scala. In the meantime, we also develop a middle-level facility based on Scala Akka library to provide the interface between our language and the underlying smart environments that works as a simulation environment for our project. Finally, we develop a programming tool and implement a few applications using sensors on top of the simulation environment to

demonstrate and evaluate our language and its facilities. 英 文 關 鍵 詞 : Smart environment, Domain-specific embedded language,

(4)

研究計畫內容:

1. 背景與研究目的

數位時代的浪潮下,在可預見的未來,具有計算能力的穿戴式裝置(wearable devices)將和個人 電腦及手機一樣,快速地普及於人們的日常生活中,各式嵌入式計算與感測裝置微型化,讓 Weiser所提出的普及運算(Ubiquitous Computing 或稱 Pervasive Computing)願景得以實現 [1]。近 年來,穿戴式裝置逐漸發展特製、微小且具有計算能力的裝置與感測器讓使用者「穿」在身上的 趨勢,使用者將具備隨時隨地可取得資訊與服務,進一步透過增實境(augment reality)技術,達到 虛實互動的效果。一群配置於使用者身上穿戴式裝置會形成一個穿戴式系統(wearable systems)。 穿戴式系統(wearable system)最早在 1960 年代便已經有學者提出,並實作出雛型 [2]。此類系統除 了形成個人化的計算環境外,也扮演與智慧生活空間結合的一個重要橋樑 [3],而隨著智慧生活科 技近年來快速發展,穿戴式系統與使用者週遭空間的互動能力也相形重要。 理想的穿戴式系統應該具有幾個特色 [4],首先,穿戴式系統必須穩定地 24 小時運作,並且裝 備在人身上時,只在「適當時機」才提供資訊與服務,而不讓使用者感到其工作被干擾。其次, 為了掌握「適當時機」,系統必須了解使用者的心理、自身、週遭環境及與其目前正從事活動相 關的資訊,這些資訊一般統稱為情境資訊(Context)。此一系統必須增強(augment)及協調(mediate) 人與環境的互動,以智慧導覽為例,當使用者走近一幅畫時,配戴的系統偵知後,會通知其智慧 眼鏡,在使用者看到這幅畫的視野旁,標示出作者資訊及創作說明。由上可知,「情境資訊」的 取得、處理與運用是穿戴式系統相關研究的一項重要議題。Amft 等人也有類似主張,他們認為, 對環境的感知能力是穿戴式系統的核心概念之一 [5]。Pascoe 則更進一步指出,情境感知能力 (context awareness)將在穿戴式系統與智慧生活空間的整合扮演重要角色 [6]。 學者們觀察到目前消費者對於穿戴式系統的接受度仍然不如預期。根據 Anderson 與 Lee 在 2008年對消費者進行的一項調查研究顯示,穿戴式系統接受度不如預期的主要原因,在於消費者 購買穿戴裝置商品最主要的考量並非行銷人員所認知的流行、品牌形象(social prestige)或同儕壓 力,反而是使用時的「方便性」、「相容性」與「實用性」[7]。而 Pascoe 所提及的「情境感知能 力」的四個層級即為提升「方便性」、「相容性」與「實用性」的關鍵技術 [6]。舉例來說, Contextual sensing 與 adaption 可提升使用上的方便性;Contextual resource discovery 可確保相容 性;而 Contextual augmentation 則讓使用者可與實際空間互動,加強了實用性。 智慧生活與穿戴式系統的結合,透過應用程式來實現服務管理,在市場上也有一些應用,例 如,應用於數位藝術展演上逐漸受到矚目,但是要控制分散在環境中的感測設備,程式會有一定 的複雜度;在加上為了具備情境感知能力,軟體應用程式邏輯通常由外在的情境資訊(Contexts)觸 發,再以提供特定的計算服務,因此具有「反應式(Reactive)」[11]的特性,造成傳統程序式 (imperative)的編程思維無法妥善應用在智慧環境中軟體開發。因此我們開發的穿戴式以反應式系

(5)

統為基礎,聚焦於發展簡化穿戴式應用程式(Simplicity)和情境感知與推論能力(Context-Awareness) 之的穿戴式系統整合平台。 除此之外,在開發環境中要有適當的容錯性(fault tolerant),能夠在感測裝置與各項設備故障 時,仍能維持一定的運轉,不至於導致全面性的停擺,所以程式語言必須具有良好的例外處理機 制,以因應系統內一些元件的故障狀況。另外,本研究主要應用目的為數位互動展演場域,因此 我們需要針對數位互動展演的穿戴式系統特性進行更進一步的說明我們採用的技術目標。 我們採用一個支援開發結合穿戴式應用的程式語言具備以下設施與機制: (1) 可支援分散式與併行執行環境 (2) 具有可支援非同步時間驅動程式模式的設施 (3) 具有支援領域導向的抽象機制與設施,可直接以 Signal 抽象為基礎建構出更多領域抽象 (4) 具有容錯性高的例外處理機制

(5) 動態成員服務的基礎設施(group member service)

綜合上述,我們使用 Scala 語言[12] 具有強大的抽象機制與反應式程式的支援,例如:Actor 與事件驅動機制,很適合作為開發數位互動展演應用程式的工具。但為求直接支援各種領域抽 象,我們以 Scala 為基礎,發展一個領域專屬語言(domain-specific language, DSL),進一步簡化應 用程式開發工作。而且,Scala 有支援 macro,所有我們利用 macro 提供的語法處理設施,搭配其 他的抽象機制,發展一個基於 Scala 的嵌入式領域專屬語言(domain-specific embedded language,

DSEL)[13],使得我們的應用程式開發人員即可以使用高階的領域專屬抽象,在需要時也可以沿

用 Scala 原本的各項設施。

此外,當初考量到有分散與平行處理的需求,若使用傳統的命令式(imperative)語言,變數狀 態的變化複雜,常產生各種副作用(side effects),使平行程式中必須費力處理 race condition 與

deadlock等的困難議題。因此我們採用函數式語言(Functional languages)的平行程式機制,以避免

變數副作用帶來的困難,而 Scala 是一個兼具物件導向與函數式抽象機制的語言,可以解決問 題。事實上,Scala 語言是可以支援函數式反應程式(Functional Reactive Programming, FRP),其 Akka程式庫[14],提供分散執行的 actors 具有容錯性的成員管理服務(group membership service), 再加上我們使用 Raspberry PI 等的嵌入式裝置上執行 Scala 程式,來展示我們的領域專屬語言的程 式功能。 基於以上背景與動機說明,本計畫研究內容達成的具體目標: (1) 參照函數式反應程式(FRP)的概念與原理,定義適合數位互動展演應用程式的各種領域專 屬抽象。 (2) 以 Scala 語言為基礎,發展領域專屬語言,以支援所定義的領域抽象。

(3) 搭配 Scala 程式庫工具-Akka,開發支援事件驅動式的 Actor 模組,建構一個模擬環境以

(6)

(4) 以 Raspberry PI 設備搭配感測控制版(我們採用 Phidget)連結感測器,開發數個展示程式。

(5) 將以上結果應用於數位展演的穿戴式裝置的程式化控制上。

2. 文獻探討

開發與智慧環境相關的應用程式,很多學者專家都主張這類應用系統屬於反應式系統,使用 反應式程式模式(reactive programming)[15]來建構。例如:Namiot[16]就提出了以 task graph 與 reactive programming 為 基 礎 的 建 議 。 Shweta Khare 等 人 [17] 也 採 用 了 function reactive

programming(FRP)來建構一套即時性的資料流處理系統。FRP 的概念源自於 Ellioott 與 Hudak 的一

篇論文[18],以 Signal[T]來模型化源源不斷的資料流就是 FRP 的一個基礎抽象概念。近來,FRP 應用在其他領域,包含開發動畫、多媒體與圖形人機介面的等,因此我們認為 FRP 也合適於智慧 環境的應用系統。

定義領域專屬語言(domain-specific language, DSL)以方便開發。傳統上,針對特定應用領域發 展程式或腳本語言,以簡化應用程式的開發工作,但多半是設計具有新的語法與語意的語言,實 作上都要重新製作語言處理器,包含 parse 與 code generator 或是 interpreter,比較難有架構性的重 用[13],稱為 external DSL。 隨著程式語言本身抽象機制等的精進,近來許多學者開始提倡與發展

一個強大的程式語言當成主體(host),利用此主體語言的各種擴充設施(extension facilities)與抽象 機制來製定不用重新製作全新的語言,將需要的領域專屬語言構句(contracts)嵌入,稱為嵌入式領 域專屬語言(domain-specific embedded languages, DSEL),也稱為 Internal DSL,具有以下優點:

(1) 發展出來的 DSEL 寫的程式,仍是 host 語言的程式,可以延用主體語言的處理器(parser,

compiler or interpreter)直接執行,不必開發新的語言處理器。

(2) 可以直接使用主體語言的各項語言設施,不必重複定義。

(3) 可以直接使用主體語言的各種開發工具(IDE, debugger 等),不必重新開發。

常見的這類主體語言有動態語言 Ruby[19]與函數式語言 Haskell[20]和 Scala[12]。例如: Cunningham[21]提出以問卷領域專屬語言說明為何容易採用 Ruby 製作 Internal DSL;Leijen 與 Meijer[22]則說明以 Haskell 建構 Internal DSL 的優勢。

近年 Scala 語言是繼 Java 之後受到學術界與產業界一致重視的新一代程式語言,由瑞士洛桑聯 邦大學教授 Martin Odersky 團隊所研發出來的,兼具物件導向與函數式語言的特色,自 2004 年公 布後,陸續擴充並增加許多強大的功能與機制,目前已經為 Twitter、SONY 與 Novell 等國際知名 公司採用,而國內一些網路科技公司,如 Cuibe Messenger 與 VPon 也開始使用。Scala 不僅具備 函數式語言的許多高階抽象機制,也有進階的物件導向模組設施 trait[23],更提供 thread 與 actor 為基礎的平行與分散式程式的程式支援[26]。最近更提供實用 macro[24],非常適合用來 Internal DSL。例如,Miller 等人[25]以 Scala 發展用於模擬 DSEL;Bachrach 等人[27]則應用 Scala 製作一 個硬體設計描述用 DSEL。

(7)

此外,Scala 訴求是提供具延展性的元件抽象(scalable component abstraction)機制[28],也支援 大型開發與微型系統的發展,其編譯器將 Scala 程式編譯成 Java bytecode,所以只要能支援適當 版本的 JVM 設備即可執行 Scala 程式,目前一些行動與嵌入式裝置上都已經有可執行 Scala 的 JVM環境,也就是說,許多學者專家認為可以使用 Scala 於這些裝置上[29, 30]。 3. 研究方法 除一般智慧環境外,我們特別針對數位互動展演的穿戴式裝置應用。這類應用中,表演藝術 家與創作人員藉由將穿戴式裝置結合具有數位互動能力的舞台、燈光效果,導入數位展演應用 中,以大幅增進展演者與空間及與觀眾的互動性。我們使用函數式語言(Functional languages)- Scala語言,其兼具物件導向與函數式抽象機制的語言和強大的設施與機制,可以解決變數狀態的

變化複雜與產生各種副作用(side effects)且方便製作 DSEL。本研究主要目的是為發展適用數位互 動展演場域應用程式,以 Scala 語言為基礎來設計的領域專屬語言(Domain Specific Language, DSL)-Digital Interactive Performance Sketch(以下簡稱 DIPS),因此我們進一步的分析並說明如何 與前述技術目標相結合。

核心的 DIPS先設計裝置(device)的成員與方法類別,將上述各個部的感應器在 DIPS 中以抽象 的方式定義出來,以便透過實體化各個類別的物件來識別各部位的裝置,並且提供這些裝置抽象 資料型態與操作(例如,查詢裝置名稱、裝置會有什麼行為),接著再設計DIPS的語法(syntax)、語 言規則(rule)、訊號流處理 (signal),上述構成了DIPS 領域專屬語言的語意部分,搭配前述 DIPS 環境中裝置的識別封裝。以下將詳述目前所規劃的系統模型與具體作法。 DIPS 語言核心架構設計主要有四個部分: (1) Signal - 描述各種不同型態的訊號與這些訊號的組合方式 為了能夠利用高階語言的抽象化能力來處理低階訊號,DIPS 將接收到的訊號做轉換,以 包裝成程式設計人員不需要考慮時間變化的物件,一個訊號(signal) 物件代表了一個隨著 時間變化的值,來自於感測器接收到的訊號,DIPS 在這個部分提供了訊號之間的運算 元,例如:last、 count、windows、atRate、 >、 < 、 withTime 等,讓訊號物件之間可以 做運算,以左手感應器為例,我們可以建立一個代表座標 x 的裝置屬性 leftHandx,其類 別為 Signal,如此一來,我們就可以在建立物件以後,透過呼叫物件的比較運算方法 「<」,以「leftHandx < 10」來描述「當 leftHandx 的值小於 10」。 (2) Syntax - 定義了語言的高階語法 定義本語言的高階語法,稱之為泡沫詞彙,為提供語言的敘述邏輯,以產生更意義的程 式敘述,此所謂高階語法係指用來描述展演劇本的語言中,用來組合展演動作規則之間 關聯性的關鍵字(keywords),目前主要是 when 與 not 兩個詞彙,以 when 為例:

(8)

def when(condition: Condition)(action:Action) = IfRule(codition, action) 此定義了一個函式 when,這個函式相當於常見程式語言中的條件判斷敘述 if,它可以接 受兩個參數,分別是展演規則的 Condition 與 Action,用以接受條件判斷的敘述(例如兩個 Signal 的邏輯運算)和條件成立時相對應的 動作,並且呼叫 IfRule(condition, action)類別來實現條件成立的動作,而 IfRule 類別中另外設計了用以實現條件不成 立的函式 otherwise,如此一來就可以將成立與不成立串接成: when(condition)({action1}).otherwise({action2}) 由於 Scala 的函式呼叫括號可省略,因此這段敘述就變成如下: when (condition) { action1 } otherwise { action2 } (3) Rule - 定義展演規則狀態變化條件與特效動作的介面 在展演活動中,描述關係狀態變化的兩個要素分別是 Condition 和 Action,前者表示觸發 某個狀態變化的條件(condition),後者描述某個狀態變化應有的動作(action),例如處理角 色要做的動作或是場景變化效果,而這兩者的組合描述了一個展演動作的規則(rule),例 如「當 x 條件成立,做 x 動作」,為了讓一個 Rule 具有判斷條件成立與不成立兩個結果 下的不同動作,在介面中將成立與不成立兩個條件的 action 區別開來。

def action: Action

def elseAction: Option[Action]

注意到兩個代表不同結果對應的動作型態有所不同,因為並非所有條件運算敘述都需要 有反例,DIPS 透過 Scala 所提供的 Option 類別來宣告不成立狀態的動作,當宣告的規則 不需要有條件不成立時的動作,存取 Option[Action] 的值就會是 None,這樣的好處 是我們就不需要去處理,當 elseAction 沒更宣告時的錯誤。

(4) Device - 用來描述裝置與查詢裝置的介面

這個類別被設計用來記錄與描述裝置訊息,例如:裝置名稱(device name)、裝置類型 (device type)、位置(location)、 輸出入(inputs/outputs)、通用唯一識別碼(uuid),

DeviceQuery 提供查詢裝置資訊的方法。此外,Device 提供了 should 函式用來定義一個裝

(9)

val lightOn: Action = light should “on”

這樣我們就定義了一個 light 的行為,表示「light on」,當我們在 Rule 中使用了 lightOn, 且 when 條件成立時執行了 lightOn,則 light 物件(actor)就會收到一個 "on" 的訊息,此時

light 物件就會發送命令指示 Unity 動畫程式內的燈光亮起來。第三個重點實作是 Property

函式,它被用來「包裝」一個裝置的訊號(也就是以開發者的觀點,一個訊號就是一個裝 置的一個屬性),例如:

val leftHandx: Signal[Float] = Property[Float]("leftHandx") 這樣一來,我們就可以透過存取 leftHandx 得到 leftHand 這個裝置的 x 訊號值,並且運用 前述 Signal 中提供的訊號運算邏輯來操作 leftHandx。

圖一:DIPS Core Architecture

圖一顯示了四個核心架構的關係圖,Rule 中定義了建立一個規則的主要、兩種介面 Condition 和 Action 與 Device 可藉由 should 函式來定義一個裝置的行為動作(action),其型別為 Action,而 Device 的 Property 函式可以用來定義一個裝置的屬性(property,即 signal),這些 property 因為都 屬於 Signal 型別,因此可以使用 Signal 中提供的運算子來操作產生一個 condition,更了裝置的

action和由裝置的屬性產生的 condition,我們就可以透過 Syntax 所提供的 when 函式來組合成一

個展演規則(rule),最後利用 instruct 函式註冊這個規則,就可以開始監聽裝置的訊號變化,以根 據規則做反應。

而在Scala 的實作中,有一個用來處理多工運算的框架Akka, DIPS上借用 Actor class 來實作 參與者模式,利用 Stream class來將串流資料物質化(materialize),讓資料串流可以在我們的程式中 以物件的方式做處理,它幫我們處理隨時間不斷改變的資料流,因此DIPS 的設計只需要著重在 這些資料怎麼處理。以下將詳述說明各模型與作法。

(10)

參與者模式善於處理平行處理的(parallel)程式,當接收到訊息的時候,actor 只要負責處理訊 息,針對這個訊息做出一個回應或動作,而一個 actor 只會知道自己的狀態,不會知道其他

actor 的狀態,所以一個 actor 欲改變其他 actor 的狀態,它只能透過傳遞訊息告知其它 actor 應

改變的狀態,但是否改變或已經改變則是由接收到該訊息的 actor 自行決定。

傳統的系統程式採用的通訊模型是共享記憶體(shared memory)或(shared variable),這樣可能會 產生同步問題,假如對共享記憶體或共享變數的操作不是原子性的(atomic),則可能會產生臨 界區間(critical section),此時就需要利用鎖 (lock)來處理互斥(mutual exclusive)議題,如此一來 就會造成行程間的阻塞 (blocked),而 actor model 是透過訊息傳遞(message passing)來互動的,

actor 間沒有一個共有的狀態,於此條件下,每個 actor 只更當接收到訊息時才會做出反應,,

也就不會因為要等待存取臨界區間的資源而阻塞住,達到非同步的程式設計,大大增加了執 行效能。

提供非同步執行事件驅動的程式架構,方便我們指定領域所需的 actor,因此 DIPS 中採用的

actor model 以 Scala 實作的 actor class,可以利用函式將某個類別的物件包裝成參與者,如此

一來這個參與者便可以透過 actor class 的 API 在平行運算環境中彼此溝通。當我們利用 DIPS 設計好一個 rule,我們可以把這個 rule 綁定給一個 actor,這個 actor 會是一個 Listener 的實 體,它會呼叫 Syntax 中定義好的 instruct 函式來解譯與執行綁定的 rule。

implicit class Ruler(actorRef: ActorRef) { def instruct(rule: Rule) {

actorRef ! rule }

}

此外,implicit class機制讓編譯器可依程式的特殊使用環境,進行自動型別轉換,用比較簡潔 易讀的方式表達,而上述程式碼實作的是一個 instruct 函式,因為這個 actor 是個 Listener 的實 體,當要綁定 rule 的 actor 呼叫這個函式時,利用運算子:!,提供訊息,傳送rule給這個 actor, 在 Listener 類別中實作了當類別實體接收到資訊時對應的處理方法。

(2) Reactive stream

在反應式程式設計中,處理串流的物件會不斷的接收資料,並且設計一個函式,來讓使用到 這個資料流的物件可以即時的隨著資料的變化而改變。在 stream class中,提供了 flow的概念,它 是只更一個輸入與輸出的處理階段,在這個處理階段,資料流的每個資料元件會通過一個

materialize 函式,來將資料物質化,物質化後的資料便可由我們設計好的其他函式來做處理,當

資料變化,處理函式便能夠自動因應資料變化所要採取的措施。 (3) Signal[T]

(11)

隨時間變化的數據被抽象為訊號(Signal)的概念,例如:將其感測器裝置產生連續的數據可以 視為一個時間的函數,透過變化 Signal 訊息會傳遞給 actor 或在 actor 之間互傳。在 DIPS 中所 更串流訊號都裝成 Signal[T] 類別的物件,如此便可透過存取該物件取得某特定訊號,此類別 中並提供訊號的相關核心運算,如訊號值的比較(>, <, eq, average, count 等),如此可提供不同 訊號間的相關操作,例如燈窗顏色(light color)屬於一種訊號源,在編劇時可以安排檢查不同燈 光色彩而改變燈光特效,因此編寫 DIPS 時可以編寫如下:

when (lightColor == blue Or lightColor == red){ lightYellow // change light color to yellow } otherwise {

lightGreen // change light color to green }

在第 1 行的 lightColor 即為一已經包裝成物件的燈光色彩訊號,在 when 中的敘述便是引用了 訊號類別所提供的運算,來對訊號值做比較,接著可以得到比較結果是否成立(條件成立與否), 成立則執行第二行的動作,否則便執行第四行的動作。

除此之外,我們採用 MQTT 通訊協定的訊息收發與路由程式為訊息中介程式(broker)。我們在 Phidgets 訊號接收程式選用的 MQTT 實作是較輕型 Paho 的 Java library,而在 DIPS 執行引擎上的 版本則是更強大的 Akka Camel,在 Listener 中一個 actor 會訂閱一個主題,當 actor 被建立出來以 後,此 actor 就會持續監聽這個主題的訊息。

在系統運作的時候,使用者可以採用兩種方式撰寫腳本:

(1) 建立一個新的 Scala 類別檔案,引入語言函式庫後編寫腳本,在透過執行引擎運行腳本

(2) 另一種方式是使用者透過圖形化編輯器以拖拉展演指令元件的方式組合成展演腳本

我們採用上述第二種方法,透過可圖形化編輯腳本的方式轉換成 DIPS 的腳本程式後,由

DIPS 執行引擎根據 DIPS 指令,決定如何與實體裝置或虛擬裝置做互動,並發送訊息至 broker 來

與裝置溝通,而裝置收到 broker 發送來自 DIPS 執行引擎的訊息,便會根據訊息內容做出對應的 變化,而裝置如更狀態變化,亦會發送訊息給 broker 反饋給 DIPS 執行引擎,裝置間亦透過

broker 先行與 DIPS 執行引擎溝通,由 DIPS 執行引擎決定裝置間的互動。

為使 DIPS 編寫者能夠以最簡化且貼近展演描述的文字,而非以工程角度(例如:訊號的轉換) 的方式撰寫腳本,我們將分別獨立於個別檔案中設計,包含裝置(Device)、狀態(State)、動作

(Action) 與 特效(Effect),此四個項目即為展演函式庫。因此,當使用者在編寫腳本時,只需要查

閱客製化腳本的參考手冊,了解更哪些展演語法可以使用,搭配統一的 DIPS 函式庫,即可編寫 腳本,而這些函式庫的獨立設計也更利於客製化,當展演主題變更,例如新增或刪除裝置項目、

(12)

增加狀態項目、動作和特效的擴充與刪減等,以致於需要修改客製化的展演函式庫,則開發人員 只需要修改函式庫檔案即可。 4. 結果與討論 隨著各種智慧環境的服務陸續出現,這些智慧服務都必須通過應用程式來實現,因此本研究 將之與穿戴式裝置結合,聚焦於使用高階的領域專屬抽象,展示我們應用在數位互動展演上所使 用領域專屬語言的程式功能。我們的系統會接收來自展演人員穿配的連網感應器上的訊號,並且 根據導演寫好的腳本規則,自動根據接收到的裝置訊號判斷出該指示虛擬環境做出什麼樣的效 果,以達到展演效果自動變化,完成虛擬與實體展互動的程式支援。 本研究成果貢獻: (1) 描述智慧環境應用程式的常用領域抽象 (2) 實現以上領域抽象 Scala DSL 設計 (3) 開發實現以上 Scala DSL 設計 (4) 以 Akka 設計與開發智慧環境模擬系統 (5) 以此 Scala DSL 開發智慧環境應用程式範例 此外,為提供使用者(例如導演或編劇)可以有直觀的編輯介面,降低程式語言邏輯學習的障 礙,我們開發了一款圖形化編輯軟體 DIPS Creator,如圖二,以 HTTP 協定與 DIPS 執行引擎溝 通,根據 DIPS 劇本編寫者設計的規則,傳送對應命令至虛擬平台,完成虛實平台整合之目的。 為了測試本系統執行 DIPS 的效果,我們設計客製化的裝置與指令,實體裝置採用兩組 Phidgets

1056 角度計(gyroscope),模擬實際演員左手與右手的感應器,這兩組角度計會接在 MacBook Air

上,而其電腦上面運行著 Phidgets 感應器訊號轉送 Java 程式,用以存取 Phidgets 角度計的訊號, 再轉換成 JSON 格式後傳送至 DIPS 執行引擎。

(13)

圖二:DIPS Creator 透過本研究另行開發之簡易版 Unity 動畫模擬器,模擬器中有虛擬角色-大象,當 Unity 收到 來自引擎發送的命令字串時,會解譯命令並使虛擬大象做出對應的動作,或是使場景的燈光效果 改變,以下是腳本情境設定與 Unity 模擬對應動作畫面,如圖三。  實體演員:表演者  虛擬角色:大象 腳本情境 當表演者的左手向上舉起,做出指示大象鼻子舉起來的動作;當魔術師的左手 放下,做出指示大象鼻子垂下來的動作。

測試規則 當 Phidgets 感應器之 LeftHand 的 x 座標值為負值,發送動作 noseRaise 給

Unity ;否則,發送動作 noseLay 給 Unity 測試畫面

圖三:When the actor’s left hand raises up then elephant noses up

將 DIPS 腳本設計的展演詞彙(例如:舉手、打燈),轉化成可以直接拖曳排列的元件,使用者 只需要直接拖曳元件,組合成腳本,引擎程式即可將腳本轉換成對應的 DIPS 程式進行運作。利 用較為口語化方式或接近展演語意的方式敘述展演規則,以實現虛實互動的程式化,並利用抽象 化表達的方式整合了虛擬與實體平台的互動。以較為語意的方式描述展演動作,為客製化展演腳 本函式庫提供了範例。也在設計平台整合測試腳本過程中,透過此展演領域專屬語言來處理感測 器敏感變動的訊號值與自動校準問題,為未來設計訊號與裝置狀態對應提出了參考。 另一方面,我們選定 Scala 語言也是一個非常值得重視的軟體開發工具,它雖然是有學術界研 發出來的程式語言,有著非常深厚的理論基礎,但它的實用性也日益顯著,從企業級應用,到嵌 入式系統,都已經有許多產業的成功案例,例如:Twitter,LinkedIn,Sony,Foursquare,Novell 等國際大型企業都已採用 Scala,國內的一些網路科技公司也開始跟進。因此,我們更應該及早開

(14)

始培育 Scala 開發人員,本研究也希望透過智慧服務在數位互動展演的應用上,藉此深耕 Scala 的 相關技術領域,培養一些 Scala 的軟體專業人員。

參考文獻:

[1] M. Weiser, “The computer for the twenty-first century,” Scientific American, Vol.265, No.3, pp.94-104, 1991.

[2] Thorp, E.O., "The invention of the first wearable computer," Wearable Computers, 1998. Digest of Papers. Second International Symposium on , vol., no., pp.4,8, 19-20 Oct. 1998.

[3] Yong Song; SangKwon Moon; Gyudong Shim; Daeyeon Park, "mu-ware: A Middleware Framework for Wearable Computer and Ubiquitous Computing Environment," Pervasive Computing and

Communications Workshops, 2007. PerCom Workshops '07. Fifth Annual IEEE International Conference on , vol., no., pp.455,460, 19-23 March 2007.

[4] Starner, T., "The challenges of wearable computing: Part 1," Micro, IEEE , vol.21, no.4, pp.44,52, Jul/Aug 2001.

[5] Amft, O.; Lauffer, M.; Ossevoort, S.; Macaluso, F.; Lukowicz, P.; Troster, G., "Design of the QBIC wearable computing platform," Proceedings. 15th IEEE International Conference on Application-Specific Systems, Architectures and Processors, pp.398,410, 27-29 Sept. 2004.

[6] Pascoe, J., "Adding generic contextual capabilities to wearable computers," Second International Symposium on Wearable Computers, pp.92,99, 19-20 Oct. 1998.

[7] Anderson, G.; Lee, G., "Why Consumers (Don't) Adopt Smart Wearable Electronics," Pervasive Computing, IEEE , vol.7, no.3, pp.10,12, July-Sept. 2008

[8] DeVaul, R.; Sung, M.; Gips, J.; Pentland, A., "MIThril 2003: applications and architecture," Wearable Computers, 2003. Proceedings. Seventh IEEE International Symposium on , vol., no., pp.4,11, 18-21 Oct. 2005

[9] Bardram, J.E.; Bunde-Pedersen, J., "IASO - an activity-based computing platform for wearable computing," Distributed Computing Systems Workshops, 2005. 25th IEEE International Conference on , vol., no., pp.484,490, 6-10 June 2005

[10] R. Grimm. One.world: Experiences with a pervasive computing architecture. IEEE Pervasive Computing, 3(3), 2004.

[11] Reactive systems, http://en.wikipedia.org/Reactive_system

[12] The Scala Programming Language, http://www.scala-lang.org/

[13] P. Hudak, Building Domain-Specific Embedded Languages, ACM Computing Surveys, December 1996.

[14] Akka, http://akka.io/

[15] Reactive Programming, http://en.wikipeidia.org/wiki/Reactive_programming

[16] Dmitry Namiot, Manfred Snepe-Sneppe, On IoT Programming, International Journal of Open Information Technologies ISSN: 2307-8162 vol. 2, no.10, 2014.

[17] Shweta Khare et al., Scalable Reactive Stream Processing Using DDS amd Rx, Institute for Software Integrated Systems, Vanderbilt University, TECHNICAL REPORT ISIS-14-103, April, 2014.

[18] Conal Elliott and Paul Hudak, Functional Reactive Animation, Inrernational Conference on Functional Programming, 1997.

[19] The Ruby Programming Language, https://www.ruby-lang.org/zh_tw/

[20] The Haskell programming Language, https://www.haskell.org/haskellwiki/Haskell

[21] Conrad Cunningham, A little language for surveys: constructing an internal DSL in Ruby Processing of the the 46th Annual Southeast Regional Conference, 2008.

[22] Daan Leijen and Erik Meijer, Domain specific embedded compilers, Proceedings of the 2nd conference on Domain-specific languages, Pages 109-122.

[23] Trait, http://en.wikipedia.org/wiki/Trait_(computer_programming)

(15)

[25] Miller et al., Using Domain Specific Language for modeling and simulation: ScalaTion as a case study, Proceedings of the 2010 Winter Simulation Conference(WSC).

[26] Philipp Haller and Martin Odersky, Scala Actors: Unifying thread-based and event-based

programming, Theoretical Computer Science, Volume 410, Issues 2-3, 6 February 2009, Pages 202-220. [27] Jonathan Bachrach et al., Chisel: Constructing Hardware in a Scala Embedded Languages, in Proceedings of the 49th Annual Design Automation Conference.

[28] M. Odersky and M. Zenger, Scalable Component Abstractions, ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications, 2005, pp. 41-57.

[29] Mattia Denti and Jukka K. Nurminen, Performance and Energy-Efficiency of Scala on Mobile Device, Proceedings of the 2013 Seventh International Conference on Next Generation Mobile Apps, Services and Technologies, Pages 50-55.

(16)

科技部補助計畫衍生研發成果推廣資料表

日期:2017/01/22

科技部補助計畫

計畫名稱: 以Scala研發函數反應式之智慧環境領域專屬語言 計畫主持人: 陳恭 計畫編號: 104-2221-E-004-002- 學門領域: 程式語言與軟體工程

無研發成果推廣資料

(17)

104年度專題研究計畫成果彙整表

計畫主持人:陳恭 計畫編號: 104-2221-E-004-002-計畫名稱:以Scala研發函數反應式之智慧環境領域專屬語言 成果項目 量化 單位 質化 (說明:各成果項目請附佐證資料或細 項說明,如期刊名稱、年份、卷期、起 訖頁數、證號...等)         國 內 學術性論文 期刊論文 0 篇 研討會論文 0 專書 0 本 專書論文 0 章 技術報告 0 篇 其他 0 篇 智慧財產權 及成果 專利權 發明專利 申請中 0 件 已獲得 0 新型/設計專利 0 商標權 0 營業秘密 0 積體電路電路布局權 0 著作權 0 品種權 0 其他 0 技術移轉 件數 0 件 收入 0 千元 國 外 學術性論文 期刊論文 0 篇 研討會論文 1 專書 0 本 專書論文 0 章 技術報告 0 篇 其他 0 篇 智慧財產權 及成果 專利權 發明專利 申請中 0 件 已獲得 0 新型/設計專利 0 商標權 0 營業秘密 0 積體電路電路布局權 0 著作權 0 品種權 0 其他 0

(18)

技術移轉 件數 0 件 收入 0 千元 參 與 計 畫 人 力 本國籍 大專生 1 人次 碩士生 3 博士生 0 博士後研究員 0 專任助理 0 非本國籍 大專生 0 碩士生 0 博士生 0 博士後研究員 0 專任助理 0 其他成果 (無法以量化表達之成果如辦理學術活動 、獲得獎項、重要國際合作、研究成果國 際影響力及其他協助產業技術發展之具體 效益事項等,請以文字敘述填列。)  

(19)

科技部補助專題研究計畫成果自評表

請就研究內容與原計畫相符程度、達成預期目標情況、研究成果之學術或應用價

值(簡要敘述成果所代表之意義、價值、影響或進一步發展之可能性)、是否適

合在學術期刊發表或申請專利、主要發現(簡要敘述成果是否具有政策應用參考

價值及具影響公共利益之重大發現)或其他有關價值等,作一綜合評估。

1. 請就研究內容與原計畫相符程度、達成預期目標情況作一綜合評估

■達成目標

□未達成目標(請說明,以100字為限)

  □實驗失敗

  □因故實驗中斷

  □其他原因

說明:

2. 研究成果在學術期刊發表或申請專利等情形(請於其他欄註明專利及技轉之證

號、合約、申請及洽談等詳細資訊)

論文:■已發表 □未發表之文稿 □撰寫中 □無

專利:□已獲得 □申請中 ■無

技轉:□已技轉 ■洽談中 □無

其他:(以200字為限)

3. 請依學術成就、技術創新、社會影響等方面,評估研究成果之學術或應用價值

(簡要敘述成果所代表之意義、價值、影響或進一步發展之可能性,以500字

為限)

本研究提出了智慧環境應用程式以及的常用領域抽象,並設計了一個基於

Scala的領域專屬語言(DSL)來實現以上領域抽象。採用Akka來設計與開發智慧

環境模擬系統,並開發智慧環境應用程式工具與範例以及數位展演的實例。我

們的成果有潛力可應用於其他領域,如果能將開發工具結合Web使用者介面

,將可進一步發展出雲端租用模式,多用戶使用的開發工具。

4. 主要發現

本研究具有政策應用參考價值:■否 □是,建議提供機關

(勾選「是」者,請列舉建議可提供施政參考之業務主管機關)

本研究具影響公共利益之重大發現:■否 □是 

說明:(以150字為限)

參考文獻

相關文件

(三) 使用 Visual Studio 之 C# 程式語言(.Net framework 架構) ,設計 各項系統程式、使用者操作介面,以及報表。. (四) 使用 MS

(二)使用 PHP 語言、MySQL 資料庫與 Apache 伺服軟體開發互

(三)使用 Visual Studio 之 C# 程式語言(.Net framework 架構)、Visual Studio Code 之 JavaScript 程式語言(JavaScript framework 架構) ,搭配 MS

畫分語言範疇(language categories),分析學者由於對語言的研究,發現

語言的意義在於使用 ,而使用又是 因應著不同遊戲情境而定,因此語 言意義具有 豐富性、多變性、..

敦煌患文雖然是禮懺法門的應用文書,有點格式化與過分老套的語言形式,但是卻保存

•三個月大的嬰兒在聆聽母語時,大腦激發 的區域和成人聆聽語言時被激發的區域一

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple