WebAssembly入门课
于航
PayPal 高级软件工程师
新⼈⾸单¥9.9
1252 人已学习
课程目录
已更新 16 讲 / 共 22 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 我们为什么要了解 WebAssembly?
免费
01 | 基础篇:学习此课程你需要了解哪些基础知识?
02 | 历史篇:为什么会有 WebAssembly 这样一门技术?
核心原理篇 (6讲)
03 | WebAssembly 是一门新的编程语言吗?
04 | WebAssembly 模块的基本组成结构到底有多简单?
05 | 二进制编码:WebAssembly 微观世界的基本数据规则是什么?
06 | WAT:如何让一个 WebAssembly 二进制模块的内容易于解读?
07 | WASI:你听说过 WebAssembly 操作系统接口吗?
08 | API:在 WebAssembly MVP 标准下你能做到哪些事?
应用篇 (6讲)
09 | WebAssembly 能够为 Web 前端框架赋能吗?
10 | 有哪些已经投入生产的 WebAssembly 真实案例?
11 | WebAssembly 在物联网、多媒体与云技术方面有哪些创新实践?
12 | 有哪些优秀的 WebAssembly 编译器与运行时?
13 | LLVM:如何将自定义的语言编译到 WebAssembly?
14 | 有哪些正在行进中的 WebAssembly Post-MVP 提案?
实战篇 (1讲)
15 | 如何实现一个 WebAssembly 在线多媒体处理应用(一)?
WebAssembly入门课
15
15
1.0x
00:00/00:00
登录|注册

13 | LLVM:如何将自定义的语言编译到 WebAssembly?

于航 2020-10-02
你好,我是于航。
应用 Wasm 的常见方式有几种类型,一种方式是通过 Web 浏览器提供的 JavaScript API 与 Web API ,来在 Web 应用中调用从 Wasm 模块中导出的函数。通过这种方式,我们可以充分利用 Wasm 的安全、高效及可移植性等优势。
另一种方式是通过 WASI 抽象系统调用接口,以便在 out-of-web 应用中使用 Wasm。这种使用方式与 Web 端大同小异,不过区别是可以借助底层运行时的能力,使得我们构建出的 Wasm 应用可以在 Web 浏览器外的 Native 环境中与操作系统打交道,并同样享受着 Wasm 本身所带来的安全、高效及可移植性。
而今天我们要介绍的另外一个 Wasm 的应用场景,则相对有些特殊。在大多数时候,我们都是将由诸如 C/C++ 以及 Rust 等语言编写的源代码,编译至 Wasm 字节码格式来使用。假设此时我们想要设计开发一款自定义的静态编程语言,那么怎样才能够方便快捷地为它的编译器添加一个能力,可以让编译器支持将 Wasm 作为编译目标呢?
关于这个问题,我们要先从传统的编译器链路开始说起。

传统编译器链路

对于传统的静态语言编译器来说,通常会采用较为流行的“三段式”链路结构。如下图所示,三段式结构分别对应着整个编译器链路中三个最为重要的组成部分:编译器前端(Compiler Frontend)、中间代码优化器(Optimizer),以及编译器后端(Compiler Backend)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《WebAssembly入门课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥9.9
立即订阅
登录 后留言

精选留言(4)

  • 鹦鹉
    类似操作系统的 32 位与 64 位之分. 简而言之, wasm32 与 wasm64 的区别主要在于内存寻址范围的不同, 对于 wasm32 仅能对 2 的 32 次方(大约 4GB) 的线性内存范围进行寻址, 而 wasm64 能够在更大范围的内存中寻址. 虽然现在我们的操作系统基本都是 64 位, 但对于 wasm 来说, 区分 wasm32 和 wasm64 两个编译目标的主要的原因在于: 绝大多数 wasm 应用都不需要使用到超过 4GB 的内存.
    参考: https://webassembly.org/docs/faq/
    2020-10-02
    1
  • 一步
    llc add.ll -filetype=obj -mtriple=wasm64 -o add1.wasm
    在 Mac 平台 执行这行命令,生成 wasm64 的目标代码,提示 不支持的
    LLVM ERROR: 64-bit WebAssembly (wasm64) is not currently supported

    版本信息:
    LLVM (http://llvm.org/):
      LLVM version 10.0.1
      Optimized build.
      Default target: x86_64-apple-darwin19.3.0
      Host CPU: skylake
    2020-10-07
  • 一步
    存在 wasm32 和 wasm64的平台, 应该可以操作系统 中存在64和32 位的原因是一样的
    1: 64 有更大的 CPU 位宽,可以进行更大的数值的计算
    2: 内存寻址空间大小不一样
    2020-10-07
  • 猴哥
    使用llc编译后可以在浏览器中运行了吗?好emscripten编译上有什么差异?

    作者回复: 可以使用,不过只能够使用没有系统调用的 Wasm 模块版本,对 wasi-libc 的支持目前还不是很完善。相比 Emscripten 来说,直接使用 LLVM 的版本会有比较多的冗余字节码,且编译流程较为复杂,比如需要使用单独的 wasm-ld 进行链接以导出 C/C++ 代码中的函数。而 Emscripten 则会帮助你简化整个编译流程到 emcc 中,同时也会自动生成可用的 JavaScript Glue 来帮助你简化 Wasm 模块的使用方式。相较之下,LLVM 就不会帮你去模拟 Web 上的 POSIX 环境了。因此诸如 fopen 这些函数在通过 LLVM 编译到 Wasm 后就无法直接在 Web 浏览器上使用了。

    2020-10-06
    1
收起评论
4
返回
顶部