精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

走進(jìn)Golang之編譯器原理

開(kāi)發(fā) 前端
為了學(xué)好Golang底層知識(shí),折騰了一下編譯器相關(guān)知識(shí)。下面的內(nèi)容并不會(huì)提升你的生產(chǎn)技能點(diǎn),但可以提高你的能力指數(shù)。

為了學(xué)好Golang底層知識(shí),折騰了一下編譯器相關(guān)知識(shí)。下面的內(nèi)容并不會(huì)提升你的生產(chǎn)技能點(diǎn),但可以提高你能力指數(shù)。

認(rèn)識(shí) go build

當(dāng)我們敲下 go build 的時(shí)候,我們的寫(xiě)的源碼文件究竟經(jīng)歷了哪些事情?最終變成了可執(zhí)行文件。

這個(gè)命令會(huì)編譯go代碼,今天就來(lái)一起看看go的編譯過(guò)程吧!

首先先來(lái)認(rèn)識(shí)以下go的代碼源文件分類

  •  命令源碼文件:簡(jiǎn)單說(shuō)就是含有 main 函數(shù)的那個(gè)文件,通常一個(gè)項(xiàng)目一個(gè)該文件,我也沒(méi)想過(guò)需要兩個(gè)命令源文件的項(xiàng)目
  •  測(cè)試源碼文件:就是我們寫(xiě)的單元測(cè)試的代碼,都是以 _test.go 結(jié)尾
  •  庫(kù)源碼文件:沒(méi)有上面特征的就是庫(kù)源碼文件,像我們使用的很多第三方包都屬于這部分

go build 命令就是用來(lái)編譯這其中的 命令源碼文件 以及它依賴的 庫(kù)源碼文件。下面表格是一些常用的選項(xiàng)在這里集中說(shuō)明以下。

可選項(xiàng) 說(shuō)明
-a 將命令源碼文件與庫(kù)源碼文件全部重新構(gòu)建,即使是最新的
-n 把編譯期間涉及的命令全部打印出來(lái),但不會(huì)真的執(zhí)行,非常方便我們學(xué)習(xí)
-race 開(kāi)啟競(jìng)態(tài)條件的檢測(cè),支持的平臺(tái)有限制
-x 打印編譯期間用到的命名,它與 -n 的區(qū)別是,它不僅打印還會(huì)執(zhí)行

接下來(lái)就用一個(gè) hello world 程序來(lái)演示以下上面的命令選項(xiàng)。

如果對(duì)上面的代碼執(zhí)行 go build -n 我們看一下輸出信息:

來(lái)分析下整個(gè)執(zhí)行過(guò)程

這一部分是編譯的核心,通過(guò) compile、 buildid、 link 三個(gè)命令會(huì)編譯出可執(zhí)行文件 a.out。

然后通過(guò) mv 命令把 a.out 移動(dòng)到當(dāng)前文件夾下面,并改成跟項(xiàng)目文件一樣的名字(這里也可以自己指定名字)。

文章的后面部分,我們主要講的就是 compile、 buildid、 link 這三個(gè)命令涉及的編譯過(guò)程。

編譯器原理

這是go編譯器的源碼路徑

如上圖所見(jiàn),整個(gè)編譯器可以分為:編譯前端與編譯后端;現(xiàn)在我們看看每個(gè)階段編譯器都做了些什么事情。先來(lái)從前端部分開(kāi)始。

詞法分析

詞法分析簡(jiǎn)單來(lái)說(shuō)就是將我們寫(xiě)的源代碼翻譯成 Token,這是個(gè)什么意思呢?

為了理解 Golang 從源代碼翻譯到 Token 的過(guò)程,我們用一段代碼來(lái)看一下翻譯的一一對(duì)應(yīng)情況。

圖中重要的地方我都進(jìn)行了注釋,不過(guò)這里還是有幾句話多說(shuō)一下,我們看著上面的代碼想象以下,如果要我們自己來(lái)實(shí)現(xiàn)這個(gè)“翻譯工作”,程序要如何識(shí)別 Token 呢?

首先先來(lái)給Go的token類型分個(gè)類:變量名、字面量、操作符、分隔符以及關(guān)鍵字。我們需要把一堆源代碼按照規(guī)則進(jìn)行拆分,其實(shí)就是分詞,看著上面的例子代碼我們可以大概制定一個(gè)規(guī)則如下:

  1.  識(shí)別空格,如果是空格可以分一個(gè)詞;
  2.  遇到 ( 、)、'<'、'>' 等這些特殊運(yùn)算符的時(shí)候算一個(gè)分詞;
  3.  遇到 " 或者 數(shù)字字面量算分詞。

通過(guò)上面的簡(jiǎn)單分析,其實(shí)可以看出源代碼轉(zhuǎn) Token 其實(shí)沒(méi)有非常復(fù)雜,完全可以自己寫(xiě)代碼實(shí)現(xiàn)出來(lái)。當(dāng)然也有很多通過(guò)正則的方式實(shí)現(xiàn)的比較通用的詞法分析器,像 Golang 早期就用的是 lex,在后面的版本中才改用了用go來(lái)自己實(shí)現(xiàn)。

語(yǔ)法分析

經(jīng)過(guò)詞法分析后,我們拿到的就是 Token 序列,它將作為語(yǔ)法分析器的輸入。然后經(jīng)過(guò)處理后生成 AST 結(jié)構(gòu)作為輸出。

所謂的語(yǔ)法分析就是將 Token 轉(zhuǎn)化為可識(shí)別的程序語(yǔ)法結(jié)構(gòu),而 AST 就是這個(gè)語(yǔ)法的抽象表示。構(gòu)造這顆樹(shù)有兩種方法。

    1.  自上而下

這種方式會(huì)首先構(gòu)造根節(jié)點(diǎn),然后就開(kāi)始掃描 Token,遇到 STRING 或者其它類型就知道這是在進(jìn)行類型申明,func 就表示是函數(shù)申明。就這樣一直掃描直到程序結(jié)束。

    2.  自下而上

這種是與上一種方式相反的,它先構(gòu)造子樹(shù),然后再組裝成一顆完整的樹(shù)。

go語(yǔ)言進(jìn)行語(yǔ)法分析使用的是自下而上的方式來(lái)構(gòu)造 AST,下面我們就來(lái)看一下go語(yǔ)言通過(guò) Token 構(gòu)造的這顆樹(shù)是什么樣子。

這其中有意思的地方我全部用文字標(biāo)注出來(lái)了。你會(huì)發(fā)現(xiàn)其實(shí)每一個(gè) AST 樹(shù)的節(jié)點(diǎn)都與一個(gè) Token 實(shí)際位置相對(duì)應(yīng)。

這顆樹(shù)構(gòu)造后,我們可以看到不同的類型是由對(duì)應(yīng)的結(jié)構(gòu)體來(lái)進(jìn)行表示的。這里如果有語(yǔ)法、詞法錯(cuò)誤是不會(huì)被解析出來(lái)的。因?yàn)榈侥壳盀橹拐f(shuō)白了都是進(jìn)行的字符串處理。

語(yǔ)義分析

編譯器里邊都把語(yǔ)法分析后的階段叫做 語(yǔ)義分析,而go的這個(gè)階段叫 類型檢查;但是我看了以下go自己的文檔,其實(shí)做的事情沒(méi)有太大差別,我們還是按照主流規(guī)范來(lái)寫(xiě)這個(gè)過(guò)程。

那么語(yǔ)義分析(類型檢查)究竟要做些什么呢?

AST 生成后,語(yǔ)義分析將使用它作為輸入,并且的有一些相關(guān)的操作也會(huì)直接在這顆樹(shù)上進(jìn)行改寫(xiě)。

首先就是 Golang 文檔中提到的會(huì)進(jìn)行類型檢查,還有類型推斷,查看類型是否匹配,是否進(jìn)行隱式轉(zhuǎn)化(go沒(méi)有隱式轉(zhuǎn)化)。如下面的文字所說(shuō):   

  1. The AST is then type-checked. The first steps are name resolution and type inference, which determine which object belongs to which identifier, and what type each expression has. Type-checking includes certain extra checks, such as "declared and not used" as well as determining whether or not a function terminates. 

大意是:生成AST之后是類型檢查(也就是我們這里說(shuō)的語(yǔ)義分析),第一步是進(jìn)行名稱檢查和類型推斷,簽定每個(gè)對(duì)象所屬的標(biāo)識(shí)符,以及每個(gè)表達(dá)式具有什么類型。類型檢查也還有一些其它的檢查要做,像“聲明未使用”以及確定函數(shù)是否中止。   

  1. Certain transformations are also done on the AST. Some nodes are refined based on type information, such as string additions being split from the arithmetic addition node type. Some other examples are dead code elimination, function call inlining, and escape analysis. 

這一段是說(shuō):AST也會(huì)進(jìn)行轉(zhuǎn)換,有些節(jié)點(diǎn)根據(jù)類型信息進(jìn)行精簡(jiǎn),比如從算術(shù)加法節(jié)點(diǎn)類型中拆分出字符串加法。其它一些例子像dead code的消除,函數(shù)調(diào)用內(nèi)聯(lián)和逃逸分析。

上面兩段文字來(lái)自 golang compile

這里多說(shuō)一句,我們常常在debug代碼的時(shí)候,需要禁止內(nèi)聯(lián),其實(shí)就是操作的這個(gè)階段。

  1. # 編譯的時(shí)候禁止內(nèi)聯(lián)  
  2. go build -gcflags '-N -l'  
  3. -N 禁止編譯優(yōu)化  
  4. -l 禁止內(nèi)聯(lián),禁止內(nèi)聯(lián)也可以一定程度上減小可執(zhí)行程序大小 

經(jīng)過(guò)語(yǔ)義分析之后,就可以說(shuō)明我們的代碼結(jié)構(gòu)、語(yǔ)法都是沒(méi)有問(wèn)題的。所以編譯器前端主要就是解析出編譯器后端可以處理的正確的AST結(jié)構(gòu)。

接下來(lái)我們看看編譯器后端又有哪些事情要做。

機(jī)器只能夠理解二進(jìn)制并運(yùn)行,所以編譯器后端的任務(wù)簡(jiǎn)單來(lái)說(shuō)就是怎么把AST翻譯成機(jī)器碼。

中間碼生成

既然已經(jīng)拿到AST,機(jī)器運(yùn)行需要的又是二進(jìn)制。為什么不直接翻譯成二進(jìn)制呢?其實(shí)到目前為止從技術(shù)上來(lái)說(shuō)已經(jīng)完全沒(méi)有問(wèn)題了。

但是,

我們有各種各樣的操作系統(tǒng),有不同的CPU類型,每一種的位數(shù)可能不同;寄存器能夠使用的指令也不同,像是復(fù)雜指令集與精簡(jiǎn)指令集等;在進(jìn)行各個(gè)平臺(tái)的兼容之前,我們還需要替換一些底層函數(shù),比如我們使用make來(lái)初始化slice,此時(shí)會(huì)根據(jù)傳入的類型替換為:makeslice64 或者 makeslice。當(dāng)然還有像painc、channel等等函數(shù)的替換也會(huì)在中間碼生成過(guò)程中進(jìn)行替換。這一部分的替換操作可以在這里查看

中間碼存在的另外一個(gè)價(jià)值是提升后端編譯的重用,比如我們定義好了一套中間碼應(yīng)該是長(zhǎng)什么樣子,那么后端機(jī)器碼生成就是相對(duì)固定的。每一種語(yǔ)言只需要完成自己的編譯器前端工作即可。這也是大家可以看到現(xiàn)在開(kāi)發(fā)一門(mén)新語(yǔ)言速度比較快的原因。編譯是絕大部分都可以重復(fù)使用的。

而且為了接下來(lái)的優(yōu)化工作,中間代碼存在具有非凡的意義。因?yàn)橛心敲炊嗟钠脚_(tái),如果有中間碼我們可以把一些共性的優(yōu)化都放到這里。

中間碼也是有多種格式的,像 Golang 使用的就是SSA特性的中間碼(IR),這種形式的中間碼,最重要的一個(gè)特性就是最在使用變量之前總是定義變量,并且每個(gè)變量只分配一次。

代碼優(yōu)化

在go的編譯文檔中,我并沒(méi)找到獨(dú)立的一步進(jìn)行代碼的優(yōu)化。不過(guò)根據(jù)我們上面的分析,可以看到其實(shí)代碼優(yōu)化過(guò)程遍布編譯器的每一個(gè)階段。大家都會(huì)力所能及的做些事情。

通常我們除了用高效代碼替換低效的之外,還有如下的一些處理:

  •  并行性,充分利用現(xiàn)在多核計(jì)算機(jī)的特性
  •  流水線,cpu有時(shí)候在處理a指令的時(shí)候,還能同時(shí)處理b指令
  •  指令的選擇,為了讓cpu完成某些操作,需要使用指令,但是不同的指令效率有非常大的差別,這里會(huì)進(jìn)行指令優(yōu)化
  •  利用寄存器與高速緩存,我們都知道cpu從寄存器取是最快的,從高速緩存取次之。這里會(huì)進(jìn)行充分的利用

機(jī)器碼生成

經(jīng)過(guò)優(yōu)化后的中間代碼,首先會(huì)在這個(gè)階段被轉(zhuǎn)化為匯編代碼(Plan9),而匯編語(yǔ)言僅僅是機(jī)器碼的文本表示,機(jī)器還不能真的去執(zhí)行它。所以這個(gè)階段會(huì)調(diào)用匯編器,匯編器會(huì)根據(jù)我們?cè)趫?zhí)行編譯時(shí)設(shè)置的架構(gòu),調(diào)用對(duì)應(yīng)代碼來(lái)生成目標(biāo)機(jī)器碼。

這里比有意思的是,Golang 總說(shuō)自己的匯編器是跨平臺(tái)的。其實(shí)他也是寫(xiě)了多分代碼來(lái)翻譯最終的機(jī)器碼。因?yàn)樵谌肟诘臅r(shí)候他會(huì)根據(jù)我們所設(shè)置的 GOARCH=xxx 參數(shù)來(lái)進(jìn)行初始化處理,然后最終調(diào)用對(duì)應(yīng)架構(gòu)編寫(xiě)的特定方法來(lái)生成機(jī)器碼。這種上層邏輯一致,底層邏輯不一致的處理方式非常通用,非常值得我們學(xué)習(xí)。我們簡(jiǎn)單來(lái)一下這個(gè)處理。

首先看入口函數(shù) cmd/compile/main.go:main() 

  1. var archInits = map[string]func(*gc.Arch){  
  2.     "386":      x86.Init,  
  3.     "amd64":    amd64.Init,  
  4.     "amd64p32": amd64.Init,  
  5.     "arm":      arm.Init,  
  6.     "arm64":    arm64.Init,  
  7.     "mips":     mips.Init,  
  8.     "mipsle":   mips.Init,  
  9.     "mips64":   mips64.Init,  
  10.     "mips64le": mips64.Init,  
  11.     "ppc64":    ppc64.Init,  
  12.     "ppc64le":  ppc64.Init,  
  13.     "s390x":    s390x.Init,  
  14.     "wasm":     wasm.Init,  
  15.  
  16. func main() {  
  17.     // 從上面的map根據(jù)參數(shù)選擇對(duì)應(yīng)架構(gòu)的處理  
  18.     archInit, ok :archInits[objabi.GOARCH]  
  19.     if !ok {  
  20.         ......  
  21.     }  
  22.     // 把對(duì)應(yīng)cpu架構(gòu)的對(duì)應(yīng)傳到內(nèi)部去  
  23.     gc.Main(archInit)  

然后在 cmd/internal/obj/plist.go 中調(diào)用對(duì)應(yīng)架構(gòu)的方法進(jìn)行處理 

  1. func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc, myimportpath string) {  
  2.     ... ...  
  3.     for _, s :range text {  
  4.         mkfwd(s)  
  5.         linkpatch(ctxt, s, newprog)  
  6.         // 對(duì)應(yīng)架構(gòu)的方法進(jìn)行自己的機(jī)器碼翻譯  
  7.         ctxt.Arch.Preprocess(ctxt, s, newprog)  
  8.         ctxt.Arch.Assemble(ctxt, s, newprog)  
  9.         linkpcln(ctxt, s)  
  10.         ctxt.populateDWARF(plist.Curfn, s, myimportpath)  
  11.     }  

整個(gè)過(guò)程下來(lái),可以看到編譯器后端有很多工作需要做的,你需要對(duì)某一個(gè)指令集、cpu的架構(gòu)了解,才能正確的進(jìn)行翻譯機(jī)器碼。同時(shí)不能僅僅是正確,一個(gè)語(yǔ)言的效率是高還是低,也在很大程度上取決于編譯器后端的優(yōu)化。特別是即將進(jìn)入AI時(shí)代,越來(lái)越多的芯片廠商誕生,我估計(jì)以后對(duì)這方面人才的需求會(huì)變得越來(lái)越旺盛。

總結(jié)

總結(jié)一下學(xué)習(xí)編譯器這部分古老知識(shí)帶給我的幾個(gè)收獲:

  1.  知道整個(gè)編譯由幾個(gè)階段構(gòu)成,每個(gè)階段做什么事情;但是更深入的每個(gè)階段實(shí)現(xiàn)的一些細(xì)節(jié)還不知道,也不打算知道;
  2.  就算是編譯器這種復(fù)雜,很底層的東西也是可以通過(guò)分解,讓每一個(gè)階段獨(dú)立變得簡(jiǎn)單、可復(fù)用,這對(duì)我在做應(yīng)用開(kāi)發(fā)有一些意義;
  3.  分層是為了劃分指責(zé),但是某些事情還需要全局的去做,比如優(yōu)化,其實(shí)每一個(gè)階段都會(huì)去做;對(duì)于我們?cè)O(shè)計(jì)系統(tǒng)也是有一定參考意義的;
  4.  了解到 Golang 對(duì)外暴露的很多方法其實(shí)是語(yǔ)法糖(如:make、painc etc.),編譯器會(huì)幫我忙進(jìn)行翻譯,最開(kāi)始我以為是go代碼層面在運(yùn)行時(shí)去做的,類似工廠模式,現(xiàn)在回頭來(lái)看自己真是太天真了;

      5.  對(duì)接下來(lái)準(zhǔn)備學(xué)習(xí)Go的運(yùn)行機(jī)制、以及Plan9匯編進(jìn)行了一些基礎(chǔ)準(zhǔn)備。 

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2022-02-23 13:31:26

RVO編譯器優(yōu)化

2010-01-21 09:26:53

CC++編譯器

2015-03-23 10:04:43

c++編譯器c++實(shí)現(xiàn)原理總結(jié)

2019-11-28 15:00:47

GolangPlan9匯編

2010-01-21 09:11:38

C++編譯器

2010-01-18 10:34:21

C++編譯器

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2013-03-29 10:02:37

編譯器語(yǔ)言編譯開(kāi)發(fā)

2017-03-20 18:01:55

編譯器匯編

2009-08-10 17:12:54

C#編譯器

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開(kāi)發(fā)者

2009-07-06 12:49:33

JSP編譯器

2010-01-18 10:28:15

C++編譯器

2009-08-14 11:34:26

Mono C#編譯器

2009-08-04 15:52:58

ASP.NET編譯器

2022-05-18 09:31:42

編譯器開(kāi)源代碼生成

2010-07-29 14:18:57

Flex編譯器參數(shù)

2010-02-24 16:49:24

Fedora SkyE

2013-12-10 10:53:47

shellcode
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

美女精品久久| av中文天堂在线| 亚洲全部视频| 亚洲天堂色网站| 日本在线观看免费视频| 精品电影在线| 国产不卡高清在线观看视频| 性欧美办公室18xxxxhd| 少妇无套高潮一二三区| 午夜久久av| 在线免费观看不卡av| 在线观看视频黄色| 天天干在线观看| 久久精品免费观看| 91产国在线观看动作片喷水| 肉色超薄丝袜脚交69xx图片| 国产ts一区| 欧美日本视频在线| 日本三级免费网站| 亚洲图区一区| 中文字幕成人网| 精品久久sese| 国产三级伦理片| 日日夜夜精品免费视频| 久久成年人视频| 日本欧美一区二区三区不卡视频| 国产蜜臀在线| 欧美国产精品v| 国产专区一区二区三区| 国产毛片毛片毛片毛片毛片| 噜噜噜躁狠狠躁狠狠精品视频| 日韩av综合中文字幕| 亚洲综合在线一区二区| 日韩欧美看国产| 亚洲成人午夜影院| 欧美日韩一区二区三区电影| xxxxx日韩| 久久亚洲二区三区| 精品日韩欧美| 欧美特级特黄aaaaaa在线看| 国产福利精品一区| 成人国产精品免费视频| 毛片在线免费视频| 亚洲毛片视频| 久久久久在线观看| 欧美成人精品欧美一级私黄| 我不卡神马影院| 日韩在线中文字幕| 国产又粗又黄又猛| 精品一区不卡| 少妇精69xxtheporn| 天天摸日日摸狠狠添| 精品国产不卡| 日韩精品极品视频| 国产一卡二卡三卡四卡| 成人h动漫免费观看网站| 欧美一级欧美三级| a级大片免费看| 欧美成人精品一级| 日韩欧美亚洲国产精品字幕久久久| 亚洲熟妇无码一区二区三区| 丰乳肥臀在线| 午夜精品一区二区三区电影天堂 | 日韩**中文字幕毛片| 日本熟妇成熟毛茸茸| 欧美激情1区2区| 欧美激情国产精品| 国产真人真事毛片| av不卡在线看| 国产精品91久久久| 一二区在线观看| 国产麻豆一精品一av一免费| 999久久久| 天堂av2024| 国产亚洲精品aa午夜观看| 日韩精品一区二区三区四区五区 | www.av88| 久久9热精品视频| 99国产高清| 涩涩视频免费看| 久久久久久97三级| 视频一区视频二区视频三区高| 亚洲av无码专区在线| 成人综合婷婷国产精品久久蜜臀| 国产精品久久久久久久app| 中文字幕乱伦视频| 国产精品系列在线观看| 久久久www免费人成黑人精品| 国产精品一区二区黑人巨大| 国产精品一二三区| 久久久久网址| 麻豆传媒视频在线观看| 亚洲国产一区视频| 午夜dv内射一区二区| 四虎国产精品免费久久| 亚洲国产精品嫩草影院久久| 91激情视频在线观看| 欧美激情第8页| 日韩免费精品视频| 国产农村妇女毛片精品| 97aⅴ精品视频一二三区| 亚洲欧美日韩精品在线| heyzo一区| 欧美日韩国产小视频在线观看| 成人亚洲视频在线观看| 日本电影久久久| 亚洲国产另类久久精品| 国产黄a三级三级| 国产亚洲激情| 亚洲一区美女视频在线观看免费| 亚洲天堂中文网| 成人国产电影网| 亚洲欧美日产图| 一区二区精品伦理...| 91精品一区二区三区久久久久久| 男操女免费网站| 精品人人人人| 欧美成人精品h版在线观看| 久久精品五月天| 成人免费视频免费观看| 婷婷视频在线播放| 日韩经典一区| 亚洲精品国产拍免费91在线| 免费中文字幕在线| 水野朝阳av一区二区三区| 国产成人一区二区三区免费看| 亚洲av无码一区二区三区dv| 一区在线观看视频| 久久久久免费精品| 日韩欧美影院| 久久久久久久爱| 99国产精品久久久久久久成人| 狠狠色丁香婷综合久久| 日本一区视频在线观看| 亚洲优女在线| 精品亚洲一区二区三区在线观看| 欧美三级视频网站| 亚洲欧美日韩一区在线观看| 国产精品10p综合二区| 国产不卡在线| 91精品在线一区二区| www.黄色com| 热久久一区二区| 日日噜噜噜噜夜夜爽亚洲精品| 国产色a在线| 色悠悠亚洲一区二区| 国内精品久久99人妻无码| 亚洲免费黄色| 精品伊人久久大线蕉色首页| 女同视频在线观看| 精品欧美黑人一区二区三区| 免费在线观看日韩| 国产1区2区3区精品美女| 日本天堂免费a| 中文字幕日韩亚洲| 欧美成人午夜剧场免费观看| h狠狠躁死你h高h| 一区二区三区高清不卡| 日韩精品xxx| 亚洲三级国产| 久久精彩视频| 国产私拍福利精品视频二区| 亚洲欧洲免费视频| 国产免费www| 国产精品对白交换视频| 亚洲一区二区在线视频观看| 图片小说视频色综合| 91久久精品www人人做人人爽| 免费a在线观看| 欧洲日韩一区二区三区| 婷婷社区五月天| 国产成人精品亚洲777人妖| 国产 日韩 欧美在线| 神马久久影院| 国产精品亚洲精品| 欧美激情二区| 亚洲精品在线电影| 久久国产视频一区| 国产精品久久久久久久久免费樱桃 | 天天在线女人的天堂视频| 欧美性猛交xxxx乱大交蜜桃| 国产精品无码久久久久一区二区| 一区在线免费| 欧美在线播放一区| 玖玖精品在线| 久久久久久久久久久人体| 欧美视频综合| 91精品国产91综合久久蜜臀| 日韩xxxxxxxxx| 国产欧美精品日韩区二区麻豆天美| 欧美不卡在线播放| 国精一区二区| 99精品国产高清在线观看| 无遮挡在线观看| 久热精品视频在线免费观看| 人人妻人人澡人人爽人人欧美一区| 亚洲精品乱码久久久久久| 欧美大片免费播放器| 美女视频免费一区| 久久综合久久网| 久久在线视频| 国产精品一区二区三区免费| 国产精品99| 久久男人av资源网站| aaa日本高清在线播放免费观看| 色婷婷av一区二区三区软件 | 亚洲欧洲日韩av| 国产黄色三级网站| 国产主播一区二区三区| 波多野结衣乳巨码无在线| 亚洲有吗中文字幕| 日韩视频专区| 欧美男人操女人视频| 成人综合国产精品| av亚洲一区二区三区| 韩国精品久久久999| 八戒八戒神马在线电影| 一区二区三区精品99久久| 天天操天天射天天舔| 欧美一级艳片视频免费观看| 中文字幕一区二区三区免费看| 久久久久久久精| 成人免费aaa| 国精品一区二区| 中文字幕久久综合| 日韩国产一区二区三区| 免费看成人午夜电影| 超碰一区二区三区| 成人免费91在线看| 欧美激情精品| 91视频8mav| 亚洲色图图片| 成人亚洲激情网| 亚洲精品777| 国产精品偷伦免费视频观看的| 黄色一级大片在线免费看产| 国产亚洲人成a一在线v站| 日本v片在线免费观看| 亚洲国产欧美自拍| 少妇人妻偷人精品一区二区| 亚洲第一区在线观看| 精品国产免费无码久久久| 欧美一区二区三区系列电影| 亚洲一卡二卡在线观看| 欧美曰成人黄网| 免费看av在线| 欧美日韩中文精品| 在线亚洲欧美日韩| 欧美肥妇毛茸茸| 97超碰人人模人人人爽人人爱| 亚洲成av人片一区二区梦乃| 国产探花在线播放| 夜夜嗨av一区二区三区| 国产网站在线看| 欧美日韩在线另类| 天天爽夜夜爽人人爽| 欧美主播一区二区三区美女| 中国a一片一级一片| 欧美日本一区二区三区| www.欧美国产| 亚洲电影在线看| 污污网站在线免费观看| 亚洲精品一区二区三区不| 国产在线视频资源| 日韩在线欧美在线国产在线| 黄色成人影院| 久久久久久这里只有精品| 国产va在线视频| 国产成人一区二区| 亚州欧美在线| 国产精品一区二区免费看| 综合伊思人在钱三区| 亚洲精品一区二区三区四区五区| 先锋影音国产精品| 欧美亚洲另类久久综合| 99久精品视频在线观看视频| 人妻激情另类乱人伦人妻| 国产日韩精品视频一区二区三区| 800av在线免费观看| 亚洲人人精品| av污在线观看| 精品一区中文字幕| 欧美日韩激情视频在线观看| 日本欧美韩国一区三区| 中文字幕第10页| 91一区二区三区在线播放| 刘亦菲国产毛片bd| 亚洲乱码日产精品bd| 日韩特级黄色片| 制服丝袜亚洲播放| 四虎永久在线精品免费网址| 最近2019免费中文字幕视频三| 性猛交富婆╳xxx乱大交天津| 欧美日韩成人综合天天影院 | 久久99精品国产| 中文字幕一区二区三区人妻在线视频| 亚洲无吗在线| 另类小说第一页| 福利一区二区在线观看| 日本少妇xxxxx| 伊人性伊人情综合网| 天天干天天干天天干天天| 91精品国产综合久久精品性色 | 欧美一区二区观看视频| 三级网站在线看| 最好看的2019的中文字幕视频| 国产高清美女一级毛片久久| 麻豆国产va免费精品高清在线| 国产在线三区| 欧美极品少妇xxxxⅹ喷水| 69堂免费精品视频在线播放| 国内外成人免费视频| 伊人久久大香线蕉综合四虎小说 | 国产欧美一区二区三区不卡高清| 欧洲av一区二区| 国产精品精品软件视频| 久久香蕉国产| 蜜臀久久99精品久久久酒店新书| 亚洲精品韩国| 在线视频观看91| 亚洲国产岛国毛片在线| 久久久久99精品成人片我成大片| 亚洲一区二区在线观看视频| 中文字幕黄色av| 亚洲精品国产精品国自产在线 | 亚洲欧美另类久久久精品| 久久久精品视频网站| 精品国产凹凸成av人网站| 米奇精品一区二区三区| 国产精品女人网站| 红桃成人av在线播放| 人妻少妇被粗大爽9797pw| av男人天堂一区| 日本三级免费看| 精品久久久久香蕉网| 日本片在线观看| 91超碰在线电影| 一区二区电影| 亚洲一区二区三区四区精品| 亚洲天堂成人在线观看| 亚洲中文字幕一区二区| 日韩中文字幕在线视频播放| 中文.日本.精品| 亚洲一区二区三区色| 免费观看在线色综合| 波多野结衣欲乱| 欧美日韩国产片| 美女写真理伦片在线看| 91久久夜色精品国产网站| 国产大片一区| 精品人妻一区二区三| 亚洲在线成人精品| 亚洲毛片欧洲毛片国产一品色| 亚洲女人天堂av| 波多野结衣亚洲| 日本公妇乱淫免费视频一区三区| 欧美一区影院| 91精品国产高清91久久久久久 | 国产乱子精品一区二区在线观看| 亚洲一区二区免费在线| 亚洲一区二区三区| 丰满人妻一区二区三区53视频| 久久久久高清精品| 四虎成人在线观看| 在线播放日韩专区| 99综合久久| 国产一区二区三区小说| av网站一区二区三区| 中文人妻av久久人妻18| 中文字幕在线视频日韩| 国产精品成人**免费视频| 欧美狂野激情性xxxx在线观| 97精品久久久午夜一区二区三区| 波多野结衣家庭教师在线观看| 亚洲最大色网站| 天堂成人在线| 国产精品香蕉av| 欧美a级片一区| 97人妻精品一区二区三区免| 一本色道综合亚洲| 欧美jizzhd69巨大| 国产精品国产精品| 日韩国产精品大片| 男女做暖暖视频| 日韩av在线网址| 久久天堂影院| 无码粉嫩虎白一线天在线观看| 国产一区二区在线看| 久久精品性爱视频| 中文字幕亚洲无线码在线一区| 嗯~啊~轻一点视频日本在线观看| 99一区二区| 日本中文字幕一区二区有限公司| 免费黄色三级网站| 午夜精品久久久久久久久久久| 人妻精品一区一区三区蜜桃91| 九色精品免费永久在线| 国产亚洲第一伦理第一区| 亚洲AV成人精品| 欧美日韩精品福利|