周 鵬 武延軍 趙 琛
1(中國科學院軟件研究所 北京 100190) 2(中國科學院大學 北京 100049) 3(計算機科學國家重點實驗室(中國科學院軟件研究所) 北京 100190)
(zhoupengwork01@163.com)
教會機器理解代碼、編寫程序或構造可自學習的智能軟件一直是人工智能的重要挑戰問題之一[1].當前基于神經網絡的深度學習在圖像處理、語音識別、自然語言處理等領域從研究到應用取得了很大的成功,但是在程序生成上距離研究到實用仍有明顯差距.許多學者在程序處理領域也使用神經網絡深度學習方法進行了積極探索,提出了不少研究方法,取得了很好的效果,但是仍然未能有效解決泛化能力差、程序正確性、難以處理復雜程序結構的問題.當前基于神經網絡的程序生成研究主要包括基于程序輸入-輸出數據樣例的方法[2-6]、基于標注程序執行軌跡樣例的方法[7-8]和基于標注源碼的方法[9-13].
1) 基于程序輸入-輸出樣例的方法.該方法以神經網絡為待學習控制器,從輸入-輸出樣例訓練控制器學習預測對神經網絡擴展外部存儲的操作序列.該方法完全依賴輸入輸出數據對,存在從數據倒推操作序列的歧義性、泛化能力差、限定一個小的DSL(domain specific language)語言[14]空間、只能處理非常簡單的程序結構等問題.比如著名的微軟DeepCoder[2]只能處理自定義的一個小型DSL語言,主要預測5行以內、每行只有一個主標識符、順序結構的平鋪程序,不能處理分支、遞歸、跳轉等復雜控制結構,因此習得的程序非常簡單.
2) 基于標注程序執行軌跡樣例的方法.該方法收集覆蓋算法所有執行路徑的逐步執行軌跡作為有監督訓練數據,其標注方法是以下一步作為上一步的標注.DeepMind NPI[7]是最有代表性的相關研究之一,其優點是明顯提高了泛化能力.缺點是數據標注成本高,同時考慮到每個執行軌跡是算法的特定路徑,因此需要預先已知算法邏輯,所以本質上未能從輸入-輸出樣例對中倒推學習到新代碼邏輯,而是從標注執行路徑中學習算法的神經網絡表示;另外NPI是對標測試的主要模型之一,其泛化能力雖然有很大提升但仍然是有限的,對此實驗分析部分有具體對比.
3) 基于標注源碼的方法.對源代碼做有監督標注.學習源碼跟標注間的統計映射關系,然后通過輸入標簽反過來推薦源程序.該方法會面臨由編程語言過多的規則、實現細節、源碼本身丟失語義信息所帶來的學習復雜度;同時未能輸入源程序的背景知識,比如程序員預先學習的編程語言規范、計算機原理教程等,導致模型處理信息不完備.額外的復雜度加上不完備的信息給模型訓練學習帶來了巨大挑戰.BAYOU[12]是最具代表性的相關研究之一,其優點是可以從注釋標簽生成大體正確的Java源代碼推薦,不足是不能保證和自我檢驗生成的代碼語法是否正確,因此生成的程序代碼具有參考價值而不能直接解釋執行.
因此,完全依賴神經網絡,單一地以源代碼標注、輸入-輸出對、程序執行軌跡做為訓練數據輸入構建程序生成模型存在局限性.比如程序生成模型在實際應用中一般需要關心模型的泛化能力、生成程序正確性、處理復雜程序結構3個指標,可以分別定性地解釋為模型生成的程序表示需要具備一定程度的變通能力(舉一反三是理想情況)、執行的準確率、可以處理有一定結構的程序從而能描述更大范圍或有一定復雜度的任務,但是這些模型在應對3個指標時面臨挑戰.我們分析認為這主要是因為編程任務往往非常復雜、程序相對于自然語言有其特殊性,完全依靠神經網絡構建的程序生成模型未能結合程序員的價值、未能獲得豐富的輸入信息(如背景知識).有意思的是觀察人類學習編程的過程,程序員會預先學習編程語言的語法規則、計算機原理等背景知識;對比神經網絡和人類,神經網絡善于從大量數據進行自動化統計學習,人類善于問題分解、直覺感知、經驗復用.受此啟發,應對程序生成的復雜性和挑戰性,我們探討如何發揮神經網絡和人類程序員的整合優勢,實現優勢互補.
因此本文提出一種融合程序員和神經網絡各自優勢的協作式編程范式HNCP.HNCP是一種高級可微分(“可微分”是使用反向傳播算法求解神經網絡權重參數的基礎)編程語言,執行在一種提供端到端可微分運行環境的編程語言級抽象虛擬機(diff-erentiable virtual machine, dVM)上.在HNCP編程范式下,程序員用類C高級編程語言提供程序框架,由神經網絡組件根據訓練數據學習(可微分優化)生成程序的局部細節,因此最終完整確定的程序是由人類程序員和神經網絡共同創作完成.如圖1所示,圖1(a)是一個程序框架,其功能是不完整的,其中空缺部分如圖1(b)所示,無縫嵌入一個神經網絡組件,程序的完整行為將由程序員提供的程序框架和通過訓練數據(輸入-輸出對)參數化的神經網絡組件共同確定.

Fig. 1 Illustration of HNCP for automatic program generation圖1 HNCP程序自動生成示例
本文主要貢獻有3個方面:
1) 提出了神經網絡與人工程序員協作的高級編程范式HNCP,它可以結合神經網絡和程序員各自的優點,使程序生成適用于復雜的程序結構(如循環、遞歸、分支、函數調用等);
2) 給出了一種高級過程化編程語言可微分運行環境(dVM)的實現方法.dVM是實現傳統過程化程序結構跟神經網絡組件無縫融合的基礎,也是將離散的程序處理問題轉換為能用可微分優化直接處理的問題的關鍵;
3) 實驗表明,跟代表性同類程序生成模型相比,HNCP在程序生成任務上表現出更好的學習性能(泛化能力、樣本復雜度、準確率、復雜程序結構).這表明整合人工程序員和神經網絡的協作式編程是一種有潛力的研究方法,可以促進程序自動生成的實際應用能力.
文獻[12]提出了一種基于Java源程序語法相似性的組合搜索生成源代碼示例的方法.我們都用高級編程語言處理復雜的程序,但是文獻[15]中的方法是以語法而不是語義為條件的,既不考慮生成程序的準確性,也不考慮生成程序的完整性,生成的代碼示例具有參考價值而不能直接解釋執行.因此,我們在研究目標和方法上都與之不同.文獻[16]提出了基于C語言的程序骨架編程,它是基于SAT(Boolean satisfiability problem)的歸納綜合過程,即使用搜索和符號推理來尋找滿足人工定義規則的程序.但在本文中,我們采用的是神經網絡可微分優化法,也不需要額外的人工定義規則,因此是明顯不同的;文獻[15-18]擴展了神經網絡使之具有較大外部記憶存儲,這為可微分存儲器緩存的設計提供了有益的啟發.但它們都缺乏高級編程接口,而在本文中,我們提供了一個具有外部存儲器和高級C語言接口的可微分編程系統,這對于整合程序員的編程框架或者經驗、無縫融合神經網絡組件到過程化程序結構中是非常重要的.
HNCP是基于類C語法的擴展,增加了神經網絡組件嵌入的語言構造.HNCP源程序首先需要編譯成中間代碼表示(intermediate representation, IR),從而便于以可微分的矩陣計算方式進行程序解釋執行和求解.IR的指令集設計參考了Forth[19]和SECD[20].表1對IR指令集的主要指令進行了說明.該指令集是一個棧式求值語言,我們基于該棧式求值模式構造了一個可微分的運行時環境,命名為dVM,它是一個語言級虛擬機,滿足直接對IR程序的可微分解釋執行,從而滿足對HNCP的類C源程序的解釋執行.程序在dVM上以端到端可微分的方式執行生成程序的計算圖表示,包括神經網絡組件構成計算圖的組成部分.進一步,通過輸入-輸出樣例訓練計算圖來確定嵌入的神經網絡組件參數,從而學習生成一個完整、確定的程序表示.

Table 1 Instruction Set表1 指令集

Fig. 2 Overall processing flow of HNCP program圖2 HNCP程序處理的整體流程
圖2所示是用HNCP協作式編程創作的源程序框架自動生成完整、確定的程序的整體處理流程.
首先通過編譯技術將C語法的HNCP源程序翻譯為更底層的(直接面向dVM)指令集表示的中間語言表示;然后根據分支、控制結構對程序進行分塊,包括普通的中間語言代碼塊和神經網絡塊(統稱代碼塊).
每個神經網絡塊都攜帶著可以通過訓練數據來確定其行為的可學習參數(所以完整的程序行為是由程序框架和數據訓練學習共同確定).每個代碼塊是用代碼片段構成的函數來實現,而代碼片段描述為矩陣代數運算(即指令集的可微分實現),dVM的狀態緩存部件以及對狀態的訪問、處理也用矩陣和矩陣代數表示,因此程序執行的每個基礎步驟是尋址下一個代碼塊,在dVM的狀態部件上做矩陣代數計算,程序的整體執行是由這些基礎步驟一步一步推進構成的遞歸過程.dVM的狀態由R(返回棧)、S(求值數據棧)、H(隨機變量堆)這些狀態緩存和PR(返回棧棧頂指針)、PS(數據棧棧頂指針)、PC(程序計數器指針)組成.
從公理語義[21]的角度將指令的執行和求值表示為虛擬機的狀態轉換.我們給出了一個全可微分計算系統(dVM)的實現方法,dVM支持高級類C編程語言,具有IR指令集和擴展內存.
2.2.1 可微分虛擬機整體結構
圖3所示,可微分虛擬機dVM包括3個狀態區(即相對于神經網絡內部記憶空間的擴展內存)、1個控制器(對應于處理器)和狀態轉移指令集.擴展內存區包括2個棧結構(S,R)和一個隨機內存結構(H);控制器包括PS,PR,PC這3個寄存器,PS,PR分別是S,R棧頂指針,PC是程序計數器指針.支持編程控制,即支持輸入用指令集寫好的程序(程序框架)在虛擬機上執行.

Fig. 3 The dVM architecture圖3 可微分虛擬機整體結構
為了保證整個計算環境是連續可微分地執行程序,指令集(包括擴展內存訪問指令)用算術矩陣操作實現為可微分函數(fun_foo),擴展內存區用矩陣表示,寄存器用one-hot向量表示.控制器負責取指令、執行指令、更新抽象機狀態,控制器還包括一個指示指令尋址的向量PC,用于實現執行控制轉移.這些基本行為都以連續的可微分函數實現.
2.2.2 指令集與指令集的可微分實現
表1給出了dVM的主要指令集的說明.為了不影響閱讀連貫性,我們在附錄中給出了指令集可微分實現的詳細數學表示,參見附錄A.
內存讀寫的實現原理為,將棧指針看做分布在內存空間上的訪問權重,基于此將內存訪問(如READ,WRITE)表示為位置權重跟內存單元的矩陣計算,然后基于READ,WRITE的線性組合可以實現PUSH,POP等復雜的棧操作;指令集的可微分實現原理為,對dVM狀態(擴展內存)的訪問與改變實現為READ,WRITE,PUSH,POP的線性組合;對于算術邏輯操作、控制操作通過矩陣代數運算和運算的組合來實現,矩陣算術操作理論指導可參看雙線性映射[22].因此所有的指令集都是用矩陣代數運算表示的連續可微分實現,可以跟神經網絡(神經網絡也是矩陣代數運算)無縫整合,因此可以用反向傳播算法的可微分優化技術對程序生成、程序處理進行直接建模.
2.2.3 程序的可微分執行模型
算法1描述了過程化程序結構在dVM上可微分解釋執行流程.從狀態轉換的角度,其執行過程被描述為從初始狀態S0出發的steps步狀態遷移.算法1中diffInstsLib是指令集的可微分實現函數庫,通過字典結構索引.用到的FetchInst,step操作.dVM的初始狀態設置,訓練開始時先將dVM擴展內存(即S,R,H構成的狀態區)清0,然后用標注數據“輸入-輸出”樣例對的“輸入”初始化填充dVM擴展內存,并將對應的棧指針初始化指向下一個空白位置,經過初始設置內存區構成初始狀態S0.附錄B是一段程序在dVM上運行過程例子.
算法1.可微分虛擬機程序執行流程.
輸入:S0是dVM初始狀態、Code是待執行程序框架、steps是執行總步數;
輸出:狀態轉換列表LTRACE=[S0,S1,…,Ssteps].
① function:run(S0,Code,steps)
②S←S0,PC←S.pc,LTRACE[];
③LTRACE.append(S);
④ for (i=1;i≤steps;i++)
⑤Weightstate←FetchInst(PC,Code);
⑥ for (j=1;j≤Code.size;j++)
⑦Stmp←diffInstsLib[Code[j].key](S);
⑧StatesVector.append(Stmp);
⑨ end for
⑩Snext←step(Weightstate,StatesVector),
S←Snext;
算法1的執行過程是從初始狀態開始的steps步連續狀態遷移,每一步是通過尋址從代碼空間選擇指令在當前狀態上執行并推進dVM遷移到下一個狀態.因此整個執行過程構成一個steps步的RNN模型,程序的一遍執行可以描述為
exeTrace=(S1,S2,…,Si,…,Ssteps),
(1)
其中Si=step(Weightcode,Si-1),S1是初始狀態.
代碼空間尋址是根據PC和代碼矩陣Code計算在代碼行的權重分布:
FetchInst(PC,Code)←(PC⊙Code)1T.
(2)
計算取指令,其中Code是需要執行程序的矩陣結構化表示,PC是程序計數器的向量表示,1是行向量(1,1,…,1),⊙是哈達瑪積.

(3)

Fig. 4 Step forward to get the next state圖4 單步執行計算下一個狀態
單步執行,其中Statecurrent是當前狀態向量,Statenext是執行后遷移的下一個狀態,Weightcode是取指令計算得到的指令執行權重分布(用softmax計算),functionCBi是匯編后的代碼塊(即用函數代碼片段給出的指令集可微分實現),StatesVector是狀態行向量.該求值邏輯如圖4所示,SP是執行前當前狀態,SN是單步執行后遷入的狀態,Sn_i是dVM在SP狀態下執行地址空間某個指令塊得到的狀態.
2.2.4 訓練目標

(4)

(5)
我們在求值中發現通過PC,PS,PR指針計算狀態分量的掩碼(即只計算執行結束時擴展內存的有效區域),可以免去PC,PS,PR分量的距離計算.

Fig. 5 dVM state buffer components圖5 dVM狀態分量
HNCP原型實現是在C語法基礎上擴展支持嵌入神經網絡作為基本語言構造,稱作NCP(neural network component placeholder).圖6所示為HNCP前端語法產生式(grammar productions)的BNF描述;其中NCP的語法構造由ncp產生式衍生.作為原型驗證ncp只給出了encoder-transform-decoder神經網絡模型結構,其中encoder對程序上下文輸入參數條件編碼,transform對條件進行特征轉換,decoder解碼條件并基于此預測生成執行動作.得益于dVM可微分運行時環境,采用類似思路可增加其他可微分模型,如CNN(convolutional neural networks),seq2seq(sequence to sequence)等作為HNCP語法構造的編程原語.
HNCP使用棧式求值語言作為中間表示(IR),通過BNF產生式語義規則可以定義將HNCP源程序編譯為IR表示的語義動作;其基本思路是將C語法構造翻譯為IR指令、語言構造表示,如while用do-loop-endloop,if-else用GOTOF,函數調用用CALL,函數返回用RET,變量定義用H堆內存分配,不同作用域的同名變量用可區分的命名前綴表示等.附錄C給出了BNF產生式語義規則的實現樣例.

Fig. 6 HNCP BNF grammar productions圖6 HNCP的BNF語法產生式
1) 在該神經原語中,encoder以上下文參數作為條件進行特征編碼,transform做進一步特征轉換,同時也是對ncp網絡參數和層數做適當的調節,decoder解碼并做出執行動作決策.
2)linear(out)增加輸出寬度為out的線性變換層.
3)observe將dVM狀態緩存的元素進行聯合.元素取自求值數據棧(S)、控制返回棧(R)或隨機訪問內存堆(H)中的單元項.

圖7所示為encoder-transform-decoder的典型神經網絡拓撲,注意圖中每個隱藏層可包含多層神經網絡.

Fig. 7 A typical topology of encoder-transform-decoder圖7 encoder-transform-decoder網絡拓撲
本節對模型的程序生成學習性能、處理復雜程序結構的能力進行分析評估,包括泛化能力、樣本復雜度(訓練樣本消耗)、準確率的評估,以及代表性程序生成模型的主要指標對比性分析.DeepMind NPI[7]是生成直接可運行程序表示一類模型中表現最好的,seq2seq[23]是程序生成研究中普遍用來做參照的基準模型,因此HNCP主要跟這2個模型做對比.要比較的學習任務采用NPI中使用的冒泡排序(SORT)和多位數初等加法(ADD),除了可以跟NPI,seq2seq做直接對比,還考慮到它們包含多層次的復雜程序結構,如函數調用、循環、分支、遞歸,這些結構是廣泛的復雜任務編程關鍵,因此具有代表性.附錄D給出了任務的程序框架詳情.
泛化能力是評估程序生成模型實用性最重要的指標之一,定義為Gen=Lengthtest_maxLengthtrain_max,Gen值越大越好,其中Lengthtrain_max是訓練期間見過的最大任務規模(如排序任務的序列長度),Lengthtest_max是測試期間可正確預測的最大任務規模.圖8中,SORT任務:seq2seq模型泛化能力為1,即泛化能力差只能對訓練期間見過的序列長度正確排序,當測試樣本略長于訓練樣本時準確率立即迅速下降);NPI泛化能力為3,即可正確完成3倍于訓練樣本長度的序列排序;HNCP表現了最佳泛化能力(實驗最多測試了32倍規模).ADD任務:HNCP表現最好,seq2seq仍表現差,對于這個簡單些的任務NPI泛化表現也很好.

Fig. 8 Strong vs. weak generalization圖8 泛化能力比較
實驗表明,整合人工編程和神經網絡自動生成構建程序生成模型有助于提升程序生成的泛化能力.
模型達到最佳泛化能力所消耗的訓練樣本數量,該指標值越小表示模型學習性能越好.圖9所示,對于SORT任務,本文HNCP模型消耗約272個樣本,比NPI和seq2seq明顯少;對于ADD任務,本文模型消耗約320個樣本,比NPI和seq2seq模型需求明顯少.該實驗表明通過整合人工程序員和神經網絡優勢構建程序生成模型可有效提高學習效率.

Fig. 9 Consumption of training samples圖9 訓練樣本消耗量
注意,NPI模型標注樣本量是統計任務執行軌跡的步驟數,而不是直接計算輸入-輸出對.比如,SORT任務樣本數是[m(m-1)2]n,ADD任務樣本數是(10m)n,其中m是問題規模(如排序序列長度),n是任務個數.
生成程序準確率:模型生成的程序執行結果完全正確的任務樣本占總測試樣本的比例.
如圖10、圖11所示,對于ADD和SORT任務,使用長度為2的樣本訓練的HNCP模型在比訓練樣本長很多的測試樣本上可以獲得100%的準確率,明顯優于基線(NPI和seq2seq).測試發現seq2seq(LSTM實現)學習排序任務是很困難的,表現在當測試序列稍微比訓練樣本長時,準確率會立即快速下降.HNCP只需用長度為2的序列訓練程序框架,便成功地學到了排序行為,并很好地泛化到很長的任務序列.

Fig. 10 Test accuracy of task ADD圖10 加法任務生成程序測試準確率

Fig. 11 Test accuracy of task BubbleSort圖11 排序任務生成程序測試準確率
跟對標基準方法一樣,這里使用測試準確率來評估生成程序的精確性,可以很好地跟同類研究做性能指標對比.當前神經網絡可解釋性是一個難題,因此使用神經網絡構建程序生成模型的相關研究主要采用測試樣例準確率來評估生成程序的精確性.所以不同于一般意義上的程序正確性證明,對于這類程序生成模型,做到類似“形式語義”等方式實現嚴格的程序正確性證明是困難的.
本節對主要的代表性程序生成模型,結合主要指標進行對比性匯總分析.如表2所示:

Table 2 Summaries of Indexes of Program Generation Models表2 程序生成模型主要指標對比匯總
泛化能力(Gel):BAYOU和DeepCoder預測生成的代碼樣例不能保證正確、可運行,也沒有正確性自動檢測方法,所以生成程序的泛化能力無法評估.其中HNCP是表現最好的,NPI次之;復雜程序結構(Ctl):HNCP和BAYOU表現最好,都支持循環、分支、函數等復雜控制結構,NPI在自定義的DSL專用小語言上支持函數嵌套、分支、跳轉控制結構;編程語言支持(Lan):HNCP和BAYOU都支持通用編程語言,NPI和DeepCoder支持自定義DSL專用語言,seq2seq和NTM不支持編程語言;樣本復雜度(Sam):該指標越低越好,HNCP樣本消耗最低,其他都消耗偏多,NPI僅次于HNCP,但其樣本標注需要預先知道程序所有執行路徑,所以標注代價偏高;可執行(Exe):BAYOU和DeepCoder生成的程序不能直接執行;是否學習到新的程序行為(Lrn):根據是否需要提供完整的程序來區分,NPI是對給出的程序路徑的神經網絡編碼,BAYOU需要收集大量功能相似的源碼樣例,剩下其他模型都可以從輸入-輸出樣例對中學習到程序行為;學習生成的程序表示(Rep):Code表示代碼形式,Net表示用神經網絡編碼形式.
綜合來看HNCP表現出更好的程序生成學習優勢,這表明結合程序框架(人工程序員創作)和輸入-輸出數據對學習(神經網絡自動生成)探索構建程序生成模型的研究是有價值的.
實驗表明,本文方法跟同類代表性研究方法相比表現出更好的學習性能.結合模型與實驗設計,我們有理由相信這種性能提升是因為融合了人工程序員和神經網絡的協作,即模型將人工程序員的貢獻整合進來發揮了作用;但因為當前神經網絡模型的可解釋性瓶頸,我們很難給出一個嚴格的證明.實驗表明其性能提升明顯、并能表達復雜程序結構,驗證了這種整合模型的優勢;而同時從某種意義上可能認為這種整合帶來的性能優勢是以犧牲全自動化程序生成為半自動化的便利性為代價(局限性),但這需要結合技術發展階段綜合考慮:首先,我們在引言中結合相關工作和觀察分析探討過,當前完全依賴神經網絡的全自動或者全黑盒的程序生成模型在關鍵指標上表現不足(因此全自動的便利性是尚不存在的),在該背景下我們提出協作式模型并給出一種實現方法進行驗證,實驗表明這種融合程序員和神經網絡的協助式程序生成模型表現出優勢,結合分析表明這是有潛力、富有價值的研究思路;其次,考慮到程序生成總需要以一定的方式將需求提供給模型,結合引言中對程序員和神經網絡各自的優勢、不足的討論,因此將程序員融合到自動化程序生成建模中是否是必要的,是一個開放性、多因素均衡問題,并且很可能會隨著AI技術的發展階段不同而需要做出不同選擇.
關于實驗評估測試任務的選擇.主要選取對標基準模型(NPI,seq2seq)中用到的相同測試任務,這方便將我們的方法跟基準模型直接進行性能對比,其中NPI是這類模型中表現最好的,因此這種任務比較具有代表性;SORT,ADD任務包含循環、函數調用、遞歸、分支、順序執行等復雜控制結構,對于當前的程序自動生成相關研究具有足夠復雜性和挑戰性,能夠將代表性模型(如基準模型和本文模型)的性能指標進行有效區分,另外這些程序結構足以表達其他比較復雜的任務.
經過學者們長期的努力,自動化程序生成研究取得了明顯進步,但與圖像、語音處理等相比,距實際應用仍有很大的可提升空間.本文提出了一種結合“人工編程”與“神經網絡自動化程序生成”構建程序生成模型的研究方法.實驗表明整合人工程序員和神經網絡各自優勢的協作式程序生成模型可以明顯提升程序生成的訓練學習性能(泛化能力、準確率、樣本復雜度),并適應復雜程序結構.因此,本文探討的思路是可行且高效的,值得未來做更廣泛的研究探索.
提出一種協作式程序生成建模方法并實驗驗證其技術上的可行性和有效性只是研究工作的一個方面,最終希望走向廣泛的實際應用.而在工程應用中不僅關心技術可行性,還需考慮比如豐富并總結程序員跟神經網絡的編程任務分工的規則、設計豐富的編程原語、正確性驗證等,因此我們認為,下一步有必要對4項工作進行探討:
1) 豐富分工協作規則并進行總結.比如可以從應用場景、任務類型出發,全面探討和總結在程序員和神經網絡間高效的編程任務分工規則.并將這些規則以程序模板、編程原語或用戶編程接口等方式封裝呈現.參照Java,C++等編程模型發展經驗,這不是一個完全可正向評估的純技術問題,往往依賴于Java,C++等用戶生態的編程創造性的反饋和迭代,即具有開放性和創造性.
2) 如何劃分協作分工是一個開放性問題.本文實驗驗證采用的是“程序員負責框架編制、神經網絡負責局部細節生成”的分工方法,該方法在呈現協作式程序生成的概念形態、證明協作式模型的可行性、驗證可取得程序生成學習性能的明顯改進等方面具有優勢,從而證明本文方法理念在意義上是足夠的;但未必是最合理的分工方式,并且肯定不能覆蓋全部的可能分工模式或規則.因此設計不同的分工協作方法,并為新分工方法構建可實現、可驗證的模型具有很大的探索空間,比如在本文思路基礎上,如果能夠適當地設計擴展模型使得神經網絡可在“程序框架的編制”任務中參與分工,將是對程序員與神經網絡協作式編程模型很有意義的貢獻.
3) 考慮到程序需求場景的復雜性.程序自動生成的應用不僅僅是某個或某幾個技術點問題,而是涉及一系列技術集成,因此與大范圍應用的圖像處理、語音識別等相比,距離工程應用仍有差距.制約程序自動生成應用的因素很多,其中對需求進行建模并能恰當地跟神經網絡銜接是關鍵因素之一;而本文探討的程序員和神經網絡協作式模型中,程序員提供的程序框架其實也屬于一種需求描述規范的表達方式,如果沿著這個思路拓展并總結一套系統化需求描述規范,輸入給融合的神經網絡組件處理,我們相信這是值得進一步拓展探索的研究工作.
4) 生成程序的準確性證明.當前基于神經網絡的程序生成相關研究主要通過測試準確率評估生成程序的精確性,對生成程序進行嚴格的準確性證明是一個富有挑戰性的工作.