0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探索Go程序的進化可能性

jf_WZTOguxH ? 來源:AI前線 ? 作者:AI前線 ? 2022-12-05 14:02 ? 次閱讀

有時候,我們會想要把別種語言編寫的庫嵌入到自己的程序里。這類需求在程序員之間早已有之,但出于種種原因,這始終是個充滿了危險、恐懼、折磨的艱難過程。

照常來講,如果想從 Go 中調(diào)用 Rust 函數(shù),那我們就必須借助 cgo 這樣的跳板。但這樣效果不錯,而且至少比親自編寫 cgo 這樣的工具方便得多。

然而,問題是當(dāng)我們用 cgo 將 Rust 函數(shù)鏈接到 Go 程序時,還得復(fù)制 Rust 生成的共享對象。我們沒法把這個共享對象簽入源代碼樹(不同操作系統(tǒng)、不同 CPU 架構(gòu)的各自系統(tǒng)分發(fā)都必須是唯一的,就像常見的動態(tài)鏈接二進制文件一樣)。所以雖然有效,但總體來講其開發(fā)者體驗很差。這時候就不能簡單 go build,還得記得運行 cargo build --release 并確保生成的.so、.dll 或者.dylib 位于操作系統(tǒng)動態(tài)鏈接程序所能讀取的正確路徑??傊粓F亂麻。

這是個大問題,也是 Nix 和 NixOS 存在的原因。想象一下,當(dāng)我們把通用操作系統(tǒng)組件混入其中,情況會有多么復(fù)雜。但令人驚訝的是,這樣操作又是真實有效的。那么,如果說有一種方法能讓我們從 Rust 發(fā)布一個二進制文件,它能在 Go 所支持的任何平臺上正常起效;而且只需簡單的 go build 就行、不必修改任何構(gòu)建過程呢?一想就知道能這樣可太棒了。對用戶來說,他們雖然使用相應(yīng)的包或程序,卻根本感受不到有 Rust 參與其中。我的這個 mastosan 包就是這樣的解決方案。下面我想跟大家聊聊它的開發(fā)過程以及存在的原因。

為什么要開發(fā) mastosan

Mastodon 的實質(zhì)就是把素材存儲為 HTML 格式,再將該 HTML 呈現(xiàn)了 API 使用者。HTML 特別適合瀏覽器顯示,但對 bot 來說意義不大。所以如果目標(biāo)是 Slack webhook,那就不太合適。

下面來看 API 中的素材:

e4de4282-745f-11ed-8abf-dac502259ad0.png

e4f5a13e-745f-11ed-8abf-dac502259ad0.png

e52a35ac-745f-11ed-8abf-dac502259ad0.png

其內(nèi)容如下所示:

e5504026-745f-11ed-8abf-dac502259ad0.png

理想情況下,我們當(dāng)然希望它在 Slack 中也有相同的語義,比如像這樣:

e5854e92-745f-11ed-8abf-dac502259ad0.png

這條鏈接在 Slack 中的顯示效果跟其他超鏈接一樣。但隨著設(shè)計復(fù)雜度的提升,Mastodon 也會出現(xiàn)某些怪異語義,例如 span 不可見及其他一些煩人的 Slack 顯示錯誤。我們看看以下兩條有什么區(qū)別:

e5a82804-745f-11ed-8abf-dac502259ad0.png

很明顯,這兩條跟人類正常思維的契合度就不一樣。

如何實現(xiàn)

UNIX 理念的核心特征之一,在于將程序視為簡單的過濾器。它既能很好地完成一項任務(wù),又允許用戶將其組合為新的、更有趣的形式。如果大家曾經(jīng)把 curl 和 jq 配合起來執(zhí)行操作,比如從 JSONFeed 中讀取數(shù)據(jù)之類,就能理解這類實踐過程:

e5cdddce-745f-11ed-8abf-dac502259ad0.png

我用 Rust 編寫了一個小程序,它使用 lol_html 來獲取傳入的 Mastodon 風(fēng)格 HTML,并發(fā)布 Slack 風(fēng)格的 markdown。用法非常簡單:

e5ecfe20-745f-11ed-8abf-dac502259ad0.png

就這么簡單。它會接收標(biāo)準(zhǔn)輸入并在此之上返回結(jié)果。這跟 WebAssembly 流并不直接映射,除非用 WASI 填補其中的空缺。WASI 為 WebAssembly 程序提供了類似于 POSIX 的環(huán)境,大多數(shù)基礎(chǔ)功能都可以直接起效,但這里我們只使用到它的兩個主要部分:標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。

在 Go 中,如果將其作為普通的 OS 子進程運行,可以使用以下代碼:

e6318a90-745f-11ed-8abf-dac502259ad0.png

e653d96a-745f-11ed-8abf-dac502259ad0.png

但這仍然要求程序針對本機 OS 和發(fā)行版進行編譯,而且必須存在于 $PATH 文件夾內(nèi)。所以有效,但還不夠完美。

Rust 允許我們使用以下編譯器標(biāo)記,構(gòu)建以 WASI 為目標(biāo)的二進制文件:

e6643210-745f-11ed-8abf-dac502259ad0.png

這會在./target/wasm32-wasi/release/mastosan.wasm 當(dāng)中生成一個幾 MB 大小的二進制文件。只要運行它,就能幫我們達成目標(biāo)。

現(xiàn)在我們需要在 Go 中用這個二進制文件??尚械霓k法很多,這里我選擇使用 wazero。它的使用流程類似于帶 os/exec 的子進程,但也略有不同,因為我們嵌入了 WebAssembly。具體方法如下:

e681935a-745f-11ed-8abf-dac502259ad0.png

意思基本是一樣的:設(shè)置環(huán)境、加載 WASM 模塊,然后運行。主要區(qū)別在于,這里我沒有把二進制文件作為機器碼從磁盤上加載,而是使用 go:embed 將預(yù)編譯的 WebAssembly 模塊嵌入到了二進制文件中。也就是說,只要 WebAssembly 模塊的位置符合要求,那生成的 Go 程序就能正常工作。

再快一點

這種實現(xiàn)的主要缺點就是速度略慢。每次調(diào)用該函數(shù)時,它都必須編譯 WebAssembly 模塊。

Wazero 運行時和編譯后的 WebAssembly 模塊代碼都可以被舉升到包級變量當(dāng)中,具體如此補?。╤ttps://github.com/Xe/x/commit/b61b59318be6544632ac1f64b1237bb17b2e7a32)所示。這樣就能大大改善速度問題。用了這個補丁,WebAssembly 模塊只會在應(yīng)用程序啟動時編譯一次。在使用此補丁前,每次運行中的調(diào)用大概需要 0.2 秒,而使用補丁后的基準(zhǔn)測試結(jié)果為:

e6a89de2-745f-11ed-8abf-dac502259ad0.png

可以看到,最佳用時從 0.2 秒下降到了 0.3 毫秒,意味著性能至少提升了 1000 倍。這意味著大部分時間可能都花在了 HTML 解析器上,而不是無關(guān)緊要的其他部分。

我覺得這不僅能滿足我個人的工作需求,也應(yīng)該會幫助更多朋友解決難題。后續(xù)我還會用更多隨機 Mastodon 消息做實驗,看看它能否滿足要求。這種將兩個不相容的世界融合起來的感受真棒,也期待它能真正在更多實踐場景當(dāng)中發(fā)光發(fā)熱。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6617

    瀏覽量

    123037
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    12233
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4262

    瀏覽量

    62234

原文標(biāo)題:一場實驗:探索Go程序的進化可能性

文章出處:【微信號:AI前線,微信公眾號:AI前線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    探索住宅動態(tài)IP:連接世界的無限可能

    住宅動態(tài)IP,作為現(xiàn)代家庭網(wǎng)絡(luò)的重要組成部分,其不斷變化的特性為用戶帶來了諸多便利和可能性。
    的頭像 發(fā)表于 10-21 07:50 ?45次閱讀

    AI如何對產(chǎn)品設(shè)計帶來更多的可能性

    AI(人工智能)對產(chǎn)品設(shè)計帶來了廣泛而深遠(yuǎn)的可能性,這些可能性主要體現(xiàn)在以下幾個方面 1.創(chuàng)新設(shè)計的激發(fā) 創(chuàng)意生成:AI能夠?qū)W習(xí)和模仿人類設(shè)計師的創(chuàng)作過程,通過深度學(xué)習(xí)等技術(shù)生成全新的、獨特
    的頭像 發(fā)表于 10-15 11:29 ?133次閱讀

    ADS131A02從AIN1P采到的ADC值不準(zhǔn),請問有哪些可能性會造成這樣的影響?

    客戶使用TI的ADC芯片ADS131A02,發(fā)現(xiàn)從AIN1P采到的ADC值不準(zhǔn),于是將AIN1P和VREF_2V5相連,發(fā)現(xiàn)也沒法讀出滿量程的AD值,換算出來只有2.45V左右。請問有哪些可能性會造成這樣的影響? 謝謝!
    發(fā)表于 10-14 07:04

    高通探索收購英特爾芯片設(shè)計業(yè)務(wù)的可能性

    在科技行業(yè)并購傳聞頻發(fā)的背景下,高通公司被曝已探索收購英特爾部分業(yè)務(wù)的可能性,特別是其客戶端PC芯片設(shè)計業(yè)務(wù),旨在進一步豐富和增強其產(chǎn)品組合。據(jù)多位知情人士透露,高通對英特爾的這部分資產(chǎn)表現(xiàn)出濃厚興趣,而英特爾則正積極尋求現(xiàn)金流,考慮剝離非核心業(yè)務(wù)及出售資產(chǎn)以優(yōu)化財務(wù)結(jié)構(gòu)
    的頭像 發(fā)表于 09-09 17:21 ?507次閱讀

    新思科技探索AI+EDA的更多可能性

    芯片設(shè)計復(fù)雜的快速指數(shù)級增長給開發(fā)者帶來了巨大的挑戰(zhàn),整個行業(yè)不僅要向埃米級發(fā)展、Muiti-Die系統(tǒng)和工藝節(jié)點遷移所帶來的挑戰(zhàn),還需要應(yīng)對愈加緊迫的上市時間目標(biāo)、不斷增加的制造測試成本以及人才短缺等問題。早在AI大熱之前,芯片設(shè)計行業(yè)就把目光放到了AI,探索AI+E
    的頭像 發(fā)表于 08-29 11:19 ?414次閱讀

    三星電子積極探討在越南設(shè)立半導(dǎo)體組裝工廠的可能性

    據(jù)韓國政府方面的最新消息透露,三星電子的越南分公司正積極探討在越南設(shè)立半導(dǎo)體組裝工廠的可能性,盡管具體的選址尚未塵埃落定,但有線索指向富士康投資活躍的北江地區(qū)附近,這一區(qū)域因其得天獨厚的地理位置而備受矚目。
    的頭像 發(fā)表于 08-23 15:19 ?487次閱讀

    蘋果積極探索為Apple Watch SE引入塑料表殼的可能性

    8月7日,國際媒體傳來新消息,據(jù)知情人士透露,蘋果公司正積極探索為即將推出的Apple Watch SE系列引入塑料表殼的可能性,此舉旨在通過材料創(chuàng)新進一步壓縮成本,增強市場競爭力。這一變化不僅預(yù)示著成本效益的顯著提升,還可能
    的頭像 發(fā)表于 08-07 17:03 ?541次閱讀

    使用Docker部署Go Web應(yīng)用程序步驟

    大多數(shù)情況下Go應(yīng)用程序被編譯成單個二進制文件,web應(yīng)用程序則會包括模版和配置文件。而當(dāng)一個項目中有很多文件的時候,由于很多文件沒有同步就會導(dǎo)致錯誤的發(fā)生并且產(chǎn)生很多的問題。
    發(fā)表于 04-20 09:33 ?434次閱讀
    使用Docker部署<b class='flag-5'>Go</b> Web應(yīng)用<b class='flag-5'>程序</b>步驟

    瑞薩的40納米MCU技術(shù)正在重新定義嵌入式系統(tǒng)的可能性

    從延長便攜式設(shè)備電池壽命,到提高處理效率和響應(yīng)能力,瑞薩的40納米MCU技術(shù)正在重新定義嵌入式系統(tǒng)的可能性。
    的頭像 發(fā)表于 03-11 15:11 ?410次閱讀

    基礎(chǔ)模型能為機器人帶來怎樣的可能性?

    機器人是一種擁有無盡可能性的技術(shù),尤其是當(dāng)搭配了智能技術(shù)時。近段時間創(chuàng)造了許多變革應(yīng)用的大模型有望成為機器人的智慧大腦,幫助機器人感知和理解這個世界并制定決策和進行規(guī)劃。
    發(fā)表于 01-26 14:47 ?188次閱讀
    基礎(chǔ)模型能為機器人帶來怎樣的<b class='flag-5'>可能性</b>?

    記憶黑板與智能手機或平板電腦同步的可能性與實現(xiàn)

    記憶黑板與智能手機或平板電腦同步的可能性與實現(xiàn) 隨著科技的不斷發(fā)展,人們對于信息傳遞和共享的方式也在不斷追求便捷和高效。記憶黑板作為一種傳統(tǒng)的信息展示和傳遞工具,在許多場合仍然發(fā)揮著重要作用。然而
    的頭像 發(fā)表于 12-27 15:30 ?483次閱讀

    改變我們生活的鋰離子電池 | 第四講:什么是全固態(tài)電池?實用化的可能性有多大?

    改變我們生活的鋰離子電池 | 第四講:什么是全固態(tài)電池?實用化的可能性有多大?
    的頭像 發(fā)表于 12-05 16:59 ?887次閱讀
    改變我們生活的鋰離子電池 | 第四講:什么是全固態(tài)電池?實用化的<b class='flag-5'>可能性</b>有多大?

    在恩智浦,解鎖職業(yè)發(fā)展的更多可能性,原來還可以這么操作……

    本期話題 完成自我職業(yè)發(fā)展轉(zhuǎn)型, 解鎖人生更多的可能性 “跳槽”是唯一選擇嗎? No!No!No! 內(nèi)部轉(zhuǎn)崗 Internal Transfer 了解一下 恩智浦鼓勵員工在公司內(nèi)部探索更多職業(yè)發(fā)展
    的頭像 發(fā)表于 11-17 08:10 ?354次閱讀
    在恩智浦,解鎖職業(yè)發(fā)展的更多<b class='flag-5'>可能性</b>,原來還可以這么操作……

    如何讓Python和Go互相調(diào)度

    減到1,在我的設(shè)備上測試,用Go運行只需要50ms,Python可能需要接近100倍的時間。 但是,這種寫法也有缺點:實在太麻煩了,大大增加了整個項目的耦合。 那Python中有沒有辦法不通過打包
    的頭像 發(fā)表于 11-02 11:24 ?516次閱讀
    如何讓Python和<b class='flag-5'>Go</b>互相調(diào)度

    51單片機能做指紋鎖,被heck的可能性大嗎?

    51單片機能做指紋鎖,被heck的可能性大嗎?求大神解答
    發(fā)表于 10-28 06:06