亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種半監(jiān)督學(xué)習(xí)的代碼自動(dòng)生成性能評(píng)估方法

        2021-03-22 01:39:08張曉江
        關(guān)鍵詞:程序員類(lèi)別代碼

        張曉江,姜 瑛

        (昆明理工大學(xué) 云南計(jì)算機(jī)技術(shù)應(yīng)用重點(diǎn)實(shí)驗(yàn)室, 昆明 650500) (昆明理工大學(xué) 信息工程與自動(dòng)化學(xué)院, 昆明 650500)

        1 引 言

        如何有效地提高軟件開(kāi)發(fā)的效率和質(zhì)量,是軟件工程領(lǐng)域關(guān)心的核心問(wèn)題.一直以來(lái),許多研究者都通過(guò)改善軟件開(kāi)發(fā)方法和運(yùn)用技術(shù)手段來(lái)提高軟件開(kāi)發(fā)的自動(dòng)化水平.其中,代碼自動(dòng)生成技術(shù)指利用某些技術(shù)自動(dòng)地生成軟件源代碼,達(dá)到根據(jù)程序員的需求自動(dòng)編程的目的.代碼自動(dòng)生成技術(shù)被認(rèn)為是提高軟件開(kāi)發(fā)自動(dòng)化程度和質(zhì)量的重要方法,受到學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注.

        以 GitHub 和 Stack Overflow 為代表的開(kāi)源網(wǎng)站和開(kāi)源社區(qū)的發(fā)展,給研究人員提供了大量高質(zhì)量的源代碼.這些代碼中隱含著許多知識(shí),將這些知識(shí)用于軟件開(kāi)發(fā)中,使得大規(guī)模代碼的學(xué)習(xí)成為可能.通過(guò)使計(jì)算機(jī)理解源代碼中的語(yǔ)義信息和結(jié)構(gòu)信息,并借助計(jì)算能力的增長(zhǎng)和深度神經(jīng)網(wǎng)絡(luò),代碼補(bǔ)全、基于功能描述的代碼自動(dòng)生成、基于輸入輸出的代碼自動(dòng)生成等成為當(dāng)前的研究熱點(diǎn)[1].

        目前,代碼自動(dòng)生成技術(shù)的部分研究已應(yīng)用到實(shí)際開(kāi)發(fā)中,依據(jù)某種代碼生成方法實(shí)現(xiàn)的代碼自動(dòng)生成工具通常以插件的形式嵌入到集成開(kāi)發(fā)環(huán)境中.例如,IntelliJ IDEA、Eclipse、PyCharm等集成開(kāi)發(fā)環(huán)境都支持嵌入的代碼自動(dòng)生成插件,以幫助程序員提高開(kāi)發(fā)效率.在應(yīng)用代碼自動(dòng)生成工具編程的過(guò)程中,需要程序員和代碼自動(dòng)生成工具相互配合來(lái)完成編碼工作.代碼自動(dòng)生成工具根據(jù)程序員的輸入及當(dāng)前代碼語(yǔ)義環(huán)境生成代碼,生成的代碼出現(xiàn)在IDE(Integrated Development Environment)的代碼推薦框中,程序員根據(jù)需要在代碼推薦框中進(jìn)行代碼選擇.此外,程序員也可能對(duì)選擇的生成代碼進(jìn)行修改、刪除等操作.

        代碼自動(dòng)生成技術(shù)的目的是為了提高軟件的開(kāi)發(fā)效率.而在代碼自動(dòng)生成過(guò)程中,程序員的開(kāi)發(fā)效率很大程度上是由代碼自動(dòng)生成的性能來(lái)決定的.代碼自動(dòng)生成的性能指代碼自動(dòng)生成過(guò)程中所占用的時(shí)間空間以及代碼自動(dòng)生成的規(guī)模和效率.通過(guò)對(duì)代碼自動(dòng)生成的性能評(píng)估,可以對(duì)比不同模型生成代碼的質(zhì)量,分析影響生成代碼性能的因素.目前代碼自動(dòng)生成的相關(guān)研究越來(lái)越多,但是很多研究者只是針對(duì)代碼生成模型進(jìn)行不斷改進(jìn),忽略了代碼自動(dòng)生成過(guò)程中由程序員和代碼自動(dòng)生成工具相互作用而產(chǎn)生的性能問(wèn)題.實(shí)際上,代碼自動(dòng)生成的性能取決于代碼自動(dòng)生成工具以及程序員的行為.

        本文通過(guò)分析程序員行為與代碼自動(dòng)生成工具行為的交互特征,結(jié)合半監(jiān)督學(xué)習(xí)方法與深度神經(jīng)網(wǎng)絡(luò)提出了一種代碼自動(dòng)生成性能評(píng)估方法,并且分析了代碼自動(dòng)生成過(guò)程中性能類(lèi)別與程序員行為以及代碼自動(dòng)生成工具行為之間的關(guān)系.

        2 相關(guān)工作

        在現(xiàn)有研究中,用來(lái)評(píng)估代碼自動(dòng)生成性能的指標(biāo)主要包括Precision(精確率)、Recall(召回率)、MRR(Mean Reciprocal Rank)、F-Measure[2].如果代碼自動(dòng)生成工具推薦的是排序后的K個(gè)結(jié)果,可以使用Top-K的Precision、Recall、MRR、F-Measure對(duì)代碼自動(dòng)生成性能進(jìn)行評(píng)估.

        1)Precision:又稱(chēng)查準(zhǔn)率,指代碼自動(dòng)生成工具正確推薦的代碼數(shù)目占代碼自動(dòng)生成工具推薦代碼總數(shù)的比例,計(jì)算如公式(1)所示:

        (1)

        式(1)中,Actual_code(i)代表第i次程序員真實(shí)需要的推薦代碼,Recom_code(i)代表第i次代碼自動(dòng)生成工具推薦的代碼.

        2)Recall:又稱(chēng)查全率,定義為代碼自動(dòng)生成工具正確推薦代碼數(shù)目與程序員真實(shí)需要的推薦代碼總數(shù)之間的比例.

        (2)

        式(2)中的各變量含義同式(1).

        3)MRR:體現(xiàn)代碼自動(dòng)生成工具推薦代碼結(jié)果的優(yōu)劣情況,靠前的結(jié)果較優(yōu),評(píng)分越高.第1個(gè)推薦代碼成功推薦,則分?jǐn)?shù)為1;第2個(gè)推薦代碼成功推薦則分?jǐn)?shù)為0.5;第n個(gè)推薦成功分?jǐn)?shù)為1/n;若沒(méi)有推薦成功分?jǐn)?shù)為0.計(jì)算如公式(3)所示:

        (3)

        式(3)中,K為代碼自動(dòng)生成次數(shù),rank(i)為第i次正確推薦代碼所在推薦列表中的位置.

        4)F-Measure:是Precision和Recall的加權(quán)調(diào)和平均.

        (4)

        在代碼自動(dòng)生成性能評(píng)估中,通常將Precision和Recall視為同等重要,所以將式(4)中的β設(shè)為1,就是最常見(jiàn)的F1-Measure.

        在基于機(jī)器學(xué)習(xí)的代碼自動(dòng)生成的研究過(guò)程中,Hindle A等人[3]將傳統(tǒng)的N-Gram模型應(yīng)用到代碼自動(dòng)生成的研究中,使用語(yǔ)言模型N-Gram進(jìn)行代碼預(yù)測(cè),實(shí)驗(yàn)通過(guò)MRR評(píng)估代碼自動(dòng)生成的性能,MRR評(píng)估指標(biāo)為51.88%.Hellendoorn VJ等人[4]在語(yǔ)言模型的基礎(chǔ)上加入“緩存”機(jī)制來(lái)維護(hù)程序的局部信息,通過(guò)對(duì)比循環(huán)神經(jīng)網(wǎng)絡(luò)與帶有“緩存”機(jī)制的N-Gram,發(fā)現(xiàn)代碼的局部性特征對(duì)于token的預(yù)測(cè)有極大的幫助,使用循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行代碼預(yù)測(cè)時(shí)MRR評(píng)估指標(biāo)為67.5%,而帶有“緩存”機(jī)制的N-Gram模型MRR評(píng)估指標(biāo)為69.3%.

        Nguyen TT等人[5]引入了一種統(tǒng)計(jì)語(yǔ)言模型SLAMC(A Novel Statistical Semantic Language Model For Source Code),在語(yǔ)言模型的基礎(chǔ)上加入“緩存”機(jī)制來(lái)維護(hù)程序的局部信息.實(shí)驗(yàn)結(jié)果表明,加入“緩存”機(jī)制的模型捕獲了源代碼中的局部規(guī)律,實(shí)驗(yàn)使用Top-K的Precision對(duì)模型生成代碼準(zhǔn)確性進(jìn)行評(píng)估,Precision在Top-1中達(dá)到64.00%、Top-5達(dá)到78.20%.Raychev V等人[6]使用N-gram模型與循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)合,在JavaAPI調(diào)用級(jí)別進(jìn)行代碼補(bǔ)全,利用N-Gram模型對(duì)程序中的API 調(diào)用序列建模,從而對(duì)API的調(diào)用序列進(jìn)行預(yù)測(cè).該研究通過(guò)分析Top-K個(gè)推薦代碼的Precision來(lái)評(píng)估模型的效果.Tu Z等人[7]同樣針對(duì)N-Gram模型忽略的程序局部特征,在語(yǔ)言模型中加入了緩存機(jī)制,其附加的緩存組件通過(guò)捕獲軟件的局部性,從而改進(jìn)了N-Gram方法,其中MRR評(píng)估指標(biāo)為54.44%,Top-1中Precision為52.04%,Top-5中Precision為57.45%.Raychev V 等人[8]基于循環(huán)神經(jīng)網(wǎng)絡(luò),將程序代碼的抽象語(yǔ)法樹(shù)的序列化結(jié)果作為訓(xùn)練數(shù)據(jù)集,并將網(wǎng)絡(luò)輸出結(jié)果區(qū)分為終結(jié)符的預(yù)測(cè)和非終結(jié)符的預(yù)測(cè),該方法在一定程度上運(yùn)用了存在于抽象語(yǔ)法樹(shù)中的結(jié)構(gòu)化信息,進(jìn)一步提升了與生成代碼相關(guān)的非終結(jié)符預(yù)測(cè)的準(zhǔn)確性,該研究使用Top-K個(gè)推薦代碼的Precision來(lái)對(duì)模型生成代碼性能進(jìn)行評(píng)估.

        Allamanis M等人[9]提出了專(zhuān)門(mén)為方法命名問(wèn)題設(shè)計(jì)的神經(jīng)概率語(yǔ)言模型的源代碼,該模型通過(guò)在一個(gè)高維連續(xù)空間中將名稱(chēng)分配到稱(chēng)為嵌入的位置,以一種具有相似嵌入的名稱(chēng)傾向于在相似的上下文中使用的方式來(lái)了解哪些名稱(chēng)在語(yǔ)義上是相似的,并通過(guò)F1-Measure評(píng)估模型的性能.之后,Allamanis M等人[10]基于圖網(wǎng)絡(luò)學(xué)習(xí)代碼中的結(jié)構(gòu)以及語(yǔ)義特征,利用圖模型中的不同邊表示代碼token之間的結(jié)構(gòu)和語(yǔ)法關(guān)系,實(shí)驗(yàn)中F1-Measure評(píng)估指標(biāo)為44.0%.

        在當(dāng)前代碼自動(dòng)生成的相關(guān)研究中,缺乏針對(duì)代碼自動(dòng)生成性能的統(tǒng)一評(píng)估方法.部分研究用Precision、Recall、MRR、F-Measure作為評(píng)估代碼自動(dòng)生成性能的指標(biāo),但這些指標(biāo)僅基于代碼自動(dòng)生成個(gè)數(shù)以及生成代碼的正確性來(lái)進(jìn)行計(jì)算.在實(shí)際開(kāi)發(fā)中,代碼自動(dòng)生成的效果不僅僅由代碼自動(dòng)生成工具決定,程序員的行為在其中也起到了較大的作用.現(xiàn)有評(píng)估方法忽略了程序員行為在代碼自動(dòng)生成過(guò)程中的重要性,只是針對(duì)代碼自動(dòng)生成結(jié)果進(jìn)行了評(píng)估.此外,由于大部分研究采用不同的評(píng)估指標(biāo),且各指標(biāo)之間無(wú)法直接轉(zhuǎn)化,難以對(duì)各種代碼自動(dòng)生成模型和方法進(jìn)行對(duì)比.因此,針對(duì)代碼自動(dòng)生成過(guò)程進(jìn)行性能評(píng)估是亟待解決的問(wèn)題.

        本文綜合程序員以及代碼自動(dòng)生成工具在代碼自動(dòng)生成過(guò)程中的作用,提出了一種基于半監(jiān)督學(xué)習(xí)的代碼自動(dòng)生成性能評(píng)估方法.通過(guò)采集程序員行為與代碼自動(dòng)生成工具行為的相關(guān)數(shù)據(jù)來(lái)抽取代碼自動(dòng)生成過(guò)程中影響性能的特征,利用半監(jiān)督學(xué)習(xí)對(duì)代碼自動(dòng)生成過(guò)程中的相關(guān)特征數(shù)據(jù)進(jìn)行聚類(lèi)分析從而確定性能類(lèi)別;根據(jù)與性能相關(guān)的特征數(shù)據(jù)以及對(duì)應(yīng)的性能類(lèi)別來(lái)訓(xùn)練代碼自動(dòng)生成性能評(píng)估模型,從而分析代碼自動(dòng)生成性能、程序員行為與代碼自動(dòng)生成工具行為在代碼自動(dòng)生成過(guò)程中對(duì)性能的影響程度.

        3 針對(duì)程序員行為與代碼自動(dòng)生成工具行為相關(guān)數(shù)據(jù)的重要特征提取

        代碼自動(dòng)生成的性能包括程序員編程的性能和代碼自動(dòng)生成工具的性能,因此影響代碼自動(dòng)生成過(guò)程性能的數(shù)據(jù)主要包括程序員行為數(shù)據(jù)和代碼自動(dòng)生成工具行為數(shù)據(jù).

        3.1 與性能相關(guān)的基本特征

        在代碼自動(dòng)生成過(guò)程中,有時(shí)代碼自動(dòng)生成工具生成了符合邏輯的代碼,但并不符合程序員的預(yù)期,那么這段代碼在實(shí)際使用中也是性能較差的.因此,與性能相關(guān)的基本特征由程序員行為和代碼自動(dòng)生成工具行為共同決定.若能抽取所有與性能相關(guān)的特征,則可以分析出代碼自動(dòng)生成過(guò)程中的所有性能問(wèn)題.但是,考慮到性能數(shù)據(jù)收集過(guò)程中產(chǎn)生的程序擾動(dòng)以及軟硬件開(kāi)銷(xiāo),本文主要關(guān)注與性能相關(guān)的基本特征.

        代碼自動(dòng)生成工具會(huì)根據(jù)程序員的輸入代碼自動(dòng)生成代碼,而程序員的輸入代碼決定著代碼自動(dòng)生成工具生成代碼的內(nèi)容.程序員輸入代碼的長(zhǎng)短可能會(huì)導(dǎo)致生成不同的代碼,而程序員錯(cuò)誤的輸入甚至?xí)?dǎo)致代碼自動(dòng)生成工具生成不相關(guān)的代碼.所以程序員的輸入在很大程度上影響著代碼自動(dòng)生成工具的性能.

        代碼自動(dòng)生成工具為程序員更高效的完成編碼工作提供了輔助,程序員選中的生成代碼代表著實(shí)際開(kāi)發(fā)中需要的代碼,同時(shí)也反映了代碼自動(dòng)生成工具生成代碼的正確性.此外,程序員選擇生成代碼過(guò)程中的按鍵次數(shù)可以反映出程序員需要的代碼在代碼推薦列表中的位置以及代碼自動(dòng)生成工具生成代碼的準(zhǔn)確率.程序員在選擇生成代碼之后發(fā)生的刪除或糾正代碼行為表示程序員雖然選擇了生成代碼,但生成代碼需要經(jīng)過(guò)修改才能達(dá)到程序員的期望.

        程序員當(dāng)前已經(jīng)編寫(xiě)好的代碼可視為代碼上下文,代碼自動(dòng)生成工具會(huì)根據(jù)代碼上下文進(jìn)行代碼自動(dòng)生成.因此,代碼上下文的復(fù)雜度以及代碼上下文的語(yǔ)義環(huán)境決定了代碼自動(dòng)生成的內(nèi)容,清晰的代碼上下文結(jié)構(gòu)更有助于生成高質(zhì)量的代碼.在代碼自動(dòng)生成工具每次向程序員推薦的代碼中,程序員是否選擇生成代碼決定了生成代碼是否成功推薦.現(xiàn)有工具在提供代碼生成功能時(shí),通常將生成的代碼添加到IDE的代碼推薦框中,然后程序員根據(jù)自己的實(shí)際需要選擇相應(yīng)的生成代碼.因此,自動(dòng)生成的代碼在代碼推薦列表中的位置及生成時(shí)間尤為重要,它將直接影響程序員的按鍵次數(shù)以及等待時(shí)間,從而進(jìn)一步影響開(kāi)發(fā)效率.由于編寫(xiě)代碼具有很大的靈活性,因而代碼自動(dòng)生成工具生成代碼的數(shù)量可以為程序員提供多種解決方案.

        表1 代碼自動(dòng)生成性能基本特征Table 1 Basic characteristics of automatic code generation performance

        綜上所述,本文定義了程序員行為、代碼自動(dòng)生成工具行為與代碼自動(dòng)生成性能相關(guān)的基本特征,如表1所示.

        3.2 與性能相關(guān)的復(fù)雜特征分析及處理

        除了3.1中提出的與性能相關(guān)的基本特征,由于代碼中存在大量程序員自定義的修飾符,導(dǎo)致代碼自動(dòng)生成工具推薦的代碼在語(yǔ)義上符合程序員的需要,但是實(shí)際代碼并不一定完全與程序員需要的代碼相同.所以,程序員的刪除行為或生成代碼是否被程序員選擇等信息并不能完全衡量代碼自動(dòng)生成過(guò)程的性能.因此,將程序員選擇代碼與生成代碼之間的語(yǔ)義相似度作為一個(gè)與性能相關(guān)的重要特征.

        為了得到選擇代碼與生成代碼之間的語(yǔ)義相似度,本文用Word2Vec[11]對(duì)代碼token進(jìn)行向量化表示.Word2Vec在一個(gè)連續(xù)空間中為每個(gè)詞語(yǔ)產(chǎn)生一個(gè)對(duì)應(yīng)的分布式向量,可計(jì)算詞語(yǔ)之間的相似度.本文應(yīng)用Word2Vec的這一特性來(lái)評(píng)估代碼自動(dòng)生成工具生成的代碼與程序員所需代碼之間的相似性.Word2Vec主要包括CBOW(Continuous Bag-of-Words Model)[12]和Skip-Gram[13]兩種模式,其中CBOW是從原始語(yǔ)句推測(cè)目標(biāo)詞,Skip-Gram是從目標(biāo)詞推測(cè)出原始語(yǔ)句,實(shí)踐表明CBOW對(duì)小型語(yǔ)料效果較好,而Skip-Gram在大型語(yǔ)料庫(kù)中表現(xiàn)更加出色.因此本文使用Skip-Gram模型為代碼訓(xùn)練一種分布式的向量表示.

        訓(xùn)練詞向量之前需要大量分詞后的優(yōu)質(zhì)代碼語(yǔ)料.在構(gòu)建代碼語(yǔ)料的過(guò)程中,由于代碼文件通常包含大量的自然語(yǔ)言注釋?zhuān)瑢⒂绊懺~向量以及代碼分詞的效果.本文使用抽象語(yǔ)法樹(shù)(Abstract Syntax Tree,AST)對(duì)代碼進(jìn)行解析并進(jìn)行數(shù)據(jù)清洗,校驗(yàn)代碼語(yǔ)料語(yǔ)法是否規(guī)范,并利用AST構(gòu)建代碼詞典.

        3.2.1 數(shù)據(jù)清洗

        為了避免代碼語(yǔ)料中存在的自然語(yǔ)言注釋以及語(yǔ)法不規(guī)范等問(wèn)題對(duì)詞向量的構(gòu)建產(chǎn)生影響,我們使用AST對(duì)代碼語(yǔ)料進(jìn)行解析,通過(guò)AST結(jié)構(gòu)的完整性來(lái)檢查代碼語(yǔ)法是否規(guī)范.首先將待解析代碼初始化為code,將code通過(guò)AST解析為T(mén),通過(guò)檢查T(mén)來(lái)判斷code語(yǔ)法是否規(guī)范,若不規(guī)范對(duì)code進(jìn)行刪除,否則通過(guò)遍歷T中節(jié)點(diǎn),刪除T中注釋節(jié)點(diǎn),對(duì)T進(jìn)行AST反向解析,將T輸出為T(mén)code,Tcode即為干凈數(shù)據(jù).

        3.2.2 建立代碼詞典/分詞

        在建立代碼詞典過(guò)程中,首先初始化代碼詞典為L(zhǎng),將Tcode通過(guò)AST解析為T(mén),遍歷T中所有節(jié)點(diǎn),將所有葉子節(jié)點(diǎn)內(nèi)容添加到L,通過(guò)集合對(duì)L進(jìn)行去重.去重后的L即為代碼詞典,通過(guò)L使用正向最大長(zhǎng)度匹配對(duì)Tcode進(jìn)行分詞.建立代碼詞典/分詞算法如表2所示.

        表2 建立代碼詞典/分詞算法Table 2 Building code dictionary/word segmentation algorithm

        3.2.3 計(jì)算生成代碼相似度

        使用分詞后的代碼語(yǔ)料通過(guò)Skip-Gram模型訓(xùn)練詞向量.由于相似代碼具有相似的向量表示,本文通過(guò)計(jì)算生成代碼與程序員預(yù)期代碼之間的余弦相似度得到選擇代碼與生成代碼之間的語(yǔ)義相似度,使用公式(5)計(jì)算生成代碼相似度.

        (5)

        其中A表示程序員預(yù)期代碼token,Ak表示tokenA的第k維向量;B表示代碼自動(dòng)生成工具生成代碼token,Bi為生成的第i個(gè)代碼,Bik表示tokenBi的第k維向量.通過(guò)計(jì)算B中生成代碼Bi與程序員期望代碼A的相似度,可以得到選擇代碼與生成代碼之間的語(yǔ)義相似度,即生成代碼相似度.

        4 確定性能類(lèi)別

        抽取性能特征有助于確定性能類(lèi)別.基于3.1中的代碼自動(dòng)生成性能基本特征及3.2中生成代碼與選擇代碼的語(yǔ)義相似度,可以綜合考慮程序員行為和代碼自動(dòng)生成工具行為后對(duì)性能類(lèi)別進(jìn)行劃分.如果可以對(duì)性能數(shù)據(jù)進(jìn)行分類(lèi),就能進(jìn)一步分析性能特征對(duì)性能的影響程度.K-means是一種常用的對(duì)數(shù)據(jù)進(jìn)行無(wú)監(jiān)督聚類(lèi)的方法[14],但K-means算法在對(duì)性能數(shù)據(jù)進(jìn)行分類(lèi)時(shí),可能將一些性能數(shù)據(jù)明顯較差的數(shù)據(jù)混合到其余類(lèi)別中.

        我們?cè)谟^察采集到的性能數(shù)據(jù)時(shí),發(fā)現(xiàn)偶爾出現(xiàn)部分特征項(xiàng)為0的數(shù)據(jù),而這部分?jǐn)?shù)據(jù)大多分布在代碼自動(dòng)生成工具推薦代碼個(gè)數(shù)、程序員選擇的生成代碼、程序員選擇生成代碼的按鍵次數(shù)、生成代碼語(yǔ)義相似度等特征中.這些數(shù)據(jù)明顯屬于性能較差的類(lèi)別.為了避免在分類(lèi)過(guò)程中將性能特征數(shù)據(jù)中的程序員行為和代碼自動(dòng)生成工具行為混淆,或?qū)⒛骋环N特征弱化,借鑒文獻(xiàn)[15]中基于背景知識(shí)分類(lèi)的方法,本文將半監(jiān)督算法與代碼自動(dòng)生成過(guò)程中程序員和代碼自動(dòng)生成工具間的關(guān)系相結(jié)合,定義相應(yīng)的約束條件對(duì)性能數(shù)據(jù)進(jìn)行分類(lèi).

        4.1 約束

        在K-means的背景下,實(shí)例約束可以表示哪些實(shí)例應(yīng)該組合或不應(yīng)該組合在一起的背景知識(shí).因此,本文考慮兩種成對(duì)的約束關(guān)系,即正關(guān)聯(lián)約束和負(fù)關(guān)聯(lián)約束.

        1)正關(guān)聯(lián)(Must-link)約束指定兩個(gè)實(shí)例必須位于同一個(gè)類(lèi)別中.

        2)負(fù)關(guān)聯(lián)(Cannot-link)約束指定兩個(gè)實(shí)例不可能位于同一個(gè)類(lèi)別中.

        針對(duì)性能體現(xiàn)明顯較差的數(shù)據(jù),通過(guò)定義正關(guān)聯(lián)約束,指定該類(lèi)數(shù)據(jù)在聚類(lèi)過(guò)程中強(qiáng)制分配到低性能類(lèi)別中.反之針對(duì)性能體現(xiàn)明顯較高的數(shù)據(jù),則定義為負(fù)關(guān)聯(lián)約束,指定該類(lèi)數(shù)據(jù)不與低性能數(shù)據(jù)劃分到同一類(lèi)別中.

        4.2 帶約束的K-means聚類(lèi)算法

        為了確定性能數(shù)據(jù)的類(lèi)別,本文通過(guò)一組正負(fù)關(guān)聯(lián)約束結(jié)合K-means的聚類(lèi)原則對(duì)性能數(shù)據(jù)進(jìn)行半監(jiān)督聚類(lèi).首先將性能數(shù)據(jù)初始化為D,定義一對(duì)正關(guān)聯(lián)約束(Con=)和負(fù)關(guān)聯(lián)約束(Con≠),根據(jù)K-means的聚類(lèi)原則,首先隨機(jī)初始化類(lèi)別中心C,針對(duì)D中的性能數(shù)據(jù)di在滿(mǎn)足約束關(guān)系的前提下將其就近分配到Cj.以di到Cj的平均距離對(duì)Cj進(jìn)行更新,并對(duì)D中的性能數(shù)據(jù)di在不違反約束關(guān)系的前提下就近分配類(lèi)別,直到Cj不再發(fā)生變化,通過(guò)評(píng)估聚類(lèi)效果來(lái)確定最佳k值.帶約束的K-means聚類(lèi)算法如表3所示.

        表3 帶約束的K-means聚類(lèi)算法Table 3 Constrained K-means clustering algorithm

        4.3 評(píng) 估

        雖然帶約束的性能聚類(lèi)一定程度上可以避免錯(cuò)誤的分類(lèi),但直接決定聚類(lèi)效果好壞的類(lèi)別個(gè)數(shù)是人為定義的.為了使聚類(lèi)效果達(dá)到最佳,我們?cè)诖_定性能類(lèi)別數(shù)k時(shí),根據(jù)帶約束的聚類(lèi)方法分別計(jì)算不同k值時(shí)性能類(lèi)別中數(shù)據(jù)D的誤差平方和,如式(6)所示.

        (6)

        其中,SSE代表所有樣本的聚類(lèi)誤差,Ci代表第i個(gè)類(lèi)別,p為Ci中的樣本點(diǎn),mi為Ci的質(zhì)心(Ci中所有樣本的均值).依據(jù)SSE的思想[16],可以對(duì)k值進(jìn)行搜索,當(dāng)SSE下降幅度變小時(shí)確定k值.通過(guò)以上過(guò)程,可以劃分性能類(lèi)別個(gè)數(shù),并對(duì)每個(gè)類(lèi)別中數(shù)據(jù)的特征賦予類(lèi)別實(shí)際意義,如果不能很好地解釋每個(gè)類(lèi)別,就再考慮次優(yōu)的劃分方法,直至找到能被賦予實(shí)際意義的性能類(lèi)別.性能類(lèi)別可作為評(píng)估代碼自動(dòng)生成性能的一項(xiàng)指標(biāo).

        5 基于DNN的代碼自動(dòng)生成性能評(píng)估

        通過(guò)第4節(jié)的方法可以得到合理的性能類(lèi)別,有助于對(duì)性能特征數(shù)據(jù)進(jìn)行標(biāo)記.為了分析代碼自動(dòng)生成過(guò)程中性能類(lèi)別與程序員行為及代碼自動(dòng)生成工具行為之間的關(guān)系,本文設(shè)計(jì)了一種基于深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNN)的代碼自動(dòng)生成性能評(píng)估模型.該模型根據(jù)程序員行為與代碼自動(dòng)生成工具行為特征數(shù)據(jù)進(jìn)行性能分類(lèi),同時(shí)針對(duì)每種性能類(lèi)別分析程序員行為與代碼自動(dòng)生成工具行為的影響程度,以此評(píng)估代碼自動(dòng)生成的性能.基于DNN的代碼自動(dòng)生成性能評(píng)估模型如圖1所示.

        圖1 基于DNN的代碼自動(dòng)生成性能評(píng)估模型Fig. 1 Performance evaluation model of automatic code generation based on DNN

        從程序員行為特征輸入層p到隱藏層h的過(guò)程記為函數(shù)fp,從代碼自動(dòng)生成工具行為特征輸入層c到隱藏層h的過(guò)程記為函數(shù)fc,從隱藏層h到性能分類(lèi)層y的過(guò)程記為函數(shù)g,如式(7)、式(8)所示:

        h=fp(xp)+fc(xc)=S(Wp+b)+S(Wc+b)

        (7)

        y=g(h)=S(WTh+d)

        (8)

        其中S一般取為sigmod函數(shù);Wp為程序員行為特征輸入層p與隱藏層之間的權(quán)重矩陣,Wc為代碼自動(dòng)生成工具行為特征輸入層c與隱藏層之間的權(quán)重矩陣;b表示隱藏層的偏置向量,d表示輸出層的偏置向量.依據(jù)式(7)、式(8)可以得到x所屬性能類(lèi)別y.為方便表示,記θ=(Wp,Wc,WT,b,d).

        假設(shè)程序員行為特征輸入層的樣本數(shù)據(jù)為p={p1,p2,…,pn},代碼自動(dòng)生成工具行為特征輸入層的樣本數(shù)據(jù)為c={c1,c2,…,cn},D為包含N個(gè)p和c的訓(xùn)練集以及數(shù)據(jù)對(duì)應(yīng)的性能類(lèi)別標(biāo)簽,則訓(xùn)練基于DNN的代碼自動(dòng)生成性能評(píng)估模型的過(guò)程就是利用D對(duì)參數(shù)θ的訓(xùn)練過(guò)程,訓(xùn)練目標(biāo)是使y和性能類(lèi)別標(biāo)簽盡可能接近,性能數(shù)據(jù)分類(lèi)準(zhǔn)確度使用均方誤差來(lái)描述,其定義為式(9):

        (9)

        通過(guò)以上方法可以得到參數(shù)θ.針對(duì)未知性能類(lèi)別的代碼生成特征數(shù)據(jù)x,可以將特征數(shù)據(jù)分為程序員行為數(shù)據(jù)xp以及代碼自動(dòng)生成工具行為數(shù)據(jù)xc兩部分輸入模型,由于程序員與代碼自動(dòng)生成工具在代碼生成過(guò)程中有著不同的重要程度,我們?cè)趫D1中的I層計(jì)算了xp與xc對(duì)分類(lèi)結(jié)果y的影響程度,即Impact_P和Impact_C.計(jì)算方法如式(10)、式(11)所示:

        Impact_P=(WTfp(xp)+b)/y

        (10)

        Impact_C=(WTfc(xc)+d)/y

        (11)

        其中Impact_P為程序員行為特征p對(duì)性能類(lèi)別y的影響程度,Impact_C為代碼自動(dòng)生成工具行為特征c對(duì)性能類(lèi)別y的影響程度.

        通過(guò)基于DNN的代碼自動(dòng)生成性能評(píng)估模型,可以針對(duì)代碼自動(dòng)生成過(guò)程中產(chǎn)生的程序員行為數(shù)據(jù)以及代碼自動(dòng)生成工具行為數(shù)據(jù)對(duì)代碼生成性能進(jìn)行分類(lèi),同時(shí)分析程序員和代碼自動(dòng)生成工在性能類(lèi)別中的影響程度.

        6 實(shí) 驗(yàn)

        本文在前期研究中實(shí)現(xiàn)了原型工具API4ACGT[17],并利用IntelliJ IDEA的開(kāi)源插件機(jī)制將API4ACGT無(wú)縫集成到IntelliJ IDEA中.API4ACGT可以在程序員使用代碼自動(dòng)生成工具進(jìn)行編碼時(shí)動(dòng)態(tài)記錄程序員的行為信息以及代碼生成工具行為信息.

        6.1 性能數(shù)據(jù)及復(fù)雜特征提取

        我們將API4ACGT(1)https://github.com/xiaojiangzhang安裝到多個(gè)程序員的IDE中,同時(shí)安裝了代碼生成工具IDEA和AiXCoder.對(duì)不同時(shí)刻、熟練程度不同的程序員在代碼自動(dòng)生成工具輔助下的編程過(guò)程的性能數(shù)據(jù)進(jìn)行了采集,數(shù)據(jù)規(guī)模為15000條.部分?jǐn)?shù)據(jù)如表4所示.

        通過(guò)API4ACGT得到性能數(shù)據(jù)后,首先需對(duì)數(shù)據(jù)進(jìn)行特征提取,并計(jì)算代碼自動(dòng)生成工具生成的代碼與程序員需要代碼之間的語(yǔ)義相似度.應(yīng)用3.2中的方法,我們?cè)贕itHub開(kāi)源社區(qū)中爬取了40余萬(wàn)個(gè)Start大于20的Java代碼文件(約11GB),并建立了Java代碼語(yǔ)料庫(kù),代碼詞庫(kù)中的token為77272個(gè).

        表5 詞向量聚類(lèi)結(jié)果Table 5 Word2Vec clustering results

        利用代碼詞庫(kù)對(duì)Java代碼進(jìn)行分詞后,使用Skip-Gram模型訓(xùn)練代碼詞向量,并在Python3.7環(huán)境中使用Gensim提供的Word2Vec模塊對(duì)分詞后的代碼語(yǔ)料進(jìn)行詞向量的訓(xùn)練.正如前文所述,AST中的相似節(jié)點(diǎn)應(yīng)該具有相似的表示,為了評(píng)估訓(xùn)練的詞向量是否達(dá)到這個(gè)標(biāo)準(zhǔn),通過(guò)K-Means聚類(lèi)來(lái)評(píng)估我們訓(xùn)練的詞向量.實(shí)驗(yàn)中我們將聚類(lèi)個(gè)數(shù)設(shè)置為48,截取了3個(gè)類(lèi)別中的部分token,結(jié)果如表5所示.在類(lèi)別1中幾乎所有符號(hào)都與String類(lèi)型相關(guān),類(lèi)別2中大多數(shù)符號(hào)都與循環(huán)控制有關(guān),類(lèi)別3中主要是List的子類(lèi)或相關(guān)方法.這個(gè)結(jié)果證實(shí)了我們的訓(xùn)練是有效的,相似的符號(hào)具有相似的向量表示.

        根據(jù)式(5),對(duì)代碼自動(dòng)生成工具所生成的推薦代碼與程序員選擇的生成代碼進(jìn)行了語(yǔ)義相似度的計(jì)算,并將其合并為生成代碼語(yǔ)義相似度指標(biāo).同時(shí)對(duì)表4中部分原始數(shù)據(jù)進(jìn)行了數(shù)值化,代碼自動(dòng)生成工具推薦代碼索引按照式(12)進(jìn)行計(jì)算.

        (12)

        其中n為代碼索引位置.生成代碼位置越靠后,s值就越小。與代碼自動(dòng)生成過(guò)程相關(guān)的所有性能特征數(shù)值化后如表6所示.

        表6 性能特征數(shù)值Table 6 Performance feature value

        表6中有少量數(shù)據(jù)存在空值,主要集中在代碼自動(dòng)生成工具生成推薦代碼個(gè)數(shù)、代碼自動(dòng)生成工具是否成功推薦代碼、代碼自動(dòng)生成工具推薦代碼索引、生成代碼語(yǔ)義相似度等特征中.通過(guò)分析,出現(xiàn)這種情況的原因主要是由于代碼自動(dòng)生成工具未能為程序員生成代碼,所以在程序員選擇代碼行為或代碼自動(dòng)生成工具相關(guān)行為的數(shù)據(jù)上為空值,可以通過(guò)人工判定這種情況屬于性能較差的體現(xiàn).

        6.2 性能分類(lèi)

        在應(yīng)用第4節(jié)中的方法標(biāo)注性能類(lèi)別時(shí),可以基于人工判定的結(jié)果定義相關(guān)約束.如果代碼自動(dòng)生成工具推薦代碼個(gè)數(shù)、代碼自動(dòng)生成工具是否成功推薦代碼、代碼自動(dòng)生成工具推薦代碼索引、生成代碼語(yǔ)義相似度的特征值為空或0,則將這類(lèi)數(shù)據(jù)強(qiáng)制連接到性能較差的數(shù)據(jù)類(lèi)別中;不滿(mǎn)足該約束時(shí),該類(lèi)數(shù)據(jù)不允許連接到性能較差的類(lèi)別中.基于這種約束,我們對(duì)數(shù)據(jù)集進(jìn)行了聚類(lèi),通過(guò)計(jì)算不同k值與SSE值確定最優(yōu)的性能類(lèi)別個(gè)數(shù),結(jié)果如圖2所示.

        在性能類(lèi)別數(shù)等于3時(shí)SSE下降幅度為1413.9,性能類(lèi)別數(shù)等于4時(shí)SSE下降幅度為642.47,下降幅度明顯變緩慢.可見(jiàn),將性能數(shù)據(jù)劃分為高、中、低3個(gè)類(lèi)別是合理的.因此,本文設(shè)定類(lèi)別數(shù)為3.通過(guò)對(duì)數(shù)據(jù)集進(jìn)行聚類(lèi)及標(biāo)注,聚類(lèi)結(jié)果如圖3所示.

        圖2 SSE 計(jì)算結(jié)果Fig.2 SSE statistics

        在圖3中,負(fù)值表示數(shù)據(jù)相對(duì)較小.如圖3所示,在性能較低的類(lèi)別中,代碼上下文復(fù)雜度較高,而代碼自動(dòng)生成工具生成代碼時(shí)間較長(zhǎng),成功推薦代碼次數(shù)較少,同時(shí)生成代碼與程序員期望代碼之間的代碼語(yǔ)義相似度較低.程序員行為中刪除行為較突出,說(shuō)明生成代碼并不符合程序員的期望.此外,在代碼復(fù)雜度較高的情況下,代碼自動(dòng)生成工具生成代碼數(shù)量較少,時(shí)間較長(zhǎng),在代碼自動(dòng)生成過(guò)程中性能表現(xiàn)較低.

        圖3 聚類(lèi)結(jié)果Fig.3 Clustering results

        6.3 代碼自動(dòng)生成性能評(píng)估

        應(yīng)用第5節(jié)的性能評(píng)估模型,本文在分類(lèi)后的數(shù)據(jù)中隨機(jī)抽取13000條作為訓(xùn)練集,2000條作為測(cè)試集,使用隱藏層數(shù)為3、隱層節(jié)點(diǎn)數(shù)為20的網(wǎng)絡(luò)參數(shù)對(duì)模型進(jìn)行訓(xùn)練.在訓(xùn)練階段為了防止深度學(xué)習(xí)中常見(jiàn)的擬合性問(wèn)題,本文在模型訓(xùn)練過(guò)程中加入了Dropout正則化處理,最終模型針對(duì)測(cè)試集性能分類(lèi)準(zhǔn)確率達(dá)到98.17%.

        為了評(píng)估程序員行為與代碼自動(dòng)生成工具行為在代碼自動(dòng)生成過(guò)程中各自的影響程度,選擇了一批經(jīng)過(guò)復(fù)雜特征提取后的數(shù)據(jù)進(jìn)行分類(lèi),并計(jì)算了程序員行為特征與代碼自動(dòng)生成工具行為特征在不同性能類(lèi)別中的影響程度,用一個(gè)三元組作為評(píng)估代碼自動(dòng)生成性能的指標(biāo).其中,Class代表代碼自動(dòng)生成性能類(lèi)別,Impact_P為程序員行為特征對(duì)性能類(lèi)別的影響程度,Impact_C為代碼自動(dòng)生成工具行為特征對(duì)性能類(lèi)別的影響程度,部分實(shí)驗(yàn)數(shù)據(jù)如表7所示.

        表7中Class為性能類(lèi)別.可以看出,低性能類(lèi)別中Impact_P指標(biāo)明顯高于Impact_C.從序號(hào)為3、9、10、11、14、16的數(shù)據(jù)中可以看出,代碼自動(dòng)生成工具推薦代碼個(gè)數(shù)接近0,代碼自動(dòng)生成工具是否成功推薦代碼為0,生成代碼語(yǔ)義相似度幾乎為0,Impact_P均值為0.8352,而Impact_C均值為0.1648,可以看出程序員行為對(duì)低性能類(lèi)別影響程度較高.低性能數(shù)據(jù)的各項(xiàng)特征可以反映出代碼生成工具沒(méi)有為程序員生成符合期望的代碼.在中性能數(shù)據(jù)中,Impact_P與Impact_C較為接近,程序員行為數(shù)據(jù)與代碼自動(dòng)生成工具行為數(shù)據(jù)分布比較均勻.例如序號(hào)為1、5、7、12、15的中性能數(shù)據(jù),Impact_P與Impact_C均值為0.4849和0.5151.在高性能數(shù)據(jù)中,Impact_C指標(biāo)比較突出,Impact_C幾乎接近1.此時(shí),代碼自動(dòng)生成工具生成代碼的語(yǔ)義相似度最高達(dá)到0.8542,生成代碼數(shù)量也達(dá)到最高,同時(shí)程序員按鍵次數(shù)依舊保持在1左右,即代碼自動(dòng)生成工具為程序員生成了優(yōu)質(zhì)的代碼,從而提高了程序員的開(kāi)發(fā)效率.

        表7 程序員行為特征與代碼自動(dòng)生成工具行為特征在不同性能類(lèi)別中的影響程度實(shí)驗(yàn)數(shù)據(jù)Table 7 Experimental data on the influence of behavior characteristics of programmers and automatic code generation tools on different performance categories

        上述實(shí)驗(yàn)表明,本文的方法可以有效分析代碼自動(dòng)生成過(guò)程的性能,并判斷程序員行為與代碼自動(dòng)生成工具行為對(duì)代碼自動(dòng)生成過(guò)程性能的影響程度.

        6.4 評(píng)估結(jié)果分析

        為了進(jìn)一步驗(yàn)證本文所提出的方法,代碼自動(dòng)生成過(guò)程中采集的性能數(shù)據(jù)使用Precision、Recall、MRR、F1-Measure及本文評(píng)估方法中的進(jìn)行了計(jì)算.本文的代碼自動(dòng)生成性能數(shù)據(jù)在InstallJ IDEA中采集.在InstallJ IDEA中,代碼自動(dòng)生成工具可以推薦無(wú)限多個(gè)代碼.但無(wú)限多的推薦代碼會(huì)導(dǎo)致Precision接近0,即使推薦成功也沒(méi)有意義.因此,性能評(píng)估中設(shè)定Top-K大小為3,且只考慮推薦代碼列表中的前3項(xiàng).針對(duì)表7中16條代碼自動(dòng)生成記錄,性能評(píng)估結(jié)果如表8所示.

        從表8中可以看出,不同評(píng)估指標(biāo)顯示表7中16條代碼自動(dòng)生成記錄的性能評(píng)估結(jié)果為中等.與Precision、Recall相比,F(xiàn)1-Measure、MRR、的評(píng)估結(jié)果較為接近.

        在代碼自動(dòng)生成過(guò)程中,涉及較多可能影響代碼自動(dòng)生成性能的因素.例如,程序員輸入代碼會(huì)直接影響代碼自動(dòng)生成工具推薦代碼內(nèi)容;程序員選擇生成代碼之后,可能出現(xiàn)刪除代碼的行為等.從公式(1)、(2)、(4)可知,Precision、Recall以及F1-Measure只計(jì)算了代碼自動(dòng)生成工具推薦代碼個(gè)數(shù)以及正確推薦代碼次數(shù),MRR計(jì)算了代碼自動(dòng)生成工具正確推薦代碼排序結(jié)果.本文提出的方法綜合考慮了影響代碼自動(dòng)生成性能問(wèn)題的相關(guān)因素,從程序員行為以及代碼自動(dòng)生成工具行為兩個(gè)方面進(jìn)行評(píng)估.通過(guò)選擇深度神經(jīng)網(wǎng)絡(luò)作為性能評(píng)估的基礎(chǔ)模型,在代碼自動(dòng)生成性能評(píng)估過(guò)程中,不僅對(duì)性能數(shù)據(jù)類(lèi)別進(jìn)行計(jì)算,而且使用深度神經(jīng)網(wǎng)絡(luò)中不同神經(jīng)元之間的權(quán)重參數(shù)來(lái)估計(jì)程序員與代碼自動(dòng)生成工具行為數(shù)據(jù)對(duì)性能評(píng)估的影響程度,同時(shí)也可以利用兩種行為對(duì)性能的影響程度分析性能問(wèn)題的瓶頸.

        表8 代碼自動(dòng)生成性能評(píng)估結(jié)果Table 8 Results of code automatic generation based on different performance metrics

        7 結(jié)束語(yǔ)

        本文針對(duì)代碼自動(dòng)生成提出了一種性能評(píng)估方法,綜合考慮了程序員與代碼自動(dòng)生成工具的作用,通過(guò)抽取程序員行為與代碼自動(dòng)生成工具行為特征,使用帶約束的半監(jiān)督聚類(lèi)方法對(duì)性能數(shù)據(jù)進(jìn)行分類(lèi);根據(jù)程序員行為特征數(shù)據(jù)以及代碼自動(dòng)生成數(shù)據(jù)建立了一種基于DNN的性能評(píng)估模型,評(píng)估了程序員和代碼自動(dòng)生成工具對(duì)代碼自動(dòng)生成性能的影響程度.實(shí)驗(yàn)表明,代碼自動(dòng)生成性能表現(xiàn)較高時(shí),代碼自動(dòng)生成工具行為特征權(quán)重較大,幾乎直接決定了性能類(lèi)別,同時(shí)也說(shuō)明高性能的代碼自動(dòng)生成在較大程度上簡(jiǎn)化了程序員的開(kāi)發(fā)行為;而在低性能類(lèi)別中,程序員的行為特征權(quán)重較大,說(shuō)明低性能的代碼自動(dòng)生成會(huì)導(dǎo)致程序員的開(kāi)發(fā)行為在編程中占據(jù)較大比重;在中性能類(lèi)別中,程序員行為特征與代碼自動(dòng)生成工具行為特征的權(quán)重較為平衡.

        本文所提出的代碼自動(dòng)生成性能評(píng)估方法通過(guò)分析程序員行為與代碼自動(dòng)生成工具行為的交互特征,可以有效的對(duì)生成代碼性能進(jìn)行評(píng)估,并可應(yīng)用于實(shí)際軟件項(xiàng)目中.但是,目前僅針對(duì)程序員行為與代碼自動(dòng)生成工具行為對(duì)性能分類(lèi)影響程度進(jìn)行了研究,下一步將針對(duì)程序員與代碼自動(dòng)生成工具行為中的不同特征對(duì)于性能影響程度進(jìn)行研究,為提高代碼自動(dòng)生成性能提供更多參考.

        猜你喜歡
        程序員類(lèi)別代碼
        為了讓媽媽看懂地圖,一位“野生程序員”做了個(gè)小程序
        怎樣成為一名優(yōu)秀程序員
        幼兒100(2020年29期)2020-10-21 06:17:58
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        程序員之子
        意林(2017年24期)2018-01-02 22:49:14
        加班
        三月三(2016年6期)2016-06-21 10:25:33
        服務(wù)類(lèi)別
        論類(lèi)別股東會(huì)
        商事法論集(2014年1期)2014-06-27 01:20:42
        免费国产a国产片高清网站| 精品国产乱码一区二区三区| 亚洲韩日av中文字幕| 国产区女主播在线观看| 亚洲精品国偷拍自产在线麻豆| 免费视频一区二区| 亚洲春色视频在线观看| 一本色道久久亚洲加勒比| 亚洲精品乱码8久久久久久日本 | 国产中文字幕乱人伦在线观看| 欧美男生射精高潮视频网站 | 精品人妻伦一二三区久久| 国产精品_国产精品_k频道| 国产精品一区二区久久乐下载| 黄色中文字幕视频网站| 黄片视频免费在线观看国产| 草草浮力地址线路①屁屁影院| 亚洲精品中国国产嫩草影院美女 | 99香蕉国产精品偷在线观看| 视频一区精品自拍| 国产精品老女人亚洲av无| 午夜精品久久久久久久| 国产精品福利自产拍久久| 中文字幕av无码一区二区三区电影| 精品中文字幕日本久久久| 国产精品麻豆一区二区三区 | 亚洲视频综合在线第一页| 国产日本精品视频一区二区 | 欧美 亚洲 国产 日韩 综AⅤ| 亚洲少妇一区二区三区老| 东北少妇不戴套对白第一次| 精品人妻潮喷久久久又裸又黄| 日韩精品欧美激情国产一区| 青青草原综合久久大伊人精品| 三年片免费观看大全有| 伊人久久中文大香线蕉综合| 日本一道高清在线一区二区| 亚洲国产精品成人久久久| 日韩好片一区二区在线看| 亚洲av永久无码精品成人| 丰满少妇被猛进去高潮|