成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從源碼一步步學(xué)習,Ryan Dahl的Deno實現(xiàn)原理

goji / 1239人閱讀

摘要:之父在中的設(shè)計錯誤演講中表示不允許將任意本地函數(shù)綁定至當中。所有系統(tǒng)調(diào)用都將通過消息傳遞完成序列化。兩項原生函數(shù)與。這既簡化了設(shè)計流程,又使得系統(tǒng)更易于審計。

Node之父ry:在“Node中的設(shè)計錯誤”演講中表示:

不允許將任意本地函數(shù)綁定至 V8 當中。

所有系統(tǒng)調(diào)用都將通過消息傳遞完成(protobuf 序列化)。

兩項原生函數(shù):send 與 recv。

這既簡化了設(shè)計流程,又使得系統(tǒng)更易于審計。

這幾點很大程度上體現(xiàn)出了node和deno在設(shè)計本質(zhì)上的區(qū)別,同時這幾點體現(xiàn)了deno的安全性(利用 JavaScript 本身即為安全沙箱這一事實)

V8worker2是Go和V8連接的橋梁

允許從GO程序執(zhí)行JavaScript

只允許GO和V8之間的消息傳遞(傳統(tǒng):暴露C++函數(shù)作為函數(shù)在JavaScript。)

維護一個安全的JS沙箱

JS中只允許綁定3個函數(shù):$send() $recv() $print()


從圖中可以清晰的看出,V8worker2是v8和Go之間實現(xiàn)調(diào)用的核心組件

可以看出V8worker2 是通過binding C++ 模塊進行綁定V8,bingding暴露了基礎(chǔ)操作方法:$v8_init() 、$worker_load()、$worker_send_bytes()、$worker_dispose()...提供給GO 進行調(diào)用

//binding.h
const char* worker_version();
void worker_set_flags(int* argc, char** argv);
void v8_init();
worker* worker_new(int table_index);
int worker_load(worker* w, char* name_s, char* source_s);
const char* worker_last_exception(worker* w);
int worker_send_bytes(worker* w, void* data, size_t len);
void worker_dispose(worker* w);
void worker_terminate_execution(worker* w);

通過Golang的GC提供的CGO模塊調(diào)用C語言暴露的方法,就可以實現(xiàn)GO和V8之間的通信了:

創(chuàng)建一個實例:v8worker2.New(ReceiveMessageCallback)

加載執(zhí)行JS: worker.Load(scriptName,codeString)

// worker.go
package v8worker2

import "C"
...

func recvCb(buf unsafe.Pointer, buflen C.int, index workerTableIndex) C.buf {
    ...
}

func New(cb ReceiveMessageCallback) *Worker {
    ...
    initV8Once.Do(func() {
        C.v8_init()
    })
}

func (w *Worker) Load(scriptName string, code string) error {
    ...
    r := C.worker_load(w.worker.cWorker, scriptName_s, code_s)
...
}

func (w *Worker) SendBytes(msg []byte) error {
    ...
    r := C.worker_send_bytes(w.worker.cWorker, msg_p, C.size_t(len(msg)))
}
案例演示

實現(xiàn)Js中的console.log() 方法

Js發(fā)送數(shù)據(jù)給Go

Go發(fā)送數(shù)據(jù)給Js

// hello.go
package main

import (
    "fmt"

    "github.com/ry/v8worker2"
)

func main() {
    worker := v8worker2.New(recv)

    // 實現(xiàn)JS的console.log 方法
    err := worker.Load("hello.js", `
        this["console"] = {
            log(...args) {
                V8Worker2.print(args)
            }
        };
        console.log("Hello World");
    `)

    if err != nil {
        fmt.Println(err)
    }

    // 發(fā)送數(shù)據(jù)給GO
    err = worker.Load("sendData.js", `
        V8Worker2.send(new ArrayBuffer(5))
    `)
    if err != nil {
        fmt.Println(err)
    }

    // 發(fā)送數(shù)據(jù)給JS
    err = worker.Load("recvData.js", `
        V8Worker2.recv(function(msg) {
            const len =msg.byteLength;
            console.log("recv data from go,length: "+len);
        });
    `)
    if err != nil {
        fmt.Println(err)
    }
    err = worker.SendBytes([]byte("abcd"))

}

func recv(buf []byte) []byte {
    fmt.Println("recv data from js,length:", len(buf))
    return nil
}

在控制臺運行: go run hello.go

需要運行測試代碼,可以直接訪問我的github :deno 案例源碼

參考資料

Ryan Dahl 對 v8worker 的演講PPT

justjavac: Deno 并不是下一代 Node.js

v8worker2 github

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107953.html

相關(guān)文章

  • Deno 并不是下代 Node.js

    摘要:長文預(yù)警字,圖。開發(fā)并不是因為,也不是為了取代。不知道從官方介紹來看,可以認為它是下一代是如何腦補出來的。只是一個原型或?qū)嶒炐援a(chǎn)品。所以,不是要取代,也不是下一代,也不是要放棄重建生態(tài)。的目前是要擁抱瀏覽器生態(tài)。 這幾天前端圈最火的事件莫過于 ry(Ryan Dahl) 的新項目 deno 了,很多 IT 新聞和媒體都用了標題:下一代 Node.js。這周末讀了一遍 deno 的源碼,...

    mmy123456 評論0 收藏0
  • 前端每周清單第 29 期:Web 現(xiàn)狀分析與優(yōu)化策略、Vue 單元測試、Headless Chrom

    摘要:前端每周清單第期現(xiàn)狀分析與優(yōu)化策略單元測試爬蟲作者王下邀月熊編輯徐川前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清單第 29 期:Web 現(xiàn)狀分析與優(yōu)化策略...

    HackerShell 評論0 收藏0
  • 快速學(xué)習nodejs系列:二、nodejs誕生

    摘要:簡介的誕生學(xué)習一門技術(shù)之前,有必要了解該技術(shù)是如何誕生的是之父于年發(fā)布的。其在紐約羅切斯特大學(xué)數(shù)學(xué)系讀博,研究一些分型分類的研究。年月,把項目定義為同年月,向外界宣布這個項目年底,在柏林的大會上進行的演講,之后開始流行 nodejs簡介 1.nodejs的誕生 學(xué)習一門技術(shù)之前,有必要了解該技術(shù)是如何誕生的? nodejs是ryan dahl(nodejs 之父)于2009年發(fā)布的。 ...

    tangr206 評論0 收藏0
  • 什么是Node.js

    Node.js從2009年誕生至今,已經(jīng)發(fā)展了兩年有余,其成長的速度有目共睹。從在github的訪問量超過Rails,到去年底Node.jsS創(chuàng)始人Ryan Dalh加盟Joyent獲得企業(yè)資助,再到今年發(fā)布Windows移植版本,Node.js的前景獲得了技術(shù)社區(qū)的肯定。InfoQ一直在關(guān)注Node.js的發(fā)展,在今年的兩次Qcon大會(北京站和杭州站)都有專門的講座。為了更好地促進Node.j...

    CrazyCodes 評論0 收藏0
  • Node.js 是什么?我為什么選擇它?

    摘要:單線程使用單線程來運行,而不是向之類的其它服務(wù)器,每個請求將生產(chǎn)一個線程,這種方法避免了上下文切換和內(nèi)存中的大量執(zhí)行堆棧,這也是和其它服務(wù)器為解決上一個年,著名的并發(fā)連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當我們學(xué)習一項新的事物的時候,我們首先要知道它來...

    Joyven 評論0 收藏0

發(fā)表評論

0條評論

goji

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<