Deno源碼簡析(一)架構

開始

感受又好久好久沒寫東西了,內心有點忐忑不安:一直埋頭工做而不去學習新知識但是程序員的大忌,恰好Deno又正式發佈1.0,因此忙裏偷閒也要學習一下,那麼今天就是帶來一波簡單的Deno源碼分析。前端

Deno vs Node.js

有人說Deno就是Destroy Node的縮寫就是爲了替代Node.js而生,也有人說Deno目前不成熟並不能替代如今的Node.js等等;自從Ryan指出Node.js的十大問題而且公開了新的項目Deno,在某乎上立馬就展開各類(友好)討論。不過不管怎麼樣,有競爭纔有進步,Deno已經做爲一個挑戰者走進咱們的視野,咱們只需客觀正視它的優缺點就行了。
不過我的的一些見解,Deno的出現基本意味着這是一場死鬥,由於彼此基本特性實在太類似了:v8引擎,單線程異步,背靠着js的生態圈...,基本意味着開發者選擇二者其一就永遠不須要考慮其二,長遠來看用戶羣可能會分裂吧;而Deno目前在這個基礎上主打的是穩定性和安全性,這是服務端開發所必須的,只有知足這兩個要求基礎上才能去追求更高的性能,因此如今Deno的性能從官方的測試來看跟Node.js比仍是有一段距離,可是我的並不太擔憂這一塊性能差距,早晚也是會慢慢遇上來的,畢竟才1.0嘛。node

前置知識

準備深刻Deno部分知識仍是要提早準備一下的:c++

  • Typescript(對於前端開發大多沒啥壓力)
  • Rust(主打安全和高性能的語言,學習曲線奇高,長期被編譯器教作人)
  • V8引擎(Isolate,Context,Handle等等概念常記內心)

不得不說,其實rust就是Deno和Node.js分界點,感受Deno的一個潛在目標就是把Deno的生態與rust的生態捆綁在一塊兒,這樣Deno一開始的生態比較弱的問題也能夠獲得一些緩解吧,另外對於前端來講早晚也是須要學習一門靜態語言的,rust也是一個不錯的選擇(rust但是StackOverflow最受歡迎的語言)。程序員

Deno的架構

直接貼上官網的架構圖:
schematic_v0.2.png
這裏官方的架構圖還沒來得及更新,libdeno已經替換成rusty_v8,這樣意味着咱們開發native插件的時候能夠徹底繞過了c/c++,直接使用rust就能夠完成功能開發(加上rust自己自帶一個可靠強大的標準庫更加駕輕就熟),固然開發者仍是須要了解V8引擎相關的知識了。
再回到架構圖上,咱們知道Node.js是由libuv提供調度和io的能力,那麼在Deno上這個角色就由rust的Tokio庫提供類似的能力,而一開始Deno仍是想使用go語言來提供這樣的能力(Ryan果真是go語言的真粉),可是畢竟go語言也是帶gc的(一個應用上同時跑兩個gc,穩定性實在很難想象)並且性能上也是差rust一截,後面替換成rust也是至關明智的,另外Tokio其實對比libuv也是絕不遜色的(任務調度算法也是參考了go語言的實現)
另外在Deno裏面js與rust的交互都會經過Deno.core.send和Deno.core.recv這兩個方法,這樣作對於應用作審計和權限控制是很是有好處,後面再會分析js和rust是如何交互的。最後例如js異步讀取文件這些操做都會扔到Tokio線程池中執行,這也是Deno實現非阻塞的關鍵點。
而後Deno爲了安全的緣由,對資源都作了一層映射,本來系統的文件描述符或者其餘資源都映射成了一個rid(非零整數),對資源的操做都須要經過rid進行。算法

|                       **Linux** | **Deno**                         |
| ------------------------------: | :------------------------------- |
|                       Processes | Web Workers                      |
|                        Syscalls | Ops                              |
|           File descriptors (fd) | [Resource ids (rid)](#resources) |
|                       Scheduler | Tokio                            |
| Userland: libc++ / glib / boost | https://deno.land/std/           |
|                 /proc/\$\$/stat | [Deno.metrics()](#metrics)       |
|                       man pages | deno types                       |

好吧,把全部的概念聚集在一塊兒,跟Linux一對比,就會發現Deno真的頗有意思了,難道是想要變成一個輕量級js應用平臺嗎?官方文檔透露的信息實在太少了,感受一些設計意圖也沒有表達出來,但願文檔可以再詳細一點就行了。typescript

項目結構

.
├── cli //負責實現各類接口,包括兼容瀏覽器的和Deno.xxx
├── core //負責實例化和執行模塊代碼,處理js與rust之間交互還有實現event-loop
├── deno_typescript //負責編譯打包typescript文件和生成v8的snapshot
├── docs //文檔
├── std //std標準庫
├── target
├── test_plugin
├── third_party
└── tools

本身再整理裏面各個模塊的依賴關係,大體以下:
截屏2020-06-06 下午9.47.23.png瀏覽器

固然發現更有趣的是std目錄下還有有一個node的模塊:安全

.
├── README.md
├── _fs
├── _utils.ts
├── events.ts
├── events_test.ts
├── fs.ts
├── global.ts
├── module.ts
├── module_test.ts
├── os.ts
├── os_test.ts
├── path.ts
├── process.ts
├── process_test.ts
├── querystring.ts
├── querystring_test.ts
├── tests
├── timers.ts
├── util.ts
└── util_test.ts

是否是看到這些文件名稱就有一種至關熟悉的感受,嗯,這就是deno爲了兼容node模塊所作的一個兼容層,雖然尚未完成,不過至少也知道deno也是有這個意願去兼容node的模塊,或許在下一個版本咱們就能看到deno可以直接使用node的模塊去開發應用了。架構

結束

暫時先介紹到這裏,好像一點也沒有深刻到代碼,真的是標題黨,哈哈,下一篇文章再來深刻代碼分析。異步

相關文章
相關標籤/搜索