• <abbr id="ck0wi"><source id="ck0wi"></source></abbr>
    <li id="ck0wi"></li>
  • <li id="ck0wi"><dl id="ck0wi"></dl></li><button id="ck0wi"><input id="ck0wi"></input></button>
  • <abbr id="ck0wi"></abbr>
  • <li id="ck0wi"><dl id="ck0wi"></dl></li>
  • 世界服裝鞋帽網(wǎng)首頁 > 正文

    計(jì)算機(jī)編程原來是這樣的過程:告訴你我們每天瀏覽的頁面是如何編譯出來的!

    2019/9/1 8:48:00 來源: 任奧全球推評論(0)12038

    計(jì)算機(jī)過程頁面

      計(jì)算機(jī)編程原來是這樣的過程:告訴你我們每天瀏覽的頁面是如何編譯出來的!

      機(jī)器的“原力覺醒”





      這個(gè)故事,先從計(jì)算機(jī)的語言說起。

      事實(shí)上,人類文明中最早出現(xiàn)的文字就是數(shù)字,比完整表意的文字早500-1000年。

      隨著人類社會的發(fā)展,社會結(jié)構(gòu)開始變得復(fù)雜,征稅必須先收集國民收入、財(cái)產(chǎn)、付款、欠款、債務(wù)、罰款等數(shù)據(jù),遠(yuǎn)遠(yuǎn)超過人腦的記憶系統(tǒng)。于是,數(shù)字誕生了。

      5000年前,蘇美爾人文明(今科威特及鄰近地區(qū))以6和10作為基數(shù),用符號表達(dá)1、10、60、600、以及3600。今天,我們?nèi)匀怀R娨?為基數(shù)的數(shù)字,例如圓有360度,一天有24小時(shí)。

      而另外一種叫安第斯文化(主要在今天的南美地區(qū)),則用“結(jié)繩語”記錄數(shù)字,管理稅收等財(cái)務(wù)數(shù)據(jù)長達(dá)數(shù)百年甚至數(shù)千年。就算西班牙人占領(lǐng)南美之后,還在相當(dāng)一段時(shí)間內(nèi)用結(jié)繩語來管理他們建立的新帝國。這就是人類最早的語言,雖然不能完整傳遞口語,也無法寫詩,但是記賬收稅效率一流。公元8世紀(jì),印度人發(fā)明了數(shù)字0-9,這種十進(jìn)制的數(shù)學(xué)符號讓數(shù)據(jù)存儲和處理的效率一日千里,成為人類文明重要的里程碑,奠定了現(xiàn)代數(shù)學(xué)基礎(chǔ)。后因阿拉伯人將其發(fā)揚(yáng)光大并傳入中東和歐洲,所以大家稱之為“阿拉伯?dāng)?shù)字”。還有一種文字系統(tǒng)——“0”和“1”的二進(jìn)制,是人類文明另外一個(gè)重要的里程碑,被廣泛應(yīng)用在現(xiàn)代計(jì)算機(jī)領(lǐng)域中。此外,我們喜歡的音樂、我們熱愛的電影、我們拍攝的照片,今天都是通過這種二進(jìn)制的數(shù)字來進(jìn)行“重現(xiàn)”,包括記錄、存儲、傳播和分享。人類通過0和1開啟了機(jī)器“文明”,從此科學(xué)革命的進(jìn)程就像安裝上了“火箭”。那為什么計(jì)算機(jī)使用的是二進(jìn)制呢?這個(gè)故事得回溯到大英帝國的航海時(shí)代。早在17世紀(jì),英國借助強(qiáng)大的經(jīng)濟(jì)實(shí)力和海軍力量擁有了眾多的殖民地,建立了全球霸主地位。艦隊(duì)使用的航海表計(jì)算復(fù)雜,人工計(jì)算的數(shù)據(jù)經(jīng)常有誤,百年間導(dǎo)致大量的船只觸礁沉沒。

      直到第一次工業(yè)革命爆發(fā),英國政府找到了數(shù)學(xué)家巴貝奇(Charles Babbage)來修正航海表。巴貝奇通過十年的努力,研制成功了“差分機(jī)”。用蒸汽機(jī)時(shí)代的機(jī)械齒輪來存儲計(jì)算過程中的數(shù)據(jù),大大提升了航海表數(shù)據(jù)的計(jì)算速度和準(zhǔn)確率。

      同期,他開始了另外一種新機(jī)器——分析機(jī)的設(shè)計(jì)。在開發(fā)分析機(jī)的過程中,巴貝奇冥思苦想,發(fā)現(xiàn)乘法是加法的重復(fù),除法是減法的重復(fù),減法可以用加法來代替,這樣就只要設(shè)計(jì)一個(gè)加法運(yùn)算器即可。基于這種假設(shè),計(jì)算機(jī)器只需要具備兩個(gè)功能即可運(yùn)作:

      1)判斷兩個(gè)數(shù)的大小;

      2)不斷重復(fù)執(zhí)行加法計(jì)算。

      所有的運(yùn)算轉(zhuǎn)化為最簡單的判斷和計(jì)算,1表示Yes(開),0表示No(關(guān)),計(jì)算機(jī)用0和1不斷重復(fù)計(jì)算。這就是計(jì)算機(jī)使用“0”和“1”二進(jìn)制語言的理論基礎(chǔ)。

      值得一提的是,巴貝奇發(fā)明分析機(jī)不久之后,英國數(shù)學(xué)家喬治·布爾于1854年發(fā)表了“布爾代數(shù)學(xué)”,提出了邏輯學(xué)的二元運(yùn)算,為現(xiàn)代電子計(jì)算機(jī)提供了另外一個(gè)重要的理論基礎(chǔ)。

      回到分析機(jī),巴貝奇借鑒了法國紡織機(jī)上使用的穿孔卡片。卡片上的孔眼排列,控制紡織機(jī)的梭子,能夠不斷重復(fù)的織出各種各樣美麗圖案的布匹。巴貝奇在著名詩人拜倫之女Ada Lovelace的幫助下,發(fā)現(xiàn)穿孔卡片不僅可以用來記錄數(shù)據(jù),還能用來控制機(jī)器工作的指令。在卡片上打上不同排列的孔,機(jī)器便有不同的工作程序,這就是現(xiàn)代計(jì)算機(jī)的軟件設(shè)計(jì)思想。

      基礎(chǔ)研究與基礎(chǔ)教育是產(chǎn)業(yè)誕生和振興的根本。這也是為什么今天的英國,仍然在數(shù)學(xué)和通信領(lǐng)域擁有非常廣泛的影響力。

      1884年,美國統(tǒng)計(jì)專家赫爾曼·何樂禮(Herman Hollerith)借鑒穿孔卡原理發(fā)明了電動制表機(jī),用于美國人口統(tǒng)計(jì),與巴貝奇的分析機(jī)具有異曲同工之妙。他把所有需要調(diào)查的項(xiàng)目依次固定在一張硬紙卡上,然后將統(tǒng)計(jì)的居民個(gè)人信息在相應(yīng)位置打孔,用來表示“Yes”。當(dāng)統(tǒng)計(jì)機(jī)器的探針撞到卡片上的“孔”,就會接通電流,計(jì)數(shù)裝置往前進(jìn)一個(gè)刻度。何樂禮博士正是采用了二進(jìn)制的原理,來高效統(tǒng)計(jì)美國人口信息。

      我們今天使用的答題卡,就采用了這種原理。何樂禮博士隨后創(chuàng)建了制表機(jī)公司,也就是赫赫有名的IBM公司的前身。

      1935年,著名的現(xiàn)代計(jì)算機(jī)科學(xué)之父和人工智能之父,艾倫·圖靈提出了著名的圖靈機(jī)模型,為現(xiàn)代計(jì)算機(jī)的邏輯工作方式奠定了理論基礎(chǔ)。

      1937年,美國哈佛大學(xué)著名計(jì)算機(jī)專家霍德·艾肯在IBM公司的資助下,借鑒上面提到的英國數(shù)學(xué)家巴貝奇的分析機(jī)理論,于1944年研制成功世界第一臺機(jī)電計(jì)算機(jī)——Mark-I型。IBM把這臺計(jì)算機(jī)送給了哈佛大學(xué),并一直使用到1959年,為培養(yǎng)早期的計(jì)算機(jī)科學(xué)家做出了巨大貢獻(xiàn)。

      另外一位學(xué)者就沒有這樣幸運(yùn)了。美國愛荷華州立大學(xué)理論量子物理學(xué)的約翰·阿塔那索夫(John Atanasoff)副教授,苦于沒有機(jī)器能夠計(jì)算出量子物理中許多變量的求解。

      同樣是在1937年,他尋求IBM公司的資助,但被斷然拒絕,于是他橫下決心一定要研制一臺更好的計(jì)算機(jī)器。他利用當(dāng)時(shí)正在發(fā)展的真空晶體管,用電子脈沖來表示“0”和“1”,并在電氣工程專家克利福特·貝瑞(Clifford Berry)的幫助下,兩人于1940年底研制成功了世界第一臺電子計(jì)算機(jī),并用兩個(gè)人的名字將其命名為ABC(Atanasoff-Berry Computer)。

      阿塔那索夫開辟了一種計(jì)算機(jī)的全新路徑,為現(xiàn)代電子計(jì)算機(jī)的架構(gòu)奠定了不可磨滅的基礎(chǔ)。今天的華為在內(nèi)部強(qiáng)調(diào)研發(fā)上要多路徑突破,或許也曾受此啟發(fā)。

      1940年底,他結(jié)識了美國物理學(xué)家莫克利(JohnW.Mauchly)。莫克利在了解和參觀了ABC計(jì)算機(jī)后,聯(lián)合賓夕法尼亞大學(xué)莫爾學(xué)院的電氣專家艾克特(J.PresperEckert),在國防部的資助下和馮·諾依曼博士的指導(dǎo)下,于1945年研制成功了世界第一臺通用電子計(jì)算機(jī)ENIAC。

      雖然這臺計(jì)算機(jī)采用的是十進(jìn)制,但當(dāng)時(shí)毫不影響它的計(jì)算能力,它大大縮短了美國“曼哈頓計(jì)劃”的原子彈研發(fā)時(shí)間,加速了二戰(zhàn)的結(jié)束。

      1945年6月,馮·諾依曼將ENIAC電子計(jì)算機(jī)的十進(jìn)制改回成二進(jìn)制,并提出計(jì)算機(jī)內(nèi)部存儲器存儲程序的概念,從而奠定了現(xiàn)代電子計(jì)算機(jī)理論的架構(gòu)。

      0和1這種極簡的語言設(shè)計(jì),像給計(jì)算機(jī)注入了永遠(yuǎn)在生長的“原力”,帶來了無限的可能。與通信領(lǐng)域IP路由理念具有異曲同工,就像“看不見的蒸汽機(jī)”,用最簡單的理論架構(gòu)開啟了一個(gè)全新的偉大產(chǎn)業(yè)。

      02

      軟件王國的“四大明珠”

      實(shí)際上,在電子計(jì)算機(jī)誕生之前,計(jì)算機(jī)這個(gè)角色是由女人來扮演的。這些女人被稱為Computers,大多數(shù)計(jì)算都是她們手工完成的。

      世界第一段程序,是上面提到的巴貝奇的師妹著名詩人拜倫之女Ada Lovelace在打孔卡上寫出來的。程序設(shè)計(jì)人員都要把程序編排成010101這樣的形式,在紙上打孔,再送到機(jī)器里去讀。這減少了相當(dāng)多的工作,寫一個(gè)卡片能使用相當(dāng)久,也避免了重復(fù)造輪子。

      因此,當(dāng)程序員開始在卡片上寫這些程序時(shí),人們開始構(gòu)建程序庫(libraries)。隨著時(shí)間的推移,大部分的程序漸漸的有了一些規(guī)則手冊來指導(dǎo)編寫。但還是很繁瑣,畢竟編寫和記憶0和1的各種組合,對于很多人來說相當(dāng)于是“天書”。

      一個(gè)傳奇的人物出現(xiàn)了。

      美國海軍的傳奇天才格雷斯·霍珀(Grace Hopper),在海軍服役時(shí),曾被派到哈佛大學(xué),與艾肯博士一起工作,負(fù)責(zé)為美國國防部資助的Mark-II型機(jī)電計(jì)算機(jī)編制程序。在二戰(zhàn)結(jié)束后,她加入了發(fā)明ENAIC電子計(jì)算機(jī)的莫克利和艾克特創(chuàng)辦的“電子控制公司”,開始了她改變世界的光輝旅程——打開編譯器和編程語言的新世界。

      Grace在加入莫克利和艾克特的公司,便產(chǎn)生了一種想法。她想設(shè)計(jì)一種程序,讓人可以用類似英文的語法,把想做的事寫下來,然后用這個(gè)程序把英文翻譯成機(jī)器能執(zhí)行的語言,交給機(jī)器去執(zhí)行。

      她把這個(gè)革命性的想法付諸實(shí)踐,發(fā)明了世界上第一個(gè)編譯器A-0。這是編譯器的始祖,也是現(xiàn)代編程語言的始祖。

      1952年,Grace和莫克利研究出了一種較為接近自然語言的計(jì)算機(jī)語言——匯編語言Flow-Matic。匯編語言本質(zhì)上是使用助記符來代替機(jī)器語言01010101,進(jìn)了一大步,但這種語言對計(jì)算機(jī)硬件依賴很大。不同的計(jì)算機(jī),匯編語言不相通。

      IBM公司在1946年后從制表機(jī)全面轉(zhuǎn)型電子計(jì)算機(jī)市場,并投入巨資招攬了世界眾多頂尖的計(jì)算機(jī)人才。其中一位叫約翰·貝克斯(John W. Backus),這位出身證券經(jīng)紀(jì)人家庭的富二代,酷愛數(shù)學(xué),加入IBM公司三年后,發(fā)明了一種快速編程的FORTRAN語言。同時(shí),他深入研究了Grace發(fā)明的Flow-Matic的編譯器,應(yīng)用到FORTRAN的編譯器中。

      FORTRAN的問世,在計(jì)算機(jī)史上具有劃時(shí)代的意義。它是世界第一個(gè)高級編程語言,使計(jì)算機(jī)語言從原始的低級匯編語言走到人人易懂的境界,計(jì)算機(jī)不再是科學(xué)家的專利。FORTRAN的誕生,孕育了軟件產(chǎn)業(yè)。此后,計(jì)算機(jī)高級編程語言進(jìn)入蓬勃發(fā)展的時(shí)代。

      隨后,IBM公司開發(fā)出了的ALGOL高級語言,人工智能之父約翰·麥卡錫(John McCarthy)發(fā)布了人工智能設(shè)計(jì)語言LISP,Grace奶奶也在Flow-Matic匯編語言的基礎(chǔ)上開發(fā)了COBOL語言。

      FORTRAN適合科學(xué)計(jì)算,ALOGOL適合事務(wù)處理,LISP適合人工智能計(jì)算,COBOL適合商業(yè)處理。這四種高級語言雖然比匯編語言更簡單,但對于非計(jì)算機(jī)專業(yè)人員,編程仍難度較大。于是,Dartmouth學(xué)院的兩位教授聯(lián)手開發(fā)一種更簡單的編程語言BASIC(初學(xué)者的全方位符式指令代碼)。

      這是一種不需要編譯的語言,只需要經(jīng)過解釋器執(zhí)行即可,初期的Android智能手機(jī)軟件借鑒了這種機(jī)制。BASIC語言也是目前被廣泛使用的Visual Basic語言的鼻祖,目前在微軟Excel的“宏”中可以直接使用。

      美國編程語言的開發(fā)熱潮你追我趕,其他國家也不甘示弱。

      1963年,英國劍橋大學(xué)推出了CPL語言,后又推出了簡化的BCPL語言。

      1970年,美國貝爾實(shí)驗(yàn)室的肯·湯普遜(Ken Thompson)和丹尼斯·利奇(Dennis Ritchie)在BCPL語言的基礎(chǔ)上,推出了更加簡單的B語言(取BCPL第一個(gè)字母),后又簡化出了C語言(取BCPL第二個(gè)字母)。這是目前世界上最常用的編程語言之一,甚至可以說是第一大編程語言。

      C語言之后,誕生了很多著名的語言,包括:

      C++:1983年正式發(fā)布。由貝爾實(shí)驗(yàn)室基于C語言改良,所以C++是完全兼容C語言的。

      Objective-C:1980年代發(fā)明。1988年,斯蒂夫·喬布斯(Steve Jobs)在NeXT公司時(shí)買下了 Objective-C 語言的授權(quán),后來成為蘋果公司MAC電腦和iPhone手機(jī)的程序設(shè)計(jì)語言。

      Java:1995年5月發(fā)布。SUN公司為了在電視機(jī)頂盒等電子產(chǎn)品智能化過程中搶占先機(jī),解決跨平臺的問題,所以開發(fā)了Java語言。但Java需要借助虛擬機(jī)機(jī)制來解釋源代碼并調(diào)度硬件資源。安卓系統(tǒng)使用的基礎(chǔ)語言就是Java。

      C#:2000年6月,由微軟發(fā)布。C#與Java有著驚人的相似,也需要借助類似于虛擬機(jī)的Framework來運(yùn)行;不同的是,Java支持所有平臺,而C#只支持Windows和Linux系統(tǒng)。

      GO:谷歌在2009年發(fā)布。GO語言主要用作服務(wù)器端和云計(jì)算開發(fā)。

      Swift:2014年由蘋果公司發(fā)布,可以和Objective-C語言混合使用。

      其中,C/C++是編譯語言,即在程序員寫完程序后,通過編譯器直接編譯成機(jī)器碼,安裝到相應(yīng)的硬件設(shè)備上即可直接運(yùn)行。

      Java/C#是預(yù)編譯語言,就是需要先在開發(fā)者環(huán)境中將源代碼(Source Code)轉(zhuǎn)換成字節(jié)碼(Byte Code),然后在設(shè)備上運(yùn)行時(shí)再將字節(jié)碼編譯或解釋成硬件能聽得懂的機(jī)器碼。將源代碼轉(zhuǎn)換成字節(jié)碼的過程,就叫預(yù)編譯。

      軟件王國還有兩個(gè)很重要的成員,就是操作系統(tǒng)和數(shù)據(jù)庫。上個(gè)世紀(jì)60年代,計(jì)算機(jī)高級語言的發(fā)展為操作系統(tǒng)和數(shù)據(jù)庫的誕生培育了沃土。1970年,貝爾實(shí)驗(yàn)室B語言和C語言的開發(fā)者肯·湯普遜(Ken Thompson)和丹尼斯·利奇(Dennis Ritchie),開發(fā)出了世界第一個(gè)通用計(jì)算機(jī)系統(tǒng)——UNIX。現(xiàn)在大家熟悉的Linux和Mac OS就是類UNIX操作系統(tǒng)。其中Linux可以運(yùn)行在服務(wù)器和其他大型平臺之上,如大型計(jì)算機(jī)和超級計(jì)算機(jī),世界上最快的前10名超級計(jì)算機(jī)運(yùn)行的都是基于Linux內(nèi)核的操作系統(tǒng)。在移動設(shè)備上廣泛使用的Android操作系統(tǒng)也是創(chuàng)建在Linux內(nèi)核之上。隨著磁盤的發(fā)明,從磁盤隨機(jī)存取數(shù)據(jù)成為可能。1961年,美國通用電氣公司成功地開發(fā)出世界上第一個(gè)數(shù)據(jù)庫管理系統(tǒng)(DBMS)——IDS(Integrated DataStore 集成數(shù)據(jù)存儲)。1968年,IBM公司開發(fā)了IBM第一個(gè)數(shù)據(jù)庫系統(tǒng)IMS(Information Management System)。IBM科學(xué)家的論文理論,成就了著名的Oracle數(shù)據(jù)庫。IBM公司出品的DB2和微軟公司的MS SQLServer數(shù)據(jù)庫也成為當(dāng)今數(shù)據(jù)庫領(lǐng)域重要的角色,目前在全世界已經(jīng)廣泛應(yīng)用。高級編程語言、編譯器、操作系統(tǒng)和數(shù)據(jù)庫,被稱為軟件王國的“四大明珠”。為軟件底層貢獻(xiàn)核心技術(shù)的公司主要來自于歐美。華為通過多年持續(xù)的研發(fā)投入,讓我們終于看到了美國巨頭的背影。

      03

      編譯器的前世今生如果說計(jì)算機(jī)是汽車,那么軟件就像汽車的操控系統(tǒng)一樣,是計(jì)算機(jī)的血液。編譯器則是汽車發(fā)動機(jī)里最核心的汽油燃燒技術(shù),將軟件變成計(jì)算機(jī)的動力,其編譯性能和效率,直接決定了用戶的使用體驗(yàn)。

      如上文所述,最早的編譯器是Grace奶奶發(fā)明的A-0編譯器。第二個(gè)被大規(guī)模應(yīng)用的編譯器,則是和FORTRAN編程語言配套的FORTRAN編譯器。目前主流使用的編譯器主要有下面幾種:

      Windows系統(tǒng)

      使用CL編譯器。它直接集成在Visual Studio或Visual C++的開發(fā)者環(huán)境中,一般不單獨(dú)使用。

      Linux系統(tǒng)

      使用開源的GCC編譯器。GCC,由自由軟件運(yùn)動的精神領(lǐng)袖理查德·馬修·斯托曼(Richard Matthew Stallman, RMS)在上個(gè)世紀(jì)80年代創(chuàng)立。它原本只處理C語言,后續(xù)擴(kuò)展可以處理C++、Objective-C、Java等其他語言。GCC被認(rèn)為是跨平臺軟件的編譯器首選。

      蘋果Mac和iOS系統(tǒng)

      最初使用GCC編譯器,現(xiàn)已替代為Clang + LLVM。

      為什么蘋果公司要換編譯器呢?

      因?yàn)樘O果發(fā)現(xiàn)開源的GCC開發(fā)者根本使喚不動,他們不愿意專門為了蘋果公司的要求優(yōu)化和改進(jìn)GCC代碼,所以蘋果將編譯器后端直接替換為LLVM(Low Level Virtual Machine,底層虛擬機(jī)),并且將讀研時(shí)(2003年)發(fā)明LLVM的天才少年克里斯·拉特納(Chris Lattner)招入麾下。克里斯進(jìn)入了蘋果之后,大幅度優(yōu)化和改進(jìn)LLVM以適應(yīng)Objective-C的語法變革和性能要求,同時(shí)發(fā)起了CLang項(xiàng)目來完全替代GCC。

      今天,GCC + LLVM 已經(jīng)被替換成了 Clang +LLVM。LLVM負(fù)責(zé)編譯器后端,用來處理代碼優(yōu)化和跨平臺,而Clang負(fù)責(zé)前端,只需將程序源代碼轉(zhuǎn)換成LLVM可以看得懂的IR(Intermediate Representation,中間語言)即可。

      另外,上文提到的Swift語言,則是這位天才少年克里斯為蘋果公司貢獻(xiàn)的第三個(gè)重要作品。

      安卓系統(tǒng)

      安卓主要使用預(yù)編譯的Java語言開發(fā),最初版本通過虛擬機(jī)運(yùn)行,不需要編譯器,后續(xù)版本加入了JIT和AOT編譯機(jī)制(下一部分將詳細(xì)展開)。

      除了上述編譯器之外,還有兩個(gè)著名的編譯器值得一提。

      Intel的ICC編譯器

      ICC編譯器,全稱Intel C++ Compiler,是Intel開發(fā)的C/C++/Fortran編譯器套裝,適用于Linux、Microsoft和Mac OS X操作系統(tǒng),廣泛應(yīng)用于高性能計(jì)算、分布式計(jì)算等商業(yè)計(jì)算領(lǐng)域。

      SGI等公司推出的Open64編譯器

      SGI(S代表超級計(jì)算機(jī),G代表圖形工作站,I代表具有突破性的洞察力)生產(chǎn)的超級計(jì)算機(jī),主要應(yīng)用于巨大的實(shí)驗(yàn)室,采用Open64編譯器。

      04

      安卓的四大命門交待完計(jì)算機(jī)和軟件的發(fā)展歷程,終于說到正題。

      安卓系統(tǒng)從2008年1.0到今天的9.0,十來年間安卓系統(tǒng)大小版本超過15個(gè),從2016年開始也在不斷融入了華為等手機(jī)公司發(fā)起的文件系統(tǒng)、人工智能學(xué)習(xí)、智能硬件調(diào)度和內(nèi)存管理等底層創(chuàng)新技術(shù),安卓手機(jī)的體驗(yàn)已經(jīng)今非昔比。為什么仍然還有很多人詬病安卓手機(jī)沒有iPhone流暢?安卓系統(tǒng)的程序是怎樣運(yùn)行的?下面展開闡述一下安卓的四大命門。解決安卓這四大命門,也是華為方舟編譯器的使命!

      第一個(gè)命門

      Java的“虛擬機(jī)”

      前面提到,Java為了能夠?qū)崿F(xiàn)跨平臺操作,便借助虛擬機(jī)來調(diào)度硬件平臺資源。在虛擬機(jī)里,還需要集成翻譯器或者編譯器,來將Java的字節(jié)碼(即中間代碼)解釋成機(jī)器聽得懂的機(jī)器語言,或者直接編譯成機(jī)器直接執(zhí)行的010101的機(jī)器碼。

      2008年,Android 1.0剛發(fā)布的時(shí)候,使用的是一個(gè)叫Dalvik的虛擬機(jī),里面集成了一個(gè)解釋器,每次用戶在安卓手機(jī)上運(yùn)行APP時(shí),就會叫醒這個(gè)解釋器,來給安卓的硬件解釋APP想要干嘛。這就相當(dāng)于新聞發(fā)布會,發(fā)言人講一句自己的母語,然后再由專業(yè)翻譯將其翻譯成外國記者聽得懂的語言,效率非常低下,一個(gè)小時(shí)可能也問不了幾個(gè)問題。

      谷歌意識到這個(gè)問題嚴(yán)重拖了安卓手機(jī)的后腿,所以通過一年多的努力,在2010年中發(fā)布了2.2版本,引入了JIT(Just in Time,即時(shí)編譯)機(jī)制。JIT比較聰明,當(dāng)用戶在安卓手機(jī)運(yùn)行APP時(shí),會同時(shí)將用戶經(jīng)常使用的功能編譯為機(jī)器能直接執(zhí)行的010101機(jī)器碼,不用每一句每一句的去翻譯。當(dāng)出現(xiàn)不常用的功能時(shí),再把解釋器叫起來翻譯。

      JIT雖然變聰明了一點(diǎn),但是每次啟動APP都要先編譯一次,不能一勞永逸。加上Dalvik虛擬機(jī)性能比較落后,所以谷歌在2014年10月推出了Android 5.0版本,將虛擬機(jī)從Dalvik替代成ART(Android Run Time),同時(shí)把JIT的編譯器替代成AOT (Ahead of Time)。

      意思就是說,APP在下載后安裝到手機(jī)上時(shí)同時(shí)把能編譯的代碼先編譯成機(jī)器聽得懂的101010。剩下不太好翻譯的代碼,就在用戶使用時(shí)再叫醒解釋器來翻譯。AOT相比JIT的好處,就是不用每次打開APP都需要先編譯一遍。但是,壞處就是用戶安裝APP的時(shí)間有點(diǎn)長。

      越來越多的用戶吐槽為什么安裝一個(gè)APP也慢吞吞。于是,谷歌在2017年Android 7.0又做了一點(diǎn)改進(jìn),安裝時(shí)先不編譯中間代碼,而是在用戶空閑時(shí)將能夠編譯成機(jī)器碼的那部分代碼,通過AOT編譯器先靜態(tài)編譯了。如果AOT還沒來得及編譯或者不能編譯,再叫醒JIT+解釋器兩個(gè)難兄難弟來頂住。這種機(jī)制,相當(dāng)于用時(shí)間換空間,既縮短了用戶安裝APP的等待時(shí)間,又將虛擬機(jī)里編譯器和解釋器能做的優(yōu)化提升到最大效率了。

      很多人以為華為方舟編譯器就是Android 7.0的ART虛擬機(jī),其實(shí)不然。無論是編譯器還是解釋器,只是在虛擬機(jī)上打補(bǔ)丁。手機(jī)上的虛擬機(jī)+編譯器+解釋器本身不僅占用硬件資源,還無法最大發(fā)揮軟件運(yùn)行性能。正因如此,所以絕大部分手機(jī)廠商只能無奈的通過簡單粗暴提升安卓手機(jī)的內(nèi)存和存儲空間,來彌補(bǔ)虛擬機(jī)的弊端。這就是安卓的第一個(gè)命門,虛擬機(jī)先天不足。

      第二個(gè)命門

      Java的“原罪”——額外的JNI開銷

      JNI,全稱Java Native Interface(Java原生接口),用來和C/C++等代碼進(jìn)行交互。

      目前95%的TOP應(yīng)用都是使用Java和C/C++等多種語言混合開發(fā)而成。Java和C/C++屬于兩種不同架構(gòu)的語言,各有自己的使用規(guī)范。為了APP正常運(yùn)行,它倆之間需要互通有無,這個(gè)互通有無的接口就是JNI。

      在數(shù)據(jù)訪問、函數(shù)調(diào)用、生命周期維護(hù)、異常處理等方面都需要這兩種代碼互相調(diào)用。這就意味著手機(jī)硬件資源要分配一部分給JNI去做調(diào)度。不僅占用了硬件資源,而且這種機(jī)制本身就效率較低。

      這便是額外的JNI開銷。

      第三個(gè)命門

      代碼優(yōu)化空間有限

      安卓虛擬機(jī)的編譯器受限于手機(jī)硬件和代碼優(yōu)化模板單一,代碼優(yōu)化空間有限。編譯器包含三個(gè)部分。前端Front End,主要負(fù)責(zé)將源代碼翻譯成IR(Intermediate Representation,中間表示);中端的Optimizer主要負(fù)責(zé)代碼優(yōu)化,將前端翻譯過來的IR代碼優(yōu)化得更高效;后端Back End則將優(yōu)化后的IR編譯成101010的機(jī)器碼。

      為了防止生態(tài)過于碎片化,安卓只為第三方開放了簡單的編譯代碼優(yōu)化模板,代碼優(yōu)化空間有限。

      第四個(gè)命門

      Java現(xiàn)有內(nèi)存回收機(jī)制易造成間歇性卡頓

      當(dāng)手機(jī)內(nèi)存資源不夠用的時(shí)候,安卓虛擬機(jī)就會召喚GC(Garbage Collection)封鎖公路,讓所有手機(jī)運(yùn)行的Java線程“Stop World”,全部暫停,等待它回收內(nèi)存空間,避免“交通流量超載”。這個(gè)GC機(jī)制,無法精確控制和干預(yù),用戶也無法把它去掉,所以性能比較差的手機(jī)還存在“間歇性”卡頓。

      十余年間,通過安卓系統(tǒng)的持續(xù)優(yōu)化,以及內(nèi)存的不斷加持,安卓手機(jī)構(gòu)筑了足夠流暢的用戶體驗(yàn)。

      但是安卓的四大命門,如同達(dá)摩克利斯之劍,懸在安卓廠商的頭上。華為科學(xué)家和工程師們,對此持續(xù)攻關(guān)了十年,只為再造安卓。

      05

      十年方舟,再造安卓

      沒錯(cuò),華為為此準(zhǔn)備了十年。2009年,華為啟動5G基礎(chǔ)技術(shù)研究的同時(shí),開始創(chuàng)建編譯組,第一批海內(nèi)外研究人員加入。

      2013年,華為推出面向基站領(lǐng)域的自研編譯器HCC,并正式提出編譯器框架構(gòu)想。2014年,眾多海內(nèi)外專家加入華為,方舟項(xiàng)目正式啟動。2016年,成立編譯器與編程語言實(shí)驗(yàn)室。2019年,華為方舟編譯器正式面世!這十年,每一次攻關(guān)都蘊(yùn)含著華為軟件工程師們的傾力投入,每一個(gè)進(jìn)展都值得銘記。2017年5月,方舟編譯器上第一個(gè)Java程序“Hello World”跑通。2017年8月的一個(gè)凌晨,在華為的一個(gè)實(shí)驗(yàn)室里,項(xiàng)目組已經(jīng)連續(xù)數(shù)日24小時(shí)不間斷攻關(guān),卻始終看不到success的返回信息。絕望之下,工程師把所有通信數(shù)據(jù)打印出來,逐個(gè)字節(jié)排查,最終發(fā)現(xiàn)有一處字節(jié)的順序不一致。糾正后,華為方舟跑通了第一個(gè)安卓后臺服務(wù)DiskStatus,這標(biāo)志著對安卓的換心手術(shù)進(jìn)入了實(shí)操階段。2018年春節(jié)前一周,方舟編譯器跑通安卓系統(tǒng)所有后臺服務(wù),并成功移植到手機(jī)。當(dāng)晚,所有人聚集在實(shí)驗(yàn)室的機(jī)房中,等待首個(gè)開機(jī)畫面加載成功的神圣時(shí)刻。秒針滴答,如同過了一個(gè)世紀(jì)那么久,屏幕終于點(diǎn)亮。歡呼,擁抱,一蹦三尺高,項(xiàng)目組成員們到底沒忍住,留下了激動的淚水。接下來,項(xiàng)目組在除夕前夜啟動了方舟編譯手機(jī)的Beta測試。大年初一清晨,總架構(gòu)師發(fā)來了第一條經(jīng)編譯器編譯的運(yùn)行程序發(fā)出來的拜年消息:

      春節(jié)快樂,方舟大吉!

      當(dāng)P30發(fā)布會上“方舟”甫一出現(xiàn),就在中國軟件行業(yè)“炸”了鍋。無數(shù)軟件從業(yè)者從一開始的質(zhì)疑,到弄清方舟真相后的驚嘆……這些都是對華為軟件工程師們十年如一日、一點(diǎn)一滴“啃硬骨頭”的致敬!

      實(shí)際上,方舟已經(jīng)不是傳統(tǒng)意義上從高級語言到機(jī)器碼的“萬能翻譯”,更是一個(gè)編譯運(yùn)行系統(tǒng)。

      一方面,方舟編譯器首次在Java領(lǐng)域?qū)⑻摂M機(jī)干掉了,也是軟件史上首次將Java/C/C++等混合代碼一次編譯成機(jī)器碼直接在手機(jī)上運(yùn)行,徹底告別Java的JNI額外開銷,也徹底告別了虛擬機(jī)GC內(nèi)存回收帶來的應(yīng)用進(jìn)程掉線,使操作流暢度大幅提升。如果說目前最新的安卓系統(tǒng)是和諧號動車,那么經(jīng)方舟編譯的安卓系統(tǒng)便是高鐵,是“復(fù)興號”。

      華為手機(jī)直接通過方舟編譯器替換了Android system-server的所有后臺服務(wù),這一項(xiàng)就已經(jīng)足夠讓華為EMUI比其他安卓系統(tǒng)更快一步。根據(jù)華為官方測試,方舟編譯器提升手機(jī)系統(tǒng)操作流暢度高達(dá)24%,系統(tǒng)響應(yīng)性能提升44%。入手P30系列的用戶,應(yīng)該已經(jīng)體驗(yàn)到了。

      另一方面,方舟編譯器用空間換性能,直接將編譯器的代碼優(yōu)化搬到了開發(fā)者環(huán)境,不再被手機(jī)端的硬件資源所限制,為代碼優(yōu)化提供了無限可能。此外,經(jīng)測試,新浪微博極速版APP經(jīng)方舟編譯后,操作流暢度提升高達(dá)60%。解決安卓的四大命門,出于安卓,勝于安卓,超越iOS,并且全面兼容安卓,這就是華為方舟編譯器的使命!

      06

      生來就是要干掉虛擬機(jī)方舟編譯器從立項(xiàng)開始,就是要徹底干掉虛擬機(jī)。這在歷史上,是從來沒有人做過的。

      SUN公司當(dāng)初發(fā)明Java語言,就是借助虛擬機(jī)的這個(gè)“萬能中轉(zhuǎn)站”,屏蔽掉各種硬件的差異,方便同一個(gè)代碼在多個(gè)平臺運(yùn)行,所以Java是目前最流行的高級編程語言之一。這么多年,從來沒有人能夠干掉虛擬機(jī),說明難度非常之大。

      那么方舟編譯器,是如何完全干掉虛擬機(jī)的呢?

      最關(guān)鍵的就是要能夠?qū)ava代碼直接編譯成010101的機(jī)器碼。

      這種設(shè)想在理論是可行的,但是從現(xiàn)實(shí)來講太難了。歷史上有過一些嘗試,比如現(xiàn)在大行其道的安卓ART虛擬機(jī)。這些嘗試能夠提前翻譯Java語言里很多的靜態(tài)語義,但是多數(shù)的動態(tài)語義,仍然搞不定,還得交給虛擬機(jī)。

      所謂靜態(tài)語義,我們可以理解為確定的語言和意思,比如“我是張三”。而動態(tài)語義,則需要結(jié)合上下文去理解,比如“能穿多少就穿多少”,到底穿多還是穿少,要看是冬天還是夏天了。例如大家熟悉的微博、京東等APP的開屏廣告就需要用到動態(tài)語義。像編譯靜態(tài)語義一樣去編譯動態(tài)語義,很多知乎大神認(rèn)為根本就不可能。

      為了這個(gè)目標(biāo),華為軟件工程師們對自己苛求再苛求,這里涉及到大量的細(xì)節(jié),從對象模型的設(shè)計(jì),到每一個(gè)bit的用途、每一個(gè)對象的元數(shù)據(jù)metadata(描述數(shù)據(jù)的數(shù)據(jù))每一個(gè)編譯優(yōu)化的設(shè)計(jì),都經(jīng)過了無數(shù)次的激烈討論和推倒重來。最終,方舟編譯器通過編譯階段和運(yùn)行階段的雙向加持,將靜態(tài)編譯動態(tài)語義最大的兩大難點(diǎn)一一解決:一是設(shè)計(jì)數(shù)據(jù)模型,二是如何在運(yùn)行時(shí)高效獲得動態(tài)信息。方舟編譯器團(tuán)隊(duì)基本遍歷了Java的動態(tài)語義,進(jìn)行了大規(guī)模的數(shù)據(jù)建模。同時(shí),大大提高了編譯時(shí)動態(tài)語義分析的精度,特別是涉及跨語言調(diào)用時(shí);另外,華為設(shè)計(jì)了一套具有核心專利的動態(tài)語義匹配機(jī)制,有效降低了運(yùn)行時(shí)動態(tài)語義的開銷。正是因?yàn)檫@兩大難點(diǎn)的突破,讓方舟編譯器能夠?qū)ava代碼編譯成機(jī)器能直接執(zhí)行的語言。經(jīng)過華為方舟編譯器的APP,再也不需要在手機(jī)上編譯了,徹底告別了虛擬機(jī),從而帶來了媲美甚至超越iOS的安卓體驗(yàn)。

      07

      代碼“萬國通”

      95%的Top應(yīng)用都是Java/C/C++等混合語言編寫而成。方舟編譯器的第二個(gè)使命,就是干掉混合語言互相調(diào)用帶來的JNI開銷。

      華為方舟編譯器團(tuán)隊(duì)基于多個(gè)編程語言的深刻理解和大量研發(fā)積累,將混合語言破天荒實(shí)現(xiàn)了統(tǒng)一的中間表示IR,這就相當(dāng)于同一個(gè)人能夠理解全世界的語言,所以我們把這個(gè)革命性突破叫做,代碼“萬國通”。

      那么方舟編譯器是如何使用統(tǒng)一的IR來表示各種語言呢?

      IR是用來表示代碼的數(shù)據(jù)結(jié)構(gòu),它是編譯器的各模塊以及相關(guān)工具之間用來傳遞信息的“協(xié)議和通用語言”,也是程序變換和編譯優(yōu)化各種算法的承載體。它是編譯器的“大腦”,直接決定了編譯器的最終效果。它的難度是最高的。

      華為方舟編譯器團(tuán)隊(duì)對IR進(jìn)行了長達(dá)五年的精雕細(xì)琢,逐漸摸索出“大腦”里每一條神經(jīng)、每一個(gè)神經(jīng)元的信號規(guī)律,并在此基礎(chǔ)上發(fā)明了一套核心專利,使得不同語言代碼在開發(fā)者環(huán)境中能夠統(tǒng)一編譯成同一套可直接執(zhí)行的機(jī)器碼,從而徹底消除混合語言互相調(diào)用的開銷。

      08

      給代碼裝上飛機(jī)發(fā)動機(jī)

      除了IR,編譯器還有一個(gè)非常重要的價(jià)值,就是代碼優(yōu)化。

      華為方舟編譯器,直接將代碼優(yōu)化從手機(jī)環(huán)節(jié)搬到了開發(fā)者環(huán)境,未來還可能搬到云端。利用開發(fā)者環(huán)境更強(qiáng)大的算力,可以實(shí)現(xiàn)更先進(jìn)和精細(xì)的優(yōu)化算法,來達(dá)到更強(qiáng)大的優(yōu)化效果,在很多特定場景代碼優(yōu)化的提升甚至是顛覆性的。

      這相當(dāng)于給APP在方舟里裝上飛機(jī)發(fā)動機(jī),讓你的APP運(yùn)行如飛!

      值得一提的是,開發(fā)者使用方舟編譯器,并不需要改變原來的編碼習(xí)慣。開發(fā)者可以自行開發(fā)代碼優(yōu)化算法,也可以僅通過方舟編譯器預(yù)置的算法進(jìn)行代碼優(yōu)化。未來,華為還將提供代碼調(diào)優(yōu)工具,開發(fā)者可以選擇根據(jù)工具的優(yōu)化建議來調(diào)整代碼,和方舟編譯器配合獲得更優(yōu)的執(zhí)行效果。

      可以想象,未來廣大APP開發(fā)者使用方舟編譯器后,消費(fèi)者們的體驗(yàn)將達(dá)到一個(gè)前所未有的高度。這對于整個(gè)安卓生態(tài),都是一件前所未有的幸事!

      09

      Stop World,安卓卡頓再見

      方舟的第四個(gè)使命,就是解決安卓虛擬機(jī)GC內(nèi)存回收帶來的“Stop World”。

      目前安卓手機(jī)內(nèi)存資源不夠用的時(shí)候,GC直接叫停所有應(yīng)用,所以偶爾會遭遇莫名卡頓。

      方舟編譯器采用了引用計(jì)數(shù)法(RC,Reference Counting)來進(jìn)行內(nèi)存的實(shí)時(shí)回收,并且配合使用了專門的消除環(huán)算法(消除對象互相引用帶來的無法回收問題),來避免GC集中式回收帶來的系統(tǒng)卡頓。相比GC,方舟的內(nèi)存回收是實(shí)時(shí)的而非集中式的,且不需要暫停應(yīng)用進(jìn)程,這樣便大大消除了卡頓。

      如果把內(nèi)存回收比作成打掃房間,那么GC的策略是專門有一個(gè)衛(wèi)生員,看房間里垃圾太多了,就把所有人請出去,打掃完了再讓大家回來。而方舟的RC則是每個(gè)人收拾自己的垃圾,用完就清理,保持清潔的同時(shí)不影響人的正常活動。

      軟件有一個(gè)大家很熟悉的死循環(huán),就是電腦被一個(gè)無限循環(huán)的運(yùn)行程序把計(jì)算機(jī)資源占光。

      這種“死循環(huán)”在軟件中叫“環(huán)引用”。為了從機(jī)制避免手機(jī)內(nèi)存被環(huán)引用“吃掉”,方舟編譯器引入annotation的“告警”標(biāo)示,對基礎(chǔ)類的環(huán)進(jìn)行標(biāo)注。當(dāng)然,Java程序員也可以對業(yè)務(wù)代碼中的環(huán)進(jìn)行標(biāo)注。經(jīng)過豐富的實(shí)踐驗(yàn)證,方舟這種機(jī)制可減少大部分程序中環(huán)的出現(xiàn)。

      另外一方面,方舟編譯器在運(yùn)行狀態(tài)下引入了高效的環(huán)回收機(jī)制,允許有選擇的智能回收某個(gè)APP的內(nèi)存占用,這對傳統(tǒng)的環(huán)回收算法是一個(gè)非常棒的改進(jìn)。

      Stop World,安卓卡頓,再見!

      正是因?yàn)榉街圩龅交旌险Z言的統(tǒng)一中間表示和完全靜態(tài)編譯,它干掉了虛擬機(jī),消除了JNI開銷,告別了GC內(nèi)存回收的“間歇性”卡頓,以及其他很多開銷。同時(shí),為開發(fā)者進(jìn)行代碼優(yōu)化提供了一個(gè)更廣闊的舞臺。


      華為很快將全面開源方舟編譯器,屆時(shí)開發(fā)者們可以使用方舟編譯器作為開發(fā)工具,為移動應(yīng)用生態(tài)和體驗(yàn)打開一扇全新的大門。科技的進(jìn)步,離不開全球無數(shù)科學(xué)家和工程師的奉獻(xiàn)。產(chǎn)業(yè)的繁榮,開放是唯一出路!

    責(zé)任編輯:任奧全球推
    世界服裝鞋帽網(wǎng)版權(quán)與免責(zé)聲明:
    1、凡本網(wǎng)注明"來源:世界服裝鞋帽網(wǎng)sjfzxm.com"的所有作品,版權(quán)均屬世界服裝鞋帽網(wǎng)所有,轉(zhuǎn)載請注明"來源:世界服裝鞋帽網(wǎng)sjfzxm.com",違者,本網(wǎng)將追究相關(guān)法律責(zé)任。
    2、本網(wǎng)其他來源作品,均轉(zhuǎn)載自其他媒體,目的在于傳遞更多信息,不表明證實(shí)其描述或贊同其觀點(diǎn)。文章內(nèi)容僅供參考。
    3、若因版權(quán)等問題需要與本網(wǎng)聯(lián)絡(luò),請?jiān)?0日內(nèi)聯(lián)系我們,電話:0755-32905944,或者聯(lián)系電子郵件: 434489116@qq.com ,我們會在第一時(shí)間刪除。
    4、在本網(wǎng)發(fā)表評論者責(zé)任自負(fù)。
    跟帖0
    參與0

    網(wǎng)友評論僅供其表達(dá)個(gè)人看法,并不表明本網(wǎng)同意其觀點(diǎn)或證實(shí)其描述,發(fā)言請遵守相關(guān)規(guī)定

    相關(guān)閱讀

    疫情催生了未來10年的數(shù)字化方向服裝人的蛻變過程

    經(jīng)營攻略
    |
    2020/9/18 10:36:00
    57

    從“達(dá)芙妮”輝煌到隕落的過程看鞋業(yè)市場

    市場研究
    |
    2020/9/3 12:47:00
    37

    香港紡織及成衣研發(fā)中心介紹“銅芯抗疫”口罩消毒及包裝過程

    行業(yè)綜述
    |
    2020/5/8 11:23:00
    13

    彩色筆:吳浩談自己在疫情過程中的企業(yè)經(jīng)營感悟

    企業(yè)展播
    |
    2020/4/20 21:01:00
    123

    溫州巨納鞋業(yè)外銷轉(zhuǎn)內(nèi)銷的蛻變過程

    鞋企快遞
    |
    2020/4/1 14:30:00
    175

    拉夏貝爾:盛衰的過程與周期

    市場研究
    |
    2020/3/31 16:29:00
    95

    粗號紗生產(chǎn)過程中的空氣捻接問題及解決方案

    面料輔料
    |
    2019/12/26 11:47:00
    8

    香港交易所首席中國經(jīng)濟(jì)學(xué)家巴曙松:大灣區(qū)的使命,是在轉(zhuǎn)型過程中促進(jìn)技術(shù)的進(jìn)步

    財(cái)經(jīng)要聞
    |
    2019/12/25 11:31:00
    15

    專題推薦

    閱讀下一篇

    喬碧蘿拒絕承認(rèn)盜用美女圖片是怎么回事?居然還說對方因?yàn)榭坎渌臒岫炔懦蔀榫W(wǎng)紅?

    說起喬碧蘿,不必多說她的事情大家都不陌生,可謂是打破了網(wǎng)友對于網(wǎng)紅認(rèn)知的底線,按說這件事曝光后,喬碧

    返回世界服裝鞋帽網(wǎng)首頁
    關(guān)注公眾號 關(guān)注公眾號
    手機(jī)看新聞 手機(jī)看新聞
    展開
    • 微信公眾號

    • 電話咨詢

    • 0755-32905944
    主站蜘蛛池模板: 黑人巨大精品欧美一区二区| 91精品视品在线播放| 最新日韩在线观看| 亚洲色国产欧美日韩| 翁熄系列回乡下| 国产成人高清视频免费播放| 99久久精品美女高潮喷水| 成人毛片18女人毛片| 亚洲av无码成人网站在线观看| 男人的j插入女人的p| 国产hs免费高清在线观看| 韩国福利一区二区美女视频| 女人自慰AA大片| 中文字幕在线观| 日韩精品有码在线三上悠亚| 亚洲欧洲另类春色校园网站| 男人狂桶女人出白浆免费视频| 周妍希美乳三点尽露四季图片| 香蕉视频一区二区三区| 国产爆乳无码一区二区麻豆| 91精品国产综合久久久久久| 天天操天天干天天玩| 一级片免费观看| 扒开双腿猛进入免费观看美女 | 国产高跟踩踏vk| 国产精品精品自在线拍| 99视频在线观看视频| 婷婷社区五月天| 两个人看的www免费视频| 日出水了特别黄的视频| 久久本网站受美利坚法律保护| 欧美XXXX黑人又粗又长精品| 亚洲日本人成中文字幕| 潦草影视2021手机| 伊人久久精品亚洲午夜| 精品免费tv久久久久久久| 咪咪色在线视频| 色婷婷在线影院| 国产全黄一级毛片| 黄色网址在线免费| 国产无套中出学生姝|