成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

瀏覽器工作過程詳解(譯)(二)

fasss / 2922人閱讀

摘要:每種可解析的格式必須具有由詞匯及語法規(guī)則組成的特定的文法,這被稱為上下文無關(guān)文法。解析器將會(huì)從詞法分析器獲取一個(gè)新符號(hào),并且嘗試用某一種語法規(guī)則去匹配它。第二個(gè)匹配到規(guī)則的是,它匹配到第三條語法規(guī)則。

銜接

接著上文繼續(xù)。

在構(gòu)建好render樹后,瀏覽器就開始進(jìn)行布局了。這意味著瀏覽器會(huì)給每個(gè)節(jié)點(diǎn)正確的坐標(biāo),讓它們出現(xiàn)在該出現(xiàn)的地方。下一步就是進(jìn)行繪制了,瀏覽器將會(huì)遍歷render樹,每一個(gè)節(jié)點(diǎn)都會(huì)被UI后端層所繪制。

很重要的一點(diǎn)是,這整個(gè)過程是漸進(jìn)性的。為了更好的用戶體驗(yàn),渲染引擎會(huì)盡快地解析內(nèi)容到屏幕上。它并不會(huì)等到html完全被解析才開始創(chuàng)建和布局render樹。一部分內(nèi)容被解析了,那它就會(huì)立刻被繪制到頁面上,這這個(gè)過程中,瀏覽器可能還在請(qǐng)求剩余部分的內(nèi)容。

主要流程實(shí)例

圖3 :Webkit 主要流程

圖4 :Mozilla 的Gecko渲染引擎主要流程

從圖3和圖4你可以看到,雖然Webkit和Gecko在某些術(shù)語上稍有不同,但是主要流程是基本相同的。

Gecko把可見的格式化元素組成的樹為“Frame”樹。每一個(gè)元素都是一個(gè)frame。Webkit則把每一個(gè)渲染對(duì)象組成的樹稱為render樹。對(duì)每一個(gè)元素的定位,Webkit稱為布局,而Gecko稱為回流。Webkit稱利用dom節(jié)點(diǎn)及樣式信息去構(gòu)建render樹的過程為attachment,Gecko在html和dom樹之間附加了一層,這層稱為內(nèi)容接收器,相當(dāng)制造dom元素的工廠。下面將討論流程中的各個(gè)階段。

解析

解析是渲染引擎執(zhí)行過程中非常重要的部分,我們將會(huì)稍微深入地去探討一下。讓我們先來簡(jiǎn)單介紹一下什么是解析。

解析一個(gè)文檔意味著需要將內(nèi)容翻譯成某種編碼能夠理解和使用的結(jié)構(gòu)。而解析的結(jié)果通常是能夠表達(dá)文檔結(jié)構(gòu)的節(jié)點(diǎn)樹。它被稱為解析樹或語法樹。

舉例來說,解析表達(dá)式“2+3-1”,應(yīng)該返回如下的樹:

圖5:數(shù)學(xué)表達(dá)式的樹結(jié)構(gòu)

語法

解析過程依賴于文檔遵從的語法規(guī)則——文檔的語言或格式。每種可解析的格式必須具有由詞匯及語法規(guī)則組成的特定的文法,這被稱為上下文無關(guān)文法。人類的語言不具有這一特點(diǎn),所以不能被常規(guī)的解析技術(shù)所解析。

解析器-詞法分析器

解析過程可以被分為兩個(gè)過程-詞法分析和語法分析。

詞法分析是把輸入解釋成符號(hào)的過程,而符號(hào),是組成語言的基本有效單元。它相當(dāng)于字典中所有的單詞,用以組成和表現(xiàn)人類語言。

語法分析是指應(yīng)用語法規(guī)則。

通常情況下,解析器將工作分配給兩個(gè)組件 - 詞法分析器(有時(shí)也被稱作標(biāo)記解析器)主要負(fù)責(zé)把輸入分解成合法的符號(hào),語法分析器主要負(fù)責(zé)依靠語法規(guī)則來分析文檔結(jié)構(gòu),并構(gòu)建出解析樹。詞法分析器知道如何跳過類似空白符或者換行符之類的無關(guān)字符。

圖6:從源文檔到解析樹

解析過程是重復(fù)迭代的。解析器將會(huì)從詞法分析器獲取一個(gè)新符號(hào),并且嘗試用某一種語法規(guī)則去匹配它。如果有規(guī)則匹配到了,那么該符號(hào)相應(yīng)的節(jié)點(diǎn)將會(huì)被添加到解析樹中,然后解析器會(huì)接著解析下一個(gè)符號(hào)。

如果沒有規(guī)則可以匹配該符號(hào),解析器將會(huì)在內(nèi)部保存下這個(gè)符號(hào),并繼續(xù)獲取下一個(gè)符號(hào),直到有一條語法規(guī)則可以匹配所有內(nèi)部存儲(chǔ)的符號(hào)。如果到最后還是沒有找到能夠匹配的規(guī)則,那么解析器將會(huì)拋出一個(gè)異常。這意味著該文檔不合法或者有語法錯(cuò)誤。

轉(zhuǎn)換過程

通常情況下,解析樹并不是最終的結(jié)果。解析通常在轉(zhuǎn)換過程中使用,而轉(zhuǎn)換用于將輸入文檔轉(zhuǎn)成另一種格式。編譯過程就是一個(gè)例子。編譯器將源代碼編譯成機(jī)器碼時(shí),首先做的就是把它解析成解析樹,然后再將解析樹轉(zhuǎn)化成機(jī)器碼文檔。

圖7:編譯流程

解析實(shí)例

在圖5中,我們基于一段數(shù)學(xué)表達(dá)式創(chuàng)建了一棵解析樹。讓我們來嘗試定義一門簡(jiǎn)單的數(shù)學(xué)語言,然后看看解析過程。

詞匯表:我們的語言包括了整數(shù)、加號(hào)和減號(hào)。

語法:

我們的語言的基本組成時(shí)表達(dá)式、術(shù)語和操作符

可以包含多個(gè)表達(dá)式

兩個(gè)術(shù)語(term)通過操作符連接,這就形成一個(gè)表達(dá)式

操作符只能是加號(hào)或減號(hào)

一個(gè)術(shù)語(term)只能是一個(gè)整數(shù)或者一個(gè)表達(dá)式

讓我們來分析一下輸入“2+3-1”后發(fā)生了什么。

第一個(gè)匹配到規(guī)則的子串是“2”,根據(jù)規(guī)則5,它是一個(gè)術(shù)語(term)。第二個(gè)匹配到規(guī)則的是“2+3”,它匹配到第三條語法規(guī)則。下一次匹配將會(huì)在這個(gè)輸入的最后。“2+3-1”是一段表達(dá)式,因?yàn)槲覀円呀?jīng)知道“2+3”是一個(gè)術(shù)語(term),接下去的“-”是一個(gè)操作符,再后面“1”是一個(gè)整數(shù),也就是術(shù)語(term),這匹配了規(guī)則3。而“2++”不會(huì)匹配任何語法,所以它是一個(gè)非法輸入。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/50724.html

相關(guān)文章

  • 覽器工作過程詳解)(一)

    摘要:值得注意的是,谷歌瀏覽器和大多數(shù)瀏覽器不同,每一個(gè)選項(xiàng)卡都是渲染引擎的一個(gè)實(shí)例,都擁有獨(dú)立的進(jìn)程。組件之間的通信火狐和谷歌都發(fā)展了一個(gè)特殊的通信結(jié)構(gòu),后面我們將會(huì)單獨(dú)來講。渲染引擎我們所討論的幾款瀏覽器火狐谷歌都是基于兩種渲染引擎建立的。 寫在前面 這篇文章是一篇譯文,年代有點(diǎn)久,部分內(nèi)容有過時(shí),請(qǐng)讀者仔細(xì)閱讀,翻譯自How browser work,原文地址為點(diǎn)擊這里查看原文 簡(jiǎn)介 ...

    陳江龍 評(píng)論0 收藏0
  • css - 收藏集 - 掘金

    摘要:絕對(duì)底部前端掘金來自國(guó)外的設(shè)計(jì)達(dá)人,純,可以實(shí)現(xiàn)當(dāng)正文內(nèi)容很少時(shí),底部位于窗口最下面。有效解決圖片使用單位邊角缺失的問題前端掘金起因在移動(dòng)端使用布局時(shí)圖片也需要用單位。 CSS 絕對(duì)底部 - 前端 - 掘金來自國(guó)外的設(shè)計(jì)達(dá)人,純CSS,可以實(shí)現(xiàn): 當(dāng)正文內(nèi)容很少時(shí),底部位于窗口最下面。當(dāng)改變窗口高度時(shí),不會(huì)出現(xiàn)重疊問題。甚至,創(chuàng)造該CSS的人還專門成立一個(gè)網(wǎng)站介紹這個(gè)CSS底部布局方案...

    phpmatt 評(píng)論0 收藏0
  • CSS及布局

    摘要:經(jīng)過半年的打磨,正式發(fā)布,主要是新增了一些常用組件,并使用命名,為接下來的微信小程序開發(fā)做好準(zhǔn)備。這兩種方式實(shí)現(xiàn)的瀑布流式布局均支持首屏和網(wǎng)頁窗口大小改變時(shí)的列數(shù)自適應(yīng)。主要是對(duì)于標(biāo)準(zhǔn)里的布局方式草案中的布局方式進(jìn)行一些總結(jié)。 一勞永逸的搞定 flex 布局 尋根溯源話布局 一切都始于這樣一個(gè)問題:怎樣通過 CSS 簡(jiǎn)單而優(yōu)雅的實(shí)現(xiàn)水平、垂直同時(shí)居中。記得剛開始學(xué)習(xí) CSS 的時(shí)候,看...

    jaysun 評(píng)論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過...

    tuniutech 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<