关键词:
微软家的:blazor
看图即可见原理。mono.wasm用来构造了一个dotnet解释器。
在blazor被微软收购之前是用的dotnetanywhere,现在换成了mono
然后,直接加载那些dll,执行正经的IL代码。
这个方案,稳健,除了加载容量吓死人
这个helloworld,肉眼可见的压缩后容量超过100K的文件就4个。
开发工具 visual studio 2019
开发语言 IL家族
火狐家的rustwasm
非常干净,代码直接被编译为wasm执行,没有依赖环境
这个helloworld,wasm 压缩后47k,胶水代码4k
开发工具,命令行工具链rust家族,IDE漂泊不定,vscode可以用
开发语言 rust
来互相伤害一下
先拉个表格
方案对比 | 微软 Blazor | 火狐 RustWasm | blabla |
原理 | 把Mono解释器编译为wasm,然后解释执行dotnet dll | 直接将rust编译为wasm | 思路完全不同 |
容量 | 业务代码14K 解释器 压缩后600k dotnet基础库 压缩后约800k | 业务代码与依赖代码均编译在一起,47K | 火狐碾压胜 |
开发语言 | dotnet 家族 理论上C# F# VB.net 等,实际上c#为主 | rust | 定位完全不同 |
开发工具 | visual studio 2019 编译、编辑、代码管理一体化 | 编译工具 rust 工具链和 wasm-pack 工具链 IDE 官方没有,vscode可以用。 | 微软碾压胜 |
我对比了四个维度
工作原理
blazor是直接把mono解释器变成了wasm,用户不需要再接触wasm。这个方案有很高的一致性,兼容性极好。用户不需要了解太多wasm,dotnet开发者即可上手。相当于用wasm写了一个脚本语言,然后用户写脚本。
而rust是直接把用户代码编译为wasm。
这是两个截然不同的方案,微软方案存在二次解析和GC,性能会有一定折扣。
容量
blazor的容量惊人,仅解释器和dotnet基础库压缩后就达到了1.5M,不压缩4M多。
仅此一条,将极大的限制blazor的使用场景。
rust在这个项目上碾压胜出
开发语言
c# 作为一门已经有很广泛用户基础的语言,其资料丰富程度是无法抵挡的,外加庞大的c#开发者。
而rust 则是一门致力于为难程序员的语言。
rust是c++的挑战者,他更加底层,尤其是在内存相关的设计上极为复杂。
c#有gc,代码编写比较容易。
对程序员友好度来说,自然是c#更优,但项目?何时轮到程序员的感受了。
rust没有gc,代码就小,也没有gc代价,转换成项目语言就是,rust代码比c#代码快,尤其在wasm环境,微软选了解释器,那就会更快(按照lua的效率预测,lua解释器性能大约是c语言同等逻辑的1/22,这个仅作参考)
开发工具
微软visual studio 2019,目前坊间称为宇宙最强IDE,绝非浪得虚名。
而rust 和 wasm-pack 只有命令行工具
rust IDE,目前体验比较好的,依然是微软家的visual studio code
n
100分 对 60分的差距
调试
微软碾压胜,可以在c#直接下断点,调试wasm环境的代码。
火狐的rust这边,还要靠打log,下断点的方法暂时还没有,希望rust生态的蓬勃发能尽快弥补这个短板。
wasm是支持sourcemap的,目前 wasm-pack工具包居然没有直接生成sourcemap,所以没办法在浏览器环境直接看到rust代码,短板啊。
小结
微软太异端,巨大的依赖容量无法实用化。
rust 还是目前wasm开发的首要选择
Rust 和 Wasm 初始设置
】Rust和Wasm初始设置【英文标题】:Rust&Wasmintitialsetup【发布时间】:2020-12-2914:47:53【问题描述】:我正在关注thistutorial使用rust创建webassembly应用程序,但是当我尝试使用node运行捆绑的web程序集代码时(在添加我自己的任何代... 查看详情
rust语言编写wasm简单例子(代码片段)
rust的wasm使用wasm-pack来build,有很多选项和target用于不同的目的,本文描述一个最简单的示例,不使用webpack和npm,让你可以快速入门和了解。全局安装wasm-packcargoinstallwasm-pack--no-default-features#忽略OpenSSL实例代码extern... 查看详情
如何使用 Wasm 和 Rust 服务多个 HTML 页面?
】如何使用Wasm和Rust服务多个HTML页面?【英文标题】:HowtoservemultipleHTMLpagesusingWasmwithRust?【发布时间】:2020-07-1001:43:17【问题描述】:我正在尝试构建一个在客户端运行wasm的Web应用程序,我想知道什么是服务多个页面的好方法... 查看详情
rust语言编写wasm简单例子(代码片段)
rust的wasm使用wasm-pack来build,有很多选项和target用于不同的目的,本文描述一个最简单的示例,不使用webpack和npm,让你可以快速入门和了解。全局安装wasm-packcargoinstallwasm-pack--no-default-features#忽略OpenSSL实例代码extern... 查看详情
如何使用 Rust 生成最小的 wasm 文件?
】如何使用Rust生成最小的wasm文件?【英文标题】:HowdoIgenerateaminimalwasmfilewithRust?【发布时间】:2018-03-2108:08:23【问题描述】:通过运行emcc-O3-sWASM=1-sSIDE_MODULE=1-osum.wasmsum.c,我可以从以下C代码生成一个相当小的(203字节)wasm文... 查看详情
编译为 Wasm 时,指向堆分配内存的 Rust 指针可以为 0 吗?
】编译为Wasm时,指向堆分配内存的Rust指针可以为0吗?【英文标题】:CanaRustpointertoheap-allocatedmemorybe0whencompiledtoWasm?【发布时间】:2020-09-1411:19:06【问题描述】:在编译成Wasm的Rust代码中进行堆分配内存时,会分配Wasm线性内存中... 查看详情
如何使用 Wasm-Bindgen Web_sys Wasm-pack 将字符串从 Js 传递到通过 Rust 生成的 Wasm
】如何使用Wasm-BindgenWeb_sysWasm-pack将字符串从Js传递到通过Rust生成的Wasm【英文标题】:HowtoPassaStringfromJstoWasmgeneratedthroughRustusingWasm-BindgenWeb_sysWasm-pack【发布时间】:2020-09-1104:16:01【问题描述】:代码是基本的,我从js调用一个函... 查看详情
全栈程序员的新玩具rust第一个wasm程序
先上代码https://gitee.com/lightsever/rust_study/tree/master/wasm_hello01 webassembly就不用再赘述了,耳朵里面快磨出茧子来了。rustwasm是火狐自家的玩具,让我们来继续做实验,让rust飞起来吧。环境安装安装好rust环境之后仍然需要一个wasm... 查看详情
如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?
】如何通过wasm-pack将RustWasm应用程序与libpq链接?【英文标题】:HowcanIlinkaRustWasmapplicationwithlibpqviawasm-pack?【发布时间】:2020-02-2900:57:30【问题描述】:我正在尝试创建一个带有Wasm数据库层的NodeJS应用程序。我使用Rust、Diesel作为... 查看详情
从 Rust 为机器类型 wasm32 构建 LLVM
】从Rust为机器类型wasm32构建LLVM【英文标题】:BuildLLVMfromRustformachinetypewasm32【发布时间】:2020-02-1311:11:40【问题描述】:我正在尝试构建一个爱好项目,在其中我将Rust文件构建到WebAssembly。我想将更多选项传递给emscripten,然后Ru... 查看详情
原创来玩儿!rust+wasm开发的一个方便实用的大会海报工具
先来一张图镇楼:是不是很实用!!!此工具由专注于wasm 生态的SecondState提供。生成的海报可用于朋友圈等渠道传播不过,仅供娱乐哈!对专业运营团队可能很有用!还等什么,大家一起来玩玩儿吧!!https://second-state.... 查看详情
ewasm项目初探
...好开发合约更容易,支持更多语言和工具ewasm项目目标和方案以太坊ewasm项目目标是既要完成对wasm的支持,又要兼容EVM1.0合约。要达到这个目标,ewasm目前的 查看详情
认识webassembly与rust实践(代码片段)
...题时的优化手段和思路。简介先来说下在WebAssembly(后续称WASM)官网上的介绍,主要有四点:高效:WASM有一套完整的语义,实际上WASM是体积小且加载快的二进制格式,其目标就是充分发挥硬件的能力以达到原生... 查看详情
波卡与wasm合约双剑合璧
...:同样受限于初级语言Solidity的表达能力和运行效率。3.Wasm合约:使用链级别的高级语言Rust或AS开发,部署和运行成本都很低。01Substrate链开发:底层技术创新的温床如果用Sub 查看详情
webassembly(wasm)和云原生|wasm和区块链
文章目录一、什么是Wasm、WASI二、WebAssembly(WASM)和云原生WebAssembly能不能取代Docker三、Wasmcontainer与Kubernetes四、云原生、WASM和边缘计算为边缘优化的WebAssembly虚拟机:wasmedge五、wasm和区块链Wasm对于EVM有什么优势?虚拟机之战... 查看详情
使用 wasm-bindgen 对大型 rust 对象进行 Js 绑定
】使用wasm-bindgen对大型rust对象进行Js绑定【英文标题】:Jsbindingforlargerustobjectusingwasm-bindgen【发布时间】:2021-03-2208:05:21【问题描述】:我想写一个显示大二进制文件内容的vscode扩展,用bincode写的:#[macro_use]externcrateserde_derive;use... 查看详情
在.net7上使用wasm和wasi
WebAssembly(WASM)和WebAssemblySystemInterface(WASI)为开发人员开辟了新的世界。.NET开发人员在BlazorWebAssembly发布时熟悉了WASM。BlazorWebAssembly在浏览器中基于WebAssembly的.NET运行时上运行客户端。WASI通过提供一个系统接口... 查看详情
如何使用 Emscripten 编译的程序中的 wasm-bindgen?
】如何使用Emscripten编译的程序中的wasm-bindgen?【英文标题】:HowcanIusewasm-bindgenfromaprogramcompiledwithEmscripten?【发布时间】:2022-01-2319:07:24【问题描述】:我正在尝试将包含由wasm-bindgen生成的代码的Rust库与我想用Emscripten编译的用C... 查看详情