WebAssembly 火了!背后的 LLVM 功不可没!( 二 )


使用 LLVM 的另一种场景是向现有语言添加特定领域的扩展 。Nvidia 使用 LLVM 创建 Nvidia CUDA 编译器,允许语言添加对 CUDA 的本地支持,将其编译为正在生成的本地代码的一部分(更快),而不是通过它附带的库调用(更慢) 。
4.使用各种语言的 LLVM使用 LLVM 的典型方法是使用开发者熟悉的语言编写代码(当然,它支持 LLVM 的库) 。
两种常见的语言选择是 C 和 C++ 。许多 LLVM 开发人员默认使用这两者之一,原因如下:

  • LLVM 本身是用 C++ 编写的 。
  • LLVM 的 API 在 C 和 C++ 中可用 。
  • 许多语言的开发往往以 C/C++ 为基础
尽管如此,这两种语言并不是唯一的选择 。许多语言都可以本地调用 C 库,因此理论上可以使用任何此类语言执行 LLVM 开发 。目前许多语言、运行时都有这样的库,包括 C#/.NET/Mono、Rust、Haskell、OCAML、Node.js、Go 和 Python等等 。
需要注意的是,一些与 LLVM 语言绑定可能不如其他语言那么完整 。例如,对于 Python,有很多选择,但每个选择的完整性和实用性各不相同 。
如果对如何使用 LLVM 库来构建语言有兴趣,LLVM 有一个教程,使用 C++ 或 OCAML,它会引导你创建一种称为 Kaleidoscope 的简单语言 。
5.LLVM 不做什么LLVM 不解析语言的语法, 许多工具已经可以完成这项工作,例如: lex/yacc、flex/bison、Lark 和 ANTLR,所以 LLVM是解析与编译分离的 。
有 LLVM 不提供原语的语言的公共部分 。如:LLVM 不提供垃圾收集器机制,但它确实提供了实现垃圾收集的工具,方法是允许用元数据标记代码,从而更容易编写垃圾收集器 。
但是,不排除 LLVM 最终可能添加用于实现垃圾收集的本机机制的可能性 。
6.和LLVM相关的WebAssembly运行时WasmerWasmer 是在非浏览器上下文中运行 Wasm 的一种方式,提供基于 WebAssembly 的超轻量级容器 。专注于支持在任何平台上运行 WASM 代码,为其他跨平台运行时(例如 Java)提供了潜在的替代方案 。
WebAssembly 火了!背后的 LLVM 功不可没!

文章插图
 
Wasmer 在 GitHub 上将自己描述为“一个快速且安全的 WebAssembly 运行时,它使超轻量级容器可以在任何地方运行:从桌面到云、边缘和物联网IOT设备” 。
Wasmer使用熟悉的工具和喜欢的语言,将所有内容编译为 WebAssembly 。可以在任何操作系统上运行它或将其嵌入到其他语言中 。
WasmEdgeWasmEdge 是一个轻量级、高性能和可扩展的 WebAssembly 运行时, 它是当今号称最快的 Wasm VM 。WasmEdge的用例包括:现代 Web 应用程序架构(同构和 Jamstack 应用程序)、边缘云上的微服务、无服务器 SaaS API、嵌入式功能、智能合约和智能设备等方方面面 。
WebAssembly 火了!背后的 LLVM 功不可没!

文章插图
 
 
WasmEdge 是世界上第一个正式的 CNCF WebAssembly 运行时项目,可以设想它将作为边缘云的关键任务轻量级运行时,在 CNCF 的开源云计算领域发挥重要作用 。
WasmEdge 可以运行从 C/C++、Rust、Swift、AssemblyScript 或 Kotlin 源代码编译的标准 WebAssembly 字节码程序 。同时,它还受到标准语言和编译器工具链的支持,例如 LLVM、Rustc 和 emscripten 。
更多关于Wasmer、WasmEdge的内容可以继续在我的主页阅读,已经单独撰文《全网最火的5+优秀 WebAssembly 运行时!》进行详细介绍 。
7.获取源代码并构建 LLVM教程下载 LLVM
git clone --depth 1 https://github.com/llvm/llvm-project.git
配置和构建 LLVM 和 Clangcd llvm-projectcmake -S llvm -B build -G <generator> [options]可用的 generator 包括:Ninja、Unix Makefiles 、Visual Studio、Xcode
执行 buildcmake --build . [--target <target>]// 默认target(即 cmake --build . 或 make)将构建所有 LLVM 。基本构建一个基本的 CMake 和构建/测试调用,它只构建 LLVM 而没有其他子项目:
cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debugninja -C build check-llvm上面代码将使用调试信息设置 LLVM 构建,然后编译 LLVM 并运行 LLVM 测试 。
独立构建独立构建针对系统上已存在的 clang 或 llvm 库的预构建版本构建子项目 。
可以使用来自 llvm 项目(如上所述)的标准签出的源代码来进行独立构建,但也可以从发布页面上可用的 tarball 中构建 。
对于独立构建,必须有一个 llvm 安装,它被正确配置为可以被其他项目的独立构建使用 。这可能是一个发行版提供的 LLVM 安装,或者可以自己构建它,如下所示:


推荐阅读