日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

“主要的编程范型”及其语言特性关系(多图)

發(fā)布時(shí)間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “主要的编程范型”及其语言特性关系(多图) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

“主要的編程范型”(The principal programming paradigms)這幅圖,其實(shí)出現(xiàn)得不算早,作者在2007年完成了該圖的1.0版,到2008年更新至v1.08版本。本次提供的是翻譯成中文的版本(老實(shí)說(shuō),筆者翻譯水平相當(dāng)有限,若有不當(dāng)之處,請(qǐng)各位盡量指出,必盡快補(bǔ)正)。

?

這幅圖的原作者Peter Van Roy,是《Concepts, Techniques, and Models of Computer Programming》一書(shū)的作者,這本書(shū)(CTM)是少有的、能跟SICP并稱的書(shū)了。

?

 

該圖原文檔(PDF)下載:

http://www.info.ucl.ac.be/~pvr/paradigmsDIAGRAMeng108.pdf

?

該圖中文翻譯文件(PDF)下載:

http://www.delphibbs.com/keylife/images/u40/paradigmsDIAGRAMeng108_CN.zip

?

?

圖:主要的編程范型(點(diǎn)擊看大圖)

?

(圖1)主要的編程范型-縮略圖

 

?

一、從數(shù)據(jù)到編程
======

Peter在“主要的編程范型”中,首先分清了數(shù)據(jù)描述語(yǔ)言與描述式編程語(yǔ)言。他把數(shù)據(jù)描述語(yǔ)言——例如XML——作為獨(dú)立部分劃分出來(lái),然后指出這類語(yǔ)言主要考慮數(shù)據(jù)結(jié)構(gòu)的描象,理論上基于人們對(duì)結(jié)構(gòu)(記錄/Record、結(jié)構(gòu)/Struct)的理解。接下來(lái),作者在此基礎(chǔ)上引入第一種“程序設(shè)計(jì)特性”,即procedure,由此得到“初階函數(shù)式編程”這一個(gè)基本的程序設(shè)計(jì)范型。

?

從這里可見(jiàn)Peter在程序設(shè)計(jì)語(yǔ)言分類上與以前的其它方法的不同之處:Peter并不在乎語(yǔ)言出現(xiàn)的時(shí)間關(guān)系,也不在乎語(yǔ)言的流行程度的影響。他著力于觀察語(yǔ)言特性發(fā)展之間的脈絡(luò)。而必須要對(duì)上述內(nèi)容補(bǔ)充說(shuō)明的是,Peter在“初階函數(shù)式編程”所說(shuō)的函數(shù),事實(shí)上是早期業(yè)界對(duì)“函數(shù)(function)”的定義,即:例程分為過(guò)程、函數(shù)兩種,二者區(qū)別僅在于前者不返回值,后者返回值。所以事實(shí)上,在這里Peter強(qiáng)調(diào)的是一種“普通例程”的特性。

?

 

二、最重要的分類依據(jù):cells(state)
======
接下來(lái),Peter將一個(gè)最重要的概念"state"引入進(jìn)來(lái)。而這個(gè)state也是Peter對(duì)語(yǔ)言進(jìn)行分類并考察它們的進(jìn)化變化的主要依據(jù)。但是,Peter所引用的這個(gè)state概念,以及在這里使用的專用名詞“cells”相當(dāng)?shù)亓钊嗣曰?#xff0c;所以在這個(gè)圖的補(bǔ)充說(shuō)明中,Peter對(duì)此專門(mén)做了解釋:“狀態(tài)是記憶信息的一種能力,更精確地說(shuō),是及時(shí)存貯值序列的能力。”

?

你覺(jué)得這個(gè)概念象什么?對(duì)了,的確,非常象是“變量”。事實(shí)上,狀態(tài)在編程核心概念的“數(shù)據(jù)-邏輯”抽象中,它表明的正是“數(shù)據(jù)的可變性”,亦即是說(shuō):數(shù)據(jù)的可變性表現(xiàn)為狀態(tài)。更進(jìn)一步地說(shuō):當(dāng)數(shù)據(jù)被命名時(shí),它稱為變量或常量;當(dāng)數(shù)據(jù)未命名時(shí),它成為游離的、無(wú)名稱和時(shí)序含義的存儲(chǔ)單元,即“cells”。這也是Peter使用“cells”這個(gè)專用名詞的原因:在本圖的討論中,需要從“變量/常量”這樣的概念中,剝離掉“未命名或命名的、確定的或非確定的,以及串行的或并發(fā)的”這三方面的性質(zhì)。

?

當(dāng)不考慮一個(gè)存儲(chǔ)位置上的命名特性時(shí),它就既非變量、常量,也非某個(gè)確定的運(yùn)算對(duì)象(例如“對(duì)象”等高級(jí)的抽象概念),而只是一種更加泛義的“狀態(tài)”,而存儲(chǔ)這個(gè)狀態(tài)本身的,則因?yàn)闆](méi)有位置、時(shí)序等概念,而稱為“cells”。

 

 
三、命令式語(yǔ)言的誕生:狀態(tài)維護(hù)
======

《程序設(shè)計(jì)語(yǔ)言》這本書(shū)解釋過(guò)命令式語(yǔ)言的本質(zhì)特性,即:用算法改變數(shù)據(jù)。如果用兩個(gè)以上的邏輯(例如兩行代碼)去影響同一個(gè)存儲(chǔ)位置(cells),并使它的狀態(tài)改變,最終在該cell產(chǎn)生運(yùn)算結(jié)果的,那么它就是一種命令式語(yǔ)言。

?

再簡(jiǎn)單一點(diǎn)(但沒(méi)有上面這樣嚴(yán)謹(jǐn))地說(shuō):在程序中不斷地重寫(xiě)變量,變量值即是程序的最終結(jié)果。

所以,在本圖中,Peter把這個(gè)衍生關(guān)系表達(dá)為:命令式=純數(shù)據(jù)+算法+狀態(tài)維護(hù)。如圖:

 

 

(圖2)命令式語(yǔ)言的誕生

 

 
四、在命令式編程中對(duì)“狀態(tài)”的理解:共享狀態(tài)
======

無(wú)論是在串行的,還是并發(fā)的編程中,命令式編程范型對(duì)“狀態(tài)”的理解都是:共享狀態(tài)。在圖中,這一分支表現(xiàn)為全部的桃紅色(參見(jiàn)后圖)。

?

在串行(例如單線程)的編程中,狀態(tài)是時(shí)序相關(guān)的。因?yàn)椴粩嗟刂貙?xiě)“狀態(tài)(數(shù)據(jù)/cells/變量)”,所以前一行和后一行所面對(duì)都是同一個(gè)共享狀態(tài)的不同的值/副本。在這個(gè)過(guò)程中,狀態(tài)是時(shí)序相關(guān)的,所以前一分鐘與后一分鐘的狀態(tài)是不確定的——但是在同一時(shí)刻,這個(gè)狀態(tài)是確定的。

?

與上面類似的,在多線程中,同一時(shí)刻,不同線程也將面臨這個(gè)值/副本。但是正是因?yàn)槎嗑€程(并發(fā))中,線程A與線程B對(duì)于同一個(gè)cell,在同一時(shí)刻所得到的狀態(tài)也是不確定的——我們可以假想為多核CPU在對(duì)同一個(gè)內(nèi)存地址讀寫(xiě)(于是就出現(xiàn)了我們所謂的“同步”問(wèn)題,進(jìn)而也就出現(xiàn)了“鎖”的問(wèn)題),所以在這個(gè)分支中,當(dāng)加入“線程”概念之后,新的編程范型,全都變成了“觀測(cè)-非確定性”為“yes”的情況。

 

?

?

(圖3)觀測(cè)-非確定性(留意圖中加粗的黑框),以及狀態(tài)的共享

?

 

“觀測(cè)-非確定性(Observable nondeterminism)”可以被譯為“測(cè)不準(zhǔn)”,但是用在中文中依然拗口,所以我選擇了直譯。在Peter的書(shū)(CTM)中,對(duì)該問(wèn)題有一個(gè)經(jīng)典的示例,即:
------------------------
declare
? C={NewCell 0}

thread
? C:=1
end

thread
? C:=2
end
------------
Peter這段代碼的意思是說(shuō):當(dāng)線程1和線程2,在同時(shí)向C這個(gè)cell寫(xiě)數(shù)據(jù)時(shí),你并不確知上述代碼運(yùn)行之后C這個(gè)位置上的值究竟是1,還是2。

 
五、解決這個(gè)問(wèn)題的終極之道:不要寫(xiě)cell!
======
我們顯然發(fā)現(xiàn),問(wèn)題是因?yàn)槎鄠€(gè)線程都在“寫(xiě)cell”。在命令式的解決方案中,采用的方法是“加鎖”;持鎖存取的最經(jīng)濟(jì)的方法之一是“多讀單寫(xiě)”——即保證同時(shí)只有一個(gè)線程能“寫(xiě)cell”。

?

但是這給應(yīng)用帶來(lái)了負(fù)擔(dān)——如果一個(gè)應(yīng)用程序由多個(gè)線程(分布或不分布在多個(gè)CPU核上),在它們都要讀取同一個(gè)cell、而又有某個(gè)線程要寫(xiě)該cell的時(shí)候,那么大家就都要掛起來(lái)等這個(gè)寫(xiě)操作完成了。整個(gè)應(yīng)用程序在CPU使用(或者說(shuō)效率)上就大大地打了折扣。

?

如果這只是一個(gè)桌面程序(例如記事本),大概沒(méi)人會(huì)說(shuō)什么。但如果是服務(wù)器程序(例如Web Server),那么整個(gè)網(wǎng)絡(luò)、所有的會(huì)話就都處于等待狀態(tài)了——而這個(gè)時(shí)候,服務(wù)器的CPU占用還可能遠(yuǎn)遠(yuǎn)地小于1%!

?

解決問(wèn)題的終極方法,就是不解決這個(gè)問(wèn)題——寫(xiě)cell帶來(lái)了問(wèn)題,那么我們就“不寫(xiě)cell”。我們由前面所有講述的內(nèi)容開(kāi)始倒推,問(wèn)題根本是由“命令式語(yǔ)言”這個(gè)編程范型本身決定的:用算法改變數(shù)據(jù)。

所以,我們回到了原始的問(wèn)題:如果算法不改變cell(數(shù)據(jù)/狀態(tài)/變量)呢?

?

 

六、函數(shù)式編程的核心概念:閉包
======

當(dāng)“過(guò)程(初階的函數(shù))”引入了“閉包”的概念后,整個(gè)“函數(shù)式語(yǔ)言”的體系建立了起來(lái)。所謂“閉包”,是指在函數(shù)運(yùn)行的上下文中,所有的cells與函數(shù)之外無(wú)關(guān),這些cells的狀態(tài)僅與函數(shù)——這個(gè)運(yùn)算邏輯相關(guān),則這個(gè)上下文環(huán)境“整體地”被稱為“閉包”。

?

如果換個(gè)說(shuō)法,閉包就是不受函數(shù)之外影響的一堆cells。一般在實(shí)現(xiàn)它的時(shí)候,就是讓函數(shù)持有一個(gè)“專屬的(!)”內(nèi)存塊,并且這個(gè)內(nèi)存塊僅當(dāng)函數(shù)本身失效的時(shí)候,才被釋放。

?

一個(gè)“函數(shù)本身”何時(shí)失效呢?如果這個(gè)函數(shù)只有傳入?yún)?shù)和傳出值的功能,那么這個(gè)函數(shù)就在它傳出值之后立即失效了。所以,對(duì)于整個(gè)運(yùn)算邏輯——這個(gè)函數(shù)來(lái)說(shuō),它沒(méi)有操作過(guò)任何(函數(shù)之外的)狀態(tài),既沒(méi)有讀,也沒(méi)有寫(xiě)。對(duì)于這個(gè)邏輯來(lái)說(shuō),只有傳入,也只有傳出,所以它具有完全的運(yùn)算確定性,它本身作為一個(gè)“結(jié)果值”來(lái)看的時(shí)候,也是確定的。

?

不過(guò)在實(shí)用時(shí),對(duì)于上述的觀念做出了一些挑戰(zhàn)。例如說(shuō):當(dāng)函數(shù)內(nèi)部執(zhí)行了一半的時(shí)候退出,怎么辦呢?答案是:1、先不釋放函數(shù);2、過(guò)一會(huì)兒再進(jìn)入。這個(gè),就是所謂的延續(xù)(Continuation),以及在JavaScript 1.6以后推出的yield概念。同樣的,正因?yàn)椤暗拇_存在”執(zhí)行之后函數(shù)不釋放的可能性,所以函數(shù)式語(yǔ)言通常是由語(yǔ)言引擎來(lái)維護(hù)閉包的生存周期的——任何新的概念、理論的提出,都必須保證這個(gè)生存周期可測(cè)、可維護(hù)。因此相較于命令式語(yǔ)言,自動(dòng)內(nèi)存管理在函數(shù)式語(yǔ)言中實(shí)現(xiàn)起來(lái)更為高效和簡(jiǎn)潔,它最早被實(shí)現(xiàn)在函數(shù)式語(yǔ)言(LISP)語(yǔ)言中,也是有其必然性的了。

?

這樣一來(lái),對(duì)于在函數(shù)之外的狀態(tài)state來(lái)說(shuō),函數(shù)從來(lái)不去影響它們。函數(shù)式編程范型帶來(lái)了新的模式:給函數(shù)數(shù)據(jù)(入口參數(shù)),函數(shù)給出結(jié)果(返回值)。即通過(guò)不斷地函數(shù)運(yùn)算來(lái)產(chǎn)生結(jié)果,而不改變cell(數(shù)據(jù)/狀態(tài)/變量)。

?

函數(shù)式與命令式范型相比較,前者被人稱為(P,D;I,O),后者被人稱為(I,O;P,D),其中:輸入(I)、輸出(O)、加工處理程序(P)和存儲(chǔ)狀態(tài)數(shù)據(jù)(D)。即函數(shù)式先明確(P,D)——確定的處理與數(shù)據(jù)(閉包),然后討論在閉包上的I、O問(wèn)題。而命令式先確定了I、O的方式——即state的存取問(wèn)題,然后討論P(yáng)、D的設(shè)計(jì)。

 
七、狀態(tài)的命名:變量、常量、端口等
======

在整個(gè)這個(gè)“主要的編程范型”圖中,也許最接近現(xiàn)實(shí)世界(通用應(yīng)用開(kāi)發(fā))而又是純函數(shù)式范型的語(yǔ)言,就是erlang了。從圖中的標(biāo)注來(lái)看,erlang具有這樣的一些語(yǔ)言特性:
1、消息傳遞
2、命名狀態(tài)
3、端口
4、閉包
5、線程(erlang中的輕量級(jí)進(jìn)程)

?

這五個(gè)特性,其實(shí)都可以歸結(jié)為erlang對(duì)“狀態(tài)”的處理方式。其中:
1、當(dāng)跨節(jié)點(diǎn)傳遞狀態(tài)時(shí),采用“端口+消息傳遞”;
2、當(dāng)跨線程(進(jìn)程)傳遞狀態(tài)時(shí),采用“進(jìn)程ID+消息傳遞”;
3、當(dāng)在多個(gè)函數(shù)/執(zhí)行過(guò)程中傳遞狀態(tài)的,采用“閉包(函數(shù)入口參數(shù))”。

亦即是說(shuō),你可以把“端口、進(jìn)程標(biāo)識(shí)或函數(shù)入口參數(shù)”想像成“一個(gè)傳送狀態(tài)的通道”,或者干脆是用于讀取其它外部代碼的“狀態(tài)的一個(gè)副本”的途徑。?

(圖4)狀態(tài)的命名

 

?

對(duì)于上述特性,erlang在整個(gè)過(guò)程中允許為狀態(tài)命名(全局的或局部的)——變量。但是,該變量只能一次賦值——向端口和進(jìn)程ID傳遞消息是一次性的,而函數(shù)參數(shù)上的變量賦值/匹配也是一次性的。盡管對(duì)狀態(tài)“是否已賦值”需要進(jìn)行有效性檢測(cè),從而給系統(tǒng)帶來(lái)風(fēng)險(xiǎn),但也是使得程序可讀性和應(yīng)用性能變得“稍微好一些”的唯一方式。

?

在“主要的編程范型”圖中,緣于erlang對(duì)“命名的狀態(tài)”的取舍,它被歸為了“更少的說(shuō)明式特性”的范疇。但同樣的原因,它也是我們目前“(相對(duì))最易用”的工業(yè)級(jí)的純函數(shù)式語(yǔ)言。

?

同樣,在這個(gè)分支上還有一個(gè)后起之秀,就是“對(duì)象能力編程”。這在最近的報(bào)道中,已有基于Scala的Actor模型進(jìn)行的實(shí)現(xiàn)。盡管Scala是在Java上的一個(gè)實(shí)現(xiàn),但它擁有完整的函數(shù)式語(yǔ)言特性,并使用了面向?qū)ο蟮囊恍┱Z(yǔ)法與思想,在加入“對(duì)象能力類型(Object Capability Types,OCT)”之后,它擁有了跨Actor傳遞對(duì)象(整個(gè)對(duì)象可以視為一個(gè)狀態(tài)/cell)的能力——在必要的時(shí)候,目標(biāo)Actor會(huì)將接收到的對(duì)象再次本地化(local cell)。

 
八、語(yǔ)言的底本:LISP/Scheme/Haskell, Prolog, Fortran/Pascal, ML
======

從語(yǔ)言沿革的進(jìn)化關(guān)系來(lái)看,Fortran位于高級(jí)語(yǔ)言的基底位置,基本上來(lái)說(shuō),它是現(xiàn)今絕大多數(shù)過(guò)程式/命令式語(yǔ)言的底本,在這個(gè)分支上主要發(fā)展的有Algol、Simula、Pascal與C。后來(lái)出現(xiàn)的各種面向?qū)ο缶幊陶Z(yǔ)言,主要受到Simula跟Smalltalk的影響。

?

從Fortran之后,LISP成為所有函數(shù)式語(yǔ)言的底本,但由于早期LISP的應(yīng)用性極差,所以Scheme吸取了Algol與LISP的一些特性,成為函數(shù)式語(yǔ)言發(fā)展的主要力量之一。在1987年之后,從Scheme、Smalltalk等演化出來(lái)的Haskell,也成為不可小視的新生力量。

 

?

(圖5)函數(shù)式語(yǔ)言的龐大家族

 

?

Prolog這個(gè)語(yǔ)言的獨(dú)特的開(kāi)創(chuàng)性在于:它主要描述通過(guò)邏輯事實(shí)進(jìn)行推論并得出結(jié)論的過(guò)程,它的運(yùn)算對(duì)象并非直接含義上的“數(shù)據(jù)”,而是一種接近人的思維的抽象:邏輯子句。這種新的、對(duì)數(shù)據(jù)的抽象開(kāi)啟了一個(gè)語(yǔ)言分支。

?

在圖中幾乎總是與Scheme一起出現(xiàn)的ML(Meta Language)是一種,它的一個(gè)比較普及的、方言化的實(shí)現(xiàn)是SML(Standard ML)。在這個(gè)語(yǔ)言分支上,一個(gè)更晚出現(xiàn)而又頗富盛名的語(yǔ)言是Caml/OCaml(Caml, Categorical Abstract Machine Language)。基本上,它看起來(lái)象是在ML的函數(shù)式語(yǔ)言特性上加上:
1、命名(持久性常量)
2、cell

Objective Caml (OCaml)支持面向?qū)ο缶幊?#xff0c;而使它更為眾所周知的是:ECMAScript Ed4(Javascript 2)的標(biāo)準(zhǔn)規(guī)范,是采用OCaml這個(gè)語(yǔ)言來(lái)“定義”——并同時(shí)實(shí)現(xiàn)的。而微軟的F#也是基于OCaml在函數(shù)式語(yǔ)言上方向上發(fā)展的。

?

另一個(gè)函數(shù)式的分支是數(shù)據(jù)流編程,它的底本語(yǔ)言是Dataflow——圖中出現(xiàn)的Pipes/MapReduce是兩種不同的機(jī)制,而非確定的語(yǔ)言。在這個(gè)分支上,現(xiàn)實(shí)中主要采用數(shù)據(jù)流編程范型的語(yǔ)言其實(shí)是LabVIEW。相對(duì)于數(shù)據(jù)流(驅(qū)動(dòng)的)編程來(lái)講時(shí),命令式語(yǔ)言也被稱為控制流(驅(qū)動(dòng)的)編程語(yǔ)言。數(shù)據(jù)流編程在函數(shù)式這個(gè)分支中也是有開(kāi)創(chuàng)意義的,它帶來(lái)了圖化、網(wǎng)絡(luò)圖化編程這樣一種格局。

?

在這一小節(jié)(以及圖)里面,主要提及到的底本語(yǔ)言的出現(xiàn)時(shí)間為:
??? * 1957 FORTRAN
??? * 1958 ALGOL
??? * 1960 LISP
??? * 1962 SIMULA
??? * 1969 Smalltalk
??? * 1970 Prolog
??? * 1971 Dataflow
??? * 1972 C
??? * 1973 ML
??? * 1975 Pascal
??? * 1975 Scheme
??? * 1990 Haskell?
??? * 1996 OCaml

  

九:延伸閱讀
======

《象大師們一樣思考》
http://blog.csdn.net/aimingoo/archive/2008/10/09/3037952.aspx
 

《世界需要一種什么樣的語(yǔ)言》
http://blog.csdn.net/aimingoo/archive/2009/03/12/3983975.aspx

 

《表面的簡(jiǎn)潔》
http://blog.csdn.net/aimingoo/archive/2009/04/22/4099931.aspx

 ?

《無(wú)廢話JavaScript》(上)(下)
http://blog.csdn.net/aimingoo/archive/2008/10/06/3022379.aspx

http://blog.csdn.net/aimingoo/archive/2008/10/06/3022409.aspx


from:?http://blog.csdn.net/aimingoo/article/details/4648284

總結(jié)

以上是生活随笔為你收集整理的“主要的编程范型”及其语言特性关系(多图)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天干天天插 | 嫩草影院中文字幕 | 国产精品tv| av在线一区二区 | 97av在线| 先锋影音亚洲 | 久久视频免费 | 五月丁香花| 欧亚一区二区三区 | 国产+日韩+欧美 | 激情av| 久久精品女人 | 日本熟女一区二区 | 自拍偷拍第二页 | 中文字幕无码乱人伦 | 91喷水 | 风流少妇 | 日本免费一区二区三区四区 | 外国a级片| 你懂的国产在线 | 天海翼视频在线观看 | 无套内谢少妇高潮免费 | 美女色网站 | 亚洲色图一区二区 | 国产污在线观看 | 中文字幕影片免费在线观看 | 加勒比成人在线 | 国产区视频在线观看 | 天天摸夜夜添狠狠添婷婷 | 涩涩小网站| 91精选 | 日韩精品久久一区二区 | 欧美综合在线视频 | 钰慧的mv视频在线观看 | 91黄色免费网站 | 国产无套精品 | 午夜影院毛片 | xxxx999| 男女午夜视频在线观看 | 中文字幕av观看 | 亚洲国产日韩在线 | 91亚洲国产 | 超碰在线综合 | 超碰日本 | 日本高清不卡在线 | 麻豆久久久 | www超碰在线 | 午夜插插 | 国产精品久久国产精品 | av一区二区三区在线观看 | 国产午夜精品一区二区三区视频 | 国产a三级 | 无码人妻熟妇av又粗又大 | 日韩欧美亚洲天堂 | a v视频在线观看 | 男女又爽又黄 | 你懂的在线视频网站 | 男人日女人在线观看 | 欧美xxxxx自由摘花 | 欧美精品1| 亚洲一级视频在线观看 | 国产专区第一页 | 成人免费视频毛片 | 性生交大片免费看女人按摩 | 国产精品高潮呻吟视频 | 精品日日夜夜 | 在线观看亚洲成人 | 天天躁狠狠躁狠狠躁夜夜躁68 | 黄色短视频在线观看 | 精品人妻一区二区三区麻豆91 | 这里精品| 毛片基地站| 久久精品欧美一区二区 | 亚洲天堂avav| 打屁屁日本xxxxx变态 | 精品一区二区三区久久久 | 综合久久久 | 久草福利免费 | 天堂网www在线 | 日韩一级片 | 秋霞在线一区 | 一起草在线视频 | 中文精品一区二区三区 | 91精品久久人妻一区二区夜夜夜 | 91色影院 | 日本一区视频在线观看 | 精品自拍偷拍 | 懂色av一区二区三区免费 | 欧美大片黄色 | 日韩一区二区视频在线 | 亚洲第九页 | 丰满少妇一区 | 欧美色图激情小说 | 欧美粉嫩videosex极品 | 中文字幕一区二区av | 成人国产精品入口 | 精品香蕉99久久久久网站 | 91视频你懂的 | 午夜成人亚洲理伦片在线观看 |