理解deno-基礎篇

deno介紹

deno是一個基於v八、rust和Tokio的Javascript/Typescript的安全運行時。它在內部嵌入了一個typescript的編譯器。能夠將typescript編譯成js而後運行在v8上,並經過c++ libdeno實現js與rust的通訊交互,固然deno也能夠直接運行Javascript代碼。javascript

deno安裝

linux/mac
curl -fsSL https://deno.land/x/install/install.sh | sh
windows
iwr https://deno.land/x/install/install.ps1 | iex

詳細的細節請參考官網安裝介紹html

deno的簡單例子

計算斐波那契數列公式

clipboard.png

摘抄自維基百科斐波那契數列java

run javascript

test.js
function fibo(n) {
    if (n  === 0) return 0;
    let fn = 0, nextFn = 1;
    let tmp_fn = 0, tmp_nextFn = 0;
    for (var i = 0; i < n; i++) {
        tmp_fn = nextFn;
        tmp_nextFn = nextFn  + fn; 
        fn = tmp_fn;
        nextFn = tmp_nextFn;
    }
    return tmp_fn;
}

console.log(fibo(13));
deno ./test.js

run typescript

test.ts
function fibo(n: number) {
    if (n  === 0) return 0;
    let fn: number = 0, nextFn: number = 1;
    let tmp_fn: number = 0, tmp_nextFn: number = 1;
    for (let i: number = 0; i < n; i++) {
        tmp_fn = nextFn;
        tmp_nextFn = nextFn  + fn; 
        fn = tmp_fn;
        nextFn = tmp_nextFn;
    }
    return tmp_fn;
}

console.log(fibo(13));
deno ./test.ts

引入外部包

import * as log from "https://deno.land/x/std/log/mod.ts";

執行異步方法

(async () => {
  for (let i = 1; i < Deno.args.length; i++) {
    let filename = Deno.args[i];
    let file = await Deno.open(filename);
    await Deno.copy(Deno.stdout, file);
    file.close();
  }
})();

deno內部結構

下圖1是deno的部分文件截圖linux

clipboard.png
圖1 deno文件的部分截圖

上圖中圈出來的三個文件夾分別是c++

  • js
  • libdeno
  • src

分別對應deno的api層、中間層、和實現層,其中js中主要是typescript的代碼,包含typescript的編譯器和deno暴露給用戶的api。libdeno中主要是c++代碼,用來加載v8實例,實現typescript和rust的通訊。src文件中主要是rust的代碼,是deno功能的具體實現。例如用戶使用File實例的write方法來寫文件,其實是api層(typescript)經過中間層(libdeno)將數據傳輸給實現層(rust),最終寫文件操做由rust去完成。deno結合了Typescript/Javascript的易用性和rust的系統語言能力。下圖2能夠清晰的表示js和rust之間的邏輯關係。git

clipboard.png
圖來自於 官網,圖2 deno的架構圖

預告

~~~接下來還會有兩篇文章分析deno的內部原理~~~github

相關文章
相關標籤/搜索