極速開發 react — reason 1
大家都知道 react 是 facebook 的產品,而 angular 是 google 產品,angular 是用 typescript 來編寫,通過 typescript 這個 javascript 超級是 angular 可以輕鬆地勝任開發大型應用。而且形成自己生態,自己語言自己框架。所以 facebook 可能也不甘示弱,準備用一門其他語言高效寫出穩定可靠的 javascript 語言。
最終選擇了這個有了 20 多年曆史的語言 ocaml, 估計很多人連聽都過這門語言。這是一門函數語言程式設計的語言。但是 ocaml 是無法執行在瀏覽器上的,而且需要對前端那些熟悉 javascript 的程式設計師友好。為了解決這些問題,請看下圖

rn001.JPG
- Ocaml 提供表達和動態的語言
- Reason 是一個語言介面,這樣定義應該再恰當不過了。
- BuckleScript 是將 ocamel/reason 編譯為 javascript 的編譯器。
這麼三個相對獨立的語言和工具,他們之間的關係又是怎麼建立起來的呢?
我們通過分析 Ocaml 編譯器來看一看是如何將他們整合到一起的。

rn002.JPG
-
source code 獲取 ocaml 的程式碼
-
untped AST 進行程式碼進行解析和預處理,後生產一個棵沒有型別的 AST
-
Typed AST 對型別進行推測和檢驗生產有型別 AST
-
Lambda IR 這應該是 Ocaml 重點,但是應該不是我們今天重點,不過可以瞭解一下
將定義型別的 AST 轉為為無型別的 IR ,轉換格式依據 s-express
這句話中出現了兩個難懂的詞 IR 和 s-express
s-express 知乎一下沒有,wiki 中找到了,我們嘗試理解一下。
百度一下,百度翻譯的還不錯。在此基礎解釋一下。
s-expression應該是一種表示資料結構的表達方式例如(*2(+3 4)),就是將剛剛生產樹形結構資料表達成這樣。是巢狀列表(樹形結構)資料的一種表示法,由程式語言lisp發明並推廣,它將它們用於原始碼和資料。
-
Bytecode 最後經過進行推理將 IR 編譯成位元組碼或機器碼
瞭解 ocaml 的整個編譯過程,那麼我們的 reason 和 bs 出現在哪個階段呢?

rn003.JPG
reason 出現在 untyped AST 這個編譯階段,通過一些預處理讓我們原始碼可以解析成 AST 支援一些新語法的特性

rn005.JPG
BuckleScript 將使用無型別的 IR 進行編譯為可以高效執行的 javascript 而不是位元組碼和機器碼
BuckleScript 的神奇之處編譯的 javascript 可能比你這的還好。計算機更喜歡函數語言程式設計。讓我們擁抱機器,學一點稍微難於理解但是高效的函數語言程式設計吧