2023年WebAssembly 现状

news2024/12/24 9:59:03

WebAssembly 2023的调查已经结束,结果揭晓……真的很吸引人!

如果你想要简短的总结,这里有一些亮点:

  • RustJavaScript 的使用仍在继续增加,但更值得注意的变化发生在下面—— SwiftZig 的采纳率都有了显著的增长。

  • 与此同时,当涉及开发者“渴望”使用哪种语言时,ZigKotlinC#的受欢迎程度超过了当前的使用情况。

  • WebAssembly 仍然主要用于web应用程序开发,但无服务器技术的使用仍在增长,而作为插件环境的 WebAssembly 的使用也在增加。

  • 线程、垃圾回收和相对新的组件模型提议是人们最感兴趣的 WebAssembly 发展方向。

  • 至于 WASI,最受关注的是I/O提议(例如HTTP、文件系统)。

  • 我们可能看到社区中有些人变得不太耐烦,因为人们对WASI的发展满意度明显低于对WebAssembly`的发展的满意度。

  • 许多受访者表示,他们期望 WebAssembly 能够实现 Java 最初提出的“一次编写,到处运行”的承诺。

语言

第一个问题探讨了人们正在使用的语言,即在开发使用 WebAssembly 的应用程序时,你使用或尝试过使用哪些语言?

7377ed8dbaa532993f6c2212c6d6d16c.png

Rust 连续第三年成为 WebAssembly 使用最频繁的语言。Rust 一直以来都非常适合 WebAssembly;它是一种现代系统级语言,拥有广泛的流行度(Stack Overflow 连续七年显示它是最受欢迎的语言),同时也是编写 WebAssembly 运行时和平台的流行语言。

JavaScript是使用最广泛的第二种语言,值得注意的是,因为不能将 JavaScript 编译为WebAssembly。

要运行 JavaScript 代码,需要将运行时编译为 WebAssembly,并在 WebAssembly 托管的解释器中运行代码。这种方法听起来似乎效率不高,但却出人意料地实用,而且越来越受欢迎。

你可能不会获得速度优势,但确实可以从 WebAssembly 的安全性和隔离性中受益。想要进一步了解的话,作者推荐阅读 Shopify 团队的这篇深入文章,其中描述了他们如何支持用JavaScript编写的'Shopify函数',这些函数在WebAssembly平台上运行。

以下图表显示了长期趋势,比较了过去三次调查的结果,显示了每种语言的使用者比例(频繁或有时)——排除了<10%使用率的语言。

a90e9d10e6fad93da37c28d9580da51d.png

RustJavaScript 的使用正在增加,但其他更值得注意的变化正在下面发生。SwiftZig 的采纳率都有了显著的增长。

Swift 是 WebAssembly 生态系统中一个相对较新的成员,它始于几年前苹果公司的 Swift repo 上的一个拉取请求,目的是添加一个 wasm 目标。然而,尽管多年来提交了无数次,该请求却一直未被合并。看起来社区并不气馁,他们正在维护自己的分支。

SwiftRust 都是相当新的语言(分别为 2014 年和 2015 年),而 Zig 则更年轻,它出现于 2016 年,因此比 WebAssembly(其首个 MVP 版本发布于 2017 年)还要早一年。

今年,作者在调查中添加了一个新问题,你与 WebAssembly 的专业关系如何?目的是将积极开发 WebAssembly 工具或平台的人员与单纯的最终用户区分开来。将这两类人分开后,我们发现他们对语言的偏好如下:

5f7d6d3bfaf7dccd7c81eee3b47a5c5a.png

如预期,工具开发者对Rust有很强的偏好,还喜欢直接使用WAT(WebAssembly文本格式)编程WebAssembly。还有对 GoPython 的强烈偏好——这是作者没想到的。

调查中的下一个问题探讨了每种语言有多么受欢迎,问了这样一个问题:在将来开发利用WebAssembly 的应用程序时,你希望使用哪种语言?

8e0e109fa61d01bcd454e5faa0f68afb.png

Rust 再次名列榜首,反映了 Stack Overflow 的年度调查结果,JavasScript 位居第二。不过,使用频率较低的 Zig 语言则成为第三大最受欢迎的语言。

将每种语言 "经常使用 "的响应数与 "希望经常使用 "的响应数之间的Δ值绘制成理想度曲线,我们可以看到哪些语言的理想度与使用率之间的差异最大:

09b9c2f5731856e62f1b0fee1f74f386.png

在 Zig、Kotlin 和 C# 的一端,我们可以看到可取性超过了当前的使用率,而在另一端,人们更希望少用 C++、JavaScript 和 WAT。

运行时

考虑到基于非浏览器的 WebAssembly 使用量在不断攀升,探索人们正在使用或只是知道哪些运行时是很有趣的,调查中只问了一个问题:你听说过或使用过哪些运行时?

ce014505fdcae56357fb6471dd330c0c.png

Bytecode Alliance 的 wasmtime 是使用最广泛的运行时,排名第二的是由一家初创公司开发的 wasmer。Wazero 是该列表中的新成员,它是最近发布的一款 Go 语言运行时。

WebAssembly 的实际应用

调查问了你目前使用 WebAssembly 来做什么?允许开发者选择多个选项并添加自己的建议。以下是所有的回应,其中“其他”包括只有一个回应的所有内容:

62624dd05700158f9282b5955160e71d.png

Web应用程序开发仍居首位,但差距有所缩小。下图显示了逐年变化趋势:

9d81d91e2baeba2617a598e83ea7714d.png

注意:在 2021年/2022 年的调查中,Serverlesswasm后端使用的唯一选项。到2023年,这被拆分成两个不同的类别,因此上述图表中 Serverless 的虚线。将2023年的两个选项组合在一起,后端使用会有轻微的增加。

最值得注意的转变是将 WebAssembly 用作插件环境。以下是一些真实的例子:

  • Zellij 是一个以开发人员为中心的终端工作区,它有一个 WebAssembly 插件模型

  • Microsoft Flight Simulator允许你以 wasm 模块的形式编写插件。

  • Envoy和Istio都有一个 Wasm 插件API

  • 用 Rust 编写的新集成开发环境 Lapce 拥有基于 WASI 的插件系统

在每种情况下,平台(终端、编辑器、飞行模拟器、代理)都能受益于允许终端用户在安全和隔离的环境中使用各种编程语言扩展功能。换句话说,如果有人编写的插件行为不端或性能不佳,对平台本身的影响将降到最低。

报告中还询问了受访者——你组织的WebAssembly采纳的状态是什么?

c37f0a5a1be6ebe493e0f52ccae3f89f.png

从上图我们可以看出,41% 的受访者正在生产中使用 WebAssembly,另有 28% 的受访者正在试用或计划在明年使用 WebAssembly。

调查还探讨了WebAssembly需要哪些帮助来推动进一步的应用:

64ec464683a533cea968884e34e8d7c0.png

最常被提及的 "需求 "是通过 WASI(WebAssembly 系统接口)实现更好的非浏览器集成。WebAssembly 规范没有定义任何主机集成点,无论是访问 DOM,还是与主机运行时交换数据(例如在浏览器中将值传递给 JavaScript)。WASI 正在填补这一空白,但目前还没有完整的答案。

其次是更好的调试支持,随着人们使用 WebAssembly 开发出更复杂的解决方案,这一点将变得更加重要。如需了解更多选项,请查看 Shopify 团队的这篇博文。

功能

WebAssembly(由万维网联盟管理)和 WASI(由万维网联盟 WebAssembly 社区小组的一个子组织管理)都在不断发展,并按照标准的 5 阶段提案流程积压了大量新功能。

关于 WebAssembly 建议,下面列出了最受欢迎的建议:

4fb46fe52f58db1afaa50c3dce64ec5a.png

线程、垃圾回收和异常处理在去年的评选结果中都名列前茅,这三者在提案生命周期中都处于实施(第 3 阶段)或标准化(第 4 阶段)阶段。这意味着它们已经可以使用,并接近最终确定。

组件模型是一项更早期的提案(第 1 阶段),其广泛的目标是使在运行时以任何语言编写的 wasm 模块的组成更加容易。如果您对细节感兴趣,我推荐您观看由该提案的牵头人 Luke Wagner 播放的视频。

关于 WASI 提案,以下内容显示了哪些提案最受欢迎:

210c0a81e12293e57c85f8f32791b799.png

最重要的四项建议都与 I/O 有关,简单地说,为 WebAssembly 模块创建一种与外界通信的标准方式是当务之急。

最后,执行询问人们对 WebAssembly 和 WASI 的发展有多满意:

ac9b0ea57243c4873ef43ded5334584d.png

有很多人对此并不满意!这一点也不奇怪,因为以公开透明的方式制定有众多利益相关者参与的规范并不容易,而且需要时间。更值得注意的是,人们普遍对 WASI 的发展不太满意。

作者想在这里提一个重要的观点;这个结果不应该直接作为对WASI和WebAssembly团队所做的出色努力的批评。对WASI发展的不满可能只是反映了人们对技术的渴望,这不是一件坏事。

今年早些时候,Wasmer宣布了WASIX,这是他们加速WASI(或它代表的概念)的尝试,得到了混合的反应。

欢迎长按图片加刷碗智为好友,定时分享 Vue React Ts 等。

61178902bd75f697dce81ce936c0b5bf.png

最后:

vue2与vue3技巧合集

VueUse源码解读

c7d3958e6788ab264cd37f5ff0d3cd7f.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BigDecimal 类型的累加操作

BigDecimal 累加操作 .add操作

如何在Linux上搭建本地Docker Registry并实现远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则

目录 数据结构(红黑树)红黑规则红黑树添加结点规则 set集合小结HashSet HashSet三个问题LinkedHashSet小结 TreeSetTreeSet集合默认规则排序规则(第一种排序方法)方式二练习 小练 总结总结 集合的使用应该怎么选择 数据结构(红黑树) 红黑规则 后代节点就是比如13根结点 13下面的…

JavaSE基础语法

文章目录 概述发展历程版本环境安装main方法注释标识符关键字数据类型与变量四类八种基本类型常量变量概念定义 类型转换自动类型转换强制类型转换类型提升 字符串类型 运算符算数运算符增量运算符自增自减运算符关系运算符逻辑运算符逻辑与 &&逻辑或 ||逻辑非 !短路求…

can only concatenate list (not “range“) to list

在Python中&#xff0c;你不能直接将range对象与列表进行连接。range对象是数字序列&#xff0c;而列表是元素的序列。这两种类型的数据无法直接连接。 如果你想将一个range对象转化为列表&#xff0c;然后将其与另一个列表连接&#xff0c;你可以先将range对象转化为列表&…

Xshell如何下载文件到本地

法一&#xff1a;命令下载 1、连接到远程服务器并登录 2、使用cd命令进入要下载文件的目录 3、使用以下命令下载文件&#xff1a; scp usernameremote:/path/to/file /path/to/local/directoryusername 远程服务器的用户名 remote 远程服务器的IP地址或主机名 /path/to/file …

windows环境下PHP7.4多线程设置

windows环境下的PHP设置多线程时有一定的难度&#xff0c;难点主要是PHP版本的选择&#xff0c;多线程扩展的选择&#xff0c;以及相关的设置等。 环境 windows 10php-7.4.33-Win32-vc15-x64php_parallel-1.1.4-7.4-ts-vc15-x64phpstudy 8.1.1.2 为了快速的部署PHP环境&…

css控制卡片内部的左右布局

先放效果图 纯css样式 可以根据需求进行更改 <template> <!-- 卡片盒子 --><div class"card_box "><el-card class"box-card w400" v-for"(item,index) in cardList" :key"index"><div slot"heade…

<sa8650>qcxserver 之 QCarCam 6.X API介绍 (第二部分)

@[TOC](<sa8650>qcxserver 之 QCarCam 6.X API介绍 (第二部分)) 2.6 帧信息定 帧信息定义包括缓冲区列表ID、缓冲区索引、帧序列号、每个批处理帧的时间戳、隔行扫描字段类型和标志。 2.6.1 QCarCamHWTimestamp_t 硬件时间戳定义 2.6.2 QCarCamBatchFramesInfo_t 2.6.3…

数字通信和fpga概述——杜勇版本学习笔记

1数字通信处理流程 脉冲调制是每个数字通信系统中间必不可少的环节&#xff0c;通常是使用升余弦滚降滤波器来实现。 超外差接收机原理是利用本地产生的振荡波与输入信号混频&#xff0c;将输入信号频率变换为某个预先确定的频率的方法。超外差原理最早是由E.H.阿姆斯特朗于1…

Windows配置JAVA_HOME但是未生效问题

文章目录 前言问题定位解决方式java_home 修改成 1.6 再试试效果 前言 之前用的都是jdk 1.8&#xff0c;但最近需要修改一个老项目&#xff0c;老项目使用的是1.6。修改java_home为1.6的路径后&#xff0c;在cmd中输入java -version发现并未更改。 问题定位 之前装过简化版的…

python中circle函数的用法

python中circle函数的用法 circle函数简介语法说明代码说明 circle函数简介 Python中的circle函数用于绘制圆形&#xff0c;是Python中非常基础 和重要的函数之一 语法 turtle.circle(radius,extentNone,stepsNone)说明 第一个参数- 半径是 radius - radius 可以是负数 - r…

真正解决jellyfin硬解码转码

前段时间入手一个DS423集成显卡UHD600&#xff0c;搭了一个jellyfin&#xff0c;发现网上关于硬解码的教程基本都存在问题&#xff0c;没有真正解决我的硬解码问题。经过一系列分析修改&#xff0c;最终实现硬解码。先贴效果图&#xff1a; 下载安装jellyfin这里就不叙述&#…

猫罐头什么牌子好?精选5款口碑好的猫主食罐头推荐!

亲爱的猫咪朋友们&#xff0c;你们是否还在为如何挑选适合猫咪的猫主食罐头而烦恼呢&#xff1f;猫主食罐头不仅仅是一种美味的食物&#xff0c;更是对维护猫咪健康有益的重要食品。猫罐头什么牌子好&#xff1f;作为在宠物店工作了7年的店长&#xff0c;这些年来店里的猫猫吃过…

【MongoDB】索引 – 文本索引(指定语言)

一、语言列表 语言名称 代码 danish da dutch nl english en finnish fi french fr german de hungarian hu italian it norwegian nb portuguese pt romanian ro russian ru spanish es swedish sv turkish tr 二、指定默认语言 创建文本索…

零基础学网络安全要怎么学?五分钟看懂

网络安全因何而重要&#xff1f; 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 截至2022年6月,我国网民规模为10.51亿&#xff0c;互联网…

伐木猪小游戏

欢迎来到程序小院 伐木猪 玩法&#xff1a;控制小猪点击屏幕左右砍树&#xff0c;不能碰到树枝&#xff0c;考验手速与眼力&#xff0c;记录分数&#xff0c;快去挑战伐木吧^^。开始游戏https://www.ormcc.com/play/gameStart/199 html <script type"text/javascript…

Centos7开放及查看端口

1、开放端口 firewall-cmd --zonepublic --add-port8888/tcp --permanent # 开放8888端口 firewall-cmd --zonepublic --remove-port8888/tcp --permanent #关闭8888端口 firewall-cmd --reload # 配置立即生效 2、查看防火墙所有开放的端口 firewall-cmd --zonepubl…

5 Tensorflow图像识别(下)模型构建

上一篇&#xff1a;4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理&#xff0c;下面是完整的代码&#xff1a; import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…

有关python库

官方库 #1、导入某模块 import os #2、导入OS模块中的system方法 from os import system #3、导入某模块中的孙子模块中的xx方法&#xff0c;并重命名 from module.xx.xx import xx as rename #4、导入OS中的所有模块 #不用进行OS.method(),直接method&#xff08;&#xff0…