謝道旺 何嶺松 高志強



摘 要:測量技術對測量系統的需求具有多變性,在將手機作為手持便攜式測量設備的應用背景下,手機APP傳統通過安裝包升級實現功能更改的方式不利于測量任務的快速展開。為了突破這一限制,對測量系統進行平臺化開發。在測量系統平臺上,提供一系列可復用的虛擬儀器控件,并允許第三方控件以插件形式加載進來?;陧憫骄幊蹋岢鲆环N響應式數據端口變量以及一種響應式控件通訊架構。設計響應式編程腳本,平臺通過加載該腳本語言寫成的頁面腳本即可生成一個虛擬儀器頁面。編程腳本功能分為兩部分:一是聲明虛擬儀器控件并為其傳遞運行參數,二是描述控件間的數據響應關系。通過采用響應式編程方法,可以直接、清晰地描述控件之間的復雜數據響應關系。
關鍵詞:虛擬儀器:響應式編程;動態可重構;測量技術
DOI: 10. 11907/rjdk.191197
開放科學(資源服務)標識碼(OSID):
中圖分類號:TP319
文獻標識碼:A
文章編號:1672-7800(2020)001-0123-07
0 引言
虛擬儀器技術是測量技術與計算機技術相融合而產生的一門技術[1],是指通過將傳統硬件測量儀器軟件化,從而提高測量任務開展的方便性與靈活性,并降低測量成本。傳統基于PC的虛擬儀器發展已十分成熟,并且在各行業得到了廣泛應用[2-5]。
隨著移動互聯網的迅速發展,智能手機已經十分普及,而且隨著智能手機硬件性能越來越強大,使得在智能手機終端開展測量任務成為可能。目前已有不少學者對使用手機開展測量任務進行了研究與探討[6-12],在實際應用中也已有不少案例實現了通過手機開展測量任務,例如應用商店中的噪音測量儀、指南針以及振動測試儀器等。由于智能手機的便攜性,以及智能手機本身集成有藍牙、WiFi等無線傳輸方式,使得在智能手機上開展測量任務相比PC更加靈活與便捷。
測量任務對虛擬儀器程序的需求是多變、動態的,程序固化的虛擬儀器將難以滿足實際測量需求。如果針對不同測量任務都開發不同APP,則工作量過大,用戶往往也接受不了太多APP的下載安裝。實際上,不同測量程序所需的部分功能模塊是可以復用的,在不同測量任務中只需對這些模塊進行動態調整即可。
在手機APP開發領域,為了應對這種多變、動態的業務場景,通常采用一種“平臺化”開發方法。例如Facbook的React Native[3]、阿里巴巴的Weex[4]等,都將APP作為一個系統級別的平臺,然后通過編寫JS腳本的方式開發APP業務功能。由于APP的業務功能是通過加載腳本形式執行的,因此在該平臺下可以通過在線下載腳本與資源實現業務功能的動態更改,而無需更新APP。目前受到廣泛關注的小程序,也是基于相同思想。
本文提出的手機可重構虛擬儀器也是順應“平臺化”思想,在平臺上提供一系列常用的測量模塊控件,然后通過撰寫腳本的形式即可將這些控件有機組織起來,從而滿足不同的測量任務需求。對于平臺內控件無法滿足的測量需求,第三方可以自行開發控件,通過插件形式加載到平臺內。通過該解決方案,在安卓平臺上實現了虛擬儀器的動態可重構,并可通過網絡遠程下載腳本的方式實現虛擬儀器實例的獲取與更新。
響應式編程( Reactive Programming,RP)是為了實現復雜的事件響應系統而提出的一種編程思想[15],目的是簡化復雜事件響應系統的開發,從而避免“回調地獄”的繁瑣。響應式編程是一種聲明式編程,其本質上是對觀察者模式的高度封裝。例如在響應式編程下編寫“a≥b+c”,并不是對a進行賦值操作,而是進行一種數據響應關系的聲明。當b或c的值發生變化時,a值也會隨之發生變化,并保證a等于b加c的值。響應式編程實現的主要方式是:搭建一種響應式程序框架,然后通過一些簡單的API或自定義腳本語言即可搭建出復雜的事件響應系統。響應式編程在不少領域已經得到了成功應用[16-20]。虛擬儀器的軟件部分本質上也是一個事件響應系統,虛擬儀器內部控件產生數據事件,與數據有聯系的控件作出相應響應。本文將響應式編程應用到虛擬儀器上,在簡化虛擬儀器控件通訊模型的同時,也增強了虛擬儀器控件間復雜數據關系的動態重構能力。
1 手機可重構虛擬儀器總體設計原理
雖然測試系統的程序是多變的,但是系統包含的各種功能模塊往往是類似的,可以將這些功能模塊抽象為標準化的儀器控件,并對其進行復用。將測試系統常用功能模塊封裝成一系列標準化控件,形成一個虛擬儀器控件庫,在虛擬儀器平臺上提供給用戶使用。這些控件主要包含4大類,分別是:控制類控件(如按鈕開關、旋鈕等)、顯示類控件(如波形顯示控件、儀表盤、棒圖等)、數據處理類控件(如快速傅里葉、濾波、自相關等)以及硬件類控件(如各種數據采集硬件、通訊控件等)。用戶在進行虛擬儀器開發時,只需合理地將這些控件組織起來,便可實現大部分功能需求。對于控件庫滿足不了的功能需求,可以自行開發符合儀器控件標準的控件并加載進平臺使用。
手機可重構虛擬儀器總體設計原理如圖1所示。儀器控件組織過程便是虛擬儀器重構過程.對儀器控件的組織包括兩方面,一是儀器控件布局,二是儀器控件之間的數據響應關系。通過以上兩方面對儀器控件進行組織,便可將儀器控件融合為一個有機整體,得到一個可運行的虛擬儀器頁面。
2 響應式設計
2.1 響應式數據端口變量
分析響應式編程的實現,最根本的要求是當變量值發生改變時,系統需要感知到數據改變事件的發生。在An-droid的開發語言Java中,數據變量類型并不存在這種特性,因此需要設計一種存在該特性且符合虛擬儀器控件之間通訊需求的變量類型。
響應式數據端口變量模型如圖2所示。響應式數據端口把基本數據類型封裝到一層,便于進行管理。將虛擬儀器可能使用的數據類型都考慮進來,封裝一系列數據類型,得到一系列數據類型的響應式數據端口。封裝的數據類型包括Java的9種基本數據類型及其數組和二維數組,基本可以覆蓋所有虛擬儀器需要使用的數據類型。例如開關變量用到的boolean類型、信號數據用到的float數組和double數組、信息顯示用到的String類型、參數配置和類型選擇用到的int類型以及圖像信號用到的int二維數組等,這些數據類型都被響應式數據端口的數據類型所覆蓋。
在響應式數據端口主要屬性中,有數據類型( DataType)、端口類型(PortType)、控件ID( Controlld)以及端口名( PortName)。響應式數據端口的核心接口有兩個,分別是getData接口和setD ata接口。最核心的設計是:在setData接口被調用時,除內部數據被改變外,還會自動向系統發送數據改變事件。這里需要說明的是,本文所說的“發生數據改變”并不是指數據本身一定真的改變了,而是指setData接口被調用,數據被“試圖改變”,產生了數據流。
考慮到虛擬儀器控件在實際使用這些響應式數據端口時,會按用途分為輸入端口與輸出端口,并且這兩種數據端口有不同行為特征,因此設置了一個屬性表征數據端口類型。當控件獲取這些響應式數據端口時,需要表明控件本身的ID、端口名以及端口類型。
2.2 虛擬儀器控件模型
響應式架構下的儀虛擬器控件模型如圖3所示??丶鶕陨順I務的數據通訊需要持有一些響應式數據端口,并明確劃分出哪些是輸入端口,哪些是輸出端口。控件需要實現的主要接口為數據響應接口,該接口通過參數傳遞數據發生改變的數據端口名給控件。當輸入數據端口的數據改變時,即表明有數據流流入,此時系統會自動調用控件的數據響應接口,通過該接口觸發控件自身業務的運行。業務運行完成后,假設需要輸出結果,可以直接通過輸出端口進行輸出。例如控制類控件、信號采集類控件等一些控件會有自主數據源,當有新數據產生時,直接通過輸出端口輸出即可。
圖4為一個FFT(快速傅里葉)控件示意圖,該控件持有1個輸入端口、3個輸出端口。輸入端口輸入信號數據數組,3個輸出端口分別輸出信號經過FFT處理后得到的實部數組、虛部數組和幅值數組。其在數據響應接口中實現的邏輯為:當有新信號輸入時,對輸入數據進行FFT處理,并對處理結果進行輸出。
又比如一個旋鈕控件,其只有唯一一個數據端口,也即旋鈕數值輸出端口,控件只需在旋鈕值發生改變時將新的旋鈕值輸送到該數據端口即可。
2.3 響應式控件通訊架構
虛擬儀器可以被歸結為一個數據流驅動的響應系統,當某個控件數據發生變化時,變化會被傳播到與之相聯系的控件,控件會根據數據變化作出響應。對于某些控件,可能會出現類似屏幕單擊事件之類的非數據事件,但此類事件也會轉換為數據變化事件驅動虛擬儀器運行。例如對一個開關按鈕的點擊會改變其代表開關狀態的變量,然后再由該變量值改變事件驅動虛擬儀器運行。這種非數據事件會被固定在單獨的控件上,在虛擬儀器重構層面只需關心數據事件的響應關系。
響應式控件通訊架構如圖5所示,框架主要組成部分包括響應式數據端口、虛擬儀器控件和響應式內核??丶钟械捻憫綌祿丝谛枰缘巾憫絻群酥?,由響應式內核進行管理。
響應式編程腳本則負責構建這些數據端口的數據關系,可以通過編程方式靈活地實現數據關系創建。每個數據端口可以映射成為一個數據變量,在響應式編程腳本中可以將數據變量映射到這些數據端口上,然后使用這些變量進行響應式編程,也即聲明式編程,并對這些變量之間的數據關系進行聲明。通過解釋執行響應式編程腳本,將編程腳本描述的數據端口之間的數據關系通過特定數據結構保存下來。當響應式內核感知到端口數據改變事件時,響應式內核會對其進行實時處理,以保證經過處理之后數據端口之間滿足編程腳本所聲明的數據關系。
虛擬儀器系統除要保證這些數據端口之間滿足特定數據關系外,還需要控件在數據輸入端口發生數據改變時作出響應,從而驅動虛擬儀器運行。因此,這些控件也需要被注冊到響應式內核中,由響應式內核進行管理。這些控件需要統一實現一些標準接口,以便內核對控件進行運行調度,其中最重要的接口即是數據響應接口。對于被注冊到響應式內核的控件,當其數據輸入端口數據發生改變時,控件的數據響應接口便會被響應式內核調用。
在這種架構設計下,對于控件開發者而言,在開發普通控件的基礎上,要想開發出適配該架構的控件,只需根據通訊需要持有一些響應式數據端口,然后使用這些數據端口進行通訊即可;對于虛擬儀器使用者而言,只需通過一些簡單的聲明式編程便可將快速搭建虛擬儀器,從而實現將更多工作交由系統處理,簡化了開發者和使用者工作,契合IT開發的整體發展趨勢。
3 響應式編程腳本
3.1 響應式編程腳本設計
本文的響應式編程腳本是一種針對虛擬儀器重構任務設計的領域特定語言。本腳本語言設計目標是使虛擬儀器使用者能快速按照自己的意圖實現虛擬儀器搭建。由于虛擬儀器使用者的編程水平可能有限,因此語法設計應該盡量從簡。
響應式編程腳本總體設計如圖7所示。為了使編程語法簡單明了,使用者容易上手,將腳本劃分為3大部分,分別為變量區、函數定義區以及關系聲明區。
變量區的主要作用是實例化儀器控件,并用變量把控件實例和數據端口的引用保存下來,方便后續使用。在實例化控件時,通過參數列表為其傳遞運行參數,這些參數包括儀器控件本身所需的運行參數和布局參數。如語句“varNamel=ControlName( paraml,param2,…)”是實例化一個控件名稱為“ControIName”的控件,并將其引用賦值到變量“varNamel";語句“varName4= varName2.portNane"是將控件“varName2”端口名為“portName”的數據端口引用賦值到變量“varName4”;語句“varName5=dataType(contor-lId,portName)”將數據類型為“dataType”、控件ID為“con-torlld”、端口名為“portName”的數據端口引用賦值到變量“varName5”??丶蘒D和端口名構成的二元組可以唯一確定一個響應式數據端口,若指定的數據端口不存在,或數據端口的數據類型與“dataType”不一致,將會報錯。
在函數定義區定義一些函數,這些函數可以被用于實現數據端口之間的函數綁定關系。
在關系聲明區聲明數據端口之間的數據綁定關系。如腳本中的“varName2.portNamel->varNamel.portNamel",是聲明簡單的數據端口之間一對一的綁定關系;腳本中的“varName3.porNamel=>varName4+ varName5",是聲明數據端口之間一對多的表達式綁定關系。為了方便直接通過表達式表達較復雜的數據關系,該表達式除支持單值的四則運算外,還需要支持數組之間的運算以及單值與數組之間的混合運算,并內置一些常用函數。然而,表達式對數據關系的描述能力終究是有限的,因此為了支持更復雜的數據關系描述,該腳本還支持數據端口之間一對多的函數綁定關系。如腳本中的“varName3.portName2=>>fun-Name( varName4,varName5)”,是聲明數據端口之間一對多的函數綁定關系,具體數據關系可以在函數里定義。
數據綁定規則為:綁定公式左邊對象是要綁定的對象,右邊對象是綁定的目標對象,要綁定的變量所映射的數據端口必須是輸入端口。對于變量對變量的直接綁定,右邊變量所映射的數據端口必須是輸出端口,數據類型與左邊變量必須一致。對于表達式綁定,右邊表達式包含變量所映射的數據端口必須是輸出端口,表達式的運行結果數據類型必須與左邊變量數據類型一致。對于函數關系綁定,函數實參列表包含變量所映射的數據端口必須是輸出端口,函數返回值類型與左邊變量數據類型需要一致。
3.2 響應式編程腳本實現
3.2.1 數據端口一對一綁定
對于數據端口一對一綁定,以下分為響應式內核端與腳本解釋器端兩方面進行說明。
在響應式內核端,維護如圖8所示的一個Map數據結構,Map里的Key為輸出端口,Value綁定到該端口的輸入端口集合。當某個輸出端口數據發生改變時,需要迅速查找到與其綁定的輸入端口集,因此這里使用Map數據結構存儲綁定關系。當虛擬儀器內發生輸出數據端口的數據改變事件時,響應式內核根據該數據端口查詢到與其綁定的輸入端口集合,然后對集合進行遍歷,依次調用每個數據端口的設置值函數,使其數據值等于與其綁定的端口,并調用其所屬控件的數據響應接口。通過以上步驟,便可實現一種深度優先的數據流驅動運行模式。
在腳本解釋器端,有了上文所述的Map數據結構,實現數據端口一對一直接綁定的思路則變得很清晰。在腳本運行時,首先查詢到綁定目標對象所映射的數據端口,接著在綁定關系Map里查詢到其綁定端口集合,然后查詢綁定對象所映射的數據端口,將其添加到綁定端口集合即可。
3.2.2 數據端口表達式綁定關系
將表達式映射成一種通用的表達式控件,總體方案如圖9所示。該控件在后臺工作,不在屏幕顯示。表達式控件將表達式的抽象語法樹保存下來,表達式控件本身持有數據輸入與輸出端口,但數據端口的數目與類型不是固定的。在該表達式控件的響應接口中,從數據輸入端口獲取數據作為表達式變量值,通過表達式引擎執行表達式控件保存的語法樹,并將執行結果通過輸出端口輸出。
腳本解釋器運行時,通過分析表達式所引用的數據端口,可以得出表達式所包含的變量數目與類型,從而確定表達式控件輸入端口的數目與類型;然后再通過分析表達式的運算結果類型,確定輸出端口類型;將表達式控件的輸入端口綁定到表達式所包含變量映射的數據端口,再將綁定到表達式的數據端口綁定到該控件的輸出端口即可。
3.2.3 數據端口函數綁定關系
腳本里包含的函數是為了借助通用編程語言的表達能力,實現更復雜的數據綁定。因此,假設自己設計該部分語言,需要實現一種通用語言的設計及其編譯器,工作量將十分巨大,而且無法調用已有函數。因此,本文編程腳本的函數部分選擇內嵌Java函數的方式實現。
Java是一門動態性極高的語言,可以實現動態編譯。動態編譯是指在代碼運行過程中直接編譯一段代碼并將其加載進來運行,實現所謂的“on the fly”。
針對基于Java的動態編譯技術,本文對于函數綁定關系的實現思路如圖10所示。在腳本解釋器運行時,通過對Java函數的函數頭進行語義分析,動態生成一個與函數對應的函數控件類代碼,每個函數對應一個函數控件類,并通過動態編譯加載到系統運行。函數控件的輸入數據端口對應函數參數,輸出端口對應函數返回值,數據處理業務即是該函數。將函數作為函數控件類的成員函數,在函數控件類的數據響應接口中,從數據輸入端口獲取數據,作為函數的參數對函數進行調用,然后將調用結果通過數據輸出端口輸出。
4 響應式手機可重構虛擬儀器平臺
本文提出的響應式手機可重構虛擬儀器平臺從邏輯上可分為3層,分別是交互層、內核層及腳本解釋層,如圖11所示。界面布局容器以及與用戶的交互邏輯。針對虛擬儀器的使用特點設計界面布局以及交互邏輯。
內核層是可重構虛擬儀器的核心部分,該層負責控件管理、響應式數據端口管理,以及數據響應關系維護。其接受來自腳本層的控件實例化意圖、布局意圖以及數據關系聲明意圖,并將實例化控件添加到交互層。
腳本解釋層是最底層的部分,該層的職責是解釋頁面腳本意圖,并將意圖傳遞給內核層。
5 應用實例
如圖12所示為一個聲音監測儀器,其包含的儀器控件類型有:按鈕控件、麥克風控件、拖動條控件、FFT(快速傅里葉)控件、文本控件、數字顯示控件及波形顯示控件。其運行邏輯為:按鈕(圖中標號8)控制麥克風控件開關,拖動條控件(圖中標號5)控制麥克風數據增益倍數;增益倍數通過數字顯示控件(圖中標號4)顯示,增益后的麥克風數據通過波形顯示控件(圖中標號6)顯示;增益的數據傳送到FFT控件(圖中標號2)后,將經過FFT處理得到的頻譜繪制到波形顯示控件(圖中標號7)中;通過增益的波形數據進行聲強計算,將得到的聲強值顯示到數字顯示控件(圖中標號3)中。
以下是該儀器的省略腳本:
Vars:
mic=MicVI( "micl","10, 10, 30, 30","44100",¨4096”,“O”);
fft= FftVI(“fftl”,“50, 10, 30, 30");
label= LabelVI( "lbl”,“90,10,65,30”,“聲強(分貝)”,“” “” “” “2"):
dg= DigitaIDisplayVI( "dgl", "160, 10, 100, 30”);
lahel2=LabeIVI( "Ib2", "90. 50, 65, 30",“增益(倍數)”,“”,“”,“”,“2”);
dg2= DigitalDisplayVI(“dg2", "160, 50, 100, 30”);
label3= LabelVI( "lb3”,“90. 85, 65, 30”,“增益控制”,“”,“”,“”,“2");
sb= ScrollBarVI( "sh", "160, 85, 100, 30",“1, 10",“l”,“0.1”):
wave= WaveVI2( "wavel”,“0,120, 300, 170",…,…,“”, "-20000, 20000",“5”);
waveFft=WaveVI2( "wave2", "0, 295. 300, 170",…,“”,“”,“0.2000”,“5”);
btn=ButtonVI( "btnl", "20, 470, 260, 35",“,“1,0,O”,“停止一開始”,“50”);
t= DoubleArray(“tl”);
End
Functions:
douhle countDb( double[] data){
,,計算聲強函數
}
End
Relation:
mic.switch一>btn.value:
t.in=>mic.data術sb.value:
dg2.value一>sb.value;
fft.data一>t.out;
wave.dx=>1.0/44100:
wave.data一>t.out:
waveFft.dx=>44100.0/4096:
waveFft.data一>fft.amp;
dg.value=>>countDb( t.out);
End
為了說明本文提出的可重構虛擬儀器的靈活性,以下以一個實際案例進行說明。圖12中標號3的數字顯示控件對應的實例化腳本為“dg=DigitaIDisplayVI( "dgl",“160,10,100,30")”,將該行腳本替換成“bg= BarGraphVI( "bgl",“160,2,135, 46",“”,“0_30_60_90_1 20", "0, 120",“0”.“5")”;描述該數字顯示控件數據關系的腳本是“dg.value=>>countDb( t.out)”,將該行腳本替換為“bg.value=>> countDb(t.out)”。替換以上兩行腳本,便可實現將聲強顯示替換為一個棒圖進行顯示,如圖13所示。
6 結語
本文分析了手機虛擬儀器發展現狀以及響應式編程特點,將響應式編程引入到虛擬儀器中,并在Android平臺加以實現。研究表明,響應式編程適用于虛擬儀器?;陧憫骄幊痰氖謾C可重構虛擬儀器,其控件通訊模型更為清晰,且對復雜數據關系的表達能力更強。但目前本文設計的虛擬儀器響應式編程語言尚不夠完善,在后續研究中,可詳細考慮虛擬儀器實際應用中的各種功能業務需求,設計更系統的腳本語法,從而進一步提高可用性。
參考文獻:
[1] 秦樹人.虛擬儀器——測試儀器從硬件到軟件[J].振動、測試與診斷,2000,20(1):1-6.
[2] 張新良,馬明全.基于虛擬儀器與PCI-171IU的三軸滑臺控制系統設計[J].軟件導刊,2018,17(1):102-104.
[3] 趙寧社.遠程數據采集的現場虛擬儀器控制系統設計與實現[J].國外電子測量技術,2018,37(6):130-134.
[4]王銘華,李強,陳虹麗,基于虛擬儀器的磁特性測量系統的設計及實現[J].實驗技術與管理,2018,35( 9):127-129.
[5] 劉云龍,謝壽生,彭靖波,等.基于虛擬儀器的某型航空發動機綜合檢測系統[J].計算機應用,2018,38( Sl):260-265.
[6]田航,何嶺松,高志強,等.基于構件的手機可重構虛擬儀器技術[J].計算機應用研究,2016,33(4):1106-1110.
[7]吳玉葉,何嶺松,韋文姬,等.基于iOS的手機虛擬儀器瀏覽器的設計[J].計算機測量與控制,2017,25(11):234-238.
[8]尹愛軍,張泉,孫兵.手機移動平臺的虛擬軸承診斷儀的開發及應用[J].振動、測試與診斷,2015,35(5):897-901.
[9] 陸文英,胡海榮.基于手機多傳感器數據融合的測步長算法[J].電子科技,2018,31( 12):9-13.
[10] 藺瑩,張引根,王珂,等.基于Android的健康監護系統設計和開發[J].測控技術,2018,37(12):51-56.
[11]MEREDITH S E, ROBINSON A, ERB P,et al.A mobile-phone-based breath carbon monoxide meter to detect cigarette smoking[J].Nicotine & Tobacco Research Official Journal of the Society for Re-search on Nicotine & Tobacco, 2014, 16( 6) : 766.
[12]MURPHY E . KINC E A. Smartphone-hased noise mapping : integrat-ing sound level meter App data into the strategic noise mapping pro-cess[J]. Science of The Total Environment, 2016, 562 : 852-859.
[13]React Native中文網 .使用 JavaScript和 React編寫原生移動應用 [ EB/OL] .https : //reactnative.cn/.
[14]WEEX. Weex is a framework for building performant mohile APPswith modern web technology[ EB/OL ] . http : //,veex.apache.org/.
[15]MARCARA A , SALVANESCHI G. We have a DREAM : distributedreactive programming with consistency guarantees.[ C ] . ACM Interna-tional Conference on Distrihuted Event-based Systems . 2014.
[16] BRESSON J. Reactive visual programs for computer-aided musiccomposition [Cl.Visual Languages and Human-Centric Computing.IEEE , 2014 : 141-144.
[17]JEITSCH . WOLFCANG. Abstract categorical semantics for resource-ful functional reactive programming [J] . Journal of Logical and Alge- braic Methods in Programming, 2016, 85( 6) : 1177-1200.
[18] FREDERIC B. Mimicking quantum mechanics using reactive pro-gramming [J]. International Journal of Modern Physics C , 2011 , 22( 6) : 635-648.
[19]SCHATZ R. WIRTH C, HURNAUS D. Monaco-a domain-specificlanguage solution for reactive process control programming with hier-archical components [ J] .Computer Languages Systems & Structures ,2013 . 39( 3) : 67-94.
[20]SALVANESCHl C. PROKSCH S, AMANN S. et al. On the positiveeffect of reactive programming on software comprehension : an empiri-cal study [J].IEEE Transactions on Software Engineering, 2017, 43( 12) : 1125-1143.
基金項目:國家科技重大專項項目( 2015ZX04005007)
作者簡介:謝道旺(1992-),男,華中科技大學機械科學與工程學院碩士研究生,研究方向為手機化移動測量儀器;何嶺松(1962-),男,博士,華中科技大學機械科學與工程學院教授、博士生導師,研究方向為工業測量與控制、計算機虛擬儀器技術、手機化移動測量儀器;高志強(1986-),男,華中科技大學機械科學與工程學院博士研究生,研究方向為數控加工優化、遠程診斷。本文通訊作者:何嶺松。