網際網路計算機的專用工具,Motoko語言的介紹

買賣虛擬貨幣
前言Motoko是一種現代程式語言,專門用於開發網際網路計算機平臺上的程式,也能作為在其他平臺程式的通用語言。易用性Motoko是為那些使用過JavaScript或其他現代程式語言(如Rust、Swift、TypeScript、C#或Java),對物件導向或函數語言程式設計習慣有一些基本瞭解的程式設計師所設計的。非同步訊息通訊和型別安全Motoko相容主流的程式設計習慣,包括針對分散式應用程式的特殊程式設計抽象。每個應用程式由一個actor組成,該actor與其他actor通訊時,並不共享狀態,而是使用(非同步)訊息通訊。
Motoko基於actor的程式設計抽象允許了人類可讀的訊息傳遞模式(human-readable message-passing),它強制規定每次網路互動都要遵守某些規則並避免常見錯誤。特別地,由於Motoko包含了一個實用的現代型別系統,該系統可以在每個程式執行之前對其型別進行檢查,因此Motoko程式具有良好型別安全性。Motoko的型別系統會靜態檢查每個Motoko程式在所有可能的輸入下能否安全地執行,並且不會發生內部型別錯誤。這就排除了其他語言中常見的型別陷阱,包括空指標錯誤、引數和結果型別不匹配等等問題。Motoko程式會靜態地編譯為WebAssembly執行,WebAssembly是一種便於多平臺移植的二進位制格式,幾乎能執行在所有現代計算機硬體上,因此可以在網際網路與網際網路計算機上被廣泛地執行。微服務即actorMotoko為開發者提供了一個基於actor的程式設計模型來實現服務操作,包括網際網路計算機上的微服務。
actor類似於物件,其特殊性在於它的獨立狀態是遠端方式(remotely),並且它與外界的互動是非同步的。所有與actor的通訊以及actors之間的通訊,都需要使用網際網路計算機的訊息傳遞協議,在網路中非同步地傳遞訊息。actor的訊息是按順序處理的,因此狀態修改不會導致競態條件。網際網路計算機提供的底層計算平臺確保了每一個基於訊息的同步都能關閉,但這樣做時,分散式系統中常見的超時等原因也可能導致同步失敗。非同步actors和大部分現代程式語言一樣,Motoko允許使用符合人體工程學的語法去實現元件之間的非同步通訊。在Motoko中,每個通訊元件都是一個actor。作接下來舉一個例子,假如現在你本人就是一個actor程式,請看以下三行程式碼:
let result1 = service1.computeAnswer(params);let result2 = service2.computeAnswer(params);finalStep(await result1, await result2)我們可以透過以下三個步驟來描述程式的行為:1.該程式向兩個不同的服務發出兩個請求(第1、2行),這兩個服務都是由actor內部實現的;2.程式使用關鍵字await等待每一個結果都就緒(第3行)。
3.程式透過呼叫finalStep函式使用這兩個結果(第3行)。一般來說,服務會交錯執行而不是互相等待,這樣可以減少總體延遲。然而,如果我們試圖在沒有特殊語言的支援下以這種方式減少延遲,將破壞系統的清晰性和簡潔性。即使在沒有交錯執行的情況下(如果上面只有一個呼叫),出於同樣的原因,程式設計抽象仍然清晰和簡潔。Motoko會向編譯器發出在哪裡需要轉換程式的訊號,程式設計師不必為將程式的執行與底層系統的訊息傳遞迴圈交叉,而去調整程式本身的邏輯。在這裡,程式在第3行中使用 await ,透過使用Motoko提供的人類可讀語法,以一種簡單的方式來表示交叉行為。在缺乏這些抽象的語言設定中,開發人員不僅需要直接呼叫這兩個函式,而且必須使用非常高階的程式設計模式,可能會在系統提供的“事件處理程式”中註冊“回撥函式”。每個回撥都將處理在應答就緒時出現的非同步事件。這種系統級程式設計功能雖然強大,但非常容易出錯,因為它會把高階資料流分解為透過共享狀態進行通訊的低階系統事件。有時這種方式是必要的,但在網際網路計算機裡就不是必須的。
相反,我們的程式避免了這種更底層卻更繁瑣的程式設計風格,即每個請求都類似於一個普通的函式呼叫。雖然就像當今大多數現代軟體所做的,人們越來越多地把這種更簡單、更程式化的程式設計風格用在表達與外部環境互動的實際系統中。但這樣就需要特殊的編譯器和型別系統支援,我們將在下面詳細討論。支援非同步行為在非同步計算設定中,允許程式及其執行環境執行併發的內部計算。具體來說,非同步程式是指那些程式在處理其環境的請求時,不需要等待環境的程式。同時,允許程式在等待時(可能是主動的)在此環境中進行內部處理。在上面的示例中,程式在等待第一個微服務的同時發出了第二個請求。相對的,環境向程式發起請求,環境也不需要在等待返回響應的同時,等待該程式的響應圍繞其進行外部處理。我們上面沒有列出這種“notify”模式的例子,因為它使用了回撥(以及高階函式和控制流),因此顯得更加複雜
async與await的語法形式為了滿足清晰和簡潔的需求,Motoko採用了常見的async和await的程式構造,從而為程式設計師提供了一種結構化語言來描述複雜的非同步依賴關係。這個非同步語法會在將來引入非同步資料的“promise”(在上面的第一個示例中未顯示)。當我們在Actors和非同步資料中引入actor時,您將瞭解到更多有關非同步promise的資訊。在這裡,我們僅使用呼叫service1.computeAnswer(params)、service2.computeAnswer(params)所產生的程式碼。語法await將在預先的promise上進行同步。我們在上面的示例中展示了await表單的兩種用法,它們等待著這兩個服務的結果。當開發人員使用這些關鍵字時,編譯器會根據需要對程式進行轉換,通常會對程式的實現和資料流進行復雜的轉換,而這些轉換將很繁瑣。同時,Motoko的型別系統為這些構造寫死了一些正確的使用模式,包括在訊息的“消費者”和“生產者”之間流動的型別始終保持一致,並且允許服務之間傳送的資料型別也將符合這些規則,並且不包含私有的可變狀態。
穩定的型別與其他現代程式語言一樣,Motoko允許每個變數攜帶函式、物件或原始資料(例如字串、整數)。也存在其他型別的值,包括records、tuples和稱為variants的“標記資料”。Motoko擁有型別安全的形式屬性,也稱為型別穩定性。型別友好型的Motoko程式不會出錯,這意味著它們不會因為把程式結構當作錯誤的型別來對待,而錯誤的使用它們。例如,Motoko程式中每個變數都帶有一個關聯型別,在程式執行之前,該型別是靜態且明確的。編譯器會檢查每個變數的每次使用,以防止執行時出現型別錯誤,包括空指標錯誤。從這個意義上講,Motoko的型別在程式原始碼中提供了一份經過編譯器驗證的可信任文件。通常,動態測試可以實現Motoko型別系統無法達到的檢查能力。Motoko雖然包含了較前衛的程式設計思想,但我們並不想讓這個型別系統變得晦澀且難以理解。相反,Motoko的型別系統吸取了現代程式設計思想、易用性思想以及已有的型別系統的經驗教訓,從而為通用分散式程式設計提供了一種更易用、數學上更精確的語言。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;