原文
最近,由于SebastiaanKoppe
在移植DRuntime
以在WebAssembly(WASM)
上运行
方面的出色工作
,现在可用完整的运行时
和Phobos
实现,在浏览器
中运行D代码
.
本指南详细介绍
如何安装,并在自己的Web
项目中使用D
.
假设你用的是Linux
系统,但类似可让它在窗口
下工作.如果有足够需求,我稍后可用指定的窗口
说明扩展指南.
Git
Clang
D编译器(LDC/DMD/GDC)
CMake 3.8+
Ninja
GNU make
Python
Phobos的std.net.curl的libcurl(如,最近Ubuntu上的libcurl4)
zlib-dev(如,Ubuntu上的zlib1g-dev)
LLVM开发6.0+
Binaryen
在Ubuntu18.04
或20.04
上,可用以下命令
安装这些版本(可能适合其他基于Debian
的发布版;未测试):
sudo apt install git make clang++ ldc cmake ninja-build zlib1g-dev libcurl4 llvm-dev libclang-common-6.0-dev binaryen
此外,此时,创建个新目录来容纳与WASM
上的D设置
相关的所有内容:
mkdir wasm-dlang && cd wasm-dlang
WASI-Libc
如果选择做一个,请确保在wasm-dlang
目录中.
克隆
仓库及其子模块
git clone --recurse-submodules https://github.com/WebAssembly/wasi-libc
构建sysroot
cd wasi-libc
make WASM_CC=`which clang` WASM_AR=`which llvm-ar` WASM_NM=`which llvm-nm`
LDC
ldc
返回wasm-dlang
cd ..
克隆
仓库及其子模块
git clone https://github.com/skoppe/ldc.git
cd ldc
git checkout wasm
git submodule update --init
cd ..
创建构建目录
及构建脚本
mkdir build-ldc && cd build-ldc
cmake -G Ninja ../ldc \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PWD/../install-ldc
(如果你要为LDC
打补丁,你可能需要把"Release"
更改为"RelWithDebInfo"
)
LDC
ninja -j4
这需要几分钟
时间并使用大量RAM
.
会有大量的警告;你可忽略它们.
如果有很多可用RAM
和多核CPU
,可把-j4
更改为-j8
甚更高,来更多并行
执行工作.
DRuntime
返回wasm-dlang
.
cd ..
创建构建目录和构建脚本
.
mkdir build-druntime && cd build-druntime
echo -e '#!/bin/sh'"\n\nrm -rf $PWD/out\nCC=clang $PWD/../build-ldc/bin/ldc-build-runtime --ninja --buildDir='$PWD/out' --dFlags='-mtriple=wasm32-unknown-unknown-wasm;
-fvisibility=hidden' --targetSystem='WebAssembly' --ldcSrcDir='$PWD/../ldc' --cFlags='-target wasm32-unknown-unknown-wasi --sysroot=$PWD/..
/wasi-libc/sysroot'\nchown -R $USER:`id -gn` $PWD/out" > build
chmod +x build
运行
生成脚本
sudo ./build
Web
上运行它现在安装了个可编译D
为WASM
的LDC
版本.但是,需要一个WASI
实现,才能使用生成代码
.
为了在Web
上运行D
,可用我编写的名为d-wasm-glue
的库,它实现了一个WASI
接口,及一些胶水代码
,以便更方便
地使用D中的JS
对象,及一个围绕LDC
的包装器
来传递构建WASM
期望的所有命令行选项
.
它生成的wasm-ldc
包装器,其命令行选项
与LDC
语法完全相同
.
返回wasm-dlang
cd ..
编译胶水代码
.
git clone https://github.com/brianush1/d-wasm-glue
cd d-wasm-glue
rdmd wasm-ldc.d --build-wasm-compiler --add-to-path
// you may choose to remove the '--add-to-path' if you do not want it automatically added to your $PATH in ~/.profile
例:
//example.d
import std.stdio;
import glue;
void main() {
writeln("Hello, from D!"); //打开`JS`控制台,看到此消息
js.document.body.innerHTML = "Hello, everyone!";
}
example.html
:
<body>
<script src="glue.min.js">script>
<script>
runFile("example.wasm");
script>
body>
构建命令
:
wasm-ldc example.d
注意
确实需要通过本地Web
服务器运行
它;因为CORS
,不能直接按文件加载example.html
到浏览器中.