javascript - .NET 在 WebAssembly 中的 CLR
问题描述
我试图从 .NET 角度理解 WebAssembly 的意义。
一种称为 WebAssembly 的相对较新的标准化 Web 技术使在浏览器中运行 .NET 成为可能。
这是一个奇怪的说法。
显然,您可以在没有 WebAssembly 的情况下在浏览器中运行 .NET 代码,方法是将其交叉编译为 JavaScript(例如,使用JSIL)。这很糟糕,因为
- CLR 的对象模型比 JavaScript 的更复杂(例如,您可以创建一个紧凑的整数数组
Uint8Array
,但不能在 JavaScript 中使用更复杂的值类型),这使得某些类型的代码的翻译效率非常低。 - .NET 的原生基础库实现也需要在 JavaScript 中实现,这是很多工作。
- 浏览器生态系统是基于 JavaScript 的,所以如果你使用这样的交叉编译会有摩擦。
所以FAQ的意思是它现在很实用,对吧?
我很难看到 WebAssembly 如何帮助解决这些问题。粗略一瞥表明它的虚拟机仍然不能有效地正确表示 CLR(仍然没有复杂的值类型,对吧?)。其他两点无论如何都会成立。
那么发生了什么变化?WebAssembly 究竟带来了哪些仅靠 JavaScript 无法实现的东西?真的只是 Webassembly 是基于堆栈的,而 JS 本身不是吗?为什么会有这么大的问题?
编辑:对 Henk 的直截了当的回答感到非常高兴。对于感兴趣的人,我现在找到了一个很棒的基本原理页面。
解决方案
表明它的虚拟机仍然不能有效地正确表示 CLR
正确的。这就是 Blazor 首先部署 Mono 的编译到 WASM 版本的原因。
Blazor 为聚会带来了自己的 CLR。
您的应用程序代码不会被编译为 Wasm,它将被部署为由 Mono 执行的(常规)IL。使用开发工具,您可以看到一堆 .DLL 文件正在下载到您的浏览器。原则上,您可以使用适合浏览器安全沙箱的任何 .net 标准包。
WebAssembly 究竟带来了哪些仅靠 JavaScript 无法实现的东西?
It enables a C compiler to compile Mono.*.c to Mono.wasm.
And it is fast.
推荐阅读
- php - VS Code 中的 php 版本错误
- python - 使用 ipywidgets 启动/退出程序
- python - virtualenv 找不到 python 可执行文件,除非 .exe 指示
- java - 不添加 if 的不同方法
- python - 从 Python 中的 SQL 语句字符串获取 INSERT INTO 语句
- python - 查询 sqlalchemy 模型的外键
- haskell - return 如何在 monad-transformer 上下文中工作?
- ffmpeg - 如何:使用 ffmpeg 手动对 youtube-dl 进行后处理
- python - 有没有办法使用 python 查找 USB 设备的序列号?
- ios - CallKit:从被阻止的电话号码中接听电话