2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩63頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆

2、膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇

3、肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀</p><p>  學校名稱:北京理工大學</p><p>  院(系)名稱:計算機科學與工程系</p><p>  本科生學號:9709004</p><p>  嵌 入 式 瀏 覽 器 開 發(fā)&l

4、t;/p><p>  專 業(yè): 計算機軟件</p><p>  本科生姓名: 高波 </p><p>  指導教師姓名:張麗芬</p><p><b>  摘 要</b></p><p>  本文主要論述了嵌入式瀏覽器開發(fā)所涉及到的技術,對HTML詞法分析、瀏覽器JavaScript

5、支持、linux和gtk編程等做了詳細的分析和介紹,并對Netbit瀏覽器的開發(fā)進行了介紹,分析了主要的模塊的功能和組成,并給出了主要算法。</p><p>  還對典型的嵌入式瀏覽器進行了分析,包括Gzilla,Mozilla,Thunder和zen,總結(jié)了瀏覽器設計的技術要點和開發(fā)策略。</p><p>  另外,在論文開頭,介紹了目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀,嵌入式瀏覽器的組成和各

6、部份功能說明。</p><p>  HTML詞法分析是著重討論的技術問題,給出了詳盡的數(shù)據(jù)結(jié)構(gòu),程序流程。</p><p>  Netbit瀏覽器的開發(fā),是本論文的重點,分模塊進行了分析,提出了需要改進的地方,并給出了改進措施。</p><p>  關鍵詞:嵌入式瀏覽器,HTML詞法分析,Javascript,linux,gtk</p><p&g

7、t;<b>  ABSTRACT</b></p><p>  This paper is focused on the technology of embedded browser.Html scanner, JavaScript support for browser, linux and gtk programming are deeply discussed.and introduce

8、 the development of Netbit browser, analyse the main module of Netbit, the algorithm is presented. </p><p>  what’s more, other typical embedded browsers are analysed, include Gzilla,Mozilla,Thunder and zen,

9、and summarize the important technology and the policy of browser development</p><p>  In addition,at the head of the paper,introduce the present status of embedded browser product,the general form of embedde

10、d browser and description of the main parts.</p><p>  HTML scanner is an important technological problem, the data structure and the flow of the program are presented.</p><p>  The development o

11、f Netbit Browser is mainly discussed,and analysed by module,give the opinion to improve it.</p><p>  KEY WORDS:</p><p>  embedded browser,HTML token,Javascript,linux,gtk</p><p><

12、b>  目 錄</b></p><p>  引言………………………………………………………………5</p><p>  第一章 嵌入式瀏覽器設計概述 ………………………… 6</p><p>  1.1目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀 ……………………… 6</p><p>  1.2嵌入式瀏覽器的組成和各部份功能說明 ………

13、………… 8</p><p>  1.3開發(fā)難度分析 ……………………………………………… 9</p><p>  1.4開發(fā)的前期策劃 …………………………………………… 10</p><p>  第二章 HTML詞法分析器的設計及其應用 …………… 12</p><p>  2.1 Bit Token的組成及其功能 ……………………………

14、…12</p><p>  2.2 數(shù)據(jù)結(jié)構(gòu) ……………………………………………………12</p><p>  2.3 算法 …………………………………………………………13</p><p>  2.4詞法分析結(jié)果示意……………………………………………15</p><p>  2.5 HTML詞法分析的應用 ………………………………………15

15、</p><p>  第三章 瀏覽器JavaScript支持的實現(xiàn) …………………18</p><p>  3.1基本的JavaScript 開發(fā)環(huán)境 ………………………………18</p><p>  3.2 JavaScript Engine …………………………………………18</p><p>  3.3 JavaScript與瀏覽器接合

16、 ………………………………… 19</p><p>  3.4 瀏覽器消息響應 …………………………………………… 21</p><p>  第四章 Linux程序開發(fā)技術及 GTK圖形程序開發(fā)…… 23</p><p>  4.1 Linux下的程序開發(fā)環(huán)境 ……………………………………23</p><p>  4.2 GTK圖形程序開發(fā)

17、……………………………………………29</p><p>  第五章 Netbit瀏覽器開發(fā)與分析 ……………………… 31</p><p>  5.1 Netbit 瀏覽器簡介 ………………………………………… 31</p><p>  5.2 Netbit Browser瀏覽器各部份的功能 …………………… 31</p><p>  5.3

18、 界面模塊………………………………………………………32</p><p>  5.4 控制模塊………………………………………………………34</p><p>  5.5詞法分析模塊… ………………………………………………34</p><p>  5.6使用PIXMAP的畫圖模塊………………………………………35 </p><p>  5.7

19、文本文件的顯示模塊…………………………………………36</p><p>  5.8 HTML文件的顯示模塊 ……………………………………… 37</p><p>  5.9 Netbit實際應用效果及比較 ……………………………… 40</p><p>  5.10 Netbit Browser的缺點分析及改進辦法 …………………44</p><

20、p>  5.11 Netbit Browser未來的展望 ………………………………48</p><p>  第六章 其它瀏覽器分析…………………………………… 50</p><p>  6.1 Dillo(Gzilla)瀏覽器分析 ……………………………… 50</p><p>  6.2 Thunder瀏覽器分析…………………………………………55<

21、;/p><p>  6.3 Mozilla瀏覽器分析…………………………………………56</p><p>  6.4 ZEN瀏覽器分析………………………………………………57</p><p>  6.5 瀏覽器分析工作的總結(jié)………………………………………58</p><p>  致 謝…………………………………………………………… 60<

22、/p><p>  參考文獻表………………………………………………………61</p><p><b>  引 言</b></p><p>  隨著計算機、網(wǎng)絡技術的迅猛發(fā)展,新型的高科技含量的電子產(chǎn)品層出不窮,遍及家電、生產(chǎn)、軍事等各個領域。嵌入式系統(tǒng)因其體積小,速度快而受到重視。在掌上電腦、PDA、手機、導航設備、信息家電領域嵌入式系統(tǒng)被廣泛采用

23、,這也是近期產(chǎn)品研發(fā)的熱點。嵌入式瀏覽器作為重要的嵌入式系統(tǒng)應用軟件,是不可或缺的。但目前,嵌入式瀏覽器產(chǎn)品的市場被少數(shù)國外大公司壟斷,眾多的小型嵌入式瀏覽器也尚處于發(fā)展期,而國內(nèi)的自主技術的嵌入式瀏覽器更屈指可數(shù),剛剛進入實用階段。迫切需要更多的人來關注嵌入式瀏覽器技術,開發(fā)中國自主知識產(chǎn)權的瀏覽器產(chǎn)品。</p><p>  本文闡述了嵌入式瀏覽器開發(fā)的關鍵技術,并詳細說明Netbit Browser的實際開發(fā)

24、過程,技術細節(jié)。并以網(wǎng)站的方式公布了其源代碼,為國內(nèi)嵌入式瀏覽器的發(fā)展做了有益的嘗試。</p><p>  第一章 嵌入式瀏覽器設計概述</p><p>  1.1目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀</p><p>  1.1.1桌面瀏覽器簡介及其與嵌入式瀏覽器的區(qū)別:</p><p>  常見的桌面瀏覽器有微軟的Internet Explore

25、r,網(wǎng)景的Netscape,開放源碼的Mozilla,以及opera,mosaic,Hotjava,字符模式的lynx等。其中IE,Opera已有嵌入式版本,以上的大多數(shù)瀏覽器均有跨多平臺的版本。這些桌面型瀏覽器功能參差不齊,但大多能實現(xiàn)基本的瀏覽功能。其中IE與Netscape對HTML頁面的顯示效果均堪稱完美(對于XML,WML等標準的網(wǎng)頁瀏覽,本文不予討論)。</p><p>  與完美的瀏覽效果,功能豐富

26、,支持多種媒體格式和視音頻插件等優(yōu)點形成對立的是,這些瀏覽器龐大的體積和對機器配置的高要求。這也是桌面瀏覽器和嵌入式瀏覽器最大的區(qū)別。另外,桌面型瀏覽器通常是基于通用的操作系統(tǒng),用于桌面電腦如PC機、MAC機等。而嵌入式瀏覽器通?;趯S孟到y(tǒng)。</p><p>  需要指出的是,我們在網(wǎng)上??吹降囊恍┧^的優(yōu)秀瀏覽器,如Netcaptor,魔裝網(wǎng)神,騰訊,颶風,F(xiàn)antasia,金山WPS office的瀏覽器等

27、等,均為使用IE內(nèi)核的瀏覽器,使用了多頁面多線程的方式,降低了系統(tǒng)資源的耗費,方便了瀏覽,但軟件本身沒有多少技術可言,可以用Delphi,VB等工具輕易開發(fā)出來(如果不要求完善的功能,只需簡單到拖一個IE控件過去就行了),這也體現(xiàn)了微軟的COM+及ActiveX技術的強大。</p><p>  1.1.2常見嵌入式瀏覽器</p><p>  Internet Explorer for Wi

28、nCE,是IE的Windows CE版,這也意味著用戶為了使用它,必須選用基于WinCE平臺的產(chǎn)品,隨著微軟勢力在掌上終端領域的蔓延,WinCE版的IE必將大行其道。</p><p>  Access Netfront,Access是日本的瀏覽器大廠,占據(jù)了大部份的日本瀏覽器市場,其產(chǎn)品廣泛應用于手持設備、機頂盒、游戲機等產(chǎn)品。其新推出的Netfront Linux版本可以免費下載,網(wǎng)址是:http://www.

29、access.co.jp/product/develop。經(jīng)試用,發(fā)現(xiàn)Netfront瀏覽效果非常好,對中文的支持和表格的顯示效果,甚至超過Netscape 4.6 for Linux。而且支持鍵盤操作??梢允褂眉^鍵來選擇網(wǎng)址進行跳轉(zhuǎn)。但顯然為了簡化設計,Netfront使用了一定的權宜手段。比如它不支持使用<font>標記來設置字體,也不支持樣式表,所有字體的大小是固定的,但一般情況不易發(fā)現(xiàn),不過由于Linux版本不是商

30、業(yè)性版本,無法就此推斷其他版本的特性。Netfront Linux版大小為1.9M,如再加以簡化(比如去掉一些圖片按鈕)可以做的更小。</p><p>  Gzilla,現(xiàn)名Dillo,是基于Linux,使用GTK作為GUI平臺開發(fā)的瀏覽器,其開發(fā)目的也包含嵌入式的應用。是開放源碼項目。我們在設計Netbit Browser時主要參考了該瀏覽器的界面設計。該瀏覽器的缺點是不支持表格,布局過于簡單,不支持中文,瀏覽

31、效果比較差,優(yōu)點是網(wǎng)絡功能完善,支持cache緩沖,能夠支持多種圖片格式。網(wǎng)址是:http://www.gzilla.com。</p><p>  Viewml,使用FLTK作為GUI平臺開發(fā)的瀏覽器,主要面向嵌入式的應用。是開放源碼項目。使用C++面向?qū)ο蟮脑O計。因為使用FLTK,所以可以在嵌入式的Micro Window平臺運行,該瀏覽器支持簡單的表格,界面還沒有做(只有一個主窗口),不支持中文,由于FLTK

32、的BUG比較多,我們在實際編譯時經(jīng)常出錯,即使編譯通過,也常常是還沒運行就core dump了,但曾經(jīng)由某人編譯成功,基本可用,網(wǎng)址是:http://www.viewml.com。</p><p>  ZEN,一個并不知名的嵌入式瀏覽器,但卻十分優(yōu)秀,開放源碼項目,不僅支持表格,支持多種圖像格式,而且在設計上很有特色,將涉及到GUI平臺的部分獨立出來,用戶可以指定不同的GUI平臺運行,內(nèi)置了對字符,SVGA和GT

33、K的支持,開發(fā)這只需按照相應規(guī)范編寫該軟件的涉及GUI的部份,就可以將其移植到其它GUI平臺,而無須對整個軟件進行修改。缺點是網(wǎng)絡功能比較弱,不支持多線程,另外其必須等到所有圖片下載完畢才開始布局,若某文件傳輸失敗則會導致死鎖,需用戶中斷。網(wǎng)址是:http://www.nocrew.org/software/zen/。</p><p>  以上主要介紹了開放源碼的嵌入式瀏覽器,因為其對本項目具有實際的參考價值。&

34、lt;/p><p>  1.1.3 嵌入式瀏覽器的應用領域</p><p>  嵌入式瀏覽器主要應用于手持終端和信息家電,例如掌上電腦、3G手機、網(wǎng)絡機頂盒、具有網(wǎng)絡功能的其它家電,如可上網(wǎng)的電冰箱等,另外,在軍事等領域也有一定的應用需求。</p><p>  1.2嵌入式瀏覽器的組成和各部份功能說明</p><p>  下面簡介主要的組成部份

35、,其設計原理后面將進行專門論述。</p><p>  1.2.1 詞法分析</p><p>  主要是針對HTML進行詞法分析,該詞法分析器實際是通用的,還可用于XML、WML的詞法分析,只需替換元素名稱即可。</p><p>  HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,也是整個設計過程中重要的前端工作,其數(shù)據(jù)結(jié)構(gòu)的擬定與接下來的語法分析和布局算法密切相關,詞法

36、分析的效率與準確性、容錯性也關系到整個瀏覽器設計的質(zhì)量。</p><p><b>  1.2.2語法分析</b></p><p>  在大型的瀏覽器中,語法分析通常是獨立的模塊,但在嵌入式瀏覽器中,語法分析通常是與布局混合在一起的,即一邊進行語法分析,一邊布局,不設立相應的數(shù)據(jù)結(jié)構(gòu)來存儲語法分析的結(jié)果。語法分析對布局的算法有直接的指導意義。</p>&l

37、t;p><b>  1.2.3布局</b></p><p>  本文中的布局應理解為界面輸出前的預演和處理位置等信息的算法,而不是具體的畫圖和界面輸出。布局算法的好壞直接關系到界面的輸出效果,但布局算法也是要根據(jù)GUI所能實現(xiàn)的輸出效果來設計的,所以,GUI往往成為系統(tǒng)的瓶頸,如果GUI提供的支持有限,即使有再好的布局算法,也是紙上談兵,無用武之地。</p><p&

38、gt;  1.2.4 GUI及軟件界面</p><p>  GUI是指圖形用戶界面,瀏覽器無疑是一個圖形函數(shù)庫的大需求者,選擇好的GUI環(huán)境實屬不易,為了能夠?qū)崿F(xiàn)專有的功能,瀏覽器開發(fā)者往往還要對基礎的GUI庫進行包裝、改寫,甚至寫自己的控件。所有這些,是需要有專業(yè)的GUI庫開發(fā)經(jīng)驗的專職人員來完成。</p><p>  GUI的功勞第一在于軟件的操作界面,如窗口、菜單、工具條、滾動條等

39、。第二在于主瀏覽窗體中的圖形元素的輸出(通常以自畫控件的方式)。前者通常直接使用GUI庫中的已有控件,編程難度很小,后者主要利用基本的點線函數(shù),編程難度比較大。</p><p>  JavaScript支持</p><p>  實際上JavaScript的編譯器是開放源碼的,而且全世界通用,包括IE、Mozilla、Netscape等瀏覽器都使用相同的JavaScript的編譯器,但為何其

40、對JavaScript的支持不盡相同呢,這是因為JavaScript在瀏覽器里主要是用于操縱界面元素和與瀏覽器內(nèi)部命令進行結(jié)合。這實際上是程序員努力的結(jié)果,而不是JavaScript編譯器的功勞。這其中的機制將在后面專門介紹。</p><p><b>  IO</b></p><p>  主要是指通過HTTP協(xié)議或文件系統(tǒng)來讀取網(wǎng)頁內(nèi)容,網(wǎng)絡部份超出了本論文的討論范圍

41、,不予詳述,后面將介紹與網(wǎng)絡部份的接口。</p><p>  以上主要按工作的性質(zhì)進行分類,介紹了瀏覽器設計的主要幾個部份,但與實際開發(fā)工作的人員劃分不同,實際工作要考慮人員的實際能力和經(jīng)驗,結(jié)合要實現(xiàn)的目標,對各部份的投入也有輕重緩急之分,比如,如果沒有詞法分析的先行實現(xiàn),語法分析與布局都是紙上談兵。GUI平臺不確定,布局工作也無法展開。</p><p><b>  1.3開發(fā)

42、難度分析</b></p><p>  我們也可以看到,要設計效果較好的瀏覽器產(chǎn)品,決不是三五個人、兩三條槍就能辦到的,參與工作的人員不僅需要有相關經(jīng)驗,還需要有一定的投入,一方面對程序員艱苦的工作給予鼓勵,另一方面也可能需要購買一些成熟的開發(fā)包,在基礎的開發(fā)平臺、測試平臺上也要有一定的投資,總的來說,開發(fā)自主技術的瀏覽器產(chǎn)品是有一定的風險的,這也是國內(nèi)目前相關產(chǎn)品為數(shù)不多的原因。國外大公司在相關領域的

43、科研與實踐已很成熟,在大量投入之后,其產(chǎn)品已為廣大用戶所接受,國內(nèi)的企業(yè)若從零做起,也很難追趕。因而買斷技術,加以改進也可以成為快速成長的一條道路。</p><p>  1.4開發(fā)的前期策劃</p><p>  以下的工作均是建立在大量的調(diào)查基礎上的。是瀏覽器開發(fā)前期準備工作所解決的問題。</p><p><b>  平臺的選取</b><

44、/p><p>  目前的商業(yè)化嵌入式操作系統(tǒng)功能完善,但使用費用高昂,使用Linux內(nèi)核的嵌入式操作系統(tǒng)不僅功能強大,便于開發(fā)移植,而且費用低廉,基于Linux的嵌入式系統(tǒng)已日漸成熟,也有相應的窗口系統(tǒng)可以使用,我們使用PC上的Linux來進行瀏覽器開發(fā),是再好不過的了,軟件從PC移植到嵌入式設備只需重新編譯一下就可以了(前提是使用的函數(shù)庫、開發(fā)包同時具有PC和嵌入式的版本)。</p><p>

45、;<b>  GUI的選取</b></p><p>  GUI的選取是頗費腦筋的問題,一方面要考慮嵌入式系統(tǒng)是否有對應的版本,一方面要考慮該GUI的功能是否足夠?qū)嵱谩?lt;/p><p>  目前常見的基于Linux的GUI開發(fā)包主要有GTK、FLTK、QT、KDE等,其中FLTK有Micro Window的版本,是比較好的選擇,但使用FLTK開發(fā)的軟件還比較少,對于初學

46、者進入的難度更大,而且目前BUG較多,而GTK比較成熟,使用GTK的軟件比比皆是,資料也很豐富,我們的參考對象Gzilla也使用GTK,也就是說如果使用GTK,將有很好的原型進行參考,這使得GTK對于目前毫無GUI開發(fā)經(jīng)驗的瀏覽器開發(fā)組而言,充滿了巨大的誘惑。考慮到GUI是可以成為獨立模塊的,如瀏覽器ZEN的設計,我們決定使用GTK,待時機成熟可換用其它平臺,也并非難事。</p><p>  在前期,我們也對FL

47、TK加以了研究,還嘗試了以FLTK為基礎構(gòu)建GUI中間層的辦法,但由于工作量巨大,初步估算需2萬行程序,而不得不暫緩該計劃。建立GUI中間層在理論上是可行的,這樣,在必要時可以釜底抽薪,替換掉基礎的GUI平臺,應用軟件完全不需修改,但中間層與基礎層的接口要重寫,其工作量也很大,未必是核算的買賣。</p><p>  確定要實現(xiàn)的基本功能</p><p>  鑒于對瀏覽器開發(fā)難度的充分考慮,

48、以及現(xiàn)有人員的水平,擬定實現(xiàn)以下功能,以及需要考慮但暫不予實現(xiàn)的功能。</p><p><b>  需要實現(xiàn)的包括:</b></p><p>  (1)界面:包括窗口,菜單,輸入框,工具條,滾動條等的支持。</p><p>  (2)詞法分析:必須實現(xiàn)實用的HTML詞法分析,支持HTML4.0全部元素。</p><p&g

49、t;  (3)實現(xiàn)簡單網(wǎng)頁的布局:實現(xiàn)對簡單網(wǎng)頁的查看。</p><p>  (4)支持基本IO,支持采用線程的網(wǎng)絡傳輸。</p><p><b>  需要考慮的功能:</b></p><p>  (1)JavaScript支持</p><p><b>  (2)漢字支持</b></p

50、><p>  (3)圖片格式支持</p><p><b>  (4)表單支持</b></p><p>  (5)頁面元素的消息響應</p><p><b>  人員分工</b></p><p>  由于情況的變動,造成了人員比較緊張,在前期準備工作中,人力充沛,使得收集的資

51、料比較完備,打下了較好的基礎。在后期簡化了目標,雖然人員減少,但也能夠?qū)崿F(xiàn)主要的工作??紤]到網(wǎng)絡是比較獨立的部份,把它分出去由專人負責。</p><p>  第二章 HTML詞法分析器的設計及其應用</p><p>  HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,也是整個設計過程中重要的前端工作,其數(shù)據(jù)結(jié)構(gòu)的擬定與接下來的語法分析和布局算法密切相關,詞法分析的效率與準確性、容錯性也關系到整

52、個瀏覽器設計的質(zhì)量。</p><p>  下面將介紹一個HTML詞法分析器——Bit Token的設計思路。</p><p>  Bit Token是Netbit Browser的HTML詞法分析器,使用標準C編程,Netbit Browser是基于Linux/Gtk的瀏覽器,開放源碼項目,網(wǎng)址是http://netbit_browser.myetang.com。</p>&

53、lt;p>  Bit Token的組成及其功能</p><p>  Bit Token作為Netbit Browser的詞法分析部份,負責對接收的HTML代碼進行詞法分析,主要的目的是提取網(wǎng)頁中元素的名稱及其屬性,并以恰當?shù)男问剑窗匆欢ǖ臄?shù)據(jù)結(jié)構(gòu))加以保存,也就是完成了將數(shù)據(jù)流離散化、結(jié)構(gòu)化的過程。</p><p>  主要由以下幾個部分組成:</p><p&g

54、t;  初始化:完成對數(shù)據(jù)結(jié)構(gòu)的初始化,主要是分配內(nèi)存,變量賦初值。</p><p>  主體的數(shù)據(jù)流分析:逐字符的進行判斷,確定數(shù)據(jù)的歸屬類型。</p><p>  元素的分析:提取元素的名稱、屬性和值域。</p><p>  釋放:主要是對內(nèi)存的釋放。</p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p>

55、<p>  typedef struct BitTokenContext</p><p>  {char * strBuffer; //當前正在處理的HTML代碼</p><p>  int bufferLength;</p><p>  int curPosition;</p><p>  char * gl

56、obal_strBuffer; //全局HTML代碼</p><p>  int global_bufferLength;</p><p>  int global_curPosition;</p><p>  BitTokenList *tokenList; //元素節(jié)點鏈表</p><p>  BitTokenList *

57、tokenList_tail;</p><p>  BitPTagListpTagList;//元素名稱表,指向靜態(tài)數(shù)據(jù)</p><p>  }BitTokenContext,*BitPTokenContext;</p><p>  BitTokenContext是用于存儲當前待分析網(wǎng)頁全局屬性的數(shù)據(jù)結(jié)構(gòu),其中TokenList是核心的元素節(jié)點鏈表。詞法分析的

58、目的就是生成這樣一個鏈表。下面給出該鏈表的數(shù)據(jù)結(jié)構(gòu),是很簡單的雙向鏈表。</p><p>  typedef struct TokenList</p><p>  { BitToken *token; //元素節(jié)點</p><p>  struct TokenList *priou;</p><p>  struct TokenList *

59、next;</p><p>  }BitTokenList,*BitPTokenList;</p><p>  以下是元素節(jié)點的數(shù)據(jù)結(jié)構(gòu):</p><p>  typedef struct BitToken</p><p>  {int type; //節(jié)點類型,如定義的HTML_BODY,HTML_TXT等。</p>&l

60、t;p>  char *pData; //如果是HTML_TXT型元素,則為其內(nèi)容,否則為空</p><p>  BOOL end; //是否是結(jié)束元素,如</body></p><p>  BitTokenAttrList *attrList; //元素屬性鏈表,因為可能有多個屬性,所以使用鏈表存儲</p><p>  BitTokenAtt

61、rList *attrList_tail;</p><p>  }BitToken,*BitPToken;</p><p>  請注意,以上出現(xiàn)tail標記的指針變量,如BitTokenList * tokenList_tail等,其作用是用于保存鏈表結(jié)尾節(jié)點指針,便于在釋放內(nèi)存時,直接找到鏈尾,提高了算法的效率。</p><p><b>  算法<

62、/b></p><p>  2.3.1 基本算法:</p><p>  首先介紹基本的算法:</p><p>  (1) 從存儲網(wǎng)頁的字符串中,順序讀入一個字符</p><p>  (2) 如果遇到 < ,認為遇到TAG(元素),處理該元素,使用函數(shù)Token_ConsumTag(),處理完畢后,指針移到該元素尾。</p&g

63、t;<p>  (3) 如果遇到回車、空格,則跳過。</p><p>  (4) 如果遇到 > ,則跳過(不應該出現(xiàn)此情況,為了容錯)。</p><p>  (5) 如果非以上情況,則認為遇到文字,處理這段文字,使用函數(shù)Token_Consum_PlainText()。處理完畢,指針指向下一個元素首。</p><p>  (6) 循環(huán)以上操作,直

64、到該網(wǎng)頁分析完畢。</p><p>  由此看來,主算法十分簡單而清晰,主要是Token_ConsumTag()和Token_Consum_PlainText()這兩個函數(shù)起關鍵作用,由于其中涉及到許多細節(jié)問題,此處不予詳述。</p><p>  2.3.2 算法效率與改進:</p><p>  采用以上的基本算法,是可用的,但當網(wǎng)頁比較大的時候,比如600K,該算

65、法的效率成倍下降,這主要是由于要處理的字符串太大,在內(nèi)存中完成查找、替換、復制、移動等操作,響應時間明顯下降。對此的改進辦法就是分段進行詞法分析,不僅極大的提高了效率(在某些情況下約提高30倍),也有利于瀏覽器整體設計,因為當網(wǎng)頁較大時,若等待全部內(nèi)容傳輸完畢,再一次性完成詞法分析和布局,用戶會感到等待時間過長,一般現(xiàn)在成熟的瀏覽器都采用邊傳輸,邊分析,邊顯示。</p><p>  分段進行詞法分析的算法復雜度明

66、顯增加,比如,當每段定為1024字節(jié),在第1024字節(jié)處,可能正好將一個完整元素截斷,按常規(guī)分析方法會造成錯誤。解決的辦法是,采用回溯,確認要分析的部份至少包含1個完整元素。</p><p>  具體做法是:判斷1024字節(jié)處是否為元素結(jié)束字符 ‘>’,如果不是,則判斷前一個字節(jié),直到找到元素結(jié)束字符為止,這樣可保證至少包含一個元素。</p><p>  采用分段進行詞法分析,實際每

67、次分析的代碼會不足1024字節(jié),余下的部份匯入到下一段的分析過程即可,直到所有內(nèi)容被分析完畢。</p><p>  2.4詞法分析的結(jié)果</p><p>  下面是一段很簡單的HTML代碼。</p><p><b>  <html></b></p><p>  <img src=“go.gif” wid

68、th=200 height=100></p><p>  <a HREF="http://www.263.net">首都在線</a></p><p><b>  </html></b></p><p>  分析后,數(shù)據(jù)存儲結(jié)構(gòu)如下</p><p><b&

69、gt; ?。?lt;/b></p><p>  可以看到,詞法分析的結(jié)果是一個元素節(jié)點鏈表,每個節(jié)點的屬性也形成了一個鏈表,元素節(jié)點是有先后順序的,元素屬性的先后順序是無所謂的。</p><p>  詞法分析將網(wǎng)頁的文本數(shù)據(jù)流以清晰的結(jié)構(gòu)表現(xiàn)出來,這樣,在后面的應用中就可以很容易的遍歷各節(jié)點,并輕松地獲得各元素節(jié)點的屬性。</p><p>  2.5 HTML

70、詞法分析的應用</p><p>  2.5.1 應用舉例:</p><p>  HTML詞法分析程序通常應用于瀏覽器設計、網(wǎng)頁制作軟件設計等領域,本人以一個使用VC開發(fā)的軟件“HTML智能分析”來舉例說明,下載網(wǎng)址:</p><p>  http://netbit_browser.myetang.com/introduce.html。</p><

71、p>  “HTML智能分析”同樣使用Bit Token詞法分析器,“HTML智能分析”是一個網(wǎng)頁信息提取、處理軟件。</p><p><b>  具有以下主要功能:</b></p><p>  1、智能提取網(wǎng)頁中的文字信息,智能排版,并可在進行編輯后保存。</p><p>  2、統(tǒng)計網(wǎng)頁的有關信息。</p><p&g

72、t;  3、根據(jù)用戶設置的版式,將分析和編輯的結(jié)果,自動生成新的網(wǎng)頁。</p><p>  用戶可使用該軟件來將HTML轉(zhuǎn)為TXT格式,其對HTML中文字內(nèi)容的提取準確、快速、不含冗余信息,版式工整清晰,保持本來面貌。</p><p>  其主要設計思路是,在Bit Token詞法分析器的基礎上,結(jié)合瀏覽器布局的基本算法,對影響到TXT版面效果的元素進行處理。</p><

73、;p>  比如<PRE>標記,代表所包含的內(nèi)容瀏覽器應不予分析,按TXT格式輸出,而如表格<TR>等元素則意味著需要換行。而在HTML中,在無<PRE>這種特殊情況時,回車都是忽略不記的。這就造成了矛盾。使用常規(guī)的簡單算法進行HTML到TXT的轉(zhuǎn)換無法解決這些問題。造成轉(zhuǎn)換后的版式“失真“。而“HTML智能分析”卻能很好的解決。</p><p>  由于“HTML智能分析

74、”使用了底層的詞法分析技術,還可以很容易的過濾掉<SCRIPT>與<STYLE>(樣式表)。并可以對網(wǎng)頁中的元素進行統(tǒng)計和語法校驗。</p><p>  以下是該程序的片斷:</p><p>  pTtokenList=global_cx->tokenList; //取首節(jié)點</p><p>  while(pTtokenList!=N

75、ULL) //循環(huán)直至處理完所有節(jié)點</p><p><b>  {</b></p><p>  switch(pTtokenList->token->type)</p><p>  {//根據(jù)節(jié)點類型,做不同的處理</p><p>  case HTML_TITLE: ……</p><p

76、>  case HTML_TEXT: ……</p><p>  default: ……</p><p>  } //switch</p><p>  pTtokenList=pTtokenList->next; //取下一個節(jié)點</p><p><b>  } //while</b></p>

77、<p>  這段程序?qū)嶋H上就是一個簡單的語法分析和布局的過程。</p><p>  2.5.2 Bit Token在應用中存在的問題及修改意見</p><p>  由于HTML的標記多是成對出現(xiàn)的,并且存在<SCRIPT>這樣的特殊元素,其內(nèi)容為Javascript程序,函數(shù)的字符串參數(shù)等可能包含其它的元素標記。例如語句:Alert(“<font>

78、is a tag”);</p><p>  因此,在詞法分析時要對<SCRIPT>標記進行特殊處理,遇到<SCRIPT>就應逐字符讀入后面的內(nèi)容,直到遇到下一個</SCRIPT>標記。目前的Bit Token由于開發(fā)時間所限,未對其加以特殊處理,存在一些問題,但由于瀏覽器對Javascript的支持是較復雜的工作,目前的Netbit Browser尚不予實現(xiàn),因而沒有導致明顯問

79、題,而“HTML智能分析”這個軟件只是需要對Javascript進行刪除操作,也不會造成影響。盡管如此,對<SCRIPT>的特殊處理還是有待完善,盡管這同時也會帶來一些問題,需要進行大量的測試,來保證新加入代碼的穩(wěn)定性。</p><p>  正如前面所述,HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,但并非最重要和最具難度的環(huán)節(jié),若想開發(fā)出效果較好的瀏覽器產(chǎn)品,還要在布局和GUI設計上多下功夫。<

80、/p><p>  第三章 瀏覽器JavaScript支持的實現(xiàn)</p><p>  本部份主要針對Mozilla和Netscape瀏覽器源代碼的JavaScript部份進行了分析,闡述了瀏覽器Javascript實現(xiàn)的機制。</p><p>  3.1基本的JavaScript 開發(fā)環(huán)境</p><p>  JavaScript Referenc

81、e與JavaScript API:</p><p>  JavaScript Reference是Mozilla所使用JavaScript開發(fā)環(huán)境,是使用ANSI C的獨立的開發(fā)包,據(jù)Mozilla文檔介紹,該開發(fā)包涉及到超過160家公司的版權。而且被廣泛使用,實際已成為了進行JavaScript應用開發(fā)的標準平臺。</p><p>  JavaScript Reference可以用于建立

82、包含JavaScript runtime的Library或 DLL。既可以編譯成小的 "shell" 程序(像早期的BASIC),又連接Library后生成交互式的JavaScript解釋器,也可以用來解釋.js 文件。由于使用了ANSI C編程,可以用VC、GCC等編譯器在不同平臺下編譯。</p><p>  生成的"shell" 程序,對比瀏覽器對JavaScript的

83、支持,相同之處是使用相同的包含JavaScript runtime的Library 或 DLL,我們把這部份相同的Library或 DLL稱為JavaScript API,我們實際開發(fā)JavaScript應用,也是在JavaScript API基礎上工作,而不用過多考慮其內(nèi)部的實現(xiàn)。關于JavaScript API,參見JavaScript API詳解。JavaScript API實際就是Javscript解釋器的對外接口函數(shù)庫。<

84、;/p><p>  JavaScript Engine</p><p>  JavaScript Engine是瀏覽器開發(fā)者為了利用JavaScript API來實現(xiàn)實際應用而設立的中間層,用于初始化JavaScript環(huán)境,提供對JavaScript解釋、執(zhí)行的接口。瀏覽器主體程序的設計者可以通過JavaScript Engine,方便的實現(xiàn)各種應用,畢竟JavaScript API太基礎了

85、,直接使用不太方便。</p><p>  下面介紹JavaScript Engine的主要功能和實現(xiàn)方法。這也包含了利用JavaScript API進行應用的基本思路。</p><p><b>  (1) 初始化:</b></p><p>  內(nèi)存分配:rt=JS_Init(10000L);</p><p>  初始化c

86、x:cx = JS_NewContext(rt, STACK_CHUNK_SIZE);</p><p>  初始化globalObj:globalObj = JS_NewObject(cx, &globalClass, 0, 0);</p><p>  定義標準類:JS_InitStandardClasses(cx, globalObj);</p><p>

87、  定義系統(tǒng)函數(shù):JS_DefineFunctions(cx, globalObj, g_functions);</p><p>  定義報錯函數(shù):JS_SetErrorReporter(cx,JS_ErrorReporter);</p><p><b>  注冊其它類:</b></p><p>  RegisterClassPoint(c

88、x,globalObj);</p><p>  RegisterClassSize(cx,globalObj);</p><p>  RegisterClassRect(cx,globalObj);</p><p>  RegisterClassPolygon(cx,globalObj);</p><p>  RegisterCla

89、ssColorKey(cx,globalObj);</p><p>  RegisterClassTDTimer(cx,globalObj);</p><p>  初始化定時器:TDTimerListInit();</p><p>  (2) 提供對JavaScript解釋、執(zhí)行的接口函數(shù):</p><p>  TD_EvaluateSc

90、ript(JSContext *cx,JSObject *obj, const char *bytes, uintN length,const char *filename, uintN lineno,jsval *rval)</p><p>  JavaScript與瀏覽器接合</p><p>  基本概念:JavaScript操作HTML元素的常見方式</p><p

91、><b>  例:</b></p><p>  <html><head></p><p>  <script><!--</p><p>  function ChangeImage(index)</p><p>  {image0.src="a"+ind

92、ex+".gif";}</p><p>  --></script></p><p><b>  </head></b></p><p>  <a onmouseover="ChangeImage(0);">軍人</a><br></p

93、><p>  <a onmouseover="ChangeImage(1);">眼睛</a><br></p><p>  <img id="image0" src="a0.gif"></img></p><p><b>  </html

94、></b></p><p>  當鼠標移到文字上時,觸發(fā)事件mouseover,調(diào)用ChangeImage()函數(shù),使得圖像源(SRC)發(fā)生變化,重新調(diào)入新圖片。</p><p>  由此產(chǎn)生兩個關鍵問題:</p><p>  javascript如何獲取HTML元素的名稱和屬性。</p><p>  javascript如

95、何改變HTML元素的屬性,并操作WIDGET重畫。</p><p>  下面分別闡述這兩個問題:</p><p>  首先介紹涉及到的瀏覽器流程:</p><p>  問題1解決:HTML元素作為Javascript對象進行注冊。</p><p>  注冊過程在BuildModel中進行。BuildModel的首要任務是將Token后的結(jié)點按

96、包含關系展成一棵樹。其次就是要將某些結(jié)點注冊為JavaScript對象。</p><p><b>  注冊的過程是:</b></p><p>  定義新對象:JSObject *proto;</p><p><b>  初始化該對象:</b></p><p>  TD_JSXMLElementCla

97、ssInit(JS_GetGlobalContext(),</p><p>  (void **)&proto))</p><p>  使用JS_DefineObject或JS_NewObject定義對象屬性:</p><p>  根據(jù)是否定義了該元素的名稱區(qū)別對待:</p><p>  if(TD_XMLContentIsNamed

98、Item(aElement,&aName))</p><p>  {parent = js_GetGlobalObject();</p><p>  *aReturn=JS_DefineObject(JS_GetGlobalContext(),js_GetGlobalObject(),aName->mStr,&ElementClass,proto,JSPROP_EN

99、UMERATE);</p><p><b>  }</b></p><p><b>  else</b></p><p>  {parent=aElement->parent->mScriptObject;</p><p>  *aReturn = JS_NewObject(JS_Ge

100、tGlobalContext(), &ElementClass, proto, parent);</p><p><b>  }</b></p><p><b>  將對象加入:</b></p><p>  JS_SetPrivate(JS_GetGlobalContext(), (JSObject *)*aRet

101、urn, aElement);這樣,在編譯時,HTML元素的標識就能被Javascript編譯器識別,否則會報錯變量未定義。</p><p>  問題2解決:利用注冊給對象的函數(shù)實現(xiàn)操作符的功能化。</p><p>  具體可理解為:當image0.src=”1.gif”被執(zhí)行時,相當于為對象設置或改變屬性,此時SetElementProperty函數(shù)被調(diào)用(該函數(shù)在注冊該對象時由JSXM

102、LElementClassInit捆綁給該對象,其內(nèi)容由用戶自己定義),SetElementProperty通過函數(shù)指針調(diào)用函數(shù)TD_JSXMLSetAtrByID,改變結(jié)點樹上結(jié)點屬性,并重新生成該節(jié)點對應的widget,重畫界面。</p><p>  問題3:如何建立Javascript對象與結(jié)點樹上結(jié)點的對應?</p><p>  解決: Javascript對象與結(jié)點樹是同時生成的

103、,它們的共同性質(zhì)是結(jié)點具有相同屬性,Javascript對象根據(jù)ID屬性查找樹,找到要操作的對應結(jié)點。</p><p><b>  瀏覽器消息響應</b></p><p>  在主消息循環(huán)中調(diào)用TDWidgetProcessMsg,處理與widget有關消息。</p><p>  首先:取得當前焦點所在的widget</p>&l

104、t;p>  pWidget=TDWidgetGetAtPoint(pThis->baseDoc.base.mWidget,pt,&index);</p><p>  處理該widget對該消息的響應。</p><p>  最后一般為調(diào)用JavaScript執(zhí)行,實現(xiàn)實際響應。</p><p>  TDVOID TDWidgetDoAction(

105、TDPWidgetAction pAnchor)</p><p><b>  {</b></p><p>  jsval jval;</p><p>  if(pAnchor)</p><p>  TD_EvaluateScript(JS_GetGlobalContext(),js_GetGlobalObject(),&

106、lt;/p><p>  pAnchor->mAction.mStr,pAnchor->mAction.mLength,TDNULL,0,&jval);</p><p><b>  }</b></p><p>  其中pAnchor->mAction.mStr即為界面對象(widget)對應的JavaScript源碼,解釋執(zhí)

107、行的結(jié)果就是調(diào)用為該對象注冊的函數(shù)來重畫該widget,從而實現(xiàn)動態(tài)效果。</p><p>  第四章 Linux程序開發(fā)技術及 GTK圖形程序開發(fā)</p><p>  Linux下的程序開發(fā)環(huán)境</p><p><b>  4.1.1基本知識</b></p><p>  (1) 標準 (ANSI C, POSIX,

108、SVID, XPG, ...)ANSI C:這一標準是 ANSI(美國國家標準局)于 1989 年制定的 C 語言標準。 后來被 ISO(國際標準化組織)接受為標準,因此也稱為 ISO C。</p><p>  POSIX:該標準最初由 IEEE 開發(fā)的標準族,部分已經(jīng)被 ISO 接受為國際標準。</p><p>  SVID:System V 的接口描述。System V 接口描述

109、(SVID)是描述 AT&T Unix System V 操作 系統(tǒng)的文檔,是對 POSIX 標準的擴展超集。</p><p>  XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更為一般的標準。</p><p>  (2) 函數(shù)庫和系統(tǒng)調(diào)用 glibc:眾所周知,C 語言并沒有為常見的操作

110、,例如輸入/輸出、內(nèi)存管理,字符串操作等提供內(nèi)置的支持。相反,這些功能一般由標準的“函數(shù)庫”來提供。GNU 的 C 函數(shù)庫,即 glibc,是 Linux 上最重要的函數(shù)庫,它定義了 ISO C 標準指定的所有的庫函數(shù),以及由 POSIX 或其他 UNIX 操作系統(tǒng)變種指定的附加特色,還包括有與 GNU 系統(tǒng)相關的擴展。目前,流行的 Linux 系統(tǒng)使用 glibc 2.0 以上的版本。glibc 基于如下標準:ISO C: C 編程語

111、言的國際標準,即 ANSI C,POSIX,Berkeley Unix,SVID,XPG。</p><p>  其他重要函數(shù)庫:除 glibc 之外,流行的 Linux 發(fā)行版中還包含有一些其他的函數(shù)庫,這些函數(shù)庫具有重要地位,例如:GNU Libtool,CrackLib,LibGTop。圖形文件操作函數(shù)庫包括: libungif、libtiff、libpng、Imlib, libjpeg 等,可分別用來操作

112、GIF、TIFF、PNG、JPEG 以及其他一些格式圖形文件。</p><p><b>  (3) 系統(tǒng)調(diào)用</b></p><p>  系統(tǒng)調(diào)用是操作系統(tǒng)提供給外部程序的接口。在 C 語言中,操作系統(tǒng)的系統(tǒng)調(diào)用通常通過函數(shù)調(diào)用的形式完成,在 Linux 系統(tǒng)中,系統(tǒng)調(diào)用函數(shù)定義在 glibc 中。</p><p>  談到系統(tǒng)調(diào)用時,需要

113、注意如下幾點:系統(tǒng)調(diào)用函數(shù)通常在成功時返回 0 值,不成功時返回非零值。errno 中包含有錯誤代碼。系統(tǒng)調(diào)用是一個非常耗時 的過程。(4) C 語言編程風格 良好的編程風格可以在許多方面幫助開發(fā)人員,可以增加代碼的可讀性,并幫助你理清頭緒。編程風格最能體現(xiàn)一個程序員的綜合素質(zhì)。</p><p>  在 Linux 中,我們經(jīng)??吹降氖嵌x非常簡單的函數(shù)接口和變量名稱。C 語言最初來自 UNIX 操作系統(tǒng)

114、,與 UNIX 的設計原則一樣,C 語言被廣泛認可和使用的一個重要原因是它的靈活性以及簡潔性。在利用 C 語言編寫程序時,應當符合其簡潔的設計原則,而不應當使用非常復雜的變量命名方法。Linus 為 Linux 內(nèi)核定義的 C 語言編碼風格要點如下:</p><p>  縮進時,使用長度為 8 個字符寬的 Tab 鍵。如果程序的縮進超過 3 級,則應考慮重新設計程序。</p><p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論