0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探索Go程序的进化可能性

jf_WZTOguxH 来源:AI前线 作者:AI前线 2022-12-05 14:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有时候,我们会想要把别种语言编写的库嵌入到自己的程序里。这类需求在程序员之间早已有之,但出于种种原因,这始终是个充满了危险、恐惧、折磨的艰难过程。

照常来讲,如果想从 Go 中调用 Rust 函数,那我们就必须借助 cgo 这样的跳板。但这样效果不错,而且至少比亲自编写 cgo 这样的工具方便得多。

然而,问题是当我们用 cgo 将 Rust 函数链接到 Go 程序时,还得复制 Rust 生成的共享对象。我们没法把这个共享对象签入源代码树(不同操作系统、不同 CPU 架构的各自系统分发都必须是唯一的,就像常见的动态链接二进制文件一样)。所以虽然有效,但总体来讲其开发者体验很差。这时候就不能简单 go build,还得记得运行 cargo build --release 并确保生成的.so、.dll 或者.dylib 位于操作系统动态链接程序所能读取的正确路径。总之,一团乱麻。

这是个大问题,也是 Nix 和 NixOS 存在的原因。想象一下,当我们把通用操作系统组件混入其中,情况会有多么复杂。但令人惊讶的是,这样操作又是真实有效的。那么,如果说有一种方法能让我们从 Rust 发布一个二进制文件,它能在 Go 所支持的任何平台上正常起效;而且只需简单的 go build 就行、不必修改任何构建过程呢?一想就知道能这样可太棒了。对用户来说,他们虽然使用相应的包或程序,却根本感受不到有 Rust 参与其中。我的这个 mastosan 包就是这样的解决方案。下面我想跟大家聊聊它的开发过程以及存在的原因。

为什么要开发 mastosan

Mastodon 的实质就是把素材存储为 HTML 格式,再将该 HTML 呈现了 API 使用者。HTML 特别适合浏览器显示,但对 bot 来说意义不大。所以如果目标是 Slack webhook,那就不太合适。

下面来看 API 中的素材:

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

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

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

其内容如下所示:

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

理想情况下,我们当然希望它在 Slack 中也有相同的语义,比如像这样:

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

这条链接在 Slack 中的显示效果跟其他超链接一样。但随着设计复杂度的提升,Mastodon 也会出现某些怪异语义,例如 span 不可见及其他一些烦人的 Slack 显示错误。我们看看以下两条有什么区别:

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

很明显,这两条跟人类正常思维的契合度就不一样。

如何实现

UNIX 理念的核心特征之一,在于将程序视为简单的过滤器。它既能很好地完成一项任务,又允许用户将其组合为新的、更有趣的形式。如果大家曾经把 curl 和 jq 配合起来执行操作,比如从 JSONFeed 中读取数据之类,就能理解这类实践过程:

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

我用 Rust 编写了一个小程序,它使用 lol_html 来获取传入的 Mastodon 风格 HTML,并发布 Slack 风格的 markdown。用法非常简单:

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

就这么简单。它会接收标准输入并在此之上返回结果。这跟 WebAssembly 流并不直接映射,除非用 WASI 填补其中的空缺。WASI 为 WebAssembly 程序提供了类似于 POSIX 的环境,大多数基础功能都可以直接起效,但这里我们只使用到它的两个主要部分:标准输入和标准输出。

在 Go 中,如果将其作为普通的 OS 子进程运行,可以使用以下代码:

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

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

但这仍然要求程序针对本机 OS 和发行版进行编译,而且必须存在于 $PATH 文件夹内。所以有效,但还不够完美。

Rust 允许我们使用以下编译器标记,构建以 WASI 为目标的二进制文件:

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

这会在./target/wasm32-wasi/release/mastosan.wasm 当中生成一个几 MB 大小的二进制文件。只要运行它,就能帮我们达成目标。

现在我们需要在 Go 中用这个二进制文件。可行的办法很多,这里我选择使用 wazero。它的使用流程类似于带 os/exec 的子进程,但也略有不同,因为我们嵌入了 WebAssembly。具体方法如下:

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

意思基本是一样的:设置环境、加载 WASM 模块,然后运行。主要区别在于,这里我没有把二进制文件作为机器码从磁盘上加载,而是使用 go:embed 将预编译的 WebAssembly 模块嵌入到了二进制文件中。也就是说,只要 WebAssembly 模块的位置符合要求,那生成的 Go 程序就能正常工作。

再快一点

这种实现的主要缺点就是速度略慢。每次调用该函数时,它都必须编译 WebAssembly 模块。

Wazero 运行时和编译后的 WebAssembly 模块代码都可以被举升到包级变量当中,具体如此补丁(https://github.com/Xe/x/commit/b61b59318be6544632ac1f64b1237bb17b2e7a32)所示。这样就能大大改善速度问题。用了这个补丁,WebAssembly 模块只会在应用程序启动时编译一次。在使用此补丁前,每次运行中的调用大概需要 0.2 秒,而使用补丁后的基准测试结果为:

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

可以看到,最佳用时从 0.2 秒下降到了 0.3 毫秒,意味着性能至少提升了 1000 倍。这意味着大部分时间可能都花在了 HTML 解析器上,而不是无关紧要的其他部分。

我觉得这不仅能满足我个人的工作需求,也应该会帮助更多朋友解决难题。后续我还会用更多随机 Mastodon 消息做实验,看看它能否满足要求。这种将两个不相容的世界融合起来的感受真棒,也期待它能真正在更多实践场景当中发光发热。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128625
  • Go
    Go
    +关注

    关注

    0

    文章

    45

    浏览量

    12517
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66837

原文标题:一场实验:探索Go程序的进化可能性

文章出处:【微信号:AI前线,微信公众号:AI前线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    快速自动聚焦:索尼FCB-CR8530破解工业动态检测难题

    随着AI视觉技术的发展,索尼FCB-CR8530的应用边界不断拓展。未来,索尼FCB-CR8530有望成为智慧城市、工业巡检与生态监测的核心视觉中枢,通过不断进化的算法与硬件创新,为仪器检测领域带来更多可能性
    的头像 发表于 11-10 16:14 227次阅读
    快速自动聚焦:索尼FCB-CR8530破解工业动态检测难题

    探索无限可能:生成式推荐的演进、前沿与挑战

    TL;DR 过去一年间,生成式推荐取得了长足的实质进展,特别是在凭借大型语言模型强大的序列建模与推理能力提升整体推荐性能方面。基于LLM(Large Language Models, LLMs
    的头像 发表于 10-20 16:42 4391次阅读
    <b class='flag-5'>探索</b>无限<b class='flag-5'>可能</b>:生成式推荐的演进、前沿与挑战

    详解芯片制造中的可测设计

    然而,随着纳米技术的出现,芯片制造过程越来越复杂,晶体管密度增加,导致导线短路或断路的概率增大,芯片失效可能性大大提升。测试费用可达到制造成本的50%以上。
    的头像 发表于 10-16 16:19 2364次阅读
    详解芯片制造中的可测<b class='flag-5'>性</b>设计

    Simcenter FLOEFD扩展设计探索模块:通过设计探索和优化扩展CFD功能

    优势与功能优势:通过设计探索和优化扩展CFD功能确定更高性能的设计系列更快探索更出色的设计使用仿真推动创新显著缩减仿真时间和成本功能:强大的设计探索引擎使用SHERPA算法的稳健优化和搜索功能利用
    的头像 发表于 09-11 11:43 481次阅读
    Simcenter FLOEFD扩展设计<b class='flag-5'>探索</b>模块:通过设计<b class='flag-5'>探索</b>和优化扩展CFD功能

    电动阀门领域的后起之秀:舵机,速度与精度并重

    在阀门的世界里,舵机作为一种较为冷门的技术,正以其独特的优势和无限的可能性,引领着行业的变革。今天,就让我们一起走进这个神奇的领域,探索舵机如何改变阀门行业,以及它所蕴含的无限商机。
    的头像 发表于 06-11 17:14 665次阅读
    电动阀门领域的后起之秀:舵机,速度与精度并重

    如果 PD 合约不匹配,BCR 是否仍会打开 SINK_FET_EN POWER_DRILL2GO路径?

    BCR 具有 SINK_FET_EN 和 SAFE_PWR_EN 引脚来控制POWER_DRILL2GO消耗路径。 如果 PD 合约不匹配,BCR 是否仍会打开 SINK_FET_EN POWER_DRILL2GO路径?或者只打开 SAFE_PWR_EN POWER_DR
    发表于 05-23 08:01

    如何不使用配置实用程序对SX3进行编程?

    我们正在探索不使用配置实用程序对 SX3 进行编程的可能性。 我知道有一个 HID 示例应用程序,但它要求 SX3 已经打开 HID 接口,对吗? (顺便说一句,我无法找到如何在配置实
    发表于 05-06 06:33

    从 Java 到 Go:面向对象的巨人与云原生的轻骑兵

    不同,Go 通过编译为 单一静态二进制文件实现快速启动和低内存开销 , 以25个关键字强制代码简洁 , 用接口组合替代类继承 , 以显式返回error取代异常机制 和 轻量级并发模型
    的头像 发表于 04-25 11:13 506次阅读

    从 “执行工具” 到 “智能伙伴”:工业机器人的 AI 进化之路

    重新定义工业生产的可能性。富唯智能作为该领域的创新者,以自研的AI控制平台与深度学习算法为核心,推动工业机器人从“机械臂”向“智能体”跨越,为企业提供更高效、更灵活的解决方案。
    的头像 发表于 03-31 15:00 604次阅读
    从 “执行工具” 到 “智能伙伴”:工业机器人的 AI <b class='flag-5'>进化</b>之路

    铋金属疯涨:中低温焊锡膏中的铋金属何去何从?及其在战争中的应用探索

    探讨铋金属疯涨背景下,中低温焊锡膏中铋金属的未来走向,并探索铋金属在战争领域的应用可能性。一、铋金属疯涨对中低温焊锡膏的影响中低温焊锡膏因其较低的熔点和良好的润湿
    的头像 发表于 03-07 13:43 1172次阅读
    铋金属疯涨:中低温焊锡膏中的铋金属何去何从?及其在战争中的应用<b class='flag-5'>探索</b>

    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To Go.

    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To Go.
    的头像 发表于 01-22 17:23 882次阅读
    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To <b class='flag-5'>Go</b>.

    天津电装电子的绿色实践与低碳创新

    中国“双碳”目标的提出,为绿色发展指明了方向。电装中国集团(以下简称电装中国)积极响应国家政策,秉承“环境·安心”的长期发展战略,通过技术创新和多元实践,为实现碳中和目标注入动力,同时探索绿色发展的更多可能性
    的头像 发表于 01-17 11:32 1110次阅读

    本田回应与日产合并传闻:正探索多种合作可能

    针对近日有关本田与日产可能合并的市场传闻,本田执行副总裁青山真司今日正式作出回应。他表示,本田目前正在积极评估包括合并、资本合作以及成立控股公司在内的多种可能性,以探索未来合作的新路径。 据内部
    的头像 发表于 12-19 10:41 1030次阅读

    ADS8685采集到的数据与示波器检测到的数据会有0.1V左右的误差,为什么?

    现在在对该芯片进行相关设置后,采集到的数据与示波器检测到的数据会有0.1V左右的误差,是由于该芯片的温漂还是其他一些原因?主要不清楚是不是由于芯片的原因还是说是由于电路的原因,或者也有可能程序的原因?想请教一下哪方面的可能性
    发表于 12-16 07:57

    影目科技发布全球首款同传翻译眼镜INMO GO2

    近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。
    的头像 发表于 12-11 10:00 1947次阅读