• <ul id="k6mek"><pre id="k6mek"></pre></ul>
      <ul id="k6mek"></ul>
      <ul id="k6mek"></ul>
    • <blockquote id="k6mek"><fieldset id="k6mek"></fieldset></blockquote>
    • <samp id="k6mek"><tbody id="k6mek"></tbody></samp><ul id="k6mek"><tbody id="k6mek"></tbody></ul>
      <th id="k6mek"></th>
    • <samp id="k6mek"></samp>
    • 高效執(zhí)行的 javascript 而不是字節(jié)碼和機(jī)器碼

      大家都知道 react 是 facebook 的產(chǎn)品,而 angular 是 google 產(chǎn)品,angular 是用 typescript 來(lái)編寫(xiě),通過(guò) typescript 這個(gè) javascript 超級(jí)是 angular 可以輕松地勝任開(kāi)發(fā)大型應(yīng)用。


      而且形成自己生態(tài),自己語(yǔ)言自己框架。所以 facebook 可能也不甘示弱,準(zhǔn)備用一門(mén)其他語(yǔ)言類(lèi)型的語(yǔ)言來(lái)高效寫(xiě)出穩(wěn)定可靠的 javascript 語(yǔ)言。最終選擇了這個(gè)有了 20 多年歷史的語(yǔ)言 ocaml, 估計(jì)很多人連聽(tīng)都過(guò)這門(mén)語(yǔ)言。


      這是一門(mén)函數(shù)式編程的語(yǔ)言。但是 ocaml 是無(wú)法運(yùn)行在瀏覽器上的,而且需要對(duì)前端那些熟悉 javascript 的程序員友好。為了解決這些問(wèn)題,出現(xiàn)了 Reason ,reason 是 OCaml 的語(yǔ)言接口,對(duì)于有 javascript 開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)者友好。有了 reason 那么如何將 reason 編譯為 javascript 呢?答案是?BuckleScript ,BS (BuckleScript )是將 ocamel/reason 編譯為 javascript 的編譯器。


      這不是一個(gè)簡(jiǎn)單的編譯轉(zhuǎn)換工具,BS 不但可以將 Ocaml

      ?代碼編譯為 javascript 而且是可以編譯為高效的 javascript,而且易于閱讀。編譯后的代碼你是看不這是機(jī)器寫(xiě)的,而且 BS 也是中國(guó)人寫(xiě)的,是我們的驕傲。




      這么三個(gè)相對(duì)獨(dú)立的語(yǔ)言和工具,他們之間的關(guān)系又是怎么建立起來(lái)的呢?
      我們通過(guò)分析 Ocaml 編譯器來(lái)看一看是如何將他們整合到一起的。


      我們從 Ocaml 編譯過(guò)程作為切入點(diǎn)進(jìn)行分析,將三者聯(lián)系起來(lái)。


      source code :在這個(gè)階段編譯器獲取 OCaml 的代碼

      unTyped AST :進(jìn)行代碼進(jìn)行解析和預(yù)處理,后生產(chǎn)一個(gè)棵沒(méi)有類(lèi)型的 AST 。

      Typed AST :然后對(duì)類(lèi)型進(jìn)行推測(cè)和檢驗(yàn)生產(chǎn)有類(lèi)型的 AST。

      Lambda IR :這應(yīng)該是 Ocaml 重點(diǎn),但是應(yīng)該不是我們今天重點(diǎn),不過(guò)可以了解一下

      將定義類(lèi)型的 AST 轉(zhuǎn)為為無(wú)類(lèi)型的 IR ,轉(zhuǎn)換格式依據(jù) s-express

      這句話(huà)中出現(xiàn)了兩個(gè)難懂的詞 IR 和 s-express

      s-express 知乎一下沒(méi)有,wiki 中找到了,我們嘗試?yán)斫庖幌隆?/p>

      百度一下,百度翻譯的還不錯(cuò)。在此基礎(chǔ)解釋一下。

      **s-expression**應(yīng)該是一種表示數(shù)據(jù)結(jié)構(gòu)的表達(dá)方式例如(*2(+3 4)),就是將剛剛生產(chǎn)樹(shù)形結(jié)構(gòu)數(shù)據(jù)表達(dá)成這樣。是嵌套列表(樹(shù)形結(jié)構(gòu))數(shù)據(jù)的一種表示法,由編程語(yǔ)言lisp發(fā)明并推廣,它將它們用于源代碼和數(shù)據(jù)。

      Bytecode :最后經(jīng)過(guò)進(jìn)行推理將 IR 編譯成字節(jié)碼或機(jī)器碼

      了解 ocaml 的整個(gè)編譯過(guò)程,那么我們的 reason 和 bs 出現(xiàn)在哪個(gè)階段呢?



      Reason 出現(xiàn)在 unTyped AST 這個(gè)編譯階段,通過(guò)一些預(yù)處理讓我們?cè)创a可以解析成 AST 支持一些新語(yǔ)法的特性


      BuckleScript 將使用無(wú)類(lèi)型的 IR 進(jìn)行編譯為可以高效執(zhí)行的 javascript 而不是字節(jié)碼和機(jī)器碼

      BuckleScript 的神奇之處編譯的 javascript 可能比你這的還好。計(jì)算機(jī)更喜歡函數(shù)式編程。讓我們擁抱機(jī)器,學(xué)一點(diǎn)稍微難于理解但是高效的函數(shù)式編程吧。


      React 已經(jīng)采用 reason 來(lái)寫(xiě)組件,下面列出其好處。

      - 更安全,更簡(jiǎn)潔的方式去構(gòu)建 React 組件

      - 完全兼容 JSX

      - 類(lèi)型安全兼容 javascript 編寫(xiě)的組件

      - 用于一種全新的表述型 API 來(lái)描述狀態(tài)管理


      昨天我們通過(guò)一個(gè)示例,做了一個(gè)簡(jiǎn)單的 Demo。也知道我們可以用 reason 來(lái)寫(xiě) react 組件,reason 提供兩種模板讓我們來(lái)創(chuàng)建組件。

      無(wú)類(lèi)型的組件statelessComponent


      let component = ReasonReact.statelessComponent("SimpleComponent");let make = _children => { ...component, render: _self =>
      (ReasonReact.string("Reason Projects"))
      ,
      };

      然后我們創(chuàng)建一個(gè) TutData.re 文件,其中定義一個(gè) tut 類(lèi)型,定義數(shù)據(jù)的結(jié)構(gòu)。


      type tut = { title:string, body:string}

      我們創(chuàng)建一個(gè) statessComponent 組件。


      let component = ReasonReact.statelessComponent("SimpleComponent");let make = _children => { ...component, render: _self => {  

      (ReasonReact.string("Reason Projects"))

      ; },};

      我們?cè)诙x一個(gè)組件 TutItem,~tut 表示給這個(gè)參數(shù)打一個(gè)標(biāo)簽,雖然我們可調(diào)整參數(shù)的位置,然后通過(guò)標(biāo)簽對(duì)參數(shù)進(jìn)行傳值。


      let component = ReasonReact.statelessComponent("TutItem");let make =(~tut: TutData.tut, _children) => { ...component, render: _self => { //創(chuàng)建數(shù)據(jù)  
      (ReasonReact.string(tut.title))
      ; },};

      創(chuàng)建 tut 類(lèi)型的 dummyTut 的數(shù)據(jù),然后將 dummyTut 通過(guò) prop 傳入組件。


      let component = ReasonReact.statelessComponent("SimpleComponent");let make = _children => { ...component, render: _self => { //創(chuàng)建數(shù)據(jù) let dummyTut:TutData.tut = { title:"angular tut", body:"angular tut body" }; <div>  <h1>(ReasonReact.string("Reason Projects")) h1> <TutItem tut=dummyTut/> div>; },};



      返回觀點(diǎn)列表
      本文標(biāo)簽:

      相關(guān)專(zhuān)題

      體驗(yàn)從溝通開(kāi)始,讓我們聆聽(tīng)您的需求!

      網(wǎng)站事業(yè)部產(chǎn)品經(jīng)理

      網(wǎng)站事業(yè)部產(chǎn)品經(jīng)理

      免費(fèi)獲取項(xiàng)目策劃

      項(xiàng)目開(kāi)發(fā)部產(chǎn)品經(jīng)理

      項(xiàng)目開(kāi)發(fā)部產(chǎn)品經(jīng)理

      免費(fèi)獲取項(xiàng)目策劃

      我們正使用 cookies 來(lái)改善您的訪(fǎng)問(wèn)體驗(yàn)

      派迪科技非常重視您的個(gè)人隱私,當(dāng)您訪(fǎng)問(wèn)我們的網(wǎng)站www.bmwdream.cn時(shí),請(qǐng)同意使用所有cookies 。

      如果您想詳細(xì)了解我們?nèi)绾问褂胏ookies請(qǐng)?jiān)L問(wèn)我們的 《隱私政策》

      Cookie 偏好

      如果您想詳細(xì)了解我們?nèi)绾问褂胏ookie請(qǐng)?jiān)L問(wèn)我們的 《隱私政策》

      管理cookie偏好

      基本 cookies

      始終允許

      這些 cookies 是網(wǎng)站運(yùn)行所必需的,不能在我們的系統(tǒng)中關(guān)閉。它們通常僅針對(duì)您所做的相當(dāng)于服務(wù)請(qǐng)求的操作而設(shè)置,例如設(shè)置您的隱私首選項(xiàng)、登錄或填寫(xiě)表格。您可以將瀏覽器設(shè)置為阻止或提醒您有關(guān)這些 cookies 的信息,但網(wǎng)站的某些部分將無(wú)法運(yùn)行。這些 cookies 不存儲(chǔ)任何個(gè)人身份信息。

      性能 cookies

      始終允許
      這些 cookies 使我們能夠計(jì)算訪(fǎng)問(wèn)量和流量來(lái)源,以便我們可以衡量和改進(jìn)我們網(wǎng)站的性能。它們幫助我們了解哪些頁(yè)面受歡迎和不受歡迎,并了解訪(fǎng)問(wèn)者如何在網(wǎng)站上移動(dòng)。這些 cookies 收集的所有信息都是匯總的,而且是匿名的。如果您不允許這些 cookies,我們將不知道您何時(shí)訪(fǎng)問(wèn)了我們的網(wǎng)站,也無(wú)法監(jiān)控其性能。

      功能性 cookies

      這些 cookies 收集信息用于分析和個(gè)性化您的定向廣告體驗(yàn)。您可以使用此撥動(dòng)開(kāi)關(guān)來(lái)行使選擇不獲取個(gè)人信息的權(quán)利。如果您選擇關(guān)閉,我們將無(wú)法向您提供個(gè)性化廣告,也不會(huì)將您的個(gè)人信息交給任何第三方。

      定位 Cookies

      這些 cookies 可能由我們的廣告合作伙伴通過(guò)我們的網(wǎng)站設(shè)置。這些公司可能會(huì)使用它們來(lái)建立您的興趣檔案,并在其他網(wǎng)站上向您展示相關(guān)廣告。它們不直接存儲(chǔ)個(gè)人信息,而是基于唯一標(biāo)識(shí)您的瀏覽器和互聯(lián)網(wǎng)設(shè)備。如果您不允許使用這些 cookie,您將體驗(yàn)到較少針對(duì)性的廣告。
      • <ul id="k6mek"><pre id="k6mek"></pre></ul>
        <ul id="k6mek"></ul>
        <ul id="k6mek"></ul>
      • <blockquote id="k6mek"><fieldset id="k6mek"></fieldset></blockquote>
      • <samp id="k6mek"><tbody id="k6mek"></tbody></samp><ul id="k6mek"><tbody id="k6mek"></tbody></ul>
        <th id="k6mek"></th>
      • <samp id="k6mek"></samp>